From e87a44a5636058afe597a7ef3a8ff6a546f274ad Mon Sep 17 00:00:00 2001 From: Vladimir Lebedev Date: Thu, 14 Mar 2024 15:27:16 +0700 Subject: [PATCH 01/28] start refactoring --- Cargo.lock | 946 +++++++++++++++++++++++++--------------- liteapi/Cargo.toml | 11 +- liteapi/src/lib.rs | 391 +---------------- liteapi/src/protocol.rs | 147 +++++++ liteapi/src/tl_types.rs | 4 +- 5 files changed, 741 insertions(+), 758 deletions(-) create mode 100644 liteapi/src/protocol.rs diff --git a/Cargo.lock b/Cargo.lock index 127feee..3d68e4e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" @@ -17,18 +26,33 @@ dependencies = [ "aes", "ciborium-io", "ctr", - "curve25519-dalek 4.0.0-pre.2", "log", - "rand_core 0.6.3", + "rand_core", + "sha2", +] + +[[package]] +name = "adnl" +version = "1.0.0" +source = "git+https://github.com/tonstack/adnl-rs?branch=server#96e4391815661126e0b0e9c185d7d2a1491b0cb7" +dependencies = [ + "aes", + "ctr", + "curve25519-dalek", + "log", + "rand", + "rand_core", "sha2", + "thiserror", + "tokio", "x25519-dalek", ] [[package]] name = "aes" -version = "0.8.1" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfe0133578c0986e1fe3dfcd4af1cc5b2dd6c3dbf534d69916ce16a2701d40ba" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if", "cipher", @@ -37,13 +61,28 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.7.18" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "atty" version = "0.2.14" @@ -61,11 +100,32 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base64" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "bitflags" @@ -75,36 +135,30 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "block-buffer" -version = "0.10.2" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] [[package]] name = "bumpalo" -version = "3.9.1" +version = "3.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" - -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" [[package]] name = "bytes" -version = "1.3.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cc" -version = "1.0.73" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" +checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" [[package]] name = "cfg-if" @@ -114,34 +168,29 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.19" +version = "0.4.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +checksum = "8eaf5903dcbc0a39312feb77df2ff4c76387d591b9fc7b04a238dcf8bb62639a" dependencies = [ - "libc", - "num-integer", + "android-tzdata", + "iana-time-zone", + "js-sys", "num-traits", - "time", - "winapi", + "wasm-bindgen", + "windows-targets 0.52.4", ] -[[package]] -name = "chunked_transfer" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff857943da45f546682664a79488be82e69e43c1a7a2307679ab9afb3a66d2e" - [[package]] name = "ciborium-io" -version = "0.2.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "346de753af073cc87b52b2083a506b38ac176a44cfb05497b622e27be899b369" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" [[package]] name = "cipher" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1873270f8f7942c191139cb8a40fd228da6c3fd2fc376d7e92d47aa14aeb59e" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ "crypto-common", "inout", @@ -174,7 +223,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -190,8 +239,8 @@ dependencies = [ name = "cli" version = "0.1.0" dependencies = [ - "adnl", - "base64", + "adnl 0.1.0", + "base64 0.13.1", "chrono", "clap", "env_logger", @@ -205,44 +254,50 @@ dependencies = [ "ureq", ] +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + [[package]] name = "cpufeatures" -version = "0.2.1" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] [[package]] name = "crc" -version = "3.0.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53757d12b596c16c78b83458d732a5d1a17ab3f53f2f7412f6fb57cc8a140ab3" +checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" dependencies = [ "crc-catalog", ] [[package]] name = "crc-catalog" -version = "2.2.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cace84e55f07e7301bae1c519df89cdad8cc3cd868413d3fdbdeca9ff3db484" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" dependencies = [ "cfg-if", ] [[package]] name = "crypto-common" -version = "0.1.3" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", "typenum", @@ -250,44 +305,45 @@ dependencies = [ [[package]] name = "ctr" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d14f329cfbaf5d0e06b5e87fff7e265d2673c5ea7d2c27691a2c107db1442a0" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" dependencies = [ "cipher", ] [[package]] name = "curve25519-dalek" -version = "3.2.1" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" +checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "fiat-crypto", + "platforms", + "rustc_version", "subtle", "zeroize", ] [[package]] -name = "curve25519-dalek" -version = "4.0.0-pre.2" +name = "curve25519-dalek-derive" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12dc3116fe595d7847c701796ac1b189bd86b81f4f593c6f775f9d80fb2e29f4" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ - "byteorder", - "digest 0.10.3", - "rand_core 0.6.3", - "subtle", - "zeroize", + "proc-macro2", + "quote", + "syn 2.0.52", ] [[package]] name = "darling" -version = "0.13.1" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0d720b8683f8dd83c65155f0530560cba68cd2bf395f6513a483caee57ff7f4" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" dependencies = [ "darling_core", "darling_macro", @@ -295,27 +351,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.13.1" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a340f241d2ceed1deb47ae36c4144b2707ec7dd0b649f894cb39bb595986324" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn", + "syn 1.0.109", ] [[package]] name = "darling_macro" -version = "0.13.1" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c41b3b7352feb3211a0d743dc5700a4e3b60f51bd2b368892d1e0f9a95f44b" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" dependencies = [ "darling_core", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -326,23 +382,14 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote", - "syn", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", + "syn 1.0.109", ] [[package]] name = "digest" -version = "0.10.3" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", @@ -350,9 +397,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.9.0" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3" +checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" dependencies = [ "atty", "humantime", @@ -361,15 +408,19 @@ dependencies = [ "termcolor", ] +[[package]] +name = "fiat-crypto" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1676f435fc1dadde4d03e43f5d62b259e1ce5f40bd4ffb21db2b42ebe59c1382" + [[package]] name = "flate2" -version = "1.0.22" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" dependencies = [ - "cfg-if", "crc32fast", - "libc", "miniz_oxide", ] @@ -381,19 +432,18 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.0.1" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ - "matches", "percent-encoding", ] [[package]] name = "generic-array" -version = "0.14.5" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -401,37 +451,32 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.1.16" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "libc", - "wasi 0.9.0+wasi-snapshot-preview1", + "wasi", ] [[package]] -name = "getrandom" -version = "0.2.5" +name = "gimli" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d39cd93900197114fa1fcb7ae84ca742095eed9442088988ae74fa744e930e77" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", -] +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "hashbrown" -version = "0.11.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "heck" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" @@ -454,6 +499,29 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -462,20 +530,19 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.2.3" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ - "matches", "unicode-bidi", "unicode-normalization", ] [[package]] name = "indexmap" -version = "1.8.0" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown", @@ -483,123 +550,118 @@ dependencies = [ [[package]] name = "inout" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1f03d4ab4d5dc9ec2d219f86c15d2a15fc08239d1cd3b2d6a19717c0a2f443" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" dependencies = [ "generic-array", ] [[package]] name = "itoa" -version = "1.0.1" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "js-sys" -version = "0.3.56" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a38fc24e30fd564ce974c02bf1d337caddff65be6cc4735a1f7eab22a7440f04" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - [[package]] name = "libc" -version = "0.2.144" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "log" -version = "0.4.14" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "matches" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "memchr" -version = "2.4.1" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "miniz_oxide" -version = "0.4.4" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" dependencies = [ "adler", - "autocfg", ] [[package]] -name = "num-integer" -version = "0.1.44" +name = "mio" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ - "autocfg", - "num-traits", + "libc", + "wasi", + "windows-sys 0.48.0", ] [[package]] name = "num-traits" -version = "0.2.14" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", ] +[[package]] +name = "object" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" -version = "1.17.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "os_str_bytes" -version = "6.5.0" +version = "6.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" [[package]] name = "percent-encoding" -version = "2.1.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.5.4" +version = "2.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ab62d2fa33726dbe6321cc97ef96d8cde531e3eeaf858a058de53a8a6d40d8f" +checksum = "56f8023d0fb78c8e03784ea1c7f3fa36e68a723138990b8d5a47d916b651e7a8" dependencies = [ + "memchr", "thiserror", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.5.4" +version = "2.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf026e2d0581559db66d837fe5242320f525d85c76283c61f4d51a1238d65ea" +checksum = "b0d24f72393fd16ab6ac5738bc33cdb6a9aa73f8b902e8fe29cf4e67d7dd1026" dependencies = [ "pest", "pest_generator", @@ -607,33 +669,45 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.5.4" +version = "2.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b27bd18aa01d91c8ed2b61ea23406a676b42d82609c6e2581fba42f0c15f17f" +checksum = "fdc17e2a6c7d0a492f0158d7a4bd66cc17280308bbaff78d5bef566dca35ab80" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn", + "syn 2.0.52", ] [[package]] name = "pest_meta" -version = "2.5.4" +version = "2.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f02b677c1859756359fc9983c2e56a0237f18624a3789528804406b7e915e5d" +checksum = "934cd7631c050f4674352a6e835d5f6711ffbfb9345c2fc0107155ac495ae293" dependencies = [ "once_cell", "pest", "sha2", ] +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[package]] +name = "platforms" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" + [[package]] name = "ppv-lite86" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "pretty-hex" @@ -650,7 +724,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "version_check", ] @@ -667,18 +741,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.58" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa1fb82fc0c281dd9671101b66b771ebbe1eaf967b96ac8740dcba4b70005ca8" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.27" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -691,7 +765,7 @@ checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", - "rand_core 0.6.3", + "rand_core", ] [[package]] @@ -701,32 +775,35 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.3", + "rand_core", ] [[package]] name = "rand_core" -version = "0.5.1" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.1.16", + "getrandom", ] [[package]] -name = "rand_core" -version = "0.6.3" +name = "regex" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ - "getrandom 0.2.5", + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", ] [[package]] -name = "regex" -version = "1.5.5" +name = "regex-automata" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", @@ -735,25 +812,31 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.25" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "ring" -version = "0.16.20" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", + "cfg-if", + "getrandom", "libc", - "once_cell", "spin", "untrusted", - "web-sys", - "winapi", + "windows-sys 0.52.0", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustc-hash" version = "1.1.0" @@ -761,64 +844,82 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] -name = "rustls" -version = "0.20.4" +name = "rustc_version" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fbfeb8d0ddb84706bc597a5574ab8912817c52a397f819e5b614e2265206921" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "log", - "ring", - "sct", - "webpki", + "semver", ] [[package]] -name = "rustversion" -version = "1.0.6" +name = "rustls" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f" +checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41" +dependencies = [ + "log", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] [[package]] -name = "ryu" -version = "1.0.9" +name = "rustls-pki-types" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" +checksum = "5ede67b28608b4c60685c7d54122d4400d90f62b40caee7700e700380a390fa8" [[package]] -name = "sct" -version = "0.7.0" +name = "rustls-webpki" +version = "0.102.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" dependencies = [ "ring", + "rustls-pki-types", "untrusted", ] +[[package]] +name = "ryu" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" + +[[package]] +name = "semver" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" + [[package]] name = "serde" -version = "1.0.136" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.136" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.52", ] [[package]] name = "serde_json" -version = "1.0.79" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ "itoa", "ryu", @@ -827,50 +928,59 @@ dependencies = [ [[package]] name = "serde_with" -version = "1.12.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec1e6ec4d8950e5b1e894eac0d360742f3b1407a6078a604a731c4b3f49cefbc" +checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" dependencies = [ - "base64", - "rustversion", + "base64 0.13.1", "serde", "serde_with_macros", ] [[package]] name = "serde_with_macros" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12e47be9471c72889ebafb5e14d5ff930d89ae7a67bbdb5f8abb564f845a927e" +checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "sha2" -version = "0.10.2" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55deaec60f81eefe3cce0dc50bda92d6d8e88f2a27df7c5033b42afeb1ed2676" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.3", + "digest", ] [[package]] name = "smallvec" -version = "1.8.0" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" + +[[package]] +name = "socket2" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] [[package]] name = "spin" -version = "0.5.2" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] name = "strsim" @@ -880,102 +990,90 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "subtle" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" -version = "1.0.86" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] -name = "synstructure" -version = "0.12.6" +name = "syn" +version = "2.0.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" dependencies = [ "proc-macro2", "quote", - "syn", - "unicode-xid", + "unicode-ident", ] [[package]] name = "termcolor" -version = "1.1.3" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] [[package]] name = "textwrap" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" +checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" [[package]] name = "thiserror" -version = "1.0.38" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.38" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn", -] - -[[package]] -name = "time" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" -dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi", + "syn 2.0.52", ] [[package]] name = "tinyvec" -version = "1.5.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ "tinyvec_macros", ] [[package]] name = "tinyvec_macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tl-proto" -version = "0.4.2" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60421dced386ad8dec8c1b9a9bf737fe9b807a31d48312c812b14a1c68578e9b" +checksum = "3418163db528cc2324ed7bc9d52aa3ca7a8f73d685f8b21b319d2a08ee4b36d3" dependencies = [ "bytes", - "digest 0.10.3", + "digest", "sha2", "smallvec", "thiserror", @@ -984,14 +1082,14 @@ dependencies = [ [[package]] name = "tl-proto-proc" -version = "0.4.1" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5abcdfb6846667a980a20deff2c73de595435c3551b5622534c78eeb441cbf02" +checksum = "b3f51de4865e0618b187c2b790c137de938d01fe5510116b959387b6133c20ac" dependencies = [ "proc-macro2", "quote", "rustc-hash", - "syn", + "syn 2.0.52", "tl-scheme", ] @@ -1008,102 +1106,115 @@ dependencies = [ "thiserror", ] +[[package]] +name = "tokio" +version = "1.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.48.0", +] + [[package]] name = "ton_liteapi" version = "0.1.0" dependencies = [ - "adnl", - "ciborium-io", - "curve25519-dalek 4.0.0-pre.2", + "adnl 1.0.0", "derivative", "hex", "log", - "rand", + "thiserror", "tl-proto", - "x25519-dalek", + "tokio", + "tower-service", ] [[package]] name = "ton_networkconfig" version = "0.1.0" dependencies = [ - "adnl", + "adnl 0.1.0", "serde", "serde_json", "serde_with", ] +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + [[package]] name = "typenum" -version = "1.15.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ucd-trie" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" [[package]] name = "unicode-bidi" -version = "0.3.7" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" -version = "0.1.19" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" dependencies = [ "tinyvec", ] -[[package]] -name = "unicode-xid" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" - [[package]] name = "untrusted" -version = "0.7.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "2.4.0" +version = "2.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9399fa2f927a3d327187cbd201480cee55bee6ac5d3c77dd27f0c6814cff16d5" +checksum = "11f214ce18d8b2cbe84ed3aa6486ed3f5b285cf8d8fbdbce9f3f767a724adc35" dependencies = [ - "base64", - "chunked_transfer", + "base64 0.21.7", "flate2", "log", "once_cell", "rustls", + "rustls-pki-types", + "rustls-webpki", "url", - "webpki", "webpki-roots", ] [[package]] name = "url" -version = "2.2.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", - "matches", "percent-encoding", ] @@ -1115,21 +1226,15 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.79" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25f1af7423d8588a3d840681122e72e6a24ddbcb3f0ec385cac0d12d24256c06" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1137,24 +1242,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.79" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b21c0df030f5a177f3cba22e9bc4322695ec43e7257d865302900290bcdedca" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", - "syn", + "syn 2.0.52", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.79" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f4203d69e40a52ee523b2529a773d5ffc1dc0071801c87b3d270b471b80ed01" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1162,50 +1267,30 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.79" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa8a30d46208db204854cadbb5d4baf5fcf8071ba5bf48190c3e59937962ebc" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.52", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.79" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d958d035c4438e28c70e4321a2911302f10135ce78a9c7834c0cab4123d06a2" - -[[package]] -name = "web-sys" -version = "0.3.56" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c060b319f29dd25724f09a2ba1418f142f539b2be99fbf4d2d5a8f7330afb8eb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" -dependencies = [ - "ring", - "untrusted", -] +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "webpki-roots" -version = "0.22.2" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "552ceb903e957524388c4d3475725ff2c8b7960922063af6ce53c9a43da07449" +checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" dependencies = [ - "webpki", + "rustls-pki-types", ] [[package]] @@ -1226,9 +1311,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] @@ -1239,34 +1324,175 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.4", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.4", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +dependencies = [ + "windows_aarch64_gnullvm 0.52.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" + [[package]] name = "x25519-dalek" -version = "2.0.0-pre.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5da623d8af10a62342bcbbb230e33e58a63255a58012f8653c578e54bab48df" +checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" dependencies = [ - "curve25519-dalek 3.2.1", - "rand_core 0.6.3", + "curve25519-dalek", + "rand_core", + "serde", "zeroize", ] [[package]] name = "zeroize" -version = "1.3.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" dependencies = [ "zeroize_derive", ] [[package]] name = "zeroize_derive" -version = "1.3.2" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f8f187641dad4f680d25c4bfc4225b418165984179f26ca76ec4fb6441d3a17" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn", - "synstructure", + "syn 2.0.52", ] diff --git a/liteapi/Cargo.toml b/liteapi/Cargo.toml index d37d3fb..72c58a6 100644 --- a/liteapi/Cargo.toml +++ b/liteapi/Cargo.toml @@ -4,12 +4,11 @@ version = "0.1.0" edition = "2021" [dependencies] -adnl = { version = "0.1.0", features = ["std", "dalek"] } -x25519-dalek = "2.0.0-pre.1" -curve25519-dalek = "4.0.0-pre.2" -rand = "0.8.5" +adnl = { git = "https://github.com/tonstack/adnl-rs", branch = "server" } tl-proto = "0.4.2" derivative = "2.2.0" -ciborium-io = "0.2.0" log = '0.4.14' -hex = "0.4.3" \ No newline at end of file +hex = "0.4.3" +thiserror = "1" +tokio = { version = "1.36", features = ["net", "io-util"] } +tower-service = "0.3.2" \ No newline at end of file diff --git a/liteapi/src/lib.rs b/liteapi/src/lib.rs index 8c0c2cc..ac71e84 100644 --- a/liteapi/src/lib.rs +++ b/liteapi/src/lib.rs @@ -1,391 +1,2 @@ pub mod tl_types; - -pub use private::{LiteClient, LiteError}; - -mod private { - use std::{ - error::Error, - fmt::{Debug, Display}, - }; - - use crate::tl_types; - use adnl::{AdnlBuilder, AdnlClient, AdnlError, AdnlPublicKey, Empty}; - use ciborium_io::{Read, Write}; - use tl_proto::{TlError, TlRead, TlWrite}; - use x25519_dalek::StaticSecret; - - pub enum LiteError { - ServerError(tl_types::Error), - TlError(TlError), - NotLiteAnswer, - AdnlReadError(::Error), - AdnlWriteError(::Error), - AdnlIntegrityError, - AdnlTooShortPacketError, - } - - impl Display for LiteError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{:?}", self) - } - } - - impl Debug for LiteError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::ServerError(arg0) => f.debug_tuple("ServerError").field(arg0).finish(), - Self::TlError(arg0) => f.debug_tuple("TlError").field(arg0).finish(), - Self::NotLiteAnswer => write!(f, "NotLiteAnswer"), - Self::AdnlReadError(arg0) => write!(f, "AdnlReadError"), - Self::AdnlWriteError(arg0) => write!(f, "AdnlWriteError"), - Self::AdnlIntegrityError => write!(f, "AdnlIntegrityError"), - Self::AdnlTooShortPacketError => write!(f, "AdnlTooShortPacketError"), - } - } - } - - impl Error for LiteError {} - - pub type LiteResult = std::result::Result>; - - pub struct LiteClient { - client: AdnlClient, - } - - impl LiteClient { - pub fn connect( - transport: T, - public_key: P, - ) -> Result> { - let local_secret = StaticSecret::new(rand::rngs::OsRng); - let client = AdnlBuilder::with_random_aes_params(&mut rand::rngs::OsRng) - .perform_ecdh(local_secret, public_key) - .perform_handshake(transport).map_err(|e| match e { - AdnlError::ReadError(e) => LiteError::AdnlReadError(e), - AdnlError::WriteError(e) => LiteError::AdnlWriteError(e), - AdnlError::ConsumeError(_) => unreachable!(), - AdnlError::IntegrityError => LiteError::AdnlIntegrityError, - AdnlError::TooShortPacket => LiteError::AdnlTooShortPacketError, - })?; - Ok(Self { client }) - } - - pub fn lite_query<'tl, R, U>( - &mut self, - request: R, - response: &'tl mut Vec, - ) -> LiteResult - where - R: TlWrite + Debug, - U: TlRead<'tl> + Debug, - { - log::debug!("liteapi request:\n{:#?}", request); - - // pack lite api query - let mut message = tl_proto::serialize(tl_types::Message::Query { - query_id: (tl_types::Int256(rand::random())), - query: (tl_proto::serialize(tl_types::Query { - data: (tl_proto::serialize(request)), - })), - }); - - // send over ADNL - self.client - .send(&mut message, &mut rand::random()) - .map_err(|e| match e { - AdnlError::WriteError(x) => LiteError::AdnlWriteError(x), - _ => unreachable!(), - })?; - - // get response over ADNL - self.client - .receive::<_, 8192>(response) - .map_err(|e| match e { - AdnlError::ReadError(e) => LiteError::AdnlReadError(e), - AdnlError::IntegrityError => LiteError::AdnlIntegrityError, - AdnlError::TooShortPacket => LiteError::AdnlTooShortPacketError, - _ => unreachable!(), - })?; - - // deserialize adnl.Message - let data = tl_proto::deserialize::(response) - .map_err(|e| LiteError::TlError(e))?; - match data { - tl_types::Message::Answer { - query_id: _, - answer, - } => { - *response = answer; - } - msg => { - log::error!("Got wrong adnl.Message type from server, expected adnl.message.answer:\n{:#?}", msg); - return Err(LiteError::NotLiteAnswer); - } - } - - // deserialize actual answer or deserialize error if any - let result = tl_proto::deserialize::(response).or_else(|e| { - if let TlError::UnknownConstructor = e { - let err = tl_proto::deserialize::(response) - .map_err(|e| LiteError::TlError(e))?; - log::debug!("liteapi response error: {:?}", err); - Err(LiteError::ServerError(err)) - } else { - Err(LiteError::TlError(e)) - } - })?; - - log::debug!("liteapi response ok:\n{:#?}", result); - Ok(result) - } - - pub fn get_masterchain_info(&mut self) -> LiteResult { - let mut response = Vec::::new(); - self.lite_query(tl_types::GetMasterchainInfo, &mut response) - } - - pub fn get_masterchain_info_ext( - &mut self, - mode: i32, - ) -> LiteResult { - let mut response = Vec::::new(); - self.lite_query(tl_types::GetMasterchainInfoExt { mode }, &mut response) - } - - pub fn get_time(&mut self) -> LiteResult { - let mut response = Vec::::new(); - self.lite_query(tl_types::GetTime, &mut response) - } - - pub fn get_version(&mut self) -> LiteResult { - let mut response = Vec::::new(); - self.lite_query(tl_types::GetVersion, &mut response) - } - - pub fn get_block( - &mut self, - id: tl_types::BlockIdExt, - ) -> LiteResult { - let mut response = Vec::::new(); - self.lite_query(tl_types::GetBlock { id }, &mut response) - } - - pub fn get_state( - &mut self, - id: tl_types::BlockIdExt, - ) -> LiteResult { - let mut response = Vec::::new(); - self.lite_query(tl_types::GetState { id }, &mut response) - } - - pub fn get_block_header( - &mut self, - id: tl_types::BlockIdExt, - mode: i32, - ) -> LiteResult { - let mut response = Vec::::new(); - self.lite_query(tl_types::GetBlockHeader { id, mode }, &mut response) - } - - pub fn send_message(&mut self, body: Vec) -> LiteResult { - let mut response = Vec::::new(); - self.lite_query(tl_types::SendMessage { body }, &mut response) - } - - pub fn get_account_state( - &mut self, - id: tl_types::BlockIdExt, - account: tl_types::AccountId, - ) -> LiteResult { - let mut response = Vec::::new(); - self.lite_query(tl_types::GetAccountState { id, account }, &mut response) - } - - pub fn run_smc_method( - &mut self, - id: tl_types::BlockIdExt, - account: tl_types::AccountId, - method_id: i64, - params: Vec, - ) -> LiteResult { - let mut response = Vec::::new(); - self.lite_query( - tl_types::RunSmcMethod { - mode: (), - id, - account, - method_id, - params, - }, - &mut response, - ) - } - - pub fn get_shard_info( - &mut self, - id: tl_types::BlockIdExt, - workchain: i32, - shard: u64, - exact: bool, - ) -> LiteResult { - let mut response = Vec::::new(); - self.lite_query( - tl_types::GetShardInfo { - id, - workchain, - shard, - exact, - }, - &mut response, - ) - } - - pub fn get_all_shards_info( - &mut self, - id: tl_types::BlockIdExt, - ) -> LiteResult { - let mut response = Vec::::new(); - self.lite_query(tl_types::GetAllShardsInfo { id }, &mut response) - } - - pub fn get_one_transaction( - &mut self, - id: tl_types::BlockIdExt, - account: tl_types::AccountId, - lt: i64, - ) -> LiteResult { - let mut response = Vec::::new(); - self.lite_query( - tl_types::GetOneTransaction { id, account, lt }, - &mut response, - ) - } - - pub fn get_transactions( - &mut self, - count: i32, - account: tl_types::AccountId, - lt: i64, - hash: tl_types::Int256, - ) -> LiteResult { - let mut response = Vec::::new(); - self.lite_query( - tl_types::GetTransactions { - count, - account, - lt, - hash, - }, - &mut response, - ) - } - - pub fn lookup_block( - &mut self, - id: tl_types::BlockId, - lt: Option, - utime: Option, - ) -> LiteResult { - let trash = if lt.is_none() && utime.is_none() { - Some(0u8) - } else { - None - }; - let mut response = Vec::::new(); - self.lite_query( - tl_types::LookupBlock { - mode: (), - trash, - id, - lt, - utime, - }, - &mut response, - ) - } - - pub fn list_block_transactions( - &mut self, - id: tl_types::BlockIdExt, - count: i32, - after: Option, - reverse_order: Option, - want_proof: Option, - ) -> LiteResult { - let mut response = Vec::::new(); - self.lite_query( - tl_types::ListBlockTransactions { - id, - mode: (), - count, - after, - reverse_order, - want_proof, - }, - &mut response, - ) - } - - pub fn get_block_proof( - &mut self, - known_block: tl_types::BlockIdExt, - target_block: Option, - ) -> LiteResult { - let mut response = Vec::::new(); - self.lite_query( - tl_types::GetBlockProof { - mode: (), - known_block, - target_block, - }, - &mut response, - ) - } - - pub fn get_config_all( - &mut self, - mode: i32, - id: tl_types::BlockIdExt, - ) -> LiteResult { - let mut response = Vec::::new(); - self.lite_query(tl_types::GetConfigAll { mode, id }, &mut response) - } - - pub fn get_config_params( - &mut self, - mode: i32, - id: tl_types::BlockIdExt, - param_list: Vec, - ) -> LiteResult { - let mut response = Vec::::new(); - self.lite_query( - tl_types::GetConfigParams { - mode, - id, - param_list, - }, - &mut response, - ) - } - - pub fn get_validator_stats( - &mut self, - id: tl_types::BlockIdExt, - limit: i32, - start_after: Option, - modified_after: Option, - ) -> LiteResult { - let mut response = Vec::::new(); - self.lite_query( - tl_types::GetValidatorStats { - mode: (), - id, - limit, - start_after, - modified_after, - }, - &mut response, - ) - } - } -} +pub mod protocol; \ No newline at end of file diff --git a/liteapi/src/protocol.rs b/liteapi/src/protocol.rs new file mode 100644 index 0000000..5219598 --- /dev/null +++ b/liteapi/src/protocol.rs @@ -0,0 +1,147 @@ +use adnl::AdnlError; +use tl_proto::TlError; +use tower_service::Service; +use thiserror::Error; + +use crate::tl_types::*; + +pub enum LiteRequest { + GetMasterchainInfo, + GetMasterchainInfoExt(GetMasterchainInfoExt), + GetTime, + GetVersion, + GetBlock(GetBlock), + GetState(GetState), + GetBlockHeader(GetBlockHeader), + SendMessage(SendMessage), + GetAccountState(GetAccountState), + RunSmcMethod(RunSmcMethod), + GetShardInfo(GetShardInfo), + GetAllShardsInfo(GetAllShardsInfo), + GetOneTransaction(GetOneTransaction), + GetTransactions(GetTransactions), + LookupBlock(LookupBlock), + ListBlockTransactions(ListBlockTransactions), + GetBlockProof(GetBlockProof), + GetConfigAll(GetConfigAll), + GetConfigParams(GetConfigParams), + GetValidatorStats(GetValidatorStats), +} + +impl LiteRequest { + pub fn serialize(&self) -> Vec { + match self { + LiteRequest::GetMasterchainInfo => tl_proto::serialize(GetMasterchainInfo), + LiteRequest::GetMasterchainInfoExt(req) => tl_proto::serialize(req), + LiteRequest::GetTime => tl_proto::serialize(GetTime), + LiteRequest::GetVersion => tl_proto::serialize(GetVersion), + LiteRequest::GetBlock(req) => tl_proto::serialize(req), + LiteRequest::GetState(req) => tl_proto::serialize(req), + LiteRequest::GetBlockHeader(req) => tl_proto::serialize(req), + LiteRequest::SendMessage(req) => tl_proto::serialize(req), + LiteRequest::GetAccountState(req) => tl_proto::serialize(req), + LiteRequest::RunSmcMethod(req) => tl_proto::serialize(req), + LiteRequest::GetShardInfo(req) => tl_proto::serialize(req), + LiteRequest::GetAllShardsInfo(req) => tl_proto::serialize(req), + LiteRequest::GetOneTransaction(req) => tl_proto::serialize(req), + LiteRequest::GetTransactions(req) => tl_proto::serialize(req), + LiteRequest::LookupBlock(req) => tl_proto::serialize(req), + LiteRequest::ListBlockTransactions(req) => tl_proto::serialize(req), + LiteRequest::GetBlockProof(req) => tl_proto::serialize(req), + LiteRequest::GetConfigAll(req) => tl_proto::serialize(req), + LiteRequest::GetConfigParams(req) => tl_proto::serialize(req), + LiteRequest::GetValidatorStats(req) => tl_proto::serialize(req), + } + } + + pub fn deserialize(buf: &[u8]) -> Result { + let data = tl_proto::deserialize::(response) + .map_err(|e| LiteError::TlError(e))?; + match data { + tl_types::Message::Answer { + query_id: _, + answer, + } => { + *response = answer; + } + msg => { + log::error!("Got wrong adnl.Message type from server, expected adnl.message.answer:\n{:#?}", msg); + return Err(LiteError::NotLiteAnswer); + } + } + + // deserialize actual answer or deserialize error if any + let result = tl_proto::deserialize::(response).or_else(|e| { + if let TlError::UnknownConstructor = e { + let err = tl_proto::deserialize::(response) + .map_err(|e| LiteError::TlError(e))?; + log::debug!("liteapi response error: {:?}", err); + Err(LiteError::ServerError(err)) + } else { + Err(LiteError::TlError(e)) + } + })?; + } +} + +pub enum LiteResponse { + MasterchainInfo(MasterchainInfo), + MasterchainInfoExt(MasterchainInfoExt), + CurrentTime(CurrentTime), + Version(Version), + BlockData(BlockData), + BlockState(BlockState), + BlockHeader(BlockHeader), + SendMsgStatus(SendMsgStatus), + AccountState(AccountState), + RunMethodResult(RunMethodResult), + ShardInfo(ShardInfo), + AllShardsInfo(AllShardsInfo), + TransactionInfo(TransactionInfo), + TransactionList(TransactionList), + BlockTransactions(BlockTransactions), + PartialBlockProof(PartialBlockProof), + ConfigInfo(ConfigInfo), + ValidatorStats(ValidatorStats), +} + +impl LiteResponse { + pub fn serialize(&self) -> Vec { + match self { + LiteResponse::MasterchainInfo(req) => tl_proto::serialize(req), + LiteResponse::MasterchainInfoExt(req) => tl_proto::serialize(req), + LiteResponse::CurrentTime(req) => tl_proto::serialize(req), + LiteResponse::Version(req) => tl_proto::serialize(req), + LiteResponse::BlockData(req) => tl_proto::serialize(req), + LiteResponse::BlockState(req) => tl_proto::serialize(req), + LiteResponse::BlockHeader(req) => tl_proto::serialize(req), + LiteResponse::SendMsgStatus(req) => tl_proto::serialize(req), + LiteResponse::AccountState(req) => tl_proto::serialize(req), + LiteResponse::RunMethodResult(req) => tl_proto::serialize(req), + LiteResponse::ShardInfo(req) => tl_proto::serialize(req), + LiteResponse::AllShardsInfo(req) => tl_proto::serialize(req), + LiteResponse::TransactionInfo(req) => tl_proto::serialize(req), + LiteResponse::TransactionList(req) => tl_proto::serialize(req), + LiteResponse::BlockTransactions(req) => tl_proto::serialize(req), + LiteResponse::PartialBlockProof(req) => tl_proto::serialize(req), + LiteResponse::ConfigInfo(req) => tl_proto::serialize(req), + LiteResponse::ValidatorStats(req) => tl_proto::serialize(req), + } + } +} + +#[derive(Debug, Error)] +pub enum LiteError { + #[error("Liteserver error")] + ServerError(Error), + #[error("TL parsing error")] + TlError(TlError), + #[error("Unexpected TL message")] + UnexpectedMessage, + #[error("ADNL error")] + AdnlError(AdnlError), + #[error(transparent)] + OtherError(#[from] Error), +} + +pub trait LiteService: Service{} diff --git a/liteapi/src/tl_types.rs b/liteapi/src/tl_types.rs index 2aac50e..796e53b 100644 --- a/liteapi/src/tl_types.rs +++ b/liteapi/src/tl_types.rs @@ -718,8 +718,8 @@ pub struct LookupBlock { #[tl(flags)] pub mode: (), pub id: BlockId, - #[tl(skip, flags_bit = "mode.0")] - pub trash: Option, + //#[tl(skip, flags_bit = "mode.0")] + //pub trash: Option, #[tl(flags_bit = "mode.1")] pub lt: Option, #[tl(flags_bit = "mode.2")] From fb434c05a487a34609fd793532b55a15dafef687 Mon Sep 17 00:00:00 2001 From: Vladimir Lebedev Date: Thu, 14 Mar 2024 18:11:48 +0700 Subject: [PATCH 02/28] work on request/response TL serialization --- liteapi/src/protocol.rs | 18 +++++++----------- liteapi/src/tl_types.rs | 1 - 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/liteapi/src/protocol.rs b/liteapi/src/protocol.rs index 5219598..288b88b 100644 --- a/liteapi/src/protocol.rs +++ b/liteapi/src/protocol.rs @@ -55,20 +55,16 @@ impl LiteRequest { } pub fn deserialize(buf: &[u8]) -> Result { - let data = tl_proto::deserialize::(response) - .map_err(|e| LiteError::TlError(e))?; - match data { - tl_types::Message::Answer { - query_id: _, - answer, - } => { - *response = answer; - } + let data = tl_proto::deserialize::(buf).map_err(|e| LiteError::TlError(e))?; + let (query_id, answer) = match data { + Message::Answer { query_id, answer } => (query_id, answer), msg => { log::error!("Got wrong adnl.Message type from server, expected adnl.message.answer:\n{:#?}", msg); - return Err(LiteError::NotLiteAnswer); + return Err(LiteError::UnexpectedMessage); } - } + }; + + tl_proto::deserialize(packet) // deserialize actual answer or deserialize error if any let result = tl_proto::deserialize::(response).or_else(|e| { diff --git a/liteapi/src/tl_types.rs b/liteapi/src/tl_types.rs index 796e53b..55bc6f8 100644 --- a/liteapi/src/tl_types.rs +++ b/liteapi/src/tl_types.rs @@ -7,7 +7,6 @@ use tl_proto::{TlRead, TlWrite}; /// true = True; #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] -#[tl(boxed, id = "true", scheme_inline = r##"true = True;"##)] pub struct True; pub fn fmt_string(bytes: &[u8], f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { From 069f5321152075633304b9c9f2c7adf75d6a3da9 Mon Sep 17 00:00:00 2001 From: Vladimir Lebedev Date: Wed, 20 Mar 2024 17:41:34 +0700 Subject: [PATCH 03/28] work on server --- Cargo.lock | 197 ++++++- liteapi/Cargo.toml | 13 +- liteapi/examples/time.rs | 16 + liteapi/src/client.rs | 47 ++ liteapi/src/lib.rs | 6 +- liteapi/src/protocol.rs | 143 ----- liteapi/src/server.rs | 94 ++++ liteapi/src/tl/adnl.rs | 24 + liteapi/src/tl/common.rs | 186 +++++++ liteapi/src/tl/mod.rs | 32 ++ liteapi/src/tl/request.rs | 203 +++++++ liteapi/src/tl/response.rs | 206 ++++++++ liteapi/src/tl/utils.rs | 33 ++ liteapi/src/tl_types.rs | 853 ------------------------------ liteapi/src/types.rs | 22 + liteapi/tests/config_test.rs | 993 ----------------------------------- liteapi/tests/rpc_test.rs | 512 ------------------ liteapi/tests/sample.txt | 1 - 18 files changed, 1066 insertions(+), 2515 deletions(-) create mode 100644 liteapi/examples/time.rs create mode 100644 liteapi/src/client.rs delete mode 100644 liteapi/src/protocol.rs create mode 100644 liteapi/src/server.rs create mode 100644 liteapi/src/tl/adnl.rs create mode 100644 liteapi/src/tl/common.rs create mode 100644 liteapi/src/tl/mod.rs create mode 100644 liteapi/src/tl/request.rs create mode 100644 liteapi/src/tl/response.rs create mode 100644 liteapi/src/tl/utils.rs delete mode 100644 liteapi/src/tl_types.rs create mode 100644 liteapi/src/types.rs delete mode 100644 liteapi/tests/config_test.rs delete mode 100644 liteapi/tests/rpc_test.rs delete mode 100644 liteapi/tests/sample.txt diff --git a/Cargo.lock b/Cargo.lock index 3d68e4e..b040e3c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -89,7 +89,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi", + "hermit-abi 0.1.19", "libc", "winapi", ] @@ -439,6 +439,30 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "pin-utils", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -487,6 +511,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + [[package]] name = "hex" version = "0.4.3" @@ -578,6 +608,16 @@ version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + [[package]] name = "log" version = "0.4.21" @@ -619,6 +659,16 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi 0.3.9", + "libc", +] + [[package]] name = "object" version = "0.32.2" @@ -640,6 +690,29 @@ version = "6.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.48.5", +] + [[package]] name = "percent-encoding" version = "2.3.1" @@ -691,12 +764,38 @@ dependencies = [ "sha2", ] +[[package]] +name = "pin-project" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.52", +] + [[package]] name = "pin-project-lite" version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + [[package]] name = "platforms" version = "3.3.0" @@ -787,6 +886,15 @@ dependencies = [ "getrandom", ] +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags", +] + [[package]] name = "regex" version = "1.10.3" @@ -889,6 +997,12 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + [[package]] name = "semver" version = "1.0.22" @@ -960,6 +1074,15 @@ dependencies = [ "digest", ] +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + [[package]] name = "smallvec" version = "1.13.1" @@ -1069,8 +1192,7 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tl-proto" version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3418163db528cc2324ed7bc9d52aa3ca7a8f73d685f8b21b319d2a08ee4b36d3" +source = "git+https://github.com/hacker-volodya/tl-proto#83a9987a8d828528459914b56f4e0eec1c00c6e5" dependencies = [ "bytes", "digest", @@ -1083,8 +1205,7 @@ dependencies = [ [[package]] name = "tl-proto-proc" version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3f51de4865e0618b187c2b790c137de938d01fe5510116b959387b6133c20ac" +source = "git+https://github.com/hacker-volodya/tl-proto#83a9987a8d828528459914b56f4e0eec1c00c6e5" dependencies = [ "proc-macro2", "quote", @@ -1096,8 +1217,7 @@ dependencies = [ [[package]] name = "tl-scheme" version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfb36e00e1c6be44d5ed8b2be322667f8ad4955387375c0cf617c542e01a56" +source = "git+https://github.com/hacker-volodya/tl-proto#83a9987a8d828528459914b56f4e0eec1c00c6e5" dependencies = [ "crc", "pest", @@ -1116,23 +1236,42 @@ dependencies = [ "bytes", "libc", "mio", + "num_cpus", + "parking_lot", "pin-project-lite", + "signal-hook-registry", "socket2", + "tokio-macros", "windows-sys 0.48.0", ] +[[package]] +name = "tokio-macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.52", +] + [[package]] name = "ton_liteapi" version = "0.1.0" dependencies = [ "adnl 1.0.0", + "base64 0.13.1", "derivative", "hex", "log", + "rand", "thiserror", "tl-proto", "tokio", - "tower-service", + "tower", + "ureq", + "x25519-dalek", ] [[package]] @@ -1145,12 +1284,54 @@ dependencies = [ "serde_with", ] +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + [[package]] name = "tower-service" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "log", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + [[package]] name = "typenum" version = "1.17.0" diff --git a/liteapi/Cargo.toml b/liteapi/Cargo.toml index 72c58a6..a179198 100644 --- a/liteapi/Cargo.toml +++ b/liteapi/Cargo.toml @@ -4,11 +4,18 @@ version = "0.1.0" edition = "2021" [dependencies] -adnl = { git = "https://github.com/tonstack/adnl-rs", branch = "server" } -tl-proto = "0.4.2" +adnl = { git = "https://github.com/tonstack/adnl-rs", branch = "server", features = ["dalek"] } +tl-proto = { git = "https://github.com/hacker-volodya/tl-proto" } derivative = "2.2.0" log = '0.4.14' hex = "0.4.3" thiserror = "1" tokio = { version = "1.36", features = ["net", "io-util"] } -tower-service = "0.3.2" \ No newline at end of file +tower = { version = "0.4.13", features = ["make", "util"] } +rand = "0.8.5" + +[dev-dependencies] +ureq = "2.4.0" +base64 = "0.13.0" +x25519-dalek = { version = "2.0.1", features = ["static_secrets"] } +tokio = { version = "1.36", features = ["full"] } \ No newline at end of file diff --git a/liteapi/examples/time.rs b/liteapi/examples/time.rs new file mode 100644 index 0000000..c7fb16b --- /dev/null +++ b/liteapi/examples/time.rs @@ -0,0 +1,16 @@ +use adnl::AdnlRawPublicKey; +use ton_liteapi::{client::SingleClient, tl::request::{Request, WrappedRequest}}; +use x25519_dalek::StaticSecret; + +#[tokio::main] +async fn main() -> Result<(), Box> { + // decode liteserver public key + let server_public = AdnlRawPublicKey::try_from(&*base64::decode("JhXt7H1dZTgxQTIyGiYV4f9VUARuDxFl/1kVBjLSMB8=")?)?; + + let ls_ip = "65.21.74.140"; + let ls_port = 46427; + let mut client = SingleClient::connect((ls_ip, ls_port), &StaticSecret::random_from_rng(rand::thread_rng()), &server_public).await?; + let result = client.query(WrappedRequest { wait_masterchain_seqno: None, request: Request::GetTime }).await?; + println!("{:?}", result); + Ok(()) +} \ No newline at end of file diff --git a/liteapi/src/client.rs b/liteapi/src/client.rs new file mode 100644 index 0000000..a422ef6 --- /dev/null +++ b/liteapi/src/client.rs @@ -0,0 +1,47 @@ +use adnl::{AdnlBuilder, AdnlPeer, AdnlPrivateKey, AdnlPublicKey}; +use tokio::{io::{AsyncReadExt, AsyncWriteExt}, net::ToSocketAddrs}; + +use crate::{tl::{adnl::Message, common::Int256, request::{Query, WrappedRequest}, response::Response}, types::LiteError}; + +pub struct SingleClient { + peer: AdnlPeer +} + +impl SingleClient { + pub fn from_adnl(peer: AdnlPeer) -> Self { + Self { peer } + } + + pub async fn connect_over_transport(transport: T, client_private: &S, server_public: &P) -> Result where S: AdnlPrivateKey, P: AdnlPublicKey { + let peer = AdnlBuilder::with_random_aes_params(&mut rand::rngs::OsRng) + .perform_ecdh(client_private, server_public) + .perform_handshake(transport) + .await + .map_err(|e| LiteError::AdnlError(e))?; + Ok(Self::from_adnl(peer)) + } + + pub async fn query(&mut self, request: WrappedRequest) -> Result { + let query_id = Int256::random(); + let query = Message::Query { query_id: query_id.clone(), query: Query { wrapped_request: request } }; + self.peer.send(&mut tl_proto::serialize(query)).await.map_err(|e| LiteError::AdnlError(e))?; + let mut answer = Vec::with_capacity(8192); + self.peer.receive(&mut answer).await.map_err(|e| LiteError::AdnlError(e))?; + let message = tl_proto::deserialize::(&answer).map_err(|e| LiteError::TlError(e))?; + if let Message::Answer { answer: response, query_id: recv_query_id } = message { + if query_id != recv_query_id { + return Err(LiteError::UnexpectedMessage); + } + Ok(response) + } else { + Err(LiteError::UnexpectedMessage) + } + } +} + +impl SingleClient { + pub async fn connect(addr: A, client_private: &S, server_public: &P) -> Result where A: ToSocketAddrs, P: AdnlPublicKey, S: AdnlPrivateKey { + let tcp = tokio::net::TcpStream::connect(addr).await.map_err(|e| LiteError::IoError(e))?; + Self::connect_over_transport(tcp, client_private, server_public).await + } +} \ No newline at end of file diff --git a/liteapi/src/lib.rs b/liteapi/src/lib.rs index ac71e84..8a5f0f6 100644 --- a/liteapi/src/lib.rs +++ b/liteapi/src/lib.rs @@ -1,2 +1,4 @@ -pub mod tl_types; -pub mod protocol; \ No newline at end of file +pub mod tl; +pub mod types; +pub mod client; +pub mod server; \ No newline at end of file diff --git a/liteapi/src/protocol.rs b/liteapi/src/protocol.rs deleted file mode 100644 index 288b88b..0000000 --- a/liteapi/src/protocol.rs +++ /dev/null @@ -1,143 +0,0 @@ -use adnl::AdnlError; -use tl_proto::TlError; -use tower_service::Service; -use thiserror::Error; - -use crate::tl_types::*; - -pub enum LiteRequest { - GetMasterchainInfo, - GetMasterchainInfoExt(GetMasterchainInfoExt), - GetTime, - GetVersion, - GetBlock(GetBlock), - GetState(GetState), - GetBlockHeader(GetBlockHeader), - SendMessage(SendMessage), - GetAccountState(GetAccountState), - RunSmcMethod(RunSmcMethod), - GetShardInfo(GetShardInfo), - GetAllShardsInfo(GetAllShardsInfo), - GetOneTransaction(GetOneTransaction), - GetTransactions(GetTransactions), - LookupBlock(LookupBlock), - ListBlockTransactions(ListBlockTransactions), - GetBlockProof(GetBlockProof), - GetConfigAll(GetConfigAll), - GetConfigParams(GetConfigParams), - GetValidatorStats(GetValidatorStats), -} - -impl LiteRequest { - pub fn serialize(&self) -> Vec { - match self { - LiteRequest::GetMasterchainInfo => tl_proto::serialize(GetMasterchainInfo), - LiteRequest::GetMasterchainInfoExt(req) => tl_proto::serialize(req), - LiteRequest::GetTime => tl_proto::serialize(GetTime), - LiteRequest::GetVersion => tl_proto::serialize(GetVersion), - LiteRequest::GetBlock(req) => tl_proto::serialize(req), - LiteRequest::GetState(req) => tl_proto::serialize(req), - LiteRequest::GetBlockHeader(req) => tl_proto::serialize(req), - LiteRequest::SendMessage(req) => tl_proto::serialize(req), - LiteRequest::GetAccountState(req) => tl_proto::serialize(req), - LiteRequest::RunSmcMethod(req) => tl_proto::serialize(req), - LiteRequest::GetShardInfo(req) => tl_proto::serialize(req), - LiteRequest::GetAllShardsInfo(req) => tl_proto::serialize(req), - LiteRequest::GetOneTransaction(req) => tl_proto::serialize(req), - LiteRequest::GetTransactions(req) => tl_proto::serialize(req), - LiteRequest::LookupBlock(req) => tl_proto::serialize(req), - LiteRequest::ListBlockTransactions(req) => tl_proto::serialize(req), - LiteRequest::GetBlockProof(req) => tl_proto::serialize(req), - LiteRequest::GetConfigAll(req) => tl_proto::serialize(req), - LiteRequest::GetConfigParams(req) => tl_proto::serialize(req), - LiteRequest::GetValidatorStats(req) => tl_proto::serialize(req), - } - } - - pub fn deserialize(buf: &[u8]) -> Result { - let data = tl_proto::deserialize::(buf).map_err(|e| LiteError::TlError(e))?; - let (query_id, answer) = match data { - Message::Answer { query_id, answer } => (query_id, answer), - msg => { - log::error!("Got wrong adnl.Message type from server, expected adnl.message.answer:\n{:#?}", msg); - return Err(LiteError::UnexpectedMessage); - } - }; - - tl_proto::deserialize(packet) - - // deserialize actual answer or deserialize error if any - let result = tl_proto::deserialize::(response).or_else(|e| { - if let TlError::UnknownConstructor = e { - let err = tl_proto::deserialize::(response) - .map_err(|e| LiteError::TlError(e))?; - log::debug!("liteapi response error: {:?}", err); - Err(LiteError::ServerError(err)) - } else { - Err(LiteError::TlError(e)) - } - })?; - } -} - -pub enum LiteResponse { - MasterchainInfo(MasterchainInfo), - MasterchainInfoExt(MasterchainInfoExt), - CurrentTime(CurrentTime), - Version(Version), - BlockData(BlockData), - BlockState(BlockState), - BlockHeader(BlockHeader), - SendMsgStatus(SendMsgStatus), - AccountState(AccountState), - RunMethodResult(RunMethodResult), - ShardInfo(ShardInfo), - AllShardsInfo(AllShardsInfo), - TransactionInfo(TransactionInfo), - TransactionList(TransactionList), - BlockTransactions(BlockTransactions), - PartialBlockProof(PartialBlockProof), - ConfigInfo(ConfigInfo), - ValidatorStats(ValidatorStats), -} - -impl LiteResponse { - pub fn serialize(&self) -> Vec { - match self { - LiteResponse::MasterchainInfo(req) => tl_proto::serialize(req), - LiteResponse::MasterchainInfoExt(req) => tl_proto::serialize(req), - LiteResponse::CurrentTime(req) => tl_proto::serialize(req), - LiteResponse::Version(req) => tl_proto::serialize(req), - LiteResponse::BlockData(req) => tl_proto::serialize(req), - LiteResponse::BlockState(req) => tl_proto::serialize(req), - LiteResponse::BlockHeader(req) => tl_proto::serialize(req), - LiteResponse::SendMsgStatus(req) => tl_proto::serialize(req), - LiteResponse::AccountState(req) => tl_proto::serialize(req), - LiteResponse::RunMethodResult(req) => tl_proto::serialize(req), - LiteResponse::ShardInfo(req) => tl_proto::serialize(req), - LiteResponse::AllShardsInfo(req) => tl_proto::serialize(req), - LiteResponse::TransactionInfo(req) => tl_proto::serialize(req), - LiteResponse::TransactionList(req) => tl_proto::serialize(req), - LiteResponse::BlockTransactions(req) => tl_proto::serialize(req), - LiteResponse::PartialBlockProof(req) => tl_proto::serialize(req), - LiteResponse::ConfigInfo(req) => tl_proto::serialize(req), - LiteResponse::ValidatorStats(req) => tl_proto::serialize(req), - } - } -} - -#[derive(Debug, Error)] -pub enum LiteError { - #[error("Liteserver error")] - ServerError(Error), - #[error("TL parsing error")] - TlError(TlError), - #[error("Unexpected TL message")] - UnexpectedMessage, - #[error("ADNL error")] - AdnlError(AdnlError), - #[error(transparent)] - OtherError(#[from] Error), -} - -pub trait LiteService: Service{} diff --git a/liteapi/src/server.rs b/liteapi/src/server.rs new file mode 100644 index 0000000..5f946dc --- /dev/null +++ b/liteapi/src/server.rs @@ -0,0 +1,94 @@ +use std::{convert::Infallible, error::Error, future::poll_fn, net::SocketAddr, time::Duration}; + +use adnl::{AdnlError, AdnlPeer, AdnlPrivateKey}; +use log::error; +use tokio::{io::{self, AsyncReadExt, AsyncWriteExt}, net::{TcpListener, TcpStream}}; +use tower::{Service, MakeService, ServiceExt}; + +use crate::{tl::{adnl::Message, request::{Request, WrappedRequest}, response::Response}, types::{LiteError, LiteService}}; + +pub struct Connection { + peer: AdnlPeer +} + +impl Connection { + pub fn from_adnl(peer: AdnlPeer) -> Self { + Self { peer } + } + + pub async fn from_transport(transport: T, server_private: &S) -> Result where S: AdnlPrivateKey { + Ok(Self { peer: AdnlPeer::handle_handshake(transport, server_private).await? }) + } +} + +async fn handle_request(service: &mut LS, peer: &mut AdnlPeer) -> Result<(), Box> { + let mut buffer = Vec::with_capacity(8192); + let size = peer.receive(&mut buffer).await?; + let message = tl_proto::deserialize::(&buffer[..size])?; + if let Message::Query { query_id, query } = message { + let response = service.ready().await?.call(query.wrapped_request).await?; + let answer = Message::Answer { query_id, answer: response }; + peer.send(&mut tl_proto::serialize(answer)).await?; + Ok(()) + } + else { + Err(LiteError::UnexpectedMessage.into()) + } +} + +pub async fn serve(listener: TcpListener, make_service: M, private_key: &S) -> Result<(), Box> where M: MakeService, M::Service: LiteService, S: AdnlPrivateKey { + loop { + let (socket, remote_addr) = match tcp_accept(&listener).await { + Some(x) => x, + None => continue, + }; + poll_fn(|cx| make_service.poll_ready(cx)).await?; + + let service = match make_service.make_service(remote_addr).await { + Ok(service) => service, + Err(_) => continue, + }; + + tokio::spawn(async move { + let mut peer = AdnlPeer::handle_handshake(socket, private_key).await?; + loop { + handle_request(&mut service, &mut peer).await; + } + }); + } +} + +fn is_connection_error(e: &io::Error) -> bool { + matches!( + e.kind(), + io::ErrorKind::ConnectionRefused + | io::ErrorKind::ConnectionAborted + | io::ErrorKind::ConnectionReset + ) +} + +async fn tcp_accept(listener: &TcpListener) -> Option<(TcpStream, SocketAddr)> { + match listener.accept().await { + Ok(conn) => Some(conn), + Err(e) => { + if is_connection_error(&e) { + return None; + } + + // [From `hyper::Server` in 0.14](https://github.com/hyperium/hyper/blob/v0.14.27/src/server/tcp.rs#L186) + // + // > A possible scenario is that the process has hit the max open files + // > allowed, and so trying to accept a new connection will fail with + // > `EMFILE`. In some cases, it's preferable to just wait for some time, if + // > the application will likely close some files (or connections), and try + // > to accept the connection again. If this option is `true`, the error + // > will be logged at the `error` level, since it is still a big deal, + // > and then the listener will sleep for 1 second. + // + // hyper allowed customizing this but axum does not. + error!("accept error: {e}"); + tokio::time::sleep(Duration::from_secs(1)).await; + None + } + } +} \ No newline at end of file diff --git a/liteapi/src/tl/adnl.rs b/liteapi/src/tl/adnl.rs new file mode 100644 index 0000000..3f88b93 --- /dev/null +++ b/liteapi/src/tl/adnl.rs @@ -0,0 +1,24 @@ +use derivative::Derivative; +use tl_proto::{TlRead, TlWrite}; + +use super::request::Query; +use super::response::Response; +use super::common::*; +use super::utils::*; + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +#[tl( + boxed, + scheme_inline = r##"adnl.message.query query_id:int256 query:bytes = adnl.Message; + adnl.message.answer query_id:int256 answer:bytes = adnl.Message;"## +)] +pub enum Message { + /// adnl.message.query query_id:int256 query:bytes = adnl.Message; + #[tl(id = "adnl.message.query")] + Query { query_id: Int256, #[tl(with = "struct_as_bytes")] query: Query }, + + /// adnl.message.answer query_id:int256 answer:bytes = adnl.Message; + #[tl(id = "adnl.message.answer")] + Answer { query_id: Int256, #[tl(with = "struct_as_bytes")] answer: Response }, +} \ No newline at end of file diff --git a/liteapi/src/tl/common.rs b/liteapi/src/tl/common.rs new file mode 100644 index 0000000..66bef96 --- /dev/null +++ b/liteapi/src/tl/common.rs @@ -0,0 +1,186 @@ +use core::fmt; +use std::str::FromStr; + +use derivative::Derivative; +use hex::FromHex; +use tl_proto::{TlRead, TlWrite}; +use super::utils::*; + +/// true = True; +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct True; + +/// string ? = String; +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct String(#[derivative(Debug(format_with = "fmt_string"))] Vec); + +impl fmt::Display for String { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "{}", + std::string::String::from_utf8(self.0.clone()).unwrap() + ) + } +} + +impl String { + pub fn new(str: std::string::String) -> Self { + Self(str.into_bytes()) + } +} + +/// int256 8*[ int ] = Int256; +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct Int256(#[derivative(Debug(format_with = "fmt_bytes"))] pub [u8; 32]); + +impl FromStr for Int256 { + fn from_str(s: &str) -> Result { + Self::from_hex(s) + } + type Err = hex::FromHexError; +} + +impl ToString for Int256 { + fn to_string(&self) -> std::string::String { + hex::encode(self.0) + } +} + +impl Int256 { + pub fn to_hex(&self) -> std::string::String { + hex::encode(self.0) + } + + pub fn from_hex(s: &str) -> Result { + Ok(Int256(<[u8; 32]>::from_hex(s)?)) + } + + pub fn random() -> Self { + Self(rand::random()) + } +} + +/// tonNode.blockId workchain:int shard:long seqno:int = tonNode.BlockId; +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct BlockId { + pub workchain: i32, + pub shard: u64, + pub seqno: u32, +} + +/// tonNode.blockIdExt workchain:int shard:long seqno:int root_hash:int256 file_hash:int256 = tonNode.BlockIdExt; +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct BlockIdExt { + pub workchain: i32, + pub shard: u64, + pub seqno: u32, + pub root_hash: Int256, + pub file_hash: Int256, +} + +impl fmt::Display for BlockIdExt { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "({},{:X},{}):{}:{}", self.workchain, self.shard, self.seqno, self.root_hash.to_string(), self.file_hash.to_string()) + } +} + +/// liteServer.accountId workchain:int id:int256 = liteServer.AccountId; +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct AccountId { + pub workchain: i32, + pub id: Int256, +} + +/// liteServer.transactionId3 account:int256 lt:long = liteServer.TransactionId3; +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +// #[tl(boxed, id = "liteServer.transactionId3", scheme_inline = r##"liteServer.transactionId3 account:int256 lt:long = liteServer.TransactionId3;"##)] +pub struct TransactionId3 { + pub account: Int256, + pub lt: i64, +} + +/// liteServer.signature node_id_short:int256 signature:bytes = liteServer.Signature; +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +// #[tl(boxed, id = "liteServer.signature", scheme_inline = r##"liteServer.signature node_id_short:int256 signature:bytes = liteServer.Signature;"##)] +pub struct Signature { + pub node_id_short: Int256, + pub signature: Vec, +} + +/// liteServer.signatureSet validator_set_hash:int catchain_seqno:int signatures:(vector liteServer.signature) = liteServer.SignatureSet; +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +#[tl( + boxed, + id = "liteServer.signatureSet", + scheme_inline = r##"liteServer.signatureSet validator_set_hash:int catchain_seqno:int signatures:(vector liteServer.signature) = liteServer.SignatureSet;"## +)] +pub struct SignatureSet { + pub validator_set_hash: i32, + pub catchain_seqno: i32, + pub signatures: Vec, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +#[tl( + boxed, + scheme_inline = r##"liteServer.blockLinkBack to_key_block:Bool from:tonNode.blockIdExt to:tonNode.blockIdExt dest_proof:bytes proof:bytes state_proof:bytes = liteServer.BlockLink; + liteServer.blockLinkForward to_key_block:Bool from:tonNode.blockIdExt to:tonNode.blockIdExt dest_proof:bytes config_proof:bytes signatures:liteServer.SignatureSet = liteServer.BlockLink;"## +)] +pub enum BlockLink { + /// liteServer.blockLinkBack to_key_block:Bool from:tonNode.blockIdExt to:tonNode.blockIdExt dest_proof:bytes proof:bytes state_proof:bytes = liteServer.BlockLink; + #[tl(id = "liteServer.blockLinkBack")] + BlockLinkBack { + to_key_block: bool, + from: BlockIdExt, + to: BlockIdExt, + dest_proof: Vec, + proof: Vec, + state_proof: Vec, + }, + /// liteServer.blockLinkForward to_key_block:Bool from:tonNode.blockIdExt to:tonNode.blockIdExt dest_proof:bytes config_proof:bytes signatures:liteServer.SignatureSet = liteServer.BlockLink; + #[tl(id = "liteServer.blockLinkForward")] + BlockLinkForward { + to_key_block: bool, + from: BlockIdExt, + to: BlockIdExt, + dest_proof: Vec, + config_proof: Vec, + signatures: SignatureSet, + }, +} + +/// tonNode.zeroStateIdExt workchain:int root_hash:int256 file_hash:int256 = tonNode.ZeroStateIdExt; +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct ZeroStateIdExt { + pub workchain: i32, + #[tl(size_hint = 32)] + pub root_hash: Int256, + #[tl(size_hint = 32)] + pub file_hash: Int256, +} + +/// liteServer.transactionId mode:# account:mode.0?int256 lt:mode.1?long hash:mode.2?int256 = liteServer.TransactionId; +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct TransactionId { + #[tl(flags)] + pub mode: (), + #[tl(flags_bit = "mode.0")] + pub account: Option, + #[tl(flags_bit = "mode.1")] + pub lt: Option, + #[tl(flags_bit = "mode.2")] + pub hash: Option, +} \ No newline at end of file diff --git a/liteapi/src/tl/mod.rs b/liteapi/src/tl/mod.rs new file mode 100644 index 0000000..1560e56 --- /dev/null +++ b/liteapi/src/tl/mod.rs @@ -0,0 +1,32 @@ +pub mod adnl; +pub mod common; +pub mod request; +pub mod response; +pub mod utils; + +#[cfg(test)] +mod tests { + use std::error::Error; + + use tests::{adnl::Message, common::Int256, request::WrappedRequest}; + + use crate::tl::*; + + use self::request::Request; + + #[test] + fn test_time() -> Result<(), Box> { + let raw = hex::decode("7af98bb435263e6c95d6fecb497dfd0aa5f031e7d412986b5ce720496db512052e8f2d100cdf068c7904345aad16000000000000")?; + let constructed = tl_proto::serialize(Message::Query { + query_id: Int256::from_hex("35263e6c95d6fecb497dfd0aa5f031e7d412986b5ce720496db512052e8f2d10")?, + query: request::Query { + wrapped_request: WrappedRequest { + request: Request::GetTime, + wait_masterchain_seqno: None, + } + } + }); + assert_eq!(raw, constructed); + Ok(()) + } +} diff --git a/liteapi/src/tl/request.rs b/liteapi/src/tl/request.rs new file mode 100644 index 0000000..83e27c4 --- /dev/null +++ b/liteapi/src/tl/request.rs @@ -0,0 +1,203 @@ +use derivative::Derivative; +use tl_proto::{TlRead, TlWrite}; + +use super::common::*; +use super::utils::*; + +/// liteServer.query data:bytes = Object; +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +#[tl( + boxed, + id = "liteServer.query", + scheme_inline = r##"liteServer.query data:bytes = Object;"## +)] +pub struct Query { + #[tl(with = "struct_as_bytes")] + pub wrapped_request: WrappedRequest, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct WrappedRequest { + #[tl(read_with = "lossy_read")] + pub wait_masterchain_seqno: Option, + pub request: Request, +} + +/// liteServer.query data:bytes = Object; +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +#[tl( + boxed, + id = "liteServer.waitMasterchainSeqno", + scheme_inline = r##"liteServer.waitMasterchainSeqno seqno:int timeout_ms:int = Object;"## +)] +pub struct WaitMasterchainSeqno { + pub seqno: i32, + pub timeout_ms: i32, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +#[tl(boxed)] +pub enum Request { + /// liteServer.getMasterchainInfo = liteServer.MasterchainInfo; + #[tl(id = 0x89b5e62e)] + GetMasterchainInfo, + + /// liteServer.getMasterchainInfoExt mode:# = liteServer.MasterchainInfoExt; + #[tl(id = 0x70a671df)] + GetMasterchainInfoExt { + mode: u32, + }, + + /// liteServer.getTime = liteServer.CurrentTime; + #[tl(id = 0x16ad5a34)] + GetTime, + + /// liteServer.getVersion = liteServer.Version; + #[tl(id = 0x232b940b)] + GetVersion, + + /// liteServer.getBlock id:tonNode.blockIdExt = liteServer.BlockData; + #[tl(id = 0x6377cf0d)] + GetBlock { + id: BlockIdExt, + }, + + /// liteServer.getState id:tonNode.blockIdExt = liteServer.BlockState; + #[tl(id = 0xba6e2eb6)] + GetState { + id: BlockIdExt, + }, + + /// liteServer.getBlockHeader id:tonNode.blockIdExt mode:# = liteServer.BlockHeader; + #[tl(id = 0x21ec069e)] + GetBlockHeader { + id: BlockIdExt, + mode: u32, + }, + + /// liteServer.sendMessage body:bytes = liteServer.SendMsgStatus; + #[tl(id = 0x690ad482)] + SendMessage { + body: Vec, + }, + + /// liteServer.getAccountState id:tonNode.blockIdExt account:liteServer.accountId = liteServer.AccountState; + #[tl(id = 0x6b890e25)] + GetAccountState { + id: BlockIdExt, + account: AccountId, + }, + + /// liteServer.runSmcMethod mode:# id:tonNode.blockIdExt account:liteServer.accountId method_id:long params:bytes = liteServer.RunMethodResult; + #[tl(id = 0x5cc65dd2)] + RunSmcMethod { + mode: u32, + id: BlockIdExt, + account: AccountId, + method_id: i64, + params: Vec, + }, + + /// liteServer.getShardInfo id:tonNode.blockIdExt workchain:int shard:long exact:Bool = liteServer.ShardInfo; + #[tl(id = 0x46a2f425)] + GetShardInfo { + id: BlockIdExt, + workchain: i32, + shard: u64, + exact: bool, + }, + + /// liteServer.getAllShardsInfo id:tonNode.blockIdExt = liteServer.AllShardsInfo; + #[tl(id = 0x74d3fd6b)] + GetAllShardsInfo { + id: BlockIdExt, + }, + + /// liteServer.getOneTransaction id:tonNode.blockIdExt account:liteServer.accountId lt:long = liteServer.TransactionInfo; + #[tl(id = 0xd40f24ea)] + GetOneTransaction { + id: BlockIdExt, + account: AccountId, + lt: i64, + }, + + /// liteServer.getTransactions count:# account:liteServer.accountId lt:long hash:int256 = liteServer.TransactionList; + #[tl(id = 0x1c40e7a1)] + GetTransactions { + count: i32, + account: AccountId, + lt: i64, + hash: Int256, + }, + + /// liteServer.lookupBlock mode:# id:tonNode.blockId lt:mode.1?long utime:mode.2?int = liteServer.BlockHeader; + #[tl(id = 0xfac8f71e)] + LookupBlock { + #[tl(flags)] + mode: (), + id: BlockId, + //#[tl(skip, flags_bit = "mode.0")] + //trash: Option, + #[tl(flags_bit = "mode.1")] + lt: Option, + #[tl(flags_bit = "mode.2")] + utime: Option, + }, + + /// liteServer.listBlockTransactions id:tonNode.blockIdExt mode:# count:# after:mode.7?liteServer.transactionId3 reverse_order:mode.6?true want_proof:mode.5?true = liteServer.BlockTransactions; + #[tl(id = 0xadfcc7da)] + ListBlockTransactions { + id: BlockIdExt, + #[tl(flags)] + mode: (), + count: i32, + #[tl(flags_bit = "mode.7")] + after: Option, + #[tl(flags_bit = "mode.6")] + reverse_order: Option<()>, + #[tl(flags_bit = "mode.5")] + want_proof: Option<()>, + }, + + /// liteServer.getBlockProof mode:# known_block:tonNode.blockIdExt target_block:mode.0?tonNode.blockIdExt = liteServer.PartialBlockProof; + #[tl(id = 0x8aea9c44)] + GetBlockProof { + #[tl(flags)] + mode: (), + known_block: BlockIdExt, + #[tl(flags_bit = "mode.0")] + target_block: Option, + }, + + /// liteServer.getConfigAll mode:# id:tonNode.blockIdExt = liteServer.ConfigInfo; + #[tl(id = 0x911b26b7)] + GetConfigAll { + mode: i32, + id: BlockIdExt, + }, + + /// liteServer.getConfigParams mode:# id:tonNode.blockIdExt param_list:(vector int) = liteServer.ConfigInfo; + #[tl(id = 0x2a111c19)] + GetConfigParams { + mode: i32, + id: BlockIdExt, + param_list: Vec, + }, + + /// liteServer.getValidatorStats#091a58bc mode:# id:tonNode.blockIdExt limit:int start_after:mode.0?int256 modified_after:mode.2?int = liteServer.ValidatorStats; + #[tl(id = 0xe7253699)] + GetValidatorStats { + #[tl(flags)] + mode: (), + id: BlockIdExt, + limit: i32, + #[tl(flags_bit = "mode.0")] + start_after: Option, + #[tl(flags_bit = "mode.2")] + modified_after: Option, + }, +} \ No newline at end of file diff --git a/liteapi/src/tl/response.rs b/liteapi/src/tl/response.rs new file mode 100644 index 0000000..3ac4025 --- /dev/null +++ b/liteapi/src/tl/response.rs @@ -0,0 +1,206 @@ +use derivative::Derivative; +use tl_proto::{TlRead, TlWrite}; + +use super::common::*; +use super::utils::*; + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +#[tl(boxed)] +pub enum Response { + /// liteServer.masterchainInfo last:tonNode.blockIdExt state_root_hash:int256 init:tonNode.zeroStateIdExt = liteServer.MasterchainInfo; + #[tl(id = 0x85832881)] + MasterchainInfo { + last: BlockIdExt, + state_root_hash: Int256, + init: ZeroStateIdExt, + }, + + /// liteServer.masterchainInfoExt mode:# version:int capabilities:long last:tonNode.blockIdExt last_utime:int now:int state_root_hash:int256 init:tonNode.zeroStateIdExt = liteServer.MasterchainInfoExt; + #[tl(id = 0xa8cce0f5)] + MasterchainInfoExt { + #[tl(flags)] + mode: (), + version: i32, + capabilities: i64, + last: BlockIdExt, + last_utime: i32, + now: i32, + state_root_hash: Int256, + init: ZeroStateIdExt, + }, + + /// liteServer.currentTime now:int = liteServer.CurrentTime; + #[tl(id = 0xe953000d)] + CurrentTime { + now: i32, + }, + + /// liteServer.version mode:# version:int capabilities:long now:int = liteServer.Version; + #[tl(id = 0x5a0491e5)] + Version { + mode: i32, + version: i32, + capabilities: i64, + now: i32, + }, + + /// liteServer.blockData id:tonNode.blockIdExt data:bytes = liteServer.BlockData; + #[tl(id = 0xa574ed6c)] + BlockData { + id: BlockIdExt, + data: Vec, + }, + + /// liteServer.blockState id:tonNode.blockIdExt root_hash:int256 file_hash:int256 data:bytes = liteServer.BlockState; + #[tl(id = 0xabaddc0c)] + BlockState { + id: BlockIdExt, + root_hash: Int256, + file_hash: Int256, + data: Vec, + }, + + /// liteServer.blockHeader id:tonNode.blockIdExt mode:# header_proof:bytes = liteServer.BlockHeader; + #[tl(id = 0x752d8219)] + BlockHeader { + id: BlockIdExt, + mode: i32, + header_proof: Vec, + }, + + /// liteServer.sendMsgStatus status:int = liteServer.SendMsgStatus; + #[tl(id = 0x3950e597)] + SendMsgStatus { + status: i32, + }, + + /// liteServer.accountState id:tonNode.blockIdExt shardblk:tonNode.blockIdExt shard_proof:bytes proof:bytes state:bytes = liteServer.AccountState; + #[tl(id = 0x7079c751)] + AccountState { + id: BlockIdExt, + shardblk: BlockIdExt, + #[derivative(Debug(format_with = "fmt_bytes"))] + shard_proof: Vec, + #[derivative(Debug(format_with = "fmt_bytes"))] + proof: Vec, + #[derivative(Debug(format_with = "fmt_bytes"))] + state: Vec, + }, + + /// liteServer.runMethodResult mode:# id:tonNode.blockIdExt shardblk:tonNode.blockIdExt shard_proof:mode.0?bytes proof:mode.0?bytes state_proof:mode.1?bytes init_c7:mode.3?bytes lib_extras:mode.4?bytes exit_code:int result:mode.2?bytes = liteServer.RunMethodResult; + #[tl(id = 0xa39a616b)] + RunMethodResult { + #[tl(flags)] + mode: (), + id: BlockIdExt, + shardblk: BlockIdExt, + #[tl(flags_bit = "mode.0")] + shard_proof: Option>, + #[tl(flags_bit = "mode.0")] + proof: Option>, + #[tl(flags_bit = "mode.1")] + state_proof: Option>, + #[tl(flags_bit = "mode.3")] + init_c7: Option>, + #[tl(flags_bit = "mode.4")] + lib_extras: Option>, + exit_code: i32, + #[tl(flags_bit = "mode.2")] + result: Option>, + }, + + /// liteServer.shardInfo id:tonNode.blockIdExt shardblk:tonNode.blockIdExt shard_proof:bytes shard_descr:bytes = liteServer.ShardInfo; + #[tl(id = 0x9fe6cd84)] + ShardInfo { + id: BlockIdExt, + shardblk: BlockIdExt, + shard_proof: Vec, + shard_descr: Vec, + }, + + /// liteServer.allShardsInfo id:tonNode.blockIdExt proof:bytes data:bytes = liteServer.AllShardsInfo; + #[tl(id = 0x098fe72d)] + AllShardsInfo { + id: BlockIdExt, + proof: Vec, + data: Vec, + }, + + /// liteServer.transactionInfo id:tonNode.blockIdExt proof:bytes transaction:bytes = liteServer.TransactionInfo; + #[tl(id = 0x0edeed47)] + TransactionInfo { + id: BlockIdExt, + proof: Vec, + transaction: Vec, + }, + + /// liteServer.transactionList ids:(vector tonNode.blockIdExt) transactions:bytes = liteServer.TransactionList; + #[tl(id = 0x6f26c60b)] + TransactionList { + ids: Vec, + transactions: Vec, + }, + + /// liteServer.transactionId mode:# account:mode.0?int256 lt:mode.1?long hash:mode.2?int256 = liteServer.TransactionId; + #[tl(id = 0xb12f65af)] + TransactionId { + #[tl(flags)] + mode: (), + #[tl(flags_bit = "mode.0")] + account: Option, + #[tl(flags_bit = "mode.1")] + lt: Option, + #[tl(flags_bit = "mode.2")] + hash: Option, + }, + + /// liteServer.blockTransactions id:tonNode.blockIdExt req_count:# incomplete:Bool ids:(vector liteServer.transactionId) proof:bytes = liteServer.BlockTransactions; + #[tl(id = 0xbd8cad2b)] + BlockTransactions { + id: BlockIdExt, + req_count: i32, + incomplete: bool, + ids: Vec, + proof: Vec, + }, + + /// liteServer.partialBlockProof complete:Bool from:tonNode.blockIdExt to:tonNode.blockIdExt steps:(vector liteServer.BlockLink) = liteServer.PartialBlockProof; + #[tl(id = 0x8ed0d2c1)] + PartialBlockProof { + complete: bool, + from: BlockIdExt, + to: BlockIdExt, + steps: Vec, + }, + + /// liteServer.configInfo mode:# id:tonNode.blockIdExt state_proof:bytes config_proof:bytes = liteServer.ConfigInfo; + #[tl(id = 0xae7b272f)] + ConfigInfo { + #[tl(flags)] + mode: (), + id: BlockIdExt, + state_proof: Vec, + config_proof: Vec, + }, + + /// liteServer.validatorStats mode:# id:tonNode.blockIdExt count:int complete:Bool state_proof:bytes data_proof:bytes = liteServer.ValidatorStats; + #[tl(id = 0xb9f796d8)] + ValidatorStats { + #[tl(flags)] + mode: (), + id: BlockIdExt, + count: i32, + complete: bool, + state_proof: Vec, + data_proof: Vec, + }, + + /// liteServer.error code:int message:string = liteServer.Error; + #[tl(id = 0xbba9e148)] + Error { + code: i32, + #[derivative(Debug(format_with = "String::fmt"))] + message: String, + } +} \ No newline at end of file diff --git a/liteapi/src/tl/utils.rs b/liteapi/src/tl/utils.rs new file mode 100644 index 0000000..f05d81d --- /dev/null +++ b/liteapi/src/tl/utils.rs @@ -0,0 +1,33 @@ +use tl_proto::{TlRead, TlResult}; + +pub fn lossy_read<'tl, T: TlRead<'tl>>(packet: &'tl [u8], offset: &mut usize) -> TlResult> { + Ok(T::read_from(packet, offset).ok()) +} + +pub fn fmt_string(bytes: &[u8], f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { + write!( + f, + "{}", + std::string::String::from_utf8(bytes.to_vec()).unwrap() + ) +} + +pub fn fmt_bytes(bytes: &[u8], f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { + write!(f, "0x{}", hex::encode(bytes)) +} + +pub mod struct_as_bytes { + use tl_proto::{TlPacket, TlRead, TlResult, TlWrite}; + + pub fn size_hint(v: &T) -> usize { + tl_proto::serialize(v).len() + } + + pub fn write(v: &T, packet: &mut P) { + tl_proto::serialize(v).write_to(packet) + } + + pub fn read<'tl, T: TlRead<'tl>>(packet: &'tl [u8], offset: &mut usize) -> TlResult { + <&'tl [u8]>::read_from(packet, offset).and_then(|x| tl_proto::deserialize(x)) + } +} \ No newline at end of file diff --git a/liteapi/src/tl_types.rs b/liteapi/src/tl_types.rs deleted file mode 100644 index 55bc6f8..0000000 --- a/liteapi/src/tl_types.rs +++ /dev/null @@ -1,853 +0,0 @@ -use derivative::Derivative; -use hex::FromHex; -use std::string::ToString; -use std::{fmt, str::FromStr, *}; -use tl_proto::{TlRead, TlWrite}; - -/// true = True; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -pub struct True; - -pub fn fmt_string(bytes: &[u8], f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { - write!( - f, - "{}", - std::string::String::from_utf8(bytes.to_vec()).unwrap() - ) -} - -/// string ? = String; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -pub struct String(#[derivative(Debug(format_with = "fmt_string"))] Vec); - -impl fmt::Display for String { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!( - f, - "{}", - std::string::String::from_utf8(self.0.clone()).unwrap() - ) - } -} - -impl String { - pub fn new(str: std::string::String) -> Self { - Self(str.into_bytes()) - } -} - -/// int256 8*[ int ] = Int256; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -pub struct Int256(#[derivative(Debug(format_with = "fmt_bytes"))] pub [u8; 32]); - -impl FromStr for Int256 { - fn from_str(s: &str) -> Result { - Self::from_hex(s) - } - type Err = hex::FromHexError; -} - -impl ToString for Int256 { - fn to_string(&self) -> std::string::String { - hex::encode(self.0) - } -} - -impl Int256 { - pub fn to_hex(&self) -> std::string::String { - hex::encode(self.0) - } - - pub fn from_hex(s: &str) -> Result { - Ok(Int256(<[u8; 32]>::from_hex(s)?)) - } -} - -fn fmt_bytes(bytes: &[u8], f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { - write!(f, "0x{}", hex::encode(bytes)) -} - -/// bytes data:string = Bytes; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl(boxed, id = "bytes", scheme_inline = r##"bytes data:string = Bytes;"##)] -pub struct Bytes { - pub data: String, -} - -/// tonNode.blockId workchain:int shard:long seqno:int = tonNode.BlockId; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -pub struct BlockId { - pub workchain: i32, - pub shard: u64, - pub seqno: u32, -} - -/// tonNode.blockIdExt workchain:int shard:long seqno:int root_hash:int256 file_hash:int256 = tonNode.BlockIdExt; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -pub struct BlockIdExt { - pub workchain: i32, - pub shard: u64, - pub seqno: u32, - pub root_hash: Int256, - pub file_hash: Int256, -} - -impl fmt::Display for BlockIdExt { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "({},{:X},{}):{}:{}", self.workchain, self.shard, self.seqno, self.root_hash.to_string(), self.file_hash.to_string()) - } -} - -/// tonNode.zeroStateIdExt workchain:int root_hash:int256 file_hash:int256 = tonNode.ZeroStateIdExt; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -pub struct ZeroStateIdExt { - pub workchain: i32, - #[tl(size_hint = 32)] - pub root_hash: Int256, - #[tl(size_hint = 32)] - pub file_hash: Int256, -} - -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - scheme_inline = r##"adnl.message.query query_id:int256 query:bytes = adnl.Message; - adnl.message.answer query_id:int256 answer:bytes = adnl.Message;"## -)] -pub enum Message { - /// adnl.message.query query_id:int256 query:bytes = adnl.Message; - #[tl(id = "adnl.message.query")] - Query { query_id: Int256, query: Vec }, - /// adnl.message.answer query_id:int256 answer:bytes = adnl.Message; - #[tl(id = "adnl.message.answer")] - Answer { query_id: Int256, answer: Vec }, -} - -/// liteServer.error code:int message:string = liteServer.Error; ; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.error", - scheme_inline = r##"liteServer.error code:int message:string = liteServer.Error; "## -)] -pub struct Error { - pub code: i32, - #[derivative(Debug(format_with = "String::fmt"))] - pub message: String, -} -impl fmt::Display for Error { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "#{} Message: {}", self.code, self.message) - } -} -impl std::error::Error for Error {} - -/// liteServer.accountId workchain:int id:int256 = liteServer.AccountId; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -pub struct AccountId { - pub workchain: i32, - pub id: Int256, -} - -/// liteServer.masterchainInfo last:tonNode.blockIdExt state_root_hash:int256 init:tonNode.zeroStateIdExt = liteServer.MasterchainInfo; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.masterchainInfo", - scheme_inline = r##"liteServer.masterchainInfo last:tonNode.blockIdExt state_root_hash:int256 init:tonNode.zeroStateIdExt = liteServer.MasterchainInfo;"## -)] -pub struct MasterchainInfo { - pub last: BlockIdExt, - pub state_root_hash: Int256, - pub init: ZeroStateIdExt, -} - -/// liteServer.masterchainInfoExt mode:# version:int capabilities:long last:tonNode.blockIdExt last_utime:int now:int state_root_hash:int256 init:tonNode.zeroStateIdExt = liteServer.MasterchainInfoExt; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.masterchainInfoExt", - scheme_inline = r##"liteServer.masterchainInfoExt mode:# version:int capabilities:long last:tonNode.blockIdExt last_utime:int now:int state_root_hash:int256 init:tonNode.zeroStateIdExt = liteServer.MasterchainInfoExt;"## -)] -pub struct MasterchainInfoExt { - #[tl(flags)] - pub mode: (), - pub version: i32, - pub capabilities: i64, - pub last: BlockIdExt, - pub last_utime: i32, - pub now: i32, - pub state_root_hash: Int256, - pub init: ZeroStateIdExt, -} - -/// liteServer.currentTime now:int = liteServer.CurrentTime; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.currentTime", - scheme_inline = r##"liteServer.currentTime now:int = liteServer.CurrentTime;"## -)] -pub struct CurrentTime { - pub now: i32, -} - -/// liteServer.version mode:# version:int capabilities:long now:int = liteServer.Version; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.version", - scheme_inline = r##"liteServer.version mode:# version:int capabilities:long now:int = liteServer.Version;"## -)] -pub struct Version { - pub mode: i32, - pub version: i32, - pub capabilities: i64, - pub now: i32, -} - -/// liteServer.blockData id:tonNode.blockIdExt data:bytes = liteServer.BlockData; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.blockData", - scheme_inline = r##"liteServer.blockData id:tonNode.blockIdExt data:bytes = liteServer.BlockData;"## -)] -pub struct BlockData { - pub id: BlockIdExt, - pub data: Vec, -} - -/// liteServer.blockState id:tonNode.blockIdExt root_hash:int256 file_hash:int256 data:bytes = liteServer.BlockState; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.blockState", - scheme_inline = r##"liteServer.blockState id:tonNode.blockIdExt root_hash:int256 file_hash:int256 data:bytes = liteServer.BlockState;"## -)] -pub struct BlockState { - pub id: BlockIdExt, - pub root_hash: Int256, - pub file_hash: Int256, - pub data: Vec, -} - -/// liteServer.blockHeader id:tonNode.blockIdExt mode:# header_proof:bytes = liteServer.BlockHeader; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.blockHeader", - scheme_inline = r##"liteServer.blockHeader id:tonNode.blockIdExt mode:# header_proof:bytes = liteServer.BlockHeader;"## -)] -pub struct BlockHeader { - pub id: BlockIdExt, - pub mode: i32, - pub header_proof: Vec, -} - -/// liteServer.sendMsgStatus status:int = liteServer.SendMsgStatus; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.sendMsgStatus", - scheme_inline = r##"liteServer.sendMsgStatus status:int = liteServer.SendMsgStatus;"## -)] -pub struct SendMsgStatus { - pub status: i32, -} - -/// liteServer.accountState id:tonNode.blockIdExt shardblk:tonNode.blockIdExt shard_proof:bytes proof:bytes state:bytes = liteServer.AccountState; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.accountState", - scheme_inline = r##"liteServer.accountState id:tonNode.blockIdExt shardblk:tonNode.blockIdExt shard_proof:bytes proof:bytes state:bytes = liteServer.AccountState;"## -)] -pub struct AccountState { - pub id: BlockIdExt, - pub shardblk: BlockIdExt, - #[derivative(Debug(format_with = "fmt_bytes"))] - pub shard_proof: Vec, - #[derivative(Debug(format_with = "fmt_bytes"))] - pub proof: Vec, - #[derivative(Debug(format_with = "fmt_bytes"))] - pub state: Vec, -} - -/// liteServer.runMethodResult mode:# id:tonNode.blockIdExt shardblk:tonNode.blockIdExt shard_proof:mode.0?bytes proof:mode.0?bytes state_proof:mode.1?bytes init_c7:mode.3?bytes lib_extras:mode.4?bytes exit_code:int result:mode.2?bytes = liteServer.RunMethodResult; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.runMethodResult", - scheme_inline = r##"liteServer.runMethodResult mode:# id:tonNode.blockIdExt shardblk:tonNode.blockIdExt shard_proof:mode.0?bytes proof:mode.0?bytes state_proof:mode.1?bytes init_c7:mode.3?bytes lib_extras:mode.4?bytes exit_code:int result:mode.2?bytes = liteServer.RunMethodResult;"## -)] -pub struct RunMethodResult { - #[tl(flags)] - pub mode: (), - pub id: BlockIdExt, - pub shardblk: BlockIdExt, - #[tl(flags_bit = "mode.0")] - pub shard_proof: Option>, - #[tl(flags_bit = "mode.0")] - pub proof: Option>, - #[tl(flags_bit = "mode.1")] - pub state_proof: Option>, - #[tl(flags_bit = "mode.3")] - pub init_c7: Option>, - #[tl(flags_bit = "mode.4")] - pub lib_extras: Option>, - pub exit_code: i32, - #[tl(flags_bit = "mode.2")] - pub result: Option>, -} - -/// liteServer.shardInfo id:tonNode.blockIdExt shardblk:tonNode.blockIdExt shard_proof:bytes shard_descr:bytes = liteServer.ShardInfo; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.shardInfo", - scheme_inline = r##"liteServer.shardInfo id:tonNode.blockIdExt shardblk:tonNode.blockIdExt shard_proof:bytes shard_descr:bytes = liteServer.ShardInfo;"## -)] -pub struct ShardInfo { - pub id: BlockIdExt, - pub shardblk: BlockIdExt, - pub shard_proof: Vec, - pub shard_descr: Vec, -} - -/// liteServer.allShardsInfo id:tonNode.blockIdExt proof:bytes data:bytes = liteServer.AllShardsInfo; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.allShardsInfo", - scheme_inline = r##"liteServer.allShardsInfo id:tonNode.blockIdExt proof:bytes data:bytes = liteServer.AllShardsInfo;"## -)] -pub struct AllShardsInfo { - pub id: BlockIdExt, - pub proof: Vec, - pub data: Vec, -} - -/// liteServer.transactionInfo id:tonNode.blockIdExt proof:bytes transaction:bytes = liteServer.TransactionInfo; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -// #[tl(boxed, id = "liteServer.transactionInfo", scheme_inline = r##"liteServer.transactionInfo id:tonNode.blockIdExt proof:bytes transaction:bytes = liteServer.TransactionInfo;"##)] -pub struct TransactionInfo { - pub id: BlockIdExt, - pub proof: Vec, - pub transaction: Vec, -} - -/// liteServer.transactionList ids:(vector tonNode.blockIdExt) transactions:bytes = liteServer.TransactionList; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.transactionList", - scheme_inline = r##"liteServer.transactionList ids:(vector tonNode.blockIdExt) transactions:bytes = liteServer.TransactionList;"## -)] -pub struct TransactionList { - pub ids: Vec, - pub transactions: Vec, -} - -/// liteServer.transactionId mode:# account:mode.0?int256 lt:mode.1?long hash:mode.2?int256 = liteServer.TransactionId; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -// #[tl(boxed, id = "liteServer.transactionId", scheme_inline = r##"liteServer.transactionId mode:# account:mode.0?int256 lt:mode.1?long hash:mode.2?int256 = liteServer.TransactionId;"##)] -pub struct TransactionId { - #[tl(flags)] - pub mode: (), - #[tl(flags_bit = "mode.0")] - pub account: Option, - #[tl(flags_bit = "mode.1")] - pub lt: Option, - #[tl(flags_bit = "mode.2")] - pub hash: Option, -} - -/// liteServer.transactionId3 account:int256 lt:long = liteServer.TransactionId3; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -// #[tl(boxed, id = "liteServer.transactionId3", scheme_inline = r##"liteServer.transactionId3 account:int256 lt:long = liteServer.TransactionId3;"##)] -pub struct TransactionId3 { - pub account: Int256, - pub lt: i64, -} - -/// liteServer.blockTransactions id:tonNode.blockIdExt req_count:# incomplete:Bool ids:(vector liteServer.transactionId) proof:bytes = liteServer.BlockTransactions; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.blockTransactions", - scheme_inline = r##"liteServer.blockTransactions id:tonNode.blockIdExt req_count:# incomplete:Bool ids:(vector liteServer.transactionId) proof:bytes = liteServer.BlockTransactions;"## -)] -pub struct BlockTransactions { - pub id: BlockIdExt, - pub req_count: i32, - pub inclomplete: bool, - pub ids: Vec, - pub proof: Vec, -} - -/// liteServer.signature node_id_short:int256 signature:bytes = liteServer.Signature; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -// #[tl(boxed, id = "liteServer.signature", scheme_inline = r##"liteServer.signature node_id_short:int256 signature:bytes = liteServer.Signature;"##)] -pub struct Signature { - pub node_id_short: Int256, - pub signature: Vec, -} - -/// liteServer.signatureSet validator_set_hash:int catchain_seqno:int signatures:(vector liteServer.signature) = liteServer.SignatureSet; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.signatureSet", - scheme_inline = r##"liteServer.signatureSet validator_set_hash:int catchain_seqno:int signatures:(vector liteServer.signature) = liteServer.SignatureSet;"## -)] -pub struct SignatureSet { - pub validator_set_hash: i32, - pub catchain_seqno: i32, - pub signatures: Vec, -} - -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - scheme_inline = r##"liteServer.blockLinkBack to_key_block:Bool from:tonNode.blockIdExt to:tonNode.blockIdExt dest_proof:bytes proof:bytes state_proof:bytes = liteServer.BlockLink; - liteServer.blockLinkForward to_key_block:Bool from:tonNode.blockIdExt to:tonNode.blockIdExt dest_proof:bytes config_proof:bytes signatures:liteServer.SignatureSet = liteServer.BlockLink;"## -)] -pub enum BlockLink { - /// liteServer.blockLinkBack to_key_block:Bool from:tonNode.blockIdExt to:tonNode.blockIdExt dest_proof:bytes proof:bytes state_proof:bytes = liteServer.BlockLink; - #[tl(id = "liteServer.blockLinkBack")] - BlockLinkBack { - to_key_block: bool, - from: BlockIdExt, - to: BlockIdExt, - dest_proof: Vec, - proof: Vec, - state_proof: Vec, - }, - /// liteServer.blockLinkForward to_key_block:Bool from:tonNode.blockIdExt to:tonNode.blockIdExt dest_proof:bytes config_proof:bytes signatures:liteServer.SignatureSet = liteServer.BlockLink; - #[tl(id = "liteServer.blockLinkForward")] - BlockLinkForward { - to_key_block: bool, - from: BlockIdExt, - to: BlockIdExt, - dest_proof: Vec, - config_proof: Vec, - signatures: SignatureSet, - }, -} - -/// liteServer.partialBlockProof complete:Bool from:tonNode.blockIdExt to:tonNode.blockIdExt steps:(vector liteServer.BlockLink) = liteServer.PartialBlockProof; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.partialBlockProof", - scheme_inline = r##"liteServer.partialBlockProof complete:Bool from:tonNode.blockIdExt to:tonNode.blockIdExt steps:(vector liteServer.BlockLink) = liteServer.PartialBlockProof;"## -)] -pub struct PartialBlockProof { - pub complete: bool, - pub from: BlockIdExt, - pub to: BlockIdExt, - pub steps: Vec, -} - -/// liteServer.configInfo mode:# id:tonNode.blockIdExt state_proof:bytes config_proof:bytes = liteServer.ConfigInfo; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.configInfo", - scheme_inline = r##"liteServer.configInfo mode:# id:tonNode.blockIdExt state_proof:bytes config_proof:bytes = liteServer.ConfigInfo;"## -)] -pub struct ConfigInfo { - #[tl(flags)] - pub mode: (), - pub id: BlockIdExt, - pub state_proof: Vec, - pub config_proof: Vec, -} - -/// liteServer.validatorStats mode:# id:tonNode.blockIdExt count:int complete:Bool state_proof:bytes data_proof:bytes = liteServer.ValidatorStats; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.validatorStats", - scheme_inline = r##"liteServer.validatorStats mode:# id:tonNode.blockIdExt count:int complete:Bool state_proof:bytes data_proof:bytes = liteServer.ValidatorStats;"## -)] -pub struct ValidatorStats { - #[tl(flags)] - pub mode: (), - pub id: BlockIdExt, - pub count: i32, - pub complete: bool, - pub state_proof: Vec, - pub data_proof: Vec, -} - -/// liteServer.debug.verbosity value:int = liteServer.debug.Verbosity; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.debug.verbosity", - scheme_inline = r##"liteServer.debug.verbosity value:int = liteServer.debug.Verbosity;"## -)] -pub struct Verbosity { - pub value: i32, -} - -/// Functions - -/// liteServer.getMasterchainInfo = liteServer.MasterchainInfo; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.getMasterchainInfo", - scheme_inline = r##"liteServer.getMasterchainInfo = liteServer.MasterchainInfo;"## -)] -pub struct GetMasterchainInfo; - -/// liteServer.getMasterchainInfoExt mode:# = liteServer.MasterchainInfoExt; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.getMasterchainInfoExt", - scheme_inline = r##"liteServer.getMasterchainInfoExt mode:# = liteServer.MasterchainInfoExt;"## -)] -pub struct GetMasterchainInfoExt { - pub mode: i32, -} - -/// liteServer.getTime = liteServer.CurrentTime; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.getTime", - scheme_inline = r##"liteServer.getTime = liteServer.CurrentTime;"## -)] -pub struct GetTime; - -/// liteServer.getVersion = liteServer.Version; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.getVersion", - scheme_inline = r##"liteServer.getVersion = liteServer.Version;"## -)] -pub struct GetVersion; - -/// liteServer.getBlock id:tonNode.blockIdExt = liteServer.BlockData; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.getBlock", - scheme_inline = r##"liteServer.getBlock id:tonNode.blockIdExt = liteServer.BlockData;"## -)] -pub struct GetBlock { - pub id: BlockIdExt, -} - -/// liteServer.getState id:tonNode.blockIdExt = liteServer.BlockState; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.getState", - scheme_inline = r##"liteServer.getState id:tonNode.blockIdExt = liteServer.BlockState;"## -)] -pub struct GetState { - pub id: BlockIdExt, -} - -/// liteServer.getBlockHeader id:tonNode.blockIdExt mode:# = liteServer.BlockHeader; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.getBlockHeader", - scheme_inline = r##"liteServer.getBlockHeader id:tonNode.blockIdExt mode:# = liteServer.BlockHeader;"## -)] -pub struct GetBlockHeader { - pub id: BlockIdExt, - pub mode: i32, -} - -/// liteServer.sendMessage body:bytes = liteServer.SendMsgStatus; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.sendMessage", - scheme_inline = r##"liteServer.sendMessage body:bytes = liteServer.SendMsgStatus;"## -)] -pub struct SendMessage { - pub body: Vec, -} - -/// liteServer.getAccountState id:tonNode.blockIdExt account:liteServer.accountId = liteServer.AccountState; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.getAccountState", - scheme_inline = r##"liteServer.getAccountState id:tonNode.blockIdExt account:liteServer.accountId = liteServer.AccountState;"## -)] -pub struct GetAccountState { - pub id: BlockIdExt, - pub account: AccountId, -} - -/// liteServer.runSmcMethod mode:# id:tonNode.blockIdExt account:liteServer.accountId method_id:long params:bytes = liteServer.RunMethodResult; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.runSmcMethod", - scheme_inline = r##"liteServer.runSmcMethod mode:# id:tonNode.blockIdExt account:liteServer.accountId method_id:long params:bytes = liteServer.RunMethodResult;"## -)] -pub struct RunSmcMethod { - #[tl(flags)] - pub mode: (), - pub id: BlockIdExt, - pub account: AccountId, - pub method_id: i64, - pub params: Vec, -} - -/// liteServer.getShardInfo id:tonNode.blockIdExt workchain:int shard:long exact:Bool = liteServer.ShardInfo; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.getShardInfo", - scheme_inline = r##"liteServer.getShardInfo id:tonNode.blockIdExt workchain:int shard:long exact:Bool = liteServer.ShardInfo;"## -)] -pub struct GetShardInfo { - pub id: BlockIdExt, - pub workchain: i32, - pub shard: u64, - pub exact: bool, -} -/// liteServer.getAllShardsInfo id:tonNode.blockIdExt = liteServer.AllShardsInfo; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.getAllShardsInfo", - scheme_inline = r##"liteServer.getAllShardsInfo id:tonNode.blockIdExt = liteServer.AllShardsInfo;"## -)] -pub struct GetAllShardsInfo { - pub id: BlockIdExt, -} - -/// liteServer.getOneTransaction id:tonNode.blockIdExt account:liteServer.accountId lt:long = liteServer.TransactionInfo; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.getOneTransaction", - scheme_inline = r##"liteServer.getOneTransaction id:tonNode.blockIdExt account:liteServer.accountId lt:long = liteServer.TransactionInfo;"## -)] -pub struct GetOneTransaction { - pub id: BlockIdExt, - pub account: AccountId, - pub lt: i64, -} - -/// liteServer.getTransactions count:# account:liteServer.accountId lt:long hash:int256 = liteServer.TransactionList; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.getTransactions", - scheme_inline = r##"liteServer.getTransactions count:# account:liteServer.accountId lt:long hash:int256 = liteServer.TransactionList;"## -)] -pub struct GetTransactions { - pub count: i32, - pub account: AccountId, - pub lt: i64, - pub hash: Int256, -} - -/// liteServer.lookupBlock mode:# id:tonNode.blockId lt:mode.1?long utime:mode.2?int = liteServer.BlockHeader; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.lookupBlock", - scheme_inline = r##"liteServer.lookupBlock mode:# id:tonNode.blockId lt:mode.1?long utime:mode.2?int = liteServer.BlockHeader;"## -)] -pub struct LookupBlock { - #[tl(flags)] - pub mode: (), - pub id: BlockId, - //#[tl(skip, flags_bit = "mode.0")] - //pub trash: Option, - #[tl(flags_bit = "mode.1")] - pub lt: Option, - #[tl(flags_bit = "mode.2")] - pub utime: Option, -} - -/// liteServer.listBlockTransactions id:tonNode.blockIdExt mode:# count:# after:mode.7?liteServer.transactionId3 reverse_order:mode.6?true want_proof:mode.5?true = liteServer.BlockTransactions; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.listBlockTransactions", - scheme_inline = r##"liteServer.listBlockTransactions id:tonNode.blockIdExt mode:# count:# after:mode.7?liteServer.transactionId3 reverse_order:mode.6?true want_proof:mode.5?true = liteServer.BlockTransactions;"## -)] -pub struct ListBlockTransactions { - pub id: BlockIdExt, - #[tl(flags)] - pub mode: (), - pub count: i32, - #[tl(flags_bit = "mode.7")] - pub after: Option, - #[tl(flags_bit = "mode.6")] - pub reverse_order: Option, - #[tl(flags_bit = "mode.5")] - pub want_proof: Option, -} - -/// liteServer.getBlockProof mode:# known_block:tonNode.blockIdExt target_block:mode.0?tonNode.blockIdExt = liteServer.PartialBlockProof; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.getBlockProof", - scheme_inline = r##"liteServer.getBlockProof mode:# known_block:tonNode.blockIdExt target_block:mode.0?tonNode.blockIdExt = liteServer.PartialBlockProof;"## -)] -pub struct GetBlockProof { - #[tl(flags)] - pub mode: (), - pub known_block: BlockIdExt, - #[tl(flags_bit = "mode.0")] - pub target_block: Option, -} - -/// liteServer.getConfigAll mode:# id:tonNode.blockIdExt = liteServer.ConfigInfo; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.getConfigAll", - scheme_inline = r##"liteServer.getConfigAll mode:# id:tonNode.blockIdExt = liteServer.ConfigInfo;"## -)] -pub struct GetConfigAll { - pub mode: i32, - pub id: BlockIdExt, -} - -/// liteServer.getConfigParams mode:# id:tonNode.blockIdExt param_list:(vector int) = liteServer.ConfigInfo; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.getConfigParams", - scheme_inline = r##"liteServer.getConfigParams mode:# id:tonNode.blockIdExt param_list:(vector int) = liteServer.ConfigInfo;"## -)] -pub struct GetConfigParams { - pub mode: i32, - pub id: BlockIdExt, - pub param_list: Vec, -} - -/// liteServer.getValidatorStats#091a58bc mode:# id:tonNode.blockIdExt limit:int start_after:mode.0?int256 modified_after:mode.2?int = liteServer.ValidatorStats; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl(boxed, id = 0x091a58bc)] -pub struct GetValidatorStats { - #[tl(flags)] - pub mode: (), - pub id: BlockIdExt, - pub limit: i32, - #[tl(flags_bit = "mode.0")] - pub start_after: Option, - #[tl(flags_bit = "mode.2")] - pub modified_after: Option, -} - -/// liteServer.query data:bytes = Object; -#[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - id = "liteServer.query", - scheme_inline = r##"liteServer.query data:bytes = Object;"## -)] -pub struct Query { - pub data: Vec, -} - -#[cfg(test)] -mod tests { - use crate::tl_types::*; - use hex::FromHex; - use tl_proto; - #[test] - fn block_id_test() { - let bytes = tl_proto::serialize(&BlockId { - workchain: 0, - shard: 0x8000000000000000, - seqno: 13131131, - }); - println!("{:?}", bytes); - let decoded = tl_proto::deserialize(&bytes).unwrap(); - assert!(matches!( - decoded, - BlockId { - workchain: 0, - shard: 0x8000000000000000, - seqno: 13131131 - } - )); - } - #[test] - fn int256_test() { - let hex_hash = "7f43835181544d3721196153f912226625568035627bdc5df827c983a4965cae"; - let encoded_hash = <[u8; 32]>::from_hex(hex_hash).unwrap(); - println!("{:?}", tl_proto::serialize(Int256(encoded_hash))); - let _check: [u8; 32] = [ - 127, 67, 131, 81, 129, 84, 77, 55, 33, 25, 97, 83, 249, 18, 34, 102, 37, 86, 128, 53, - 98, 123, 220, 93, 248, 39, 201, 131, 164, 150, 92, 174, - ]; - assert!(matches!(tl_proto::serialize(Int256(encoded_hash)), _check)); - } -} diff --git a/liteapi/src/types.rs b/liteapi/src/types.rs new file mode 100644 index 0000000..c2388c2 --- /dev/null +++ b/liteapi/src/types.rs @@ -0,0 +1,22 @@ +use adnl::AdnlError; +use thiserror::Error; +use tl_proto::TlError; +use tower::Service; + +use crate::tl::{request::{Request, WrappedRequest}, response::Response}; + +#[derive(Debug, Error)] +pub enum LiteError { + #[error("Liteserver error with code {code}: {message}")] + ServerError { code: i32, message: String }, + #[error("TL parsing error")] + TlError(TlError), + #[error("Unexpected TL message")] + UnexpectedMessage, + #[error("ADNL error")] + AdnlError(AdnlError), + #[error("IO error")] + IoError(std::io::Error), +} + +pub trait LiteService: Service{} \ No newline at end of file diff --git a/liteapi/tests/config_test.rs b/liteapi/tests/config_test.rs deleted file mode 100644 index df72b20..0000000 --- a/liteapi/tests/config_test.rs +++ /dev/null @@ -1,993 +0,0 @@ -use liteclient::config::ConfigGlobal; - -#[test] -fn deserialize_mainnet_config() { - let config_json = r#" -{ - "@type": "config.global", - "dht": { - "@type": "dht.config.global", - "k": 6, - "a": 3, - "static_nodes": { - "@type": "dht.nodes", - "nodes": [ - { - "@type":"dht.node", - "id":{ - "@type":"pub.ed25519", - "key": "NutLY+VWoaLqgpNCdOR8Jp+Cf2gnDjToza9d+qUnHyE=" - }, - "addr_list":{ - "@type": "adnl.addressList", - "addrs": [ - { - "@type": "adnl.address.udp", - "ip": 2130706433, - "port": 15876 - } - ], - "version": 0, - "reinit_date": 0, - "priority": 0, - "expire_at": 0 - }, - "version":-1, - "signature": "Pb7fVqjtgvnqdTHtfJmTzvaZ7gZpkDeKThrRYTXmlpiDtPcCjijQW+m6Zg5V9ZGt2hVljnLbfvC48K4iYqzRBQ==" - }, - { - "@type":"dht.node", - "id":{ - "@type":"pub.ed25519", - "key":"Tr5TtwdWtLH53F/aOm0eUiwNEOlS7A+AV24wNI7uD9I=" - }, - "addr_list":{ - "@type":"adnl.addressList", - "addrs":[ - { - "@type":"adnl.address.udp", - "ip":2130706433, - "port":15876 - } - ], - "version":0, - "reinit_date":0, - "priority":0, - "expire_at":0 - }, - "version":-1, - "signature":"W6R7JLsLHaGKN6xnLbqydm8vVb+q/MqYmOwZvTWHx7EPOq7Y2eO4J0kf+4VVuQ5juLbZyATN5/gCbR6NPkvlDQ==" - }, - { - "@type":"dht.node", - "id":{ - "@type":"pub.ed25519", - "key":"C1uy64rfGxp10SPSqbsxWhbumy5SM0YbvljCudwpZeI=" - }, - "addr_list":{ - "@type":"adnl.addressList", - "addrs":[ - { - "@type":"adnl.address.udp", - "ip":-1307380867, - "port":15888 - } - ], - "version":0, - "reinit_date":0, - "priority":0, - "expire_at":0 - }, - "version":-1, - "signature":"s+tnHMTzPYG8abau+1dUs8tBJ+CDt+jIPmGfaVd7nmfb1gt6lL10G2IwkNeWhkxjZcAHRc0azWFVxp+IjIOOBQ==" - }, - { - "@type":"dht.node", - "id":{ - "@type":"pub.ed25519", - "key":"bn8klhFZgE2sfIDfvVI6m6+oVNi1nBRlnHoxKtR9WBU=" - }, - "addr_list":{ - "@type":"adnl.addressList", - "addrs":[ - { - "@type":"adnl.address.udp", - "ip":-1307380860, - "port":15888 - } - ], - "version":0, - "reinit_date":0, - "priority":0, - "expire_at":0 - }, - "version":-1, - "signature":"fQ5zAa6ot4pfFWzvuJOR8ijM5ELWndSDsRhFKstW1tqVSNfwAdOC7tDC8mc4vgTJ6fSYSWmhnXGK/+T5f6sDCw==" - }, - { - "@type":"dht.node", - "id":{ - "@type":"pub.ed25519", - "key":"KlNrfVSyO6oISNi4Bx8J2klAN4RnKmEPQpfr1bghGSk=" - }, - "addr_list":{ - "@type":"adnl.addressList", - "addrs":[ - { - "@type":"adnl.address.udp", - "ip":-1307380856, - "port":15888 - } - ], - "version":0, - "reinit_date":0, - "priority":0, - "expire_at":0 - }, - "version":-1, - "signature":"0/1trU+HDc+Co/q8gw5lPrSJH9YCOXxVh0caR2CGqXE5820DguuSmVnnLQ9S2+RmxHv0biYZuH8FiJv2wPwyDA==" - }, - { - "@type":"dht.node", - "id":{ - "@type":"pub.ed25519", - "key":"HU0bQDDmXnUENi2qQgGUQSopWz+s0dFA1l6NgB6HdQ0=" - }, - "addr_list":{ - "@type":"adnl.addressList", - "addrs":[ - { - "@type":"adnl.address.udp", - "ip":-1185526389, - "port":26907 - } - ], - "version":0, - "reinit_date":0, - "priority":0, - "expire_at":0 - }, - "version":-1, - "signature":"RrZILQv72PtJ/oADGh+txXgo6qfUL9RFLU+YjMXsMZTAo2lCWYwNoeFOEZrS5MKfLmkL6O0MmOR/EEAFrr3mAw==" - }, - { - "@type":"dht.node", - "id":{ - "@type":"pub.ed25519", - "key":"xHfihhu4rFeKUNjxH2aHCJIG1s9PTaypqjocrm82U24=" - }, - "addr_list":{ - "@type":"adnl.addressList", - "addrs":[ - { - "@type":"adnl.address.udp", - "ip":1560268637, - "port":29503 - } - ], - "version":0, - "reinit_date":0, - "priority":0, - "expire_at":0 - }, - "version":-1, - "signature":"m+ah3Bn9AMaV13QaXrfT/c/z1fY6DzDMQkCEIgByXygnskwYwTfWxa8Z7DXy80UX2OYpSL8GwTJ4HpQsdcxMCA==" - }, - { - "@type":"dht.node", - "id":{ - "@type":"pub.ed25519", - "key":"4R0C/zU56k+x2HGMsLWjX2rP/SpoTPIHSSAmidGlsb8=" - }, - "addr_list":{ - "@type":"adnl.addressList", - "addrs":[ - { - "@type":"adnl.address.udp", - "ip":-1952265919, - "port":14395 - } - ], - "version":0, - "reinit_date":0, - "priority":0, - "expire_at":0 - }, - "version":-1, - "signature":"0uwWyCFn2KjPnnlbSFYXLZdwIakaSgI9WyRo87J3iCGwb5TvJSztgA224A9kNAXeutOrXMIPYv1b8Zt8ImsrCg==" - }, - { - "@type":"dht.node", - "id":{ - "@type":"pub.ed25519", - "key":"/YDNd+IwRUgL0mq21oC0L3RxrS8gTu0nciSPUrhqR78=" - }, - "addr_list":{ - "@type":"adnl.addressList", - "addrs":[ - { - "@type":"adnl.address.udp", - "ip":-1402455171, - "port":14432 - } - ], - "version":0, - "reinit_date":0, - "priority":0, - "expire_at":0 - }, - "version":-1, - "signature":"6+oVk6HDtIFbwYi9khCc8B+fTFceBUo1PWZDVTkb4l84tscvr5QpzAkdK7sS5xGzxM7V7YYQ6gUQPrsP9xcLAw==" - }, - { - "@type":"dht.node", - "id":{ - "@type":"pub.ed25519", - "key":"DA0H568bb+LoO2LGY80PgPee59jTPCqqSJJzt1SH+KE=" - }, - "addr_list":{ - "@type":"adnl.addressList", - "addrs":[ - { - "@type":"adnl.address.udp", - "ip":-1402397332, - "port":14583 - } - ], - "version":0, - "reinit_date":0, - "priority":0, - "expire_at":0 - }, - "version":-1, - "signature":"cL79gDTrixhaM9AlkCdZWccCts7ieQYQBmPxb/R7d7zHw3bEHL8Le96CFJoB1KHu8C85iDpFK8qlrGl1Yt/ZDg==" - }, - { - "@type":"dht.node", - "id":{ - "@type":"pub.ed25519", - "key":"fZnkoIAxrTd4xeBgVpZFRm5SvVvSx7eN3Vbe8c83YMk=" - }, - "addr_list":{ - "@type":"adnl.addressList", - "addrs":[ - { - "@type":"adnl.address.udp", - "ip":1091897261, - "port":15813 - } - ], - "version":0, - "reinit_date":0, - "priority":0, - "expire_at":0 - }, - "version":-1, - "signature":"cmaMrV/9wuaHOOyXYjoxBnckJktJqrQZ2i+YaY3ehIyiL3LkW81OQ91vm8zzsx1kwwadGZNzgq4hI4PCB/U5Dw==" - }, - { - "@type":"dht.node", - "id":{ - "@type":"pub.ed25519", - "key":"zDBLsKjns4bBqQokzY0wOzC2vwbOeiE1J7aOjfCp5mg=" - }, - "addr_list":{ - "@type":"adnl.addressList", - "addrs":[ - { - "@type":"adnl.address.udp", - "ip":-1573440928, - "port":12821 - } - ], - "version":0, - "reinit_date":0, - "priority":0, - "expire_at":0 - }, - "version":-1, - "signature":"qORMhem9RyG7wnNYF822YL3EXwEoTO82h2TarFbjd0jikMIGizAdir1JyxSfyKkhHdFKGcLMeoPb2dfMIvQwAA==" - }, - { - "@type":"dht.node", - "id":{ - "@type":"pub.ed25519", - "key":"CU9ytJok8WBnpl29T740gfC/h69kgvQJp7FJMq/N60g=" - }, - "addr_list":{ - "@type":"adnl.addressList", - "addrs":[ - { - "@type":"adnl.address.udp", - "ip":391653587, - "port":15895 - } - ], - "version":0, - "reinit_date":0, - "priority":0, - "expire_at":0 - }, - "version":-1, - "signature":"DKyGF2nPRxmerpIHxE5FN1Lod3zvJu728NP0iYc1hpNyPvl5epu+7amjimLy1VdzNqFzTJAoJ/gqPPMkXS/kDw==" - }, - { - "@type":"dht.node", - "id":{ - "@type":"pub.ed25519", - "key":"d1lL6xZO8UWMzkWD++8Yr3hf6585X6qoOZZTeLtGl4o=" - }, - "addr_list":{ - "@type":"adnl.addressList", - "addrs":[ - { - "@type":"adnl.address.udp", - "ip":-1537553981, - "port":18513 - } - ], - "version":0, - "reinit_date":0, - "priority":0, - "expire_at":0 - }, - "version":-1, - "signature":"sDxyCuvZmi9fJvQl4DEBKZOlt532xflnVD1dvC2ia2Na5MN8dT6x4HizEpS4pUqky8LzR/A/4BCqIQXhD45vDg==" - }, - { - "@type":"dht.node", - "id":{ - "@type":"pub.ed25519", - "key":"SP2Bjle9u+GoZhlEhm3mIPiND3Yh+Nr7QsgV6bGPw/I=" - }, - "addr_list":{ - "@type":"adnl.addressList", - "addrs":[ - { - "@type":"adnl.address.udp", - "ip":-1591529174, - "port":11369 - } - ], - "version":0, - "reinit_date":0, - "priority":0, - "expire_at":0 - }, - "version":-1, - "signature":"qbbeE53SOyUvOWD2hIZmTyZGY4k2XHxgldqBIakBma33oC5sWDD/+cApuFLMbi2Gnd6fQtQ3LaZtfQzJrCiYAw==" - }, - { - "@type":"dht.node", - "id":{ - "@type":"pub.ed25519", - "key":"76SsMv8NrqzkCFEVumZEx2phYYSUZvSH3UlUTuPdZYk=" - }, - "addr_list":{ - "@type":"adnl.addressList", - "addrs":[ - { - "@type":"adnl.address.udp", - "ip":-1906451518, - "port":16937 - } - ], - "version":0, - "reinit_date":0, - "priority":0, - "expire_at":0 - }, - "version":-1, - "signature":"YgrIN/KH3XVPyk09wgZbFaXLZ/BeGjvfO6ohxN4M8Tp/CsYN0G3tNLSjJGeuH22bIKMFRoEpp3v7Sz54Q/FTCg==" - }, - { - "@type":"dht.node", - "id":{ - "@type":"pub.ed25519", - "key":"39QMN3uUgYxgu67GxapW+T3YAM8N+pU4/AmwM89aH9E=" - }, - "addr_list":{ - "@type":"adnl.addressList", - "addrs":[ - { - "@type":"adnl.address.udp", - "ip":-2134382694, - "port":7651 - } - ], - "version":0, - "reinit_date":0, - "priority":0, - "expire_at":0 - }, - "version":-1, - "signature":"/mSDe4QY5JAmG4WOQDCN3pKHYkGxOZ8g74fYbqDJ2e2UDg38+s1ecC3+n6RfU74sz0KUNYlcHAopu6VrWA7PAg==" - }, - { - "@type":"dht.node", - "id":{ - "@type":"pub.ed25519", - "key":"IHrCooudVGonmudcmTZYk+Pfdsxz2NGws33bHtXnOv8=" - }, - "addr_list":{ - "@type":"adnl.addressList", - "addrs":[ - { - "@type":"adnl.address.udp", - "ip":-1882838653, - "port":41623 - } - ], - "version":0, - "reinit_date":0, - "priority":0, - "expire_at":0 - }, - "version":-1, - "signature":"pm3PQn0ZYQH7SkmK/8q4p1igFKxJSQLCmVcFtyaRxEV9ecjvB5PiW3o3wfrTRPk0v0mnFmH8UuYtLEztj+LcBw==" - }, - { - "@type":"dht.node", - "id":{ - "@type":"pub.ed25519", - "key":"eDPKd9v6aHhutnHU3z2ykV4eUA3LdFI+oSBg6z8JyS0=" - }, - "addr_list":{ - "@type":"adnl.addressList", - "addrs":[ - { - "@type":"adnl.address.udp", - "ip":-1481864647, - "port":22261 - } - ], - "version":0, - "reinit_date":0, - "priority":0, - "expire_at":0 - }, - "version":-1, - "signature":"InY5jkkQ6fuJtutkmlPLYEhqQ0F4DyEhqoPB4KMBIJc8hhZFzm4jNAxSfy3VVQbACdJ/pj76qbjaktG/m1ipDQ==" - }, - { - "@type": "dht.node", - "id": { - "@type": "pub.ed25519", - "key": "znOAvy1ECxyzeKishi4PdSO2edaVx78wynVyNKLBmQ8=" - }, - "addr_list": { - "@type": "adnl.addressList", - "addrs": [ - { - "@type": "adnl.address.udp", - "ip": -1068377703, - "port": 6302 - } - ], - "version": 0, - "reinit_date": 0, - "priority": 0, - "expire_at": 0 - }, - "version": -1, - "signature": "KLH17nNKmOk3carKwbsUcVBc4JZpdAUdUOMxe8FSyqnkOw/lolnltbylJcC+lvPpIV5ySI/Qx8UZdNRV/4HzCA==" - }, - { - "@type": "dht.node", - "id": { - "@type": "pub.ed25519", - "key": "Qjhv9rmeqXm0a+nYYhCJG1AH7C2TM6DAmyIM3FgO0Eo=" - }, - "addr_list": { - "@type": "adnl.addressList", - "addrs": [ - { - "@type": "adnl.address.udp", - "ip": -1057912003, - "port": 6302 - } - ], - "version": 0, - "reinit_date": 0, - "priority": 0, - "expire_at": 0 - }, - "version": -1, - "signature": "2Gw5eIsZR+SdbWCU139DCuBI8Rv8T9iUioxDkgV6/IjcCHf6hNz8WCyUsKd5l5P1NBs/kdaxUBIybINDpYXoCw==" - }, - { - "@type": "dht.node", - "id": { - "@type": "pub.ed25519", - "key": "2YsTRIu3aRYzZe8eoR8PK2N2ydHJyKllwKcLPk676d4=" - }, - "addr_list": { - "@type": "adnl.addressList", - "addrs": [ - { - "@type": "adnl.address.udp", - "ip": -1057911744, - "port": 6302 - } - ], - "version": 0, - "reinit_date": 0, - "priority": 0, - "expire_at": 0 - }, - "version": -1, - "signature": "9/TJsaj0wELvRKXVIrBdyZWjgLKhfSvl7v0Oqq/9p9MsU/t9iRuGcpAzHqQF4bQAWrN8j9ARwMumRata7dH8Bg==" - }, - { - "@type": "dht.node", - "id": { - "@type": "pub.ed25519", - "key": "SHrXmMEEUBGa51TWZwHSA+2RF4Vyavw51jgtnAz1ypU=" - }, - "addr_list": { - "@type": "adnl.addressList", - "addrs": [ - { - "@type": "adnl.address.udp", - "ip": -1057911148, - "port": 6302 - } - ], - "version": 0, - "reinit_date": 0, - "priority": 0, - "expire_at": 0 - }, - "version": -1, - "signature": "R4ku8+tvjKSLIGe18zWHBHDv1maQHD5tGbAUOgbldGpBvfqH+/b76XkJjJzDsjnCO/bpxwUZfcI1sM1h6vFJCQ==" - }, - { - "@type": "dht.node", - "id": { - "@type": "pub.ed25519", - "key": "G+Lr6UtSWUcyYHTUutwbxrIG9GGZan3h96j8qQPLIXQ=" - }, - "addr_list": { - "@type": "adnl.addressList", - "addrs": [ - { - "@type": "adnl.address.udp", - "ip": -960017601, - "port": 6302 - } - ], - "version": 0, - "reinit_date": 0, - "priority": 0, - "expire_at": 0 - }, - "version": -1, - "signature": "fWU9hSNLvmaSCQOBW9M4Lja5pIWcqOzU1g9vtSywdgtASj9oQpwAslvr2sjNh9E2Np1c26NW8Sc5gUKf8YY7BA==" - }, - { - "@type": "dht.node", - "id": { - "@type": "pub.ed25519", - "key": "/tp8WsXfk/XpzOyaaxuOlvbOhDoH7/L81eWi0QMn0gg=" - }, - "addr_list": { - "@type": "adnl.addressList", - "addrs": [ - { - "@type": "adnl.address.udp", - "ip": 84478511, - "port": 6302 - } - ], - "version": 0, - "reinit_date": 0, - "priority": 0, - "expire_at": 0 - }, - "version": -1, - "signature": "2kA9P0LBI7H8gmmGsnZ2bQPZP3rZDFugrc5zQWlFrPIMLvwH7/J69HIGCVYgcaEsf0HMnIJeUMl5n4qFp0quBQ==" - }, - { - "@type": "dht.node", - "id": { - "@type": "pub.ed25519", - "key": "fnYl5kAHcbhK65FbYxfwk83X1Sn6ZiuXWMD0F0Rh+v4=" - }, - "addr_list": { - "@type": "adnl.addressList", - "addrs": [ - { - "@type": "adnl.address.udp", - "ip": 84478479, - "port": 6302 - } - ], - "version": 0, - "reinit_date": 0, - "priority": 0, - "expire_at": 0 - }, - "version": -1, - "signature": "h+K+YttdhqE4LzihZTnKLFBiXyY79Rqqcx8dCbkDVXu3FD7ZrTBNV5b/bf7BQbuF0PXTc7YqH0jEmqz8aX6aBg==" - }, - { - "@type": "dht.node", - "id": { - "@type": "pub.ed25519", - "key": "HwOhm4Vh1YGqBNmUrDwJpeo8kXAPI7J3sSH38JaAyzQ=" - }, - "addr_list": { - "@type": "adnl.addressList", - "addrs": [ - { - "@type": "adnl.address.udp", - "ip": -2018145068, - "port": 6302 - } - ], - "version": 0, - "reinit_date": 0, - "priority": 0, - "expire_at": 0 - }, - "version": -1, - "signature": "Ianf1Wm9Y6HT9r32LFNUieKi86cSBbCckczHy+ZyBo15MpIsZxouUgfAyeW20sZm1hN5+Yx4lPwzL+Ovm6KaCw==" - }, - { - "@type": "dht.node", - "id": { - "@type": "pub.ed25519", - "key": "CXo+qxdYclubZqoqvVhoeYDdPV+VhlWcurf2OX0iPZs=" - }, - "addr_list": { - "@type": "adnl.addressList", - "addrs": [ - { - "@type": "adnl.address.udp", - "ip": -2018145059, - "port": 6302 - } - ], - "version": 0, - "reinit_date": 0, - "priority": 0, - "expire_at": 0 - }, - "version": -1, - "signature": "P72kraIX5pIxQBnh7It4kyK6MPuZ56ZFZKZxegtrxwx/Vpi1wQ4PsfxWf6N0HojbNMYsVZsvwHYTLxj5nhd6Dw==" - }, - { - "@type": "dht.node", - "id": { - "@type": "pub.ed25519", - "key": "KiKtUV+kJWBd+M29zNvtRqdvUrtX4lfi5CyY+DRm+lk=" - }, - "addr_list": { - "@type": "adnl.addressList", - "addrs": [ - { - "@type": "adnl.address.udp", - "ip": 1091931625, - "port": 6302 - } - ], - "version": 0, - "reinit_date": 0, - "priority": 0, - "expire_at": 0 - }, - "version": -1, - "signature": "GjarYvxTVPik8m5yI9Eq/1lW/8CuReBdhUdFUb4wJJVVc/EvHf7j47mY5ECskHjeo9MYttgF/9KQaf8KNea1Dg==" - }, - { - "@type": "dht.node", - "id": { - "@type": "pub.ed25519", - "key": "o15mg8SB9CY2m971NvU+aCzAEnZFg3iAnIsqBMmqnj0=" - }, - "addr_list": { - "@type": "adnl.addressList", - "addrs": [ - { - "@type": "adnl.address.udp", - "ip": 1091931590, - "port": 6302 - } - ], - "version": 0, - "reinit_date": 0, - "priority": 0, - "expire_at": 0 - }, - "version": -1, - "signature": "6mJPM7RZMOL5uCMRCGINjxAG7L7LHt7o89caD7Kk75ahpwAhqJ3ri9zL1rzJZjmyOMLkPoGcckJsG8phCRbVDQ==" - }, - { - "@type": "dht.node", - "id": { - "@type": "pub.ed25519", - "key": "VCu471G41Hj8onyyeJdq8t6AZu3SR7BoGuCLs8SppBk=" - }, - "addr_list": { - "@type": "adnl.addressList", - "addrs": [ - { - "@type": "adnl.address.udp", - "ip": 1091931623, - "port": 6302 - } - ], - "version": 0, - "reinit_date": 0, - "priority": 0, - "expire_at": 0 - }, - "version": -1, - "signature": "7cOhypsjGb4xczR20M6eg7ly8sdvzdodkKVXzvr00FsXHcguz6bP0zm/dwhiQgsJgSosYypCk/LvKQrMy+C3AQ==" - }, - { - "@type": "dht.node", - "id": { - "@type": "pub.ed25519", - "key": "0uEnHB6Rg4sVjiepDgHoZ3CuKjCRjU3ul4IGmmZZoig=" - }, - "addr_list": { - "@type": "adnl.addressList", - "addrs": [ - { - "@type": "adnl.address.udp", - "ip": 1091931589, - "port": 6302 - } - ], - "version": 0, - "reinit_date": 0, - "priority": 0, - "expire_at": 0 - }, - "version": -1, - "signature": "ju40qeS5mgbJDMLUxL7qSquSdqgo3Uib4Z/Va/bpIWJJA0W3VQStJMBbV/pQySi6MoM794Du3o8Gl1bjdpwDAg==" - }, - { - "@type": "dht.node", - "id": { - "@type": "pub.ed25519", - "key": "MJr8xja0xpu9DoisFXBrkNHNx1XozR7HHw9fJdSyEdo=" - }, - "addr_list": { - "@type": "adnl.addressList", - "addrs": [ - { - "@type": "adnl.address.udp", - "ip": -2018147130, - "port": 6302 - } - ], - "version": 0, - "reinit_date": 0, - "priority": 0, - "expire_at": 0 - }, - "version": -1, - "signature": "XcR5JaWcf4QMdI8urLSc1zwv5+9nCuItSE1EDa0dSwYF15R/BtJoKU5YHA4/T8SiO18aVPQk2SL1pbhevuMrAQ==" - }, - { - "@type": "dht.node", - "id": { - "@type": "pub.ed25519", - "key": "Fhldu4zlnb20/TUj9TXElZkiEmbndIiE/DXrbGKu+0c=" - }, - "addr_list": { - "@type": "adnl.addressList", - "addrs": [ - { - "@type": "adnl.address.udp", - "ip": -2018147075, - "port": 6302 - } - ], - "version": 0, - "reinit_date": 0, - "priority": 0, - "expire_at": 0 - }, - "version": -1, - "signature": "nUGB77UAkd2+ZAL5PgInb3TvtuLLXJEJ2icjAUKLv4qIGB3c/O9k/v0NKwSzhsMP0ljeTGbcIoMDw24qf3goCg==" - } - ] - } - }, - "liteservers": [ - { - "ip": 1137658550, - "port": 4924, - "id": { - "@type": "pub.ed25519", - "key": "peJTw/arlRfssgTuf9BMypJzqOi7SXEqSPSWiEw2U1M=" - } - }, - { - "ip": 84478511, - "port": 19949, - "id": { - "@type": "pub.ed25519", - "key": "n4VDnSCUuSpjnCyUk9e3QOOd6o0ItSWYbTnW3Wnn8wk=" - } - }, - { - "ip": 84478479, - "port": 48014, - "id": { - "@type": "pub.ed25519", - "key": "3XO67K/qi+gu3T9v8G2hx1yNmWZhccL3O7SoosFo8G0=" - } - }, - { - "ip": -2018135749, - "port": 53312, - "id": { - "@type": "pub.ed25519", - "key": "aF91CuUHuuOv9rm2W5+O/4h38M3sRm40DtSdRxQhmtQ=" - } - }, - { - "ip": -2018145068, - "port": 13206, - "id": { - "@type": "pub.ed25519", - "key": "K0t3+IWLOXHYMvMcrGZDPs+pn58a17LFbnXoQkKc2xw=" - } - }, - { - "ip": -2018145059, - "port": 46995, - "id": { - "@type": "pub.ed25519", - "key": "wQE0MVhXNWUXpWiW5Bk8cAirIh5NNG3cZM1/fSVKIts=" - } - }, - { - "ip": 868462740, - "port": 4194, - "id": { - "@type": "pub.ed25519", - "key": "8sEr/sw8EmFyuJaOQlbNbT0IKj8NtoCsFw5052hVvHw=" - } - }, - { - "ip": 1091931625, - "port": 30131, - "id": { - "@type": "pub.ed25519", - "key": "wrQaeIFispPfHndEBc0s0fx7GSp8UFFvebnytQQfc6A=" - } - }, - { - "ip": 1091931590, - "port": 47160, - "id": { - "@type": "pub.ed25519", - "key": "vOe1Xqt/1AQ2Z56Pr+1Rnw+f0NmAA7rNCZFIHeChB7o=" - } - }, - { - "ip": 1091931623, - "port": 17728, - "id": { - "@type": "pub.ed25519", - "key": "BYSVpL7aPk0kU5CtlsIae/8mf2B/NrBi7DKmepcjX6Q=" - } - }, - { - "ip": 1091931589, - "port": 13570, - "id": { - "@type": "pub.ed25519", - "key": "iVQH71cymoNgnrhOT35tl/Y7k86X5iVuu5Vf68KmifQ=" - } - }, - { - "ip": -1539021362, - "port": 52995, - "id": { - "@type": "pub.ed25519", - "key": "QnGFe9kihW+TKacEvvxFWqVXeRxCB6ChjjhNTrL7+/k=" - } - }, - { - "ip": -1539021936, - "port": 20334, - "id": { - "@type": "pub.ed25519", - "key": "gyLh12v4hBRtyBygvvbbO2HqEtgl+ojpeRJKt4gkMq0=" - } - }, - { - "ip": -1136338705, - "port": 19925, - "id": { - "@type": "pub.ed25519", - "key": "ucho5bEkufbKN1JR1BGHpkObq602whJn3Q3UwhtgSo4=" - } - }, - { - "ip": 868465979, - "port": 19434, - "id": { - "@type": "pub.ed25519", - "key": "J5CwYXuCZWVPgiFPW+NY2roBwDWpRRtANHSTYTRSVtI=" - } - }, - { - "ip": 868466060, - "port": 23067, - "id": { - "@type": "pub.ed25519", - "key": "vX8d0i31zB0prVuZK8fBkt37WnEpuEHrb7PElk4FJ1o=" - } - }, - { - "ip": -2018147130, - "port": 53560, - "id": { - "@type": "pub.ed25519", - "key": "NlYhh/xf4uQpE+7EzgorPHqIaqildznrpajJTRRH2HU=" - } - }, - { - "ip": -2018147075, - "port": 46529, - "id": { - "@type": "pub.ed25519", - "key": "jLO6yoooqUQqg4/1QXflpv2qGCoXmzZCR+bOsYJ2hxw=" - } - }, - { - "ip": 908566172, - "port": 51565, - "id": { - "@type": "pub.ed25519", - "key": "TDg+ILLlRugRB4Kpg3wXjPcoc+d+Eeb7kuVe16CS9z8=" - } - }, - { - "ip": -1185526007, - "port": 4701, - "id": { - "@type": "pub.ed25519", - "key": "G6cNAr6wXBBByWDzddEWP5xMFsAcp6y13fXA8Q7EJlM=" - } - } - ], - "validator": { - "@type": "validator.config.global", - "zero_state": { - "workchain": -1, - "shard": -9223372036854775808, - "seqno": 0, - "root_hash": "F6OpKZKqvqeFp6CQmFomXNMfMj2EnaUSOXN+Mh+wVWk=", - "file_hash": "XplPz01CXAps5qeSWUtxcyBfdAo5zVb1N979KLSKD24=" - }, - "init_block": { - "root_hash": "iyOany4cPE2u6h/Um7OAmHDQ+Nba8Am+g/qZJ5M4P9M=", - "seqno": 18155329, - "file_hash": "Yqmli3gIUgt3KjeU4n2d1ZmcJ3R4zJBMYWhM+tZF4V8=", - "workchain": -1, - "shard": -9223372036854775808 - }, - "hardforks": [ - { - "file_hash": "t/9VBPODF7Zdh4nsnA49dprO69nQNMqYL+zk5bCjV/8=", - "seqno": 8536841, - "root_hash": "08Kpc9XxrMKC6BF/FeNHPS3MEL1/Vi/fQU/C9ELUrkc=", - "workchain": -1, - "shard": -9223372036854775808 - } - ] - } -} - "#; - - let v: ConfigGlobal = serde_json::from_str(config_json).unwrap(); - println!("{:?}", v); -} diff --git a/liteapi/tests/rpc_test.rs b/liteapi/tests/rpc_test.rs deleted file mode 100644 index 1ba9ea7..0000000 --- a/liteapi/tests/rpc_test.rs +++ /dev/null @@ -1,512 +0,0 @@ -use hex::FromHex; -use liteclient::{tl_types::*, LiteClient}; - -#[test] -fn get_masterchain_info_test() { - let config = { - let url = "https://ton-blockchain.github.io/global.config.json"; - let mut response = ureq::get(url).call().unwrap(); - while response.status() != 200 { - response = ureq::get(url).call().unwrap(); - } - response.into_string().unwrap() - }; - let mut client = LiteClient::connect(&config).unwrap(); - assert!(client.get_masterchain_info().is_ok()); -} - -#[test] -fn get_masterchain_info_ext_test() { - let config = { - let url = "https://ton-blockchain.github.io/global.config.json"; - let mut response = ureq::get(url).call().unwrap(); - while response.status() != 200 { - response = ureq::get(url).call().unwrap(); - } - response.into_string().unwrap() - }; - let mut client = LiteClient::connect(&config).unwrap(); - assert!(client.get_masterchain_info_ext(0).is_ok()); -} - -#[test] -fn get_time_test() { - let config = { - let url = "https://ton-blockchain.github.io/global.config.json"; - let mut response = ureq::get(url).call().unwrap(); - while response.status() != 200 { - response = ureq::get(url).call().unwrap(); - } - response.into_string().unwrap() - }; - let mut client = LiteClient::connect(&config).unwrap(); - assert!(client.get_time().is_ok()); -} - -#[test] -fn get_version_test() { - let config = { - let url = "https://ton-blockchain.github.io/global.config.json"; - let mut response = ureq::get(url).call().unwrap(); - while response.status() != 200 { - response = ureq::get(url).call().unwrap(); - } - response.into_string().unwrap() - }; - let mut client = LiteClient::connect(&config).unwrap(); - assert!(client.get_version().is_ok()); -} - -#[test] -fn get_block_test() { - let config = { - let url = "https://ton-blockchain.github.io/global.config.json"; - let mut response = ureq::get(url).call().unwrap(); - while response.status() != 200 { - response = ureq::get(url).call().unwrap(); - } - response.into_string().unwrap() - }; - let mut client = LiteClient::connect(&config).unwrap(); - let info = client.get_masterchain_info().unwrap(); - assert!(client - .get_block(liteclient::tl_types::BlockIdExt { - workchain: info.last.workchain, - shard: info.last.shard, - seqno: info.last.seqno, - root_hash: info.last.root_hash, - file_hash: info.last.file_hash - }) - .is_ok()); -} - -#[test] -fn get_state_test() { - let config = { - let url = "https://ton-blockchain.github.io/global.config.json"; - let mut response = ureq::get(url).call().unwrap(); - while response.status() != 200 { - response = ureq::get(url).call().unwrap(); - } - response.into_string().unwrap() - }; - let mut client = LiteClient::connect(&config).unwrap(); - let workchain: i32 = -1; - let shard: u64 = 9223372036854775808; - let seqno: u32 = 2; - let root_hash = - liteclient::tl_types::Int256::from_base64("4bzgnFItQjTVEMYL9c/VHshMJttG9gDIXCzsMQdjKSU=") - .unwrap(); - let file_hash = - liteclient::tl_types::Int256::from_base64("2gOSTo8fuMWgA18snVD1RUtTfpU5LvCQWOOQ16Z7w5Y=") - .unwrap(); - let result = (client).get_state(liteclient::tl_types::BlockIdExt { - workchain, - shard, - seqno, - root_hash, - file_hash, - }); - if result.is_err() { - assert!( - result.clone().unwrap_err().message - == liteclient::tl_types::String::new("state not in db".to_string()) - || result.unwrap_err().message - == liteclient::tl_types::String::new("state already gc'd".to_string()) - ); - } else { - assert!(!result.unwrap().data.is_empty()); - } -} - -#[test] -fn get_block_header() { - let config = { - let url = "https://ton-blockchain.github.io/global.config.json"; - let mut response = ureq::get(url).call().unwrap(); - while response.status() != 200 { - response = ureq::get(url).call().unwrap(); - } - response.into_string().unwrap() - }; - let mut client = LiteClient::connect(&config).unwrap(); - let info = client.get_masterchain_info().unwrap(); - - assert!(client - .get_block(liteclient::tl_types::BlockIdExt { - workchain: info.last.workchain, - shard: info.last.shard, - seqno: info.last.seqno, - root_hash: info.last.root_hash, - file_hash: info.last.file_hash - }) - .is_ok()); -} - -// #[test] -// fn send_message_test() { -// // let config = { -// // let url = "https://ton-blockchain.github.io/global.config.json"; -// // let mut response = ureq::get(url).call().unwrap(); -// // while response.status() != 200 { -// // response = ureq::get(url).call().unwrap(); -// // } -// // response.into_string().unwrap() -// // }; -// // let mut client = LiteClient::connect(&config).unwrap(); -// todo!() -// } - -#[test] -fn get_account_state_test() { - let config = { - let url = "https://ton-blockchain.github.io/global.config.json"; - let mut response = ureq::get(url).call().unwrap(); - while response.status() != 200 { - response = ureq::get(url).call().unwrap(); - } - response.into_string().unwrap() - }; - let mut client = LiteClient::connect(&config).unwrap(); - let workchain: i32 = -1; - let shard: u64 = 9223372036854775808; - let seqno: u32 = 28235435; - let root_hash = Int256::from_base64("Ah9jCut6khUq0CRBGdyjXkevGfX3VgtwP9/o4LVU4Io=").unwrap(); - let file_hash = Int256::from_base64("F7F/vvTky8+qofgh8fLkfNXe0C8ne1rR13YDxtfHYPI=").unwrap(); - let account = - AccountId::from_friendly("EQA-PqYkjSr-bbu_dtpV379hZNiFXFGQGlr74SUOdOgSgxE0").unwrap(); - let res = client - .get_account_state( - BlockIdExt { - workchain, - shard, - seqno, - root_hash, - file_hash, - }, - account, - ) - .unwrap(); - assert!(res.state.is_empty()); -} - -#[test] -fn get_shard_info_test() { - let config = { - let url = "https://ton-blockchain.github.io/global.config.json"; - let mut response = ureq::get(url).call().unwrap(); - while response.status() != 200 { - response = ureq::get(url).call().unwrap(); - } - response.into_string().unwrap() - }; - let mut client = LiteClient::connect(&config).unwrap(); - let block = (client) - .lookup_block( - BlockId { - workchain: -1, - shard: 9223372036854775808, - seqno: 13000000, - }, - None, - None, - ) - .unwrap(); - let result = (client) - .get_shard_info(block.id, 0, 9223372036854775808, true) - .unwrap(); - assert_eq!( - result.shard_proof, - vec![ - 181u8, 238, 156, 114, 1, 2, 25, 2, 0, 4, 185, 1, 0, 9, 70, 3, 113, 120, 153, 245, 144, - 200, 82, 137, 148, 237, 70, 139, 171, 4, 196, 7, 81, 61, 189, 69, 103, 35, 28, 240, - 211, 231, 34, 135, 57, 26, 96, 254, 0, 43, 2, 9, 70, 3, 60, 23, 63, 231, 104, 223, 13, - 221, 50, 5, 48, 57, 218, 60, 98, 182, 83, 5, 112, 58, 67, 207, 94, 119, 27, 38, 237, - 107, 123, 57, 183, 162, 0, 20, 17, 36, 91, 144, 35, 175, 226, 255, 255, 255, 17, 0, - 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 93, 64, 0, 0, 0, 1, 96, 235, 12, - 87, 0, 0, 17, 190, 9, 84, 162, 132, 0, 198, 93, 61, 96, 3, 4, 5, 6, 40, 72, 1, 1, 185, - 20, 165, 199, 176, 95, 46, 123, 32, 111, 23, 172, 94, 35, 14, 216, 134, 60, 166, 34, - 226, 219, 72, 84, 179, 219, 160, 104, 149, 233, 28, 22, 0, 1, 40, 72, 1, 1, 61, 95, 80, - 117, 172, 122, 83, 138, 215, 75, 36, 31, 22, 245, 83, 155, 201, 227, 128, 154, 15, 114, - 238, 136, 76, 236, 170, 185, 107, 160, 102, 107, 0, 42, 34, 51, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 131, 147, 177, 167, 247, 26, 162, 90, 88, 40, - 7, 8, 36, 85, 204, 38, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 194, 47, 129, 187, 182, 96, 130, 3, 126, 9, 10, 11, 12, 40, 72, 1, 1, 165, - 167, 210, 64, 87, 216, 100, 59, 37, 39, 112, 157, 152, 108, 218, 56, 70, 173, 203, 62, - 221, 195, 45, 40, 236, 33, 246, 158, 23, 219, 170, 239, 0, 1, 40, 72, 1, 1, 120, 23, - 94, 12, 238, 3, 241, 51, 225, 183, 241, 225, 92, 134, 126, 183, 118, 155, 221, 83, 156, - 78, 66, 181, 127, 10, 143, 179, 161, 169, 177, 29, 0, 3, 1, 3, 208, 64, 13, 40, 72, 1, - 1, 102, 54, 213, 164, 15, 188, 211, 3, 125, 79, 255, 11, 179, 46, 82, 91, 90, 76, 209, - 226, 242, 225, 242, 204, 196, 91, 39, 202, 150, 4, 227, 74, 0, 15, 34, 191, 0, 1, 140, - 83, 216, 196, 0, 3, 24, 235, 96, 0, 2, 55, 193, 40, 172, 8, 136, 0, 0, 141, 219, 10, - 226, 244, 32, 6, 49, 207, 158, 208, 23, 94, 191, 143, 52, 74, 175, 118, 95, 237, 134, - 91, 248, 54, 154, 73, 45, 58, 6, 41, 251, 42, 235, 207, 99, 178, 87, 67, 112, 93, 235, - 63, 8, 52, 94, 254, 93, 234, 112, 101, 201, 181, 177, 67, 152, 17, 186, 153, 212, 245, - 196, 11, 58, 125, 2, 185, 198, 179, 206, 142, 146, 176, 56, 190, 15, 16, 40, 72, 1, 1, - 178, 14, 54, 163, 179, 106, 76, 222, 230, 1, 16, 108, 100, 46, 144, 113, 139, 10, 88, - 218, 242, 0, 117, 61, 187, 49, 137, 249, 86, 180, 148, 182, 0, 1, 1, 219, 80, 8, 88, - 98, 56, 6, 50, 234, 0, 0, 0, 141, 240, 74, 43, 2, 0, 0, 0, 141, 240, 74, 43, 2, 9, 94, - 99, 49, 148, 170, 1, 54, 197, 146, 50, 130, 198, 181, 213, 246, 201, 235, 187, 98, 24, - 202, 218, 203, 69, 28, 34, 0, 245, 147, 7, 4, 127, 46, 57, 13, 151, 80, 52, 157, 68, - 118, 94, 31, 49, 44, 31, 172, 54, 78, 129, 95, 33, 108, 209, 214, 15, 201, 249, 186, - 94, 36, 87, 182, 168, 128, 0, 24, 205, 252, 0, 0, 0, 0, 0, 0, 0, 0, 6, 50, 233, 235, 7, - 88, 98, 138, 14, 0, 19, 67, 185, 172, 160, 2, 29, 205, 101, 0, 32, 40, 72, 1, 1, 56, - 37, 159, 58, 45, 169, 231, 109, 91, 89, 182, 65, 62, 92, 224, 12, 116, 237, 34, 113, 2, - 228, 113, 99, 28, 145, 72, 223, 24, 100, 34, 134, 0, 24, 40, 72, 1, 1, 195, 104, 103, - 158, 204, 74, 140, 66, 116, 125, 48, 151, 21, 226, 230, 14, 208, 225, 137, 214, 252, - 50, 136, 58, 50, 58, 216, 154, 120, 227, 64, 82, 0, 15, 36, 16, 17, 239, 85, 170, 255, - 255, 255, 17, 18, 19, 20, 21, 1, 160, 155, 199, 169, 135, 0, 0, 0, 0, 4, 1, 0, 198, 93, - 64, 0, 0, 0, 1, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 96, 235, 12, 87, 0, 0, - 17, 190, 9, 84, 162, 128, 0, 0, 17, 190, 9, 84, 162, 132, 85, 27, 118, 79, 0, 3, 24, - 235, 0, 198, 93, 61, 0, 198, 57, 243, 196, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 46, 22, 40, - 72, 1, 1, 191, 136, 21, 179, 231, 153, 234, 154, 206, 234, 51, 178, 128, 159, 84, 1, - 112, 140, 124, 135, 195, 250, 197, 122, 185, 124, 188, 240, 160, 177, 184, 51, 0, 3, - 42, 138, 4, 45, 71, 111, 148, 239, 45, 235, 46, 110, 102, 239, 239, 49, 26, 7, 103, - 168, 196, 60, 39, 209, 126, 181, 206, 121, 21, 22, 37, 111, 17, 50, 128, 113, 120, 153, - 245, 144, 200, 82, 137, 148, 237, 70, 139, 171, 4, 196, 7, 81, 61, 189, 69, 103, 35, - 28, 240, 211, 231, 34, 135, 57, 26, 96, 254, 0, 43, 0, 43, 23, 24, 40, 72, 1, 1, 11, - 227, 28, 51, 69, 166, 186, 82, 137, 76, 40, 146, 104, 138, 88, 1, 248, 181, 43, 182, - 115, 92, 66, 154, 234, 182, 243, 134, 104, 120, 33, 154, 0, 8, 0, 152, 0, 0, 17, 190, - 9, 69, 96, 68, 0, 198, 93, 63, 30, 244, 236, 125, 1, 234, 44, 173, 54, 186, 10, 225, - 243, 202, 242, 249, 236, 62, 93, 106, 250, 92, 231, 97, 3, 129, 48, 228, 234, 38, 165, - 160, 206, 30, 126, 251, 108, 53, 18, 141, 125, 76, 78, 224, 255, 41, 3, 17, 205, 125, - 145, 151, 27, 223, 227, 42, 220, 246, 195, 185, 165, 17, 100, 149, 104, 140, 1, 3, 45, - 71, 111, 148, 239, 45, 235, 46, 110, 102, 239, 239, 49, 26, 7, 103, 168, 196, 60, 39, - 209, 126, 181, 206, 121, 21, 22, 37, 111, 17, 50, 128, 254, 198, 24, 212, 236, 165, 51, - 249, 129, 79, 229, 120, 50, 253, 45, 122, 201, 164, 126, 204, 151, 71, 39, 42, 93, 11, - 188, 28, 191, 83, 75, 90, 0, 43, 0, 18, 104, 140, 1, 3, 113, 120, 153, 245, 144, 200, - 82, 137, 148, 237, 70, 139, 171, 4, 196, 7, 81, 61, 189, 69, 103, 35, 28, 240, 211, - 231, 34, 135, 57, 26, 96, 254, 208, 214, 128, 118, 188, 203, 190, 146, 211, 175, 18, - 82, 177, 18, 216, 16, 121, 121, 247, 209, 165, 240, 190, 146, 123, 114, 243, 148, 114, - 212, 204, 166, 0, 43, 0, 18 - ] - ); -} - -#[test] -fn get_all_shards_info_test() { - let config = { - let url = "https://ton-blockchain.github.io/global.config.json"; - let mut response = ureq::get(url).call().unwrap(); - while response.status() != 200 { - response = ureq::get(url).call().unwrap(); - } - response.into_string().unwrap() - }; - let mut client = LiteClient::connect(&config).unwrap(); - let block = (client) - .lookup_block( - BlockId { - workchain: -1, - shard: 9223372036854775808, - seqno: 28330758, - }, - None, - None, - ) - .unwrap(); - let result = (client).get_all_shards_info(block.id); - assert!(result.is_ok()); -} - -#[test] -fn get_one_transaction_test() { - let config = { - let url = "https://ton-blockchain.github.io/global.config.json"; - let mut response = ureq::get(url).call().unwrap(); - while response.status() != 200 { - response = ureq::get(url).call().unwrap(); - } - response.into_string().unwrap() - }; - let mut client = LiteClient::connect(&config).unwrap(); - let id = BlockIdExt { - workchain: 0, - seqno: 34073780, - shard: 9223372036854775808, - root_hash: Int256::from_base64("6JhaCv30PM3S4H5Zve/OMPHXUWv/LY0hOd9+M41VUi4=").unwrap(), - file_hash: Int256::from_base64("2dL2E0uqZ5uDlKcPM11GeIPyaQgA4Hy7Zv3j2bKBhoI=").unwrap(), - }; - let account = - AccountId::from_friendly("EQAns9gBUsFtRnoOlwUuXW0738ol8CO5l46PlftBpzhRxmCs").unwrap(); - let result = client.get_one_transaction(id, account, 36479378000003); - assert!(result.is_ok()); -} - -#[test] -fn get_transactions_test() { - let config = { - let url = "https://ton-blockchain.github.io/global.config.json"; - let mut response = ureq::get(url).call().unwrap(); - while response.status() != 200 { - response = ureq::get(url).call().unwrap(); - } - response.into_string().unwrap() - }; - let mut client = LiteClient::connect(&config).unwrap(); - // let id = BlockIdExt{workchain: 0, seqno: 34073780, shard: 9223372036854775808, root_hash: Int256::from_base64("6JhaCv30PM3S4H5Zve/OMPHXUWv/LY0hOd9+M41VUi4=").unwrap(), file_hash: Int256::from_base64("2dL2E0uqZ5uDlKcPM11GeIPyaQgA4Hy7Zv3j2bKBhoI=").unwrap()}; - let account = - AccountId::from_friendly("EQAns9gBUsFtRnoOlwUuXW0738ol8CO5l46PlftBpzhRxmCs").unwrap(); - let result = client.get_transactions( - 10, - account, - 36479378000003, - Int256::from_base64("2JoweA1e8Lz4hDO1KZd1tyTYXsIXWv3FbkWeRL+PvsM=").unwrap(), - ); - assert!(result.is_ok()); -} - -#[test] -fn lookup_block_test() { - let config = { - let url = "https://ton-blockchain.github.io/global.config.json"; - let mut response = ureq::get(url).call().unwrap(); - while response.status() != 200 { - response = ureq::get(url).call().unwrap(); - } - response.into_string().unwrap() - }; - let mut client = LiteClient::connect(&config).unwrap(); - let block = liteclient::tl_types::BlockId { - workchain: -1, - shard: 3, - seqno: 28327268, - }; - let utime = 1679764594; - let lt = 36333154000001; - let empty_block = liteclient::tl_types::BlockId { - workchain: -1, - shard: 1, - seqno: 1, - }; - let res1 = client.lookup_block(block, None, None).unwrap(); - let res2 = client - .lookup_block(empty_block.clone(), Some(lt), None) - .unwrap(); - let res3 = client.lookup_block(empty_block, None, Some(utime)).unwrap(); - assert_eq!(res1, res2); - assert_eq!(res1, res3); -} - -#[test] -fn list_block_transactions_test() { - let config = { - let url = "https://ton-blockchain.github.io/global.config.json"; - let mut response = ureq::get(url).call().unwrap(); - while response.status() != 200 { - response = ureq::get(url).call().unwrap(); - } - response.into_string().unwrap() - }; - let mut client = LiteClient::connect(&config).unwrap(); - let id = BlockIdExt { - workchain: -1, - seqno: 28455017, - shard: 9223372036854775808, - root_hash: Int256::from_base64("Re9R5ML5bOjRDb1H8/hDZIcVDZ6UuhzIlL38J9omfes=").unwrap(), - file_hash: Int256::from_base64("kjP+8ReqSSiB6a6KKh9NKr/lov3RhFNZm0e/6Lndguc=").unwrap(), - }; - let result = client.list_block_transactions(id, 10, None, None, None); - assert!(result.is_ok()); -} - -#[test] -fn get_block_proof_test() { - let hexfile = std::fs::read("tests/sample.txt").unwrap(); - let strin = Vec::::from_hex(hexfile).unwrap(); - let result = tl_proto::deserialize::(&strin).unwrap(); - let response: Vec; - if let Message::Answer { - query_id: _, - answer, - } = result - { - response = answer; - } else { - panic!(); - } - let result2 = tl_proto::deserialize::(&response); - assert!(result2.is_ok()); -} - -#[test] -fn get_config_all_test() { - let config = { - let url = "https://ton-blockchain.github.io/global.config.json"; - let mut response = ureq::get(url).call().unwrap(); - while response.status() != 200 { - response = ureq::get(url).call().unwrap(); - } - response.into_string().unwrap() - }; - let mut client = LiteClient::connect(&config).unwrap(); - let id = BlockIdExt { - workchain: -1, - seqno: 28455017, - shard: 9223372036854775808, - root_hash: Int256::from_base64("Re9R5ML5bOjRDb1H8/hDZIcVDZ6UuhzIlL38J9omfes=").unwrap(), - file_hash: Int256::from_base64("kjP+8ReqSSiB6a6KKh9NKr/lov3RhFNZm0e/6Lndguc=").unwrap(), - }; - let result = client.get_config_all(0, id); - assert!(result.is_ok()); -} - -#[test] -fn get_config_params_test() { - let config = { - let url = "https://ton-blockchain.github.io/global.config.json"; - let mut response = ureq::get(url).call().unwrap(); - while response.status() != 200 { - response = ureq::get(url).call().unwrap(); - } - response.into_string().unwrap() - }; - let mut client = LiteClient::connect(&config).unwrap(); - let id = BlockIdExt { - workchain: -1, - seqno: 28455017, - shard: 9223372036854775808, - root_hash: Int256::from_base64("Re9R5ML5bOjRDb1H8/hDZIcVDZ6UuhzIlL38J9omfes=").unwrap(), - file_hash: Int256::from_base64("kjP+8ReqSSiB6a6KKh9NKr/lov3RhFNZm0e/6Lndguc=").unwrap(), - }; - let param_list = [0, 1, 2]; - let result = client.get_config_params(0, id, param_list.to_vec()); - assert!(result.is_ok()); -} - -#[test] -fn get_validator_stats_test() { - let config = { - let url = "https://ton-blockchain.github.io/global.config.json"; - let mut response = ureq::get(url).call().unwrap(); - while response.status() != 200 { - response = ureq::get(url).call().unwrap(); - } - response.into_string().unwrap() - }; - let mut client = LiteClient::connect(&config).unwrap(); - let id = BlockIdExt { - workchain: -1, - seqno: 28455017, - shard: 9223372036854775808, - root_hash: Int256::from_base64("Re9R5ML5bOjRDb1H8/hDZIcVDZ6UuhzIlL38J9omfes=").unwrap(), - file_hash: Int256::from_base64("kjP+8ReqSSiB6a6KKh9NKr/lov3RhFNZm0e/6Lndguc=").unwrap(), - }; - let result = client.get_validator_stats( - id.clone(), - 10, - Some(Int256::from_base64("Re9R5ML5bOjRDb1H8/hDZIcVDZ6UuhzIlL38J9omfes=").unwrap()), - None, - ); - assert!(result.is_ok()); - let result = client.get_validator_stats( - id.clone(), - 10, - Some(Int256::from_base64("Re9R5ML5bOjRDb1H8/hDZIcVDZ6UuhzIlL38J9omfes=").unwrap()), - Some(1650613847), - ); - assert!(result.is_ok()); - let result = client.get_validator_stats(id, 10, None, None); - assert!(result.is_ok()); -} diff --git a/liteapi/tests/sample.txt b/liteapi/tests/sample.txt deleted file mode 100644 index 7539ebd..0000000 --- a/liteapi/tests/sample.txt +++ /dev/null @@ -1 +0,0 @@ -1684ac0f0202ca7f4636ec5480e7e8393c3dee9680a734d3dfd093f9b7ceb6d37576b717fedc2007c1d2d08e379779bcffffffff00000000000000808953910158af77d91bf547c865411204262d14743dab6f643628076998ea40bd7f26a2f051ac9a242a33f6f0b0e17cf73d9babec02fbd15e77998c9855f9ccf91ee481faffffffff000000000000008077889301242455403f7ddc896101e21944d2637f9280cfd0dd02f8448a93ae07459dceb427e4c4af9ddcf7a1be4f06204530cfbf0c1f328fc7800b62cbb2da5e3f2e22a210000000ef1b7eefb5757299ffffffff00000000000000808953910158af77d91bf547c865411204262d14743dab6f643628076998ea40bd7f26a2f051ac9a242a33f6f0b0e17cf73d9babec02fbd15e77998c9855f9ccf91ee481faffffffff0000000000000080594e91019c7150fc6738a4b596136fb7851512afe5e0b4944ddce05b16ae53ca72781c1036b2225193169799f1117baf6b7607bd22d38192eb46ffce50f4feb9788fb09afe530100b5ee9c7201020701000147000946039c7150fc6738a4b596136fb7851512afe5e0b4944ddce05b16ae53ca72781c10001901241011ef55aaffffff110203040501a09bc7a98700000000060101914e590000000100ffffffff000000000000000063b4fa1400001f194e94864000001f194e94864496502b130005f88201914e5501914591c400000003000000000000002e0628480101f5c2ef8b027656b95ff21110b96127f155099451c9f1816cc91cecfab2a978e00003284801016b0dc426a419d51ca7513d5ec969e05816e0aa56cea9997fcddf4d1a9e2c8a3300182848010198c5965e0632b498641dbe4c4236ef48358f53525e3094ba8ec9edfd9e15a4fa0012009800001f194e85440401914e586a6c2553f96969fb08691702b11fb983d1e45fc5199df08af47d22d19ae65eaa21575dac1e14409730ceb83734270c2299f49d04ff39cb108a72d08d516e32ba00fe060200b5ee9c72010209010001fa0009460358af77d91bf547c865411204262d14743dab6f643628076998ea40bd7f26a2f0001601241011ef55aaffffff110203040501a09bc7a987000000000401019153890000000100ffffffff000000000000000063b50c1e00001f19a243dd4000001f19a243dd441dd238b60005f8950191538701914e59c400000003000000000000002e0628480101c0b437be0fae8cb5cdd25d399e248f97b7e202a99022dcfa5ff8c9b7db2be8b200032a8a04c381d43dcab1d06c4ada9157df9bef4c970482a0fd90bee5b4bf8bf6c5bc9f868b028b330659a89fea78883fc79b88aa88b6434e1f1f3e01fe5835d298cbdd44016f016f0708284801012347cd4ebcc92446037112189108a03341a5b669c32935e949d193415c43745c0008009800001f19a2349b04019153883d4d5d14819148cfe822d011f04b5e80ec93e048cb5aefcfaf8906d734fa39faed83bec1d15fb5f5e216aa493502c445c90a5fbada32ff93f0c771ad1d1d07fe688c0103c381d43dcab1d06c4ada9157df9bef4c970482a0fd90bee5b4bf8bf6c5bc9f8670248813997daeba0b2f903dd6f80f22d6bdd4e0d716668401aa0cd9e535dbf9016f0014688c01038b028b330659a89fea78883fc79b88aa88b6434e1f1f3e01fe5835d298cbdd44c0e02b947f4e685b6f0b94cb06c02379921c4e16a468bd1b152648863363fdd3016f00140000fe310b00b5ee9c7201026201000b25000946038b028b330659a89fea78883fc79b88aa88b6434e1f1f3e01fe5835d298cbdd44016f01245b9023afe2ffffff1100ffffffff0000000000000000019153890000000163b50c1e00001f19a243dd44019153876002030405284801019e4ece13e824714b161d03df6457d5fbe10e69158f01c848b08a6f6b9a1d2837000128480101a7b3393c988fda9160757a70d7a111a59921f93c12e3827571ff2d6c799d3365016e22330000000000000000ffffffffffffffff81f042008b3ccb19c82806072455cc26aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac2339c6854b6e0037e08090a0b28480101a5a7d24057d8643b2527709d986cda3846adcb3eddc32d28ec21f69e17dbaaef000128480101de5adf45c03a745fc9d3a418d9e2ba096db9c1aaa77bc0898b6d9ebb611d2b40000528480101246e158ed9d250210260e665a417f99fac4ecc5a67920a79eb7ec20e0619575f0002284801019dcda16ff101beb64d67ad9dd07974490b19d13abdddf9725a60e6b197528f27001022bf00014597d5300005f896e00003e334469360880000f8ca74a432200c8a72cce38a87e339c525acb09b7dbc28a8957f2f05a4a26ee702d8b5729e5393c0e081b591128c98b4bccf888bdd7b5bb03de9169c0c975a37fe7287a7f5cbc47d84d0be0c0d28480101b20e36a3b36a4cdee601106c642e90718b0a58daf200753dbb3189f956b494b600012213c3c00007c6688d26c1200e0f28480101a21b0da05a90dc872e46123ee59374666bc1c003375e2c4b9ff19f79acccbf9300102211200002b428e77028f010112211200003e33446936090404122112000018c1d5c1c28901213284801019543bb5c681ffc5fef7f4e4827dac2eeee7222ada90bc108c96cfd8d5b6a6ed900172211200000c4b2ba0348901415284801015d6c9a2c9a91312a18e90449e75102feec72b369579c7b9a7467d476c0a65ebe0016221120000059ce0a5cf89016172848010170a26ea07c68c3d57e0de2b20bddcbf286dbc5b117027b350189e73512c770c0001522112000002be2709de8901819284801011fcb42c49a5ef77df52178eb878c3fea08404d3b407a1bd56d17efe8f363f16400142211200000152be52230901a1b284801011a8cc92af26c5057773ac15100db370135ba189f8de0a437f2ec8ad5183a0988001322112000000a12422e00901c1d2848010193d6973f2b486d8fce7edc2613fe20dbbf8d605440672dc1fe7edbc683820272001222112000000485504720901e1f284801013bd6cc4fd1f7e1864393f78b6875a3d26c7060cda5a448047c0ea9913b73a9b600112211200000021e7454f89020212848010141669d592b54735baec2d05d36e8b5dfa845fae1917e3ba9c44d34e658f3a48f00102211200000010f6e9e3890222328480101f940e395c0b2464bff387d6fabaac88a0810ae2d210fa8328e7f56e84427e485000f22112000000087a5307090242528480101f98ca4d3178d88bbc3c606b6508fd76a4be4d1f56965e3e55565b08382990573000e22112000000043f30500902627284801013b163d42d3cded5110e29195f08bce985b63b29926dfcc3368f4aeeda62a5ab7000d22112000000021ea404090282928480101ea89c32d088d328d34bd95f357726a8cdfe8a65ac8a92756f5eb491085ccab20000c22112000000010f337d9902a2b28480101fbc4dc3189e628ee6d13e74329fed2c8f2c13eecfb848328bb5500ded39efa85000b221120000000087a9011902c2d284801019d4c1950a7614ab98fd39297e7f3c390c24f996c5f75bdfe49a866ae4cea032f000a221120000000043d4809902e2f284801016876e81861b83f8d2e903a2c12cac6a47186a7ce4d501ceff8f33d6647fc35cc00092211200000000219df51903031284801015011d571c48085b7ae1d6bec0414f80af274b5783d75aed9d9e9221fa0b79ab000082211200000000103664190323328480101eb85941da7eb6d4b5fe732c0436403e6d276ddec936cc941b8842f6246369fd30007221120000000007fcad9903435284801019d6174d16f591d2b0a02a7fb6e71454eb750ae7d11981b2886ef2a14289dda5200062211200000000042c1d990363728480101c3c5a7cf42d90106dc5f3faccb6f2a034298f01160ec666f4b8a1226336547bd000522112000000000243d5990383928480101cd478c283d5181bf4ac129412111a3798f1fb772dcad9bba152c123bbc2768d40004221120000000001312d1903a3b28480101a13530524a45cd7a95207c13aacec8827f74318503b53c2641aed0145c3761600003221120000000000b71b1903c3d284801019fb95301a761ac065fcecf0a8b9cc73bde87f7d22056a584b8e12c4afdc6c7d600022211200000000001e849903e3f28480101cbd284b71f73b0628b67fc24981c9ba0e94c766fc980a65c26e43cf6a79a454a000100a92000000000000000100000000000000000000000017a3a92992aabea785a7a090985a265cd31f323d849da51239737e321fb055695e994fcf4d425c0a6ce6a792594b7173205f740a39cd56f537defd28b48a0f6e82848010195d401c07999298e50ccd55081002f1772588e87273e575e2b82bd65f800972f000028480101a07cb3b91b82015fc862901c4746a67e29a0872700c9997324b6d59bcb687724001722116200003e3344693609424328480101c44728cb474386cb07b4f34a1e0c1a34f6d2e36f12666eb26e323f0381100325001422137080000f8cd11a4d82404445284801014fe912825c0c95c25b6e3197bd639048d713b2a2ca73095910e951789aea7c9f00102211480000f8cd11a4d824464728480101f05b78a1d58a2f76c540bac4d9594a10f1639b6e9364d8764fe8e1ce19d0d46a000e2211480000f8cd11a4d82448492211200003e32d290ec8904a4b284801017cb409fdcd0c165590a4641dbc484b17da222224a3b5ad0dcd54f756b1b4fe64000a28480101848f853f917dd1c3be37d6807fb911da077b708b944aed871cb1b67ce160476e000b2211200003e32d290ec8904c4d284801016e89c17626feae9f528f514ca225a3d6fa2db45da85e2dab1d408e005ffdf300000a2211200003e32d290ec8904e4f28480101cab6878dd69fb7f9d75b3871c820d00c0032ba3929eeade952052c31350ed9b300092211200003e32d290ec89050512211200003e32b242a90f0525328480101bcd0b4ce93a69b8de2591e15177afec96dba3a9e5719eab1c5c0f28ea4aa0e0200082211200003e32a1b0b78f0545528480101c8bf71c964bbc6ce6fae13402f28422d890c1507219e2e9913fe7ed0212ab6780007284801017222e2d15ee23bd100f35f0552493ca83f84841195a4a4cee6a884edc993fba900062211200003e32a1b0b78f056572211200003e329de0278f0585928480101b717bea8ec89b95a79ec987d811746de2bf47d5fda55e6b27691017e36464d62000528480101cf88df13d77dabc5f65c66c18c1e8e4488bce7a06c359e309de12414ab0ff6ac00042211200003e329de0278f05a5b284801014e210d827c735ca8a03f9483646d3e27463cd325622d4b7360192002874bdbb800032211200003e329de0278f05c5d2211200003e329d66158905e5f2848010120d784fb3e6b88b1039463d5d2e6544c949289b2fded07189bc031cdd5d15bc300022211200003e329d290c8906061284801015351298f4e8ea5a52beaf199d8175ec51fa7b124a1795c752826591338e67490000128480101a7d02abdb0923170bf984cecb2e64f62c522346ad69919c519852d7af082bef5000000a9200003e329d290c8900001f194e94864401914e599c7150fc6738a4b596136fb7851512afe5e0b4944ddce05b16ae53ca72781c1036b2225193169799f1117baf6b7607bd22d38192eb46ffce50f4feb9788fb09a80000001cce0f52b5757299ffffffff0000000000000080594e91019c7150fc6738a4b596136fb7851512afe5e0b4944ddce05b16ae53ca72781c1036b2225193169799f1117baf6b7607bd22d38192eb46ffce50f4feb9788fb09affffffff0000000000000080288e910169711bcf20c2df5accb81d0852c8ae264aa907895a2a09d4a68614fb7b879564966c2d0269acbdfd68f67cc4b8699a5d7ab21d4c7cf42bea08398e6c97aafefefe530100b5ee9c72010207010001470009460369711bcf20c2df5accb81d0852c8ae264aa907895a2a09d4a68614fb7b879564002101241011ef55aaffffff110203040501a09bc7a98700000000060101918e280000000100ffffffff000000000000000063b5da1500001f1d55fa9c4000001f1d55fa9c472771f9050005f96801918e2501914e59c400000003000000000000002e062848010106c813eeb237ec2b48b28b0e5afb35c5aab00705c3d0fea98b6b433ee4b7509e000328480101a92f1576be77b52d637e133b3333ee5addd05ba71e6ed27e59276bed53e1abb3002028480101f4bd7af2883d77baaf4e314b37bcb2c9e95bad38be32a9ea404e6f3573507f090014009800001f1d55eb5a0401918e2723728a0eba9a5af32d0045cbbcc3e62ca274338a1bb3833c4983c1199c4d05560b8372336189205ab18a1e55fd869537ad23c2b3bec33a1fbfd7e22e136b688900fe485200b5ee9c72020201ef00010000523800000946039c7150fc6738a4b596136fb7851512afe5e0b4944ddce05b16ae53ca72781c1000190001241011ef55aaffffff11000200030004000501a09bc7a98700000000060101914e590000000100ffffffff000000000000000063b4fa1400001f194e94864000001f194e94864496502b130005f88201914e5501914591c400000003000000000000002e000628480101f5c2ef8b027656b95ff21110b96127f155099451c9f1816cc91cecfab2a978e00003284801016b0dc426a419d51ca7513d5ec969e05816e0aa56cea9997fcddf4d1a9e2c8a33001824894a33f6fdc38e34ebaebf011ef3434a5c102818f62aceabfc344d1129114d81d5be993795be4ac76a71770ba81adbb3f4412164d9b1a9a388dbfc2213732433ad4cf09309c0000700080009000a009800001f194e85440401914e586a6c2553f96969fb08691702b11fb983d1e45fc5199df08af47d22d19ae65eaa21575dac1e14409730ceb83734270c2299f49d04ff39cb108a72d08d516e32ba28480101f10346d0c8b8f5b8688c8fecf2b96e60bcb7a17a498b5904e841eaebb6653be100040001022848010114c01e3d04df8aa90c4d2f298887720b022dadd24fcb8b2e1b7482b21296aeea00072457cca5e87735940043b9aca002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac000b000c000d000e284801018862dfb8eae0a1d4b3619656922d293816276ae0d2a75a54d7307d54563f63770002003fb000000000400000000000000021dcd650010ee6b280087735940043b9aca004210150000f220120001000112848010190d7f31cda8f5fa648615e059697d3d81f0b18be093748d325d56547e498c8a700032202d8001200132848010124d21cf7ae96b1c55a1230e823db0317ce24ec33e3bf2585c79605684304faf200072201200014001528480101fd78695ffd58402e209cb0b060c95b1a8a83dae389c7eac9554a3c086e52b8980007220120001600172201ce002100222848010114265b804cdb772e1c9a48d1dd67ad6e9315495151d6f49bf5f203b2b883ae7c000c2201200018001928480101ff9fb607464434b8240b30817c4e6c358ad723c3ddeed45b2b82d45b9fb0f6210004220120001a001b2848010135495972e4dffc56ffc325d2abeaa6db04e07d832cc8b8847ae195158fd724d20002220120001c001d220120001e001f28480101ab446ae5250a0e5acbf42540f12f69bc49e22d74782881442954471a01c67d6c0005010120002028480101e1e66c22df500de6499c055de17ff3d1216fe5f15247186dde0708e01c52526300010024c201000000fa000000fa000003e80000001728480101a29c4ffee5f88175f94aa05c38149626d3eb05723f7ebdf62f022c9717622d96000a0101480023012b1263b4fa1363b5fa1300e600640fffffffffffff87c000240202c80025002602012000270028020120002d002e0201200029002a020120002b002c020120003d003e020120007b007c02012000b900ba02012000f700f8020120002f003002012000310032020120013501360201200173017402012001b101b20201620033003402012000350036020148003b003c020120003700380201200039003a009b1ce3a049e2999000f2d8ad62f9964018734f6d0258c5b85b88c95fed7aa2558fa1f1c2946740025f3dc46b810f8ce67a68d27ba3c67fe1590ab9df0a8837b33e5873aec114dc432e30a986bfe8a0009b1ce3a049e2ba6b54ce1a0af0f680d7669f7ceb4c54c1023da9c0235551e5aa096b0f919c2ec00255459e2d25d3bc107ef3afcbeb159ee00deb0da381cf8eaf7ee3c54258ecb9fe354cfb3d9f8d20009b1ce3a049e28629ce122b89f2c7e2aa2642f171c9d77fc591439e32671e5082cf7739be6f7e400247f019ae80976183e3467b8107ade8d739831136c871851b1714017416f7471676f8f45bad8920009b1ce3a049e2ae6bb8ae7f3e2efc44e4635055369b95e04a7b8d51d09e31e443da13c7b10307c0022df66662345d17eec3f9b0e8ec4f7252197b59249072ed20a89cb36c7864d28212ee858d6ed9a0009b1ce3a049e2a15df9572666acc4c8cad446204d56b8a361667893c3fd82917882ae2ff608bc00022beed892488e86d31d2170d3bb67765785fe00cab6380beb648993790c6b62f6d6f9aa8653d660009b1ce3a049e2a9931fd1d2c91aeaac08f55d1ef78916758a8635f3cbee07bacbbc19862c064a80022284589b8a4d65fe10377345d60992f0c173a8ee2383d821c494cc3c9c95f069d8b51855d473e0020120003f0040020120005d005e02012000410042020120004f0050020120004300440201200049004a0201200045004602012000470048009b1ce3a049e288ae47bf96cea4a4e778054418ca40bd530383446ca02f438ce661371368c7c70006678d09d29ee83ba04c54d49d0c2a248697f32eaba92097fd5d726fa4e91f749e61f55e1b37d460009b1ce3a049e2ba38088514324df3b7f11c33ce1d4f13ba866b528b1aee850c701d7aa185fcf98006678d09d29ee8318e28452aad9bd641f98e55d7744039595724c1ae5286a6a26ac2917414715c20009b1ce3a049e2b9c354c86a19f9de3b51b199a1d6b5d9486874c0d226375e46a8a261d57566aac006678d09d29ee805e0cfa335d13c8bdc2cb6c84c534419d6a4a0d1d2427f5f7c6b3d52e5377ffae0009b1ce3a049e2a3558f0f6f045046506aaba247496e32d2bea496d2422a8dbcefc9060d0052e68006678d09d29ee83e141a8cd5031943574478d98f63ac3454492ad47adb30c1b3531c8cc349a7ad20020120004b004c020120004d004e009b1ce3a049e2a58d2ec0e69a6e8246efa0da105e0a8cb567bc18587cef5f08334f7528e6bb300006678d09d29ee80a73ab24af4170e8a646f6faf62520a9e70ae02f66a8faa8d739ef087bfc7e5ea0009b1ce3a049e29163fe7a7bd23566f1dd25bc25b0c501aa94c49a29d06a4e5ae72b702ac152a64006678d09d29ee8027b0096de4bc955d34d0aec0615701d8a028e921f17a53bb9348a002f13d86fe0009b1ce3a049e2985930f49133df09d6ff595b752dd7dece846d1adac28305eb021501a93a3c60c006678d09d29ee80dcdb94b5329e0ff38fb4327c57407542d0bcf751c201644c0ec7eb9dfc76c84a0009b1ce3a049e29f72bbe6eea4efeb35bd72a1cd3217ef2b296c822e465b9a6b9b80f0264fcc658006678d09d29ee808491234782701a48ea4a5a886cf15f978781699d77e4c3f6bf2ea201b3ebab5a002012000510052020120005700580201200053005402012000550056009b1ce3a049e2be599849ad9e19369c214ce692fa2ba58efbbb06a396d5207a1956951d29d4898006678d09d29ee8278b4f2d833b5dfc6c48d222ade39fa4a96bc874e62b16ade02c50ac553929e920009b1ce3a049e2a1fc9ef0236deda1aa0030f90dfd79a4063767323a1374940cce1c3761b4da700006678d09d29ee824ccb3c8c877acf99513bd653d35def60e18fae62414b0b3be77073c36abc72760009b1ce3a049e281116b78fcfe379f79268e33041085fb68c252b5e07c7ceb9f62f1e87b6434a8c006678d09d29ee818a899164b1822d2e39dac978d93383eb78d0354004ae047083bd1275fa5323b60009b1ce3a049e2af0d60920ab57004ce466f0a78976dfb17ca6811762b4cc1582b09a56996a80b0006678d09d29ee82354621106c08ebc3e44c338088f0c135efbbc18605d7ddfab414ab0b88c4806e00201200059005a020120005b005c009b1ce3a049e29919dd3b82267c08e77b6e39b52aebe54577ab4a03980449f24c50b0cb176c1fc006678d09d29ee80bbd302453127d952ee1de2b6eb1b4d3effa98ee8a6a66d2d1cf34f60a8adf4ee0009b1ce3a049e2ae0564b2c4dbaaf1d6d90d22d5074235989de78bf31fec34df5c957f5137f1a8c006647e6ffd01176648a634deee5132ed07cc454c7e774e25efa5b427d89aa80656253524aa9f8de0009b1ce3a049e2a3a1a4c16f462e07799f4bdf94b9e3c60849afad13ade0c9b1ee8fa98e2a71b7400657c3e7ba94e3034c8f378c65a7a2f837c86a9c061d6afb43bb893755048ae64876e99d2b0c2da0009b1ce3a049e2919489654602b59db14ef2d83abe85f3ce9314bfcdae30a5059a709ce05ae770c00655a0eb198e9e118743ced0ce2f84909844c1b90f000a3ec96c66896d5a2ef71c3cfab5f2125fa0020120005f0060020120006d006e02012000610062020120006700680201200063006402012000650066009b1ce3a049e29849096d9acb87c825f9e47a9dfc3621c3fceaab91c25940642be3fb5c3b196700065571d6834329653e530f138dc23034ab3a93aa105beba7f3adfc8fac6756c6a41d3b17ec8c0520009b1ce3a049e2bdeb22797df33efdf69ad5134a754a07f13a91e6134dd8c801597403fb5d0a09800651c38712a8d5a88373683b06a1fcb1f2e01f2e650b9cd6f64e5df8e5826b646f4a4e8028df2ce0009b1ce3a049e2b04bda008462216e4d3ce02225317486e94776ca439e03f83c0dcd61fabed464000649bd9651cba62a8515f6674aabf8a62957c6ae2a152b3503cb3fe2e55597c82b36b99373df36a0009b1ce3a049e2aa40d4090256bf3345fada49cb8d06fa8c5710a3521b762c4c3cf4e8f19b75d0400647b01d37e47947a104cc175cff079e7ddc767de7c18945406ae521e14ab5093ddc4ed618175e200201200069006a020120006b006c009b1ce3a049e2a322a20d22d8f3ca7151f6ddc23b773caa78bc7c170d30df2c5ba7eeadf06779000645d39b2559ad8116118ca6141513385bce13e34d6854fac170cba9d216efc5f71c1423d3ca8e60009b1ce3a049e297a583dc8fb062c03c202c6b4c844c1548d0c89ed3ea6cff1932fb36ad926656800645d1abb6774f2427283ea0bd92891d48b32f4464f1489fae9684ef47e15bc33d865089bc8da720009b1ce3a049e29cf22d6b0792b6cd873f1e3abb0aaa2cb30e450200fa9e6290cbd083a642eba6000645ceaf8533a1258127502a6c4d42b201970a44a30069fa999390d4df8425368c992461161f4760009b1ce3a049e2874d6e57bf970b02b26da0ea585f9df810146aa694589a640463b74a3352b16e000645952e20267a1ffa7efe55a1b9a55e20d9a0d5b34ddda9cc8fb15cd3810480f41b5fabcb599a20020120006f0070020120007500760201200071007202012000730074009b1ce3a049e2bed3620980f89ceaadd971dd5b95a9f0f7fed0855949fccd455806aa5e151cd74006448a2f9667ba6325a469419b77eb341c7cb49b14545c1ee06df4301a0ac566bdda425e82e883a0009b1ce3a049e29cf21cfb2bc19f8d2ac850198d14d94dabfea365708a9cd88efaf00353c6bccd800644864523652dc83b4199504264abb17d1db2b27514b626c70d308431230755e346d1aa0a902220009b1ce3a049e2a3cfbfc5369787bf65b3dddd08bb0378c8eec576baa623236830d9af1eb835f2c00644546691fb36ab820f19876b593dcd332fd692fb7ce62f133d69afd1538ddaed2d10df2ed32720009b1ce3a049e2aa37d09ffba6ea7bb86abd19efbf3f6b1b491b7fb1f067c1631b1da608f626bd4006444febbcdc40752accf8f07d56050efd8fb3e0ac9ada86b58d4526bf3694237f3d4f77bd27a860020120007700780201200079007a009b1ce3a049e293a960403bfc2caa79d5aeb0531448a5e73203e5505a8a0b350e1da1c12e3eea800643ea747b6f8d34a6303ed5565e9878c5b727902d93cdac1a9c9c3531c56a42db05aaabb7a25220009b1ce3a049e2928388030db6f9334dd2d63705ac9869e9f4171fe5755a0785c3b84189e4ce4900063dcfd413cb437c27cd80b3fd0e46b373e778d9de40a15bdd34327d709724c56d12e679830b3c60009b1ce3a049e2b124e4fc45ed7926bdf9abdbe374d896ff0e69574ce5e81308229603e8f213dd000627becc5327021ee4b71ea37c53a39d78c22a7d5444337bcab1ea092bffc9f7bb7550d0fa929fe0009b1ce3a049e288ef6b9053395a4979f6348965f0610730a08acd6a1c517f320fbe7235ec19e88006100f321218c407d38e728dd85d6c10021deded0962c65c77f742201cf5e27d2382e3cd525f31a0020120007d007e020120009b009c020120007f0080020120008d008e02012000810082020120008700880201200083008402012000850086009b1ce3a049e2869ccd0e05360eb2d08c11b745c8c41851ae431f2fffa821a95b01fc83df71bdc0060573a1f19623418dfd4152ff370f50ab0a7de08ede0cd56d266a28868d87b6099a40a45353c6e0009b1ce3a049e2b70d35f39cf529b50980ba7c492cadcbca7b94bf36466b62758cffde0b8343d240060029678269027c8f78839e5db3ad4221bd66f6d6180cf1184d5d96583bf2ed103649493e116820009b1ce3a049e2bee1da091042da9e13447bcd7c726bf151858e8ce0590bedd99d9ec528f728168005ff026490fb16f14cb33c7d6fe094c752529ee15ce9a43482d7e9cf6f76583ef338760706c84e20009b1ce3a049e28571f3f3b31820dccbbcb4acbcd66a2b4b8ac61ade9e88d9f8460f9a2f748920c005fd71fab588d41d6c2dc87c6cfb33d88ffd3b1f2f220f90092ee20f25a0cf94490b56b50cfee2200201200089008a020120008b008c009b1ce3a049e29aeb96fe5ab9d1eb38cc7e50c1af91bfff4458ffd9263b31c82a5d0b13989351c005fd5a99d3f68c27ecc28b733ac93e707cf11ab01189010d43e05211703894bac9a0f9f6b7e9d9e0009b1ce3a049e2be2b1f27568718bb05293e66ddeb79d331dd0e02d009b9809cd0d5639f99dbc24005fd4acdcf1d34a4b8c2ebccf36bbbb976ebbcbeb7953d5946c815783d21c88131d32e40692dd220009b1ce3a049e296975481ea6bdf05eea97f543eca93b9d82b13c880e49aa8eee6d50fa2d98cf64005fd3bf41450d11a3325d669b08511eda154caf8e2a894674119b58682a68c27e24f20ccdeb07660009b1ce3a049e2ac06ecf0ba0fb91de0584de7084afc22e1012e9f0b2bdc30f81216cd439058ad4005fcae53f6f81f27a33cc15c7eb18478d558617106c49971e53fb44cefdcfd01def54676324c8aa0020120008f0090020120009500960201200091009202012000930094009b1ce3a049e2a1b3faf521e9aa85e1acf3f1d09fa0acfcb40373f9dc9e2483246ff7290065298005fc807240cf7b307c0bf6f11a135ee1c6c851d45a7348cb431f9172132ee32466b138b1525fa660009b1ce3a049e28f6c4ce3864a3134a9111b3860d9168f1cb472ba738dd92964b5f9745debeb06c005fba0a78680d053fc4158940c46108797153c2e535b84c6d4fdf70f945f866d2bb19774a38d57e0009b1ce3a049e2b7a9a1d3bd961c604305cdc71691c6929dd72d888a75f382052100803cbdc9144005dd0959249a66eb0650a4773c4cb96e0d7674437b0084f8dbcdde8a5a06da4f55381027ee840760009b1ce3a049e2a44d913618c309fce36ebc3c9572be02543d5d71e397e407266e6312e77c51888005dc48d87e6d7a4df8da74fd965e4d1bb896131555669d612c644f8e8e2d51b91521ccc12a575d20020120009700980201200099009a009b1ce3a049e2b0e5f35a961248d84fca92fb05d109986d4d7846e18c03839b0d9536e85fb75a0005d8ddf25f5153b58225a84ba60e141b1a49f40e964bf444a9135d940fab32e8a3cc9ae2836eb7a0009b1ce3a049e29d68ca103ad9488e651e5528eb6f6578639b351186f081de2b685353e18dca1f8005d2e9e1fcd77784c02af186d0d951f649d9091d98f7646afa8e1336f3c97523262947a2f7f66260009b1ce3a049e2979feec802862bdffaa3e6348bc9db013222165868f464b6d4a520e62d7a63d04005d1e24e321888acb7250bf2fc6c9bc6f91dfb5151f1354900de181ddc4e471069af8c40c7d2c3a0009b1ce3a049e28b559b017dd10b399e9106d81354f033f95e1d668c248ab85bd9442d29931e454005cf91846e925576b90d0b43e4f4e2004fa75686da2228a063f2c36015dae01b3aba01233956c960020120009d009e02012000ab00ac020120009f00a002012000a500a602012000a100a202012000a300a4009b1ce3a049e2b4a7aca34f7904133b46ef591e0878ce15205428b7f4aa5ca9490c80f2d96bfd4005b7eafec0fe35ff95778029be79b4a96dfd0a7896c2f1b2303e461971d9ebea30943f4cbcbe40a0009b1ce3a049e2bba7c40e907bdff3abce4d3c545b7e1f7588aeef08e6065c6597ee66bb0b8c810005b6f47818172e2778e76b5162b3acd0d538d0ce14f1f870abc0d7b4516106d364582e1e4bb31060009b1ce3a049e2b7dd93ebb8dfe1706087cc6595b14235816221a288f00a009304ae8c9fa6ab574005b356a731531a396ff9b8ad8c438eafc451fd474a77e974b1bfa3e3a53a5d549c84f365471a24e0009b1ce3a049e2bd8e25412106e425ffa94db03282b459fce5d76c96e9303ed13bf79da9e2579dc005b354ef076384cb2b2f620d8add53a175a14d651ce70897b905fa513c6c747fd62077c0ac132ae002012000a700a802012000a900aa009b1ce3a049e28dd48e52926a857eee1275f59b7e46e98339ac452c3b07dd4518d8363a08efe8c005b2a8face4a93d9867e1d8c71f6175a5ea27ba5cfc9e1d27e6234e65fd7306a363e0a1de3c51120009b1ce3a049e2a9d92ef23710ef45f308c8e20d1cda96632452b0e15287edfc7189a8a9d24fb54005ab6d8e2eab666b045d350f2fc365eba43228e9c2f627dcd81169daab5f647006d9446a31d92760009b1ce3a049e2b82293952b11ee9bf7e296a597af7b06920a82e3d4d24057b9ba0b42f8796113400599d126cb620eac0b948f616efdbdce362a389bdc2ff7c1596075ae4b69a6092b2a7535ff8c2360009b1ce3a049e282e05fe5036e17e225e8c78c524e8b8d635abd4fe8581412f264d838464a315540058d99db61dc74b6802d2ba64eec84cad5b03ab06554b3f0e1e57ac20967e14ebc37106f31153ae002012000ad00ae02012000b300b402012000af00b002012000b100b2009b1ce3a049e284b1264f3395ac0bf02b19428949af0360ca57539985b41f673f1186c39a47e7800589be802a137628cfae9a113091b84c87afe09d9300d3b4a590b6e84e8bbfa27c08ca0ddebb6720009b1ce3a049e2a6920dddc0cc4b852687df14eb21e1bbcc2ec1d67844abdea411962bb0787527c005737bfe4fdf42b2b91def8b3e3c77a66db288991637f705e981aef30a18455d634d26513930cce0009b1ce3a049e28b828b77be922ad4e9e170666daa39a649a5f6dab798de235a151bc087db76a94005721fc6a625195cedd6eb17b65e5f17f4dc0adaa102c83f8c64aa3000dc42d836bff6ded8e1a160009b1ce3a049e287fb2dd43285d4cbd304840773e06c2c46cbee53ac3cb7a2e3a35ccfe8ebcb8700055df3964a2c43fd80efb75ceadab7558f7439deef102082c17590bbf61765112f2e10f9a417e96002012000b500b602012000b700b8009b1ce3a049e284044576ac1016cc26fe758ec7144a8e776998e9d61680f0a3fe0148c2f727fb0005502de2b3af6293cb7269341296477bfe73faa48d3b782a9d242932658b1fbc0dd9da4dd8eaf6a0009b1ce3a049e29b1f80da9fd0d0ebc087d324e35bc0ea61c6e94bcec5d13ecb9aca63f9973037400538e7b67cca9fa9fe01ee4c98aa31c42d62389794ddae1692e08d60154e0b6a8674d7a46cfd6160009b1ce3a049e2901496b3dbe28e3e61c9c90226bd436719125d8d8c75850d65d6d0d801d5ce9f0005315f2062c0f3106a492cb59bef4c9ab52def25e140442bbe9f26e63e71ae787a9a7fbfa1aa8860009b1ce3a049e2baffb4a3a58f740ac37d0d207929b3d55384c0c9e5f0232df0696f6158ca6ae6c0052ccd5e0ea6f82517e02c8ac346b58789397d3a6037f74656cd72e1ec4b6567992d58e07d98d9a002012000bb00bc02012000d900da02012000bd00be02012000cb00cc02012000bf00c002012000c500c602012000c100c202012000c300c4009b1ce3a049e2a4ed227ac260b5c52e613a17936c1a0caa3d1a2d35f49457b9def02f44af57e3c00527e298faa4134a9cd2bf686dbe7ba6d440aaaf67f9be34e0b3d990749e7e700949d420578a8a60009b1ce3a049e2a05a346cd9be6511e966065190ff9ff0705ec58b395c845669e6048e13c740fb800527c4fd761d805559766f814cee12945ec3c4a16cd5fe28b8aa917aabc059569c0591e5ab8eee60009b1ce3a049e2ab232ad41a106390ca860386b4fc111d1553bd6320103b98972009b34ee8b95f800523edee46412d7af9675e686c90fe2a02290d434d32e987beb21ecda88dc46dbbec0f2537f5e0e0009b1ce3a049e2a60158826f10016d613f88ed19243cda761bdfbabbdd986c1779cea4e387c4db8005153bb921f2ded2e07107e20b6685a7c898dec3007a9785808ed41d747c0d75078d63b7c76d0e6002012000c700c802012000c900ca009b1ce3a049e28899c3dc197f05b522489c96393df69fc544f97dd367ee1fe428d12193a95fdb8005153bb921f2dec51e74a504d562876807e239c6cb607461d858c47336791a1bbfa84f3964353960009b1ce3a049e29ff264eade32402636531c2df4a311fa959ba922fd07dd95b5c88dcae22fee1c0005153bb921f2dee158086f70a6e1366c4ddf33f82641fe760fed5c84a92fe68da8a3967be66b7760009b1ce3a049e29cea8aea101124e92d056cbfb3c92bc510c1c611a55a51c5f54dd5b4e69c11b38005153bb921f2dee2a10b37bcb1ec1baed930bf99ce1842d6380c306b80fcb5ff2971f5fbaf3cd3e0009b1ce3a049e29cb7b7c318a6fb38e2dca7f16aa6c73ebdad1ee0f1059fd552fb431305e347470005153bb921f2dec940fa67fc37c020ba8a5ce7e7a9e40073034f2005e95432538a8f9d72a496b0e002012000cd00ce02012000d300d402012000cf00d002012000d100d2009b1ce3a049e29885aa1e7e7229ba5908d8eb491226b8f50f9c4d09f49994a456b7c3c0be818d0005153bb921f2ded8ada53fbe1b8204016a111b642c5c10b6efb15a9157ee01f73d1fc76ce6f42b20009b1ce3a049e2bf8054133dedfa28b40fbdfbb9ad70f7af42e5bada9dfb5432310861a168c818c005153bb921f2deeb823314e26d653a3dce059977a0c83c970a98befcf5e75c937aa9db29d67feaa0009b1ce3a049e28bf7f144013fe213b54901288037e804b1c598f72cb960dea6202cf2abc6eeba0005153bb921f2def0e08c7ddf1bfc3c18fc59d5a8c49b262d4a98de685d888117d87e80e3688c12e0009b1ce3a049e2a43c3b40005a64a7495fcfb95e26c9cae6d343fb7eb64366ae1b5d35d6f954ecc005153bb921f2dec9b866bb0a015a1b9cb4a04259e75c2854e14017f653f3e42e34e3e2f87ebeb1e002012000d500d602012000d700d8009b1ce3a049e2848bac7a36240d7654bc849644a521f4d3251c01371804c547baf483bd8a63b68005153bb921f2dec264b4a58989a560db1e2b784ec64a2cd7f1e31f707785189844a455aa2f019da0009b1ce3a049e29619c3a0211c435cb3372041f92bd9d1fc2396a5eb85385a8137daac89ac1b1a0005153bb921f2dec200da27d131557afb6ca1c7542ed43c867320507d68f6595dd01e0bb32c471ae0009b1ce3a049e285541662f1ba98fa8cffd42c8ea5cd92747729531359b9d17ec303d04de8b2714005153bb921f2dee22d3e8b9e0208c7324c00eaf69b7ea62df5ba4fa59714f465dee6a87953d8c420009b1ce3a049e2a3e0d5a8472c6767b413381c7779bb2bec6cf59406655568ecdd96cea3b1d71d0005153bb921f2deffec45c828ddfd9fc9b3f6fcc0b358d37753667ccb44a8a5af094e0c9c6ec3606002012000db00dc02012000e900ea02012000dd00de02012000e300e402012000df00e002012000e100e2009b1ce3a049e289134584d68ecb12893f5a4746e37d02bf34fe51fcfc771cb58c4d682296a112c005153bb921f2deebc819c25d36ea49ec9b99cfdd3cfaf91d642ba9dc94ff8273ef4a7b4fd1690220009b1ce3a049e29ea734c6345619e55dc24a1a67adaa04e215caa4705970774f03f1b90ee5835b0005153bb921f2decc9ba8487cda2ccc88d92c89a7c1459c7585459e44f942bb38fcf192199fbfba20009b1ce3a049e28f76582fb32aa2846fa04289b92ad6f68e126a8eb59ea82123e54e0b4f8dfd4d0005153bb921f2ded6680c6a2a94f3515ee812cc8865a8cfb40ae24128c0f68230d7f03c9055c1dae0009b1ce3a049e28f68ccc369de018eb91c2b04145dd990467ea50a53d647f1c07c9b548fe9949e8005153bb921f2dec82336dc9226ff3651616ad7d83224c1c7bfdfc647001283ccfeabb8a38e52612002012000e500e602012000e700e8009b1ce3a049e2bc5bea91dd3cd8c9c23d218325fdc3f6934676807cf6dc1eeccc382a2d8dd6418005153bb921f2decc9c22d344f11ca4eb99dd0fbb543fc11dfb1e86e3206669bb76df787e1f02bbe0009b1ce3a049e2bd68838001a3f9cb1e02ca797e488eab7af7cecafc1370983275ebb8091f509e0005153bb921f2dedba3eccda1a1a67603cc4de6a8b3de4f6f42c68b481bb25667ad0f2a4882697e20009b1ce3a049e288247213551c11218607b814cafba83a92fd1c78c4d5662a309500a843164b45c005153bb921f2def32f2c478c701e91245aa3d88dd55817e44c73d0c42da9f2e84161d79c27c223a0009b1ce3a049e285b568e42e2c88b6a392363f78520711924d0d30660d42b2b18e2b49fffad69e80050fe0153cf39af6f9bd85d5b0016f6d5dfa99d23eb5ac4b1575af05db1dedd6a9a39f171313fc6002012000eb00ec02012000f100f202012000ed00ee02012000ef00f0009b1ce3a049e2ae8a45354e0169a873b3cd922bc033eb91cc0a918ee55bdd8ca64f33e5dc768000050ba8516522092dcc150c16fe0897241e80f4413339d2e0415efaa02a2c352173263a0a0b3e2760009b1ce3a049e2b8ac419cc18c44129eaf8a209bde54092205782880108d9058c1bcc47ff66a0700050a7f49041964e0d011e830eeaf39b99ed78f7c7e91e0914678ca4a7c6edec4be7ab6a18ffaea20009b1ce3a049e2bd0389d58bb091d306cd7751371e6763be567c5cd6078b70f1fbee459302a1704005043ff7f08e7e6e4e016f51815d3338ab8c29e0bd03890feab9e861f0fcb68ed8353d02b6b02460009b1ce3a049e2927a142e27e57fd1953229b4fb3f9d7c292bce2a35e3bcbe795158953d62aecec00503b09d64c3267909342cba491b08507f8a25ba54c409ba6d10cf7b9cb58a3eaf5e464fd7bfe5e002012000f300f402012000f500f6009b1ce3a049e29530db2f5ab2a00e9fdfed87d70e411004e9ba055f40aa2118697ab40cf846ad400503b09d64c324460dd58645d6b8d97fe4ba07286e084488fabb602c0872b5e57c6705ed9de64020009b1ce3a049e28ea5529ccf45ec775509521a7616fe2315e3c83e6d03212360c51ea2f16053d9800503b09d64b19601bed0b68ff4bf4108f22687b94f94b3a45c56a98c5a293986b062a2c72c4da460009b1ce3a049e28954a6d052843654f11b3902b39d1320c890eb91111cef9cf2459fdbe3fd6c9d800503b09d6487bacbf783a061684fbe1608e701ea2c6f13371cf276862016b349ebc1150977c05360009b1ce3a049e28f3150e30d025d5c34050b013bec00c86a6de0e7511ffbcd72c17b3149a29019800503b09d52acb628ea011dc72f54b87e8b43c94a59c6d499c19394fa56f6d0df127a393d11b77da002012000f900fa0201200117011802012000fb00fc0201200109010a02012000fd00fe0201200103010402012000ff010002012001010102009b1ce3a049e2849c38fc7c4d721cf29193b0731fbe0e5d5aad9c0c68ecfb4d4c7a01353c5dc38005001d9cb868a0024f830979f1ba394187d506e3dd3568fed7c2f320e5760c540b5393b590983f20009b1ce3a049e294ef23f9508e9fd0a62cc0d65493bdf00f35282e5c063d7759d8377f03b1e2080005000a15f3dbe6023fef9cf49149b2e2a3fd7dec7dda3a1f0d120cdd262f6ced9b72be999785cb60009b1ce3a049e292cbd3c412d39a8a2808ba6ff8551f18e097efb4a79267a1ce428935484b4ab38004ee1c7d82d2b446095072f6eb127007e98b0c2c855151bac6b94c20700df1f544969a2a7f853460009b1ce3a049e2b9e442be15acd0024ce265a90b11694616b428efe18b09098887a36afe828bf78004e74b25825716fce1db1c705c494511a33bffd387a79d10f195d0ba82653325f88a7d52b8ee72600201200105010602012001070108009b1ce3a049e2969890670619f6d5df374f4e69f452185efbfb81e0ce2d57aa1ecb068d5845d44004e2ef80297eb0cfd203e334de61abfcf85b23a17c6f87853d99aa68eec646047abda2fc837ae860009b1ce3a049e29062ad59a017355d715cabe7ea78871358fd97a865b1f203bbddf183baf97aa68004e02e52e89329dcd9245931ddfc6d508b411ab4018995c5f62752e054803c9f82d15485be001fa0009b1ce3a049e29ec4008c95c2e37a1440f6739d91e91488a07e5bac8f7d2f812676e6848e7c23c004ded58ab83bdcc932130f044374de6c5cbd9e723044aec3af3f77b18de54c9b9f7cf43290db89e0009b1ce3a049e2876d7d3f81d785fcaa0f95e78efd05b70013606f812dbf1f535c70cdeb7057c5c004ddb54f2dfaf0d6d40d6f38e60cb6b302febdb408fcaa67fff8c3271a40929b1ea0274b2e730260020120010b010c02012001110112020120010d010e020120010f0110009b1ce3a049e28eec1589d034d465d74bad216cf80cbe5e0131dfcb59d848dfb33ca7d61047400004da615e848f76e220f165e4717e1f52cecafc84e487107c80ec6b4b65d993b9262347297dd74ae0009b1ce3a049e2bfd88e6dde58f53b1336de8454a2d9e1abdc72fbf2ebb45f8e45108e3d2b0c3dc004d9fda6ea8ce96923f7fbb1c77f24be5deabda8e6b8930675d0751aa2d8335dc8d710cb929842e0009b1ce3a049e28f815378ba72c5457eb24cbeb9eaa5b2d331be4650cb369caa0bea9d2ce55de38004d9faef10d18be95ae334a41002a3acb6bd81cee5ef4258f7c1003c7d2f7f4c3b9b385c711968e0009b1ce3a049e2b9159bbf92e48ab8750130861212f63b51937519a92ae48faa554a1031fac00c4004d9d2e20225f96495ebb678b36f86245c959728e2166f3600d364b3843284667a297061efb9b0600201200113011402012001150116009b1ce3a049e2af50968debe1f658f5cbfb6382bd5242c0079a0799ffccd6543cffd14328960a0004d9cecd9d31a65528e1f2a08f6c977deb5e1ba1eabecda6ce4b2ee114eb8f678ca2918f77b615e0009b1ce3a049e28c72a8a1db7ece00f4de1989dcb6682f5e044b5aa78e72e0307d29c7175e220c8004d484fc3de9c528b43081357b4885f7d6a67a762a88101e31026031cf6ec6bc1fe92976035cd8a0009b1ce3a049e2a0e5b53d53d8bb07b9a3ecd3394f869c60c6e0ba1583cf2b0cb4d9ae72dcc0618004cffa8492684b8424f5e283adc3e8da52c90a2dcbd07e311c826dbc4b63dd81990fb6cb7309bc60009b1ce3a049e28b315cacf038c70a7d6036c71ab45e1f49e805560b4b5361042422cf7b4d49830004cc415bae10f30848cc771bbc8361d86f381187db7bb35f83fe8ad8241d33b8c2c9acaf59723b600201200119011a02012001270128020120011b011c02012001210122020120011d011e020120011f0120009b1ce3a049e2a47085c8c0a7796638ee69e7cfa6b6b3dbc9449f46a4ad528d6ca2258dd4b3788004cb26ec5b8c2719a28a87acfaff5de1c222cf4af07dc11e8e3fa4aadef5dab7ce01c114e5b9f6a0009b1ce3a049e2b27216d7b21bc8ce3b71588b3ae52e336fd9b43eb8d8805ccc51932fc87b02a58004c306043b47a12e53147ee1c9a4d4900c0c292df9fee569b02e0554c91ea3774f861af81fc3c960009b1ce3a049e2bc0974f85b8847233e6562e9f3516d4142984798bab32515e160ee9403cc2e24c004c306043af8a6125ea341585947baa0194b1406662fccc2693dd8932211203a1326a59f50ce64a0009b1ce3a049e28d5797b99daf5ead383efcee908eba7908450f72e6d8055b56f8cf2e87c8c48dc004c3060436dcafed16d52d1d34af75b70c1a1c7363abfc373cf7fbf3229cc8be80276825670bff200201200123012402012001250126009b1ce3a049e28c06b9ca34e2671c7fdade4818fcd1e93a4290af98a7d31e62dfa7289ef0dc0ec004c3060431cc79798c7b95f42a89c2a5ed53d6ae8dc665a1ae424ef1e961bac85be227ae5dfce5e0009b1ce3a049e2966bd617868999d1941fbebac10ba400dfd384a52695b2eac84aba3052cc0682c004c2a089e73969323623fe37a6a77b0547345396708c9363518d18af94528b92014a6d7950fe9b20009b1ce3a049e29538c4fa763ecb50b386350081fef81b3eee70d294eff943e1e3b8ec9eab6c698004c2a08991ab0ba8dec11592e433234901611fce32fadd47e24f7536ac942b81c5ef7c26d979dae0009b1ce3a049e2bfcd3d2ab64ff4829c0733e44f04c3ece0d49c63f22aa01bb4f840067a961c644004be7c8337b4123d9b69681f6a2d635073aeaad83c2107fde9639331762bbdc489662d80881fa4600201200129012a020120012f0130020120012b012c020120012d012e009b1ce3a049e281f9a62868bb42c76d7fdcfb372aee660a2e284f7241067423631248cdc697cb4004be7c8337b4123b08339ae393d96b9a5c519258e1c62c12c65bd32222ad5c45d8f201fa7c8d29e0009b1ce3a049e2ade1e7c4f6cdfd6972a817197f0cdef81be5dd2eac9366ecda53d52757ea001ec004b9cb6d92a087fb41318996d6e8ce34927a5ab553a01ea365fc17998486465516d4fd420aa885a0009b1ce3a049e281053bfce91d46fa5f0816bb90355efb78391e2c2526d4afcf0865e001533fa34004b94783969326badf573699dc359e1c159690b32f85c446b8d8f73651aca205b06560f081d11f20009b1ce3a049e2b612da895d6866124317da97a0b8693e0e87589373dd5589688457af33d24fc78004a2b9801d72032b3ff15b5771e8aa82e713e2ff3943969629e0f64e0ddb68165d190c2557ce5b600201200131013202012001330134009b1ce3a049e2af8e65ff97d6fd6de969d81bd8a8ceb85579218477a3ff8dd3d69ee5fc3a1cf88004986fcf8a0f75ca82e510b4d9f501503c4769c8f05cc7f25236f156f00aacdee9b7e06eb07ed820009b1ce3a049e296c06991dbc136446bd038fc19a84d2e508dabd60f2a687a6e150a2ddde055a9000494b4e992e8176c7839a36d9c3a50549fe17f50cbb02e554a4b2c1d257004b4c9f707134a7c6e20009b1ce3a049e2ade2301cd5b4001ea9bf63065a90a8339a364e6cbba995321814f35fdddc25318004940b6cebf106ea3ea0c15b74bf9ca563a8cecb1faec9acdb620557a084a7c862e19df048f83ea0009b1ce3a049e288137f3f485a68ca9ec1cd5165e170a323443adcb96cbb2a6edd37c43cfcad9600046c3cd0ee4a0780be1e2bdb47318045ffe1bb6e79f6bdbd0bb5413fa37fc222bfbcdfee2e857a2002012001370138020120015501560201200139013a02012001470148020120013b013c02012001410142020120013d013e020120013f0140009b1ce3a049e2a4bd6b704e6503656a6d35d8e07e8148c229377bef0b65257a6e346cac0846ec0004620bd9ae24f605d2496398d7959f433a2c366c5656ef64a8b1e04f32f4b49c4156665ec1a258a0009b1ce3a049e2bff6404666c70ea6c569d4121c5b5f91c06b8526c63e854ef7fb6467f239a42f80046205f6e81f5aa3a49af7f589fe5c368507b67a2fbbdf28486af9372c42a64f913017cd699bfa20009b1ce3a049e2bfd75d35b68fd32771655b138b8a19e65aba09046d827a0c3d2c3db859e7e4688004608c8b6dc37883536dae1af1fc09513176aff7c79d638ee99ae975fd964bf942db7d0fb91b77a0009b1ce3a049e2b1eb553a689b59d86fbd8aca55b66f73ed3269d7903d539b8df9af7a3c9266c54004600877e373571a13f11ff3180a7b3dd16e833c3a411c9cd17c8859c0c288098c80fa80b47b67a00201200143014402012001450146009b1ce3a049e288f2b88c6a77f41c424756cdd20fcdaf8b951bf62e8db84ef4c8f424f8b86bba40045cbe8352062bc48921455da5b253bf0a0373e940dab1f62c33db1b6c38e2c2509e90b18d6d8b60009b1ce3a049e29455c8c1f1307ded544b775cf0483f496b23aa70b88fb3a88900ebe72b2332d3400453bfa1bff4d711f36a9b75b9687f793dec216c606e3f7c6bd8abbe1afa40a288e30de2950ef1e0009b1ce3a049e28c2d0059bf2e3ff9f2a82bf2179d3250952bf1a9f32ed7233dd90bf76a805f0bc004480586e74d7e563dd94a980935e004b618f63008b1227557d464cc7cf26e705a8a109108c4efe0009b1ce3a049e29ed5cd5d2b01b95d09d88b3bd0af8d0c3271a3ae8a631fca9e3c33a9a6f59b46c0043d71eebc34a8c3943525f8161f8aec2fb535335fc2bbb1ab0b47681903cb447cca69824f1b9ce00201200149014a020120014f0150020120014b014c020120014d014e009b1ce3a049e28607f6f25175092f1e3827be90536d417b0726a55c68138287c7394df8b38ace8004399cc634a1f69152a1387280f0236710681053bea0ce857f8c0b5bb8bf39b78d0698a1b25b0a20009b1ce3a049e2bd9d34d9d1b25274f37bf8454baefd3053ea569cd354265973f6d642e02c6b83000433af9666a77bbaaa83f00bd051fbb5536517bb5a916537bcc03e27a87a7ec0af1943fa239f3420009b1ce3a049e284306a77916440c1c3c15a693773d0469a9a8d757e9a44183f458d0436f0b0e4800432599696d0a543c44edb7d681a9eefb9ee72b66ec874c2dcdbbefef4f9cd0ec9131c6e32ba0420009b1ce3a049e29a70efbab738ed7ad4e11ea76213c0c05cc221e3266b30224e41b60c153c7768400421b4cf7523ed9663ebf5b15b05dd8974676487cccb33fed640bc4a68b490626d98f540fc1c7ce00201200151015202012001530154009b1ce3a049e2ad81e5e080c139b1eebe035e3ed99c287bb5fba520bbaa9e4110c519a8c6fd3fc0041d467054b7c4381055db64e196e3396ede7bea28437c1d49f6db06acff8689eb73b13ea3f53420009b1ce3a049e2b66884e535f7a9e8218bfa63c3a84d782b6125ac1783eea89a9099642f3ce88180041a3c6690c210464170278680894f6ea68ca69ed38d7c8004d9acc66269c52dcba495130bf58960009b1ce3a049e298dacb4bb084e45a9580ffae6220e54aff51a8750b4112aab1ce375870de9923800414e4b9fd3a5bcfeac07f0e4bc11320a8da8b1b3a66462b53c494a4e14e76c238f26664fffe24e0009b1ce3a049e2b419eb7733d29f7ad5d4d00839b13c80133009ce02b47d931c9127d176480671800413fb19de4b2ca30b8e5463bb6f4bae077e1956a261234d3f1df5317559c2c0cd5f4b8057f475e002012001570158020120016501660201200159015a020120015f0160020120015b015c020120015d015e009b1ce3a049e2aac7949165e19781e3f4b6577130f0248b4109a7b5059f26642da1c60e3581f3800402c1880371324303963b55830d2d2853361134b7618ab43528bbdaf687a69d26867141792ffca0009b1ce3a049e29bb0b62588fcc0297353fe659bcadc5f9f1f0ffa31644b620da8add46fee54270003ffa2f0d8f88be6ba35a67d878b9ce8cd176458a2afbf5b8d642531b3f489a9fde93f24a1ec7120009b1ce3a049e29ad53ae9a32a6a56cc5358557ea76539ee2874727c698de01db9b37da24f3b82c003ffa2f0d8f88bc9a0aba445a362a7aa7b5be60b52a9885315a3c192b5313e881d68322578e79a60009b1ce3a049e2993417d3f565a099dfc9d4c22a38ba5995ee61c06324255d3c6f2daa7e24bef8c003fc51b7772041963653295d7a0ab3ffe70a8e39b431046c93e5a51976ec30f17c81151a28b624200201200161016202012001630164009b1ce3a049e2b7e581ca3e92d8fc43eec213ecc514263427b8cc5c60629cab624f9b00dc5409c003f00d18f18ef58e5b6248ae957819c53195463dd7a29277835a5b27323db64cea1c0b8712907ae0009b1ce3a049e283554628c0a4c72434fda3a78127c2a0fadb470d2dafac9d44e9baed3a0ee4250003eee0679242c707a27dbb19ba353b571991f65bffe5aed1f4760ec1b5e2ffb23dc9430e3a0be220009b1ce3a049e2bf56096957d5dd020d88fd7204474f5a9ce25e0b76eade18703701aaf6f7e17e0003e771609e8ca27751d7dee28e7a37b1e3572a62abd33af2ca3f86d1858a0cce6ff60bda6e3459e0009b1ce3a049e2aee54222940df044c981cfa466e43fc4998da6961048beb7f7c638da28574de7c003df7f4d8cc1de4d3a5c152504a1ce49bbd0c5f022169be07c1f530da7255c17855a8bd810dde7e002012001670168020120016d016e0201200169016a020120016b016c009b1ce3a049e2b159a415a5902835396b78909517c399df94ddaea42a3b70acc955d0268593840003dc1af510346267242fbe7fc4774f4d3dab3613e7cafa7b079fa124a33a6fc90ca96baa69704c20009b1ce3a049e2b63d064a162481d5e31b12dbc13549bdd99ddd9a8be5ab390e790b3871d930634003d8feb91d74a0405ab8bbe1c5e2e3b1e546636910d34eb91b232b31e21ba0b3b2162e599de997a0009b1ce3a049e2a353a8ff59b242d117efcfb4630adc1e6206f3ef9c777d4a7245add7015d43ea0003d7037f8b732c0fb2578a99c369561d684eb320a8f13ef320143899fc9850c38e74e95b0eaf40e0009b1ce3a049e2bcd0166764ca6eb413e0191f118d5793d702b827193f97afdaefa0aa87fa36420003cf390ea7c8ff3b6d3b4430cdbe843e76d179865e48f49a36bb16867897d45dd53b004067be3e60020120016f017002012001710172009b1ce3a049e2a9114678b7174a4e5b5801173aca3e55ed3449e8d000559687823b2fe5ce60ecc003cdc82669e16a1eb73d6117661e38f086a8631096061f73baa8ca5181082177fe773edeae06cd20009b1ce3a049e2ba1f1de69df338309269c2115e9760bfa09df2bede3bf584fa59d64ca27f3e69c003c93f8fa9852829944ac68574578f8ed0bddfca72d4ff96126182d0aba84e1eec9c49d3719eaba0009b1ce3a049e2a3325675d0e81977a0a99af8316decd0a98a39dfe34455320eeb9d770ef8bb508003ba3d47734964706d5026994fa04e5b710b4e68c4429a9e705ce1a95c7c0813127b2a8fe381ea20009b1ce3a049e286c6bffdc0f31cd424475ab3f2dcb41084ff98dd64a1d4fda3c6705f101a45354003adb747857849ac196c5b1cb6bc04add46eb9eb075aa93d31826c69b548eff130b118aa1f09d260020120017501760201200193019402012001770178020120018501860201200179017a020120017f0180020120017b017c020120017d017e009b1ce3a049e28e52c03c4b6ca285d2e72823c75715b6bd5815ae542cbe62cfefaa51b755a3618003a00116fa669fdf64bdc3ee3effd34f1eb0ebb0fb48e99c40e5b042c18661f7cf2837d3965c3e60009b1ce3a049e2b4b38fdd5818c0ecf14bba0b786fd140b7a68196b0eb77194d44afa0d7e4c52b00039af030e5ec13e1ea43d67ab725691048a03b4a4b10be18c03fc4447238864ebfbe528e9afafa60009b1ce3a049e2888973f5ec47cae6e8fe4fdc415217f442bc031ad3c2ef84b1d05fa0a372f9cd80037bc79d040a90e4bf04f4e4bc1f57ed53926a829ac7687196fac601487c228d65acece629cf61e0009b1ce3a049e2a72acb8de4b6489b0dee016a05b2215de5442d2b0931ccffd3c4e24891d51033800379a7860ad7b04c243e0ab84c6ce8324939e1888aea6363bc3b081d6ad18eca492fb89a8125c9a00201200181018202012001830184009b1ce3a049e2bc6c1523a08b6062496cc2eac8a0de75585042c5430170df79db0d1f3e4465be0003674fe10107dc3d5f13b8eb2fb2811f8f2fd2248f8897e151bd652c93f307b1e0d0c71dbdbd10a0009b1ce3a049e2b1988f629ccc52114ea24e0c53e788c8ab89cfb29a4e58164c42ce8ba9b8ffc100036557779d6edf4df97491a293787166266f3c3ec9e93390f0aaeb74b079e92dc6694e9ec7747fe0009b1ce3a049e29cf418c7b24d8dcca9f267e5011aebefc5a1fb1502e6fb45138de01b83feff32c003637d002febbd7f09a1ca5182f7a1832d9964fdae6786d148544642138d9c1d91c3660a3bca58e0009b1ce3a049e2a94b50336cf5edd4790662a0dcad3233e292605ed6dc5380988e58a0829c64e780036004b0e2356929d32e6213ac7ee6541c7691835955b5c383bf1e277aca1dba4825d8b8e5b09e2002012001870188020120018d018e0201200189018a020120018b018c009b1ce3a049e2a780babc5190dcd10e329703665fc2abbff783fb71849409a825a47481d1bdc8000347120df5459f724c43b5243ee6b2f766a6f24f55b171fa37a3a125b9c72e6a7abeefbc3620ee60009b1ce3a049e2a2cab45ca893035e47c443cc7fd1ca22057976ff8944145e7f9fe43f110e1851800334ab89f20a42a9ea2d14b979198992f73ff458a40d76fe3157ee74c5a780e1d0cc1e93f3260520009b1ce3a049e2839ab700812697b4051206e9daab610949016ab2b49a66ea738ede952722c7d8c0032f705aa23ccdba48075ecd741d50fee154318dc3c16bda368046babcf4d0ae90619e10a3b27be0009b1ce3a049e2931720cd0dcdfd0badde7ae79d63afa4652809132375487f3871234645af77f500031e8044fe9d6d3b88705d8a1a927b941511fa4dc9dc5d50d0da4cf7fbb48496bf1a962df4ce1d20020120018f019002012001910192009b1ce3a049e2854716ac2f188e28454614f23acbba97c175a4d6eefa0ee7e89c5ded97d2268840031b7b3d86fcd7959f9e9965bc9c6efe6f26e25fbef2f719aa70c4a5b4cabe873169e5adc9dde360009b1ce3a049e2b5da2aba49abb9e3b13b0609f138f1cde092700cd40820350659c716be12ff550003132dc9245abfb85c1cfdc020bd8aa220810902f1bb066557e3927968850f219267da0bed3d52e0009b1ce3a049e2a496becc7993c7344e5c0d656f63a6e4878cc96bca3a3f45594b82dea7dd44ffc003132842eb834d0dbc32e7f98f5f18ddf0847960f69dc56903cb7924ff0bd4232512ea170108e660009b1ce3a049e29a9874d9523e0e60f970c3cced3f6d71e325509a2da549e9a6ba1d104fc8236400030727c819793b62bae4ce9ca3b27c4b57c5bfd4c91ed11f604df3803cf0beddb4437b63c7ccfb600201200195019602012001a301a402012001970198020120019d019e0201200199019a020120019b019c009b1ce3a049e2a539684947bf3972acc7129ff8b8c95d2cbaca8e83a8cb1ec3756ca2de13d55f8002fcc4f3e1445f06dee48b7d754cb10756ee56e24b1f947b72bb5d6c4dd820300e1a254e716ddb60009b1ce3a049e2baa67881359422c6ead4a0ee76c965ea7b186d2255a5aa47ffda5f73d39027fb8002fac98d12df4ab3de3900acaa1c1d147728ab1a4274054f1e3e7870d5a30dbe53d31bf2e559e7e0009b1ce3a049e298998c1751c67bdc54e4158bcad57fa52c53617dc986c6633bd0a804c13969e10002f519af270bf47e11c57246e6770c27b5507791009d09e3912f7c16e08bda5e5ef9506c4694e560009b1ce3a049e2acd03d64e5699205ebae0f271aa8626628c6ed183dc7349e30a7697b3892517d4002efd2950b562f58324d3181966a141c514523c202e2a22d8aed2506b06ebd09b6abe0dfff3ffd60020120019f01a002012001a101a2009b1ce3a049e289d6b3a8d8bc84bdc4203f63d3d4f2a493125762741ca56dc15513cb7b23ad62c002eeb4927e02a0b5d219533d6a9d383f0a19caf6dd415e9c444edf0a7739081733c5669a72c94ea0009b1ce3a049e28e9c7dede98da9c1a0e99b5250283fa5402e5bd2fd30d8d6ab8e4d1e5f636fc54002ed339b83b4be1fe968e6748584d4833998ab0f2118fc101699e06d3b0659322cef4c666802ebe0009b1ce3a049e286d1a67fabc336c959baa78fd4be503ea923982d063f589f01183e07bb8414224002e7bc17ccef3a629141b26bd203d751782e5ec505807ca9574e9c73296495de83d5b39b51523fa0009b1ce3a049e28b45e39ffb538266ec48674398863f2ca5223616cdc1a0c6a9ba3385a12d90dd0002e095f36ba1b29571b3ab859148402488b98e9dda1fd151968863eb72d61528d989d9f3d96b166002012001a501a602012001ab01ac02012001a701a802012001a901aa009b1ce3a049e29a1cd0adcb891ea4b849444735df7d68ccff084fa7cbc94f40b7f563cf709d314002dfa4ab8d8035256d776e804f4c2763599d0bf0b586833ba8e36c474f43238da2169b0746157620009b1ce3a049e29efb8c47d741f7e9ea548334383470288891f03e95bf7753eb97f0d50405f5360002dc220455948f09e744c630804d331bc19d8ea9526071fb66743a527259298eb9b175e2c4a49de0009b1ce3a049e28096050de1c8869c0e5e44a4e3bd8189341f7bd00ed6964e8cade5125f8a6c4bc002da19aacdc61873be7af211d13b1637d8ac7086c5f4ee0faa764f3d951943ee00ef5468c76617a0009b1ce3a049e2998ffea1f5450aeaae104662faf0109b2fb07ac6f129525721ccc66e5c5db2da8002d98f83cda1c24cb07efad3a6a6b2b17df9688981b3b75ceacc5bc448fd9e5dcf567933d474eda002012001ad01ae02012001af01b0009b1ce3a049e290e9737cbb0c5b33420ce2fbe4f675ee819053e536764a2f8360f85de2d0dd4b4002d8830cf209759a24819b16ef4e614fff38afa70fa7d6f7a68b75728272b882e324f5680cb623a0009b1ce3a049e28f4aca701c894bc54f7b4f802989456c26eda829f776dc513f4359cc90ecdb2f8002d6bab08600fe22146cf7c9dd9e666392a3c3f6b4d3032b13332abc5b3f83e047c4a556a8a380e0009b1ce3a049e2b29c47e86ee56408442130bd20f1021fdaa3962830cb0d73409ecc8bcf1fc5c18002c9c51e2976d0bb1f366ec8202d0d1dd0f7428a8f2368678939775dfd43322e3caafd2f9a69ac60009b1ce3a049e28323ad3763c139aa45bf83808edae3c00f291fcfb1b4af038c78f2afe4b17b4a8002bbd423be796b967339f65d1a206965adb6c3f41c0332f0408ab3b37eb1a1e5030776b0cbef34e002012001b301b402012001d101d202012001b501b602012001c301c402012001b701b802012001bd01be02012001b901ba02012001bb01bc009b1ce3a049e2ab4b710d35dc28cba8bbcacd96d8420fa1ac44ef4e12b78dfb1eb9f00f6d4e560002b82b0709e8cdda17d1d73ddd00cba98a4cf38b3ac649bb9e6ce7064d651c825b650ef7e5e005a0009b1ce3a049e288bc9acf8d2171ae8bd59e552a053612afc2fdd3a449b377c6ef0e41fc1d4eb0c002b50e2e61ebc02c55aa14232e9228032dbb019fd765435ed319f633cbef102114ccaf1609f64420009b1ce3a049e28de6118ca890e13731443d4e0f81a31c4227685981cde56dc898128a55183c36c002adb09da09006dee9c4e215c1203ad0f95cd8dc58bfbc667801c1ec68886d16573346915867b620009b1ce3a049e2b0c1e5cefbb7a10ffba429be7e65273dd122903273a890a5167f2d95e4076e6f0002ab89ec35efbe52ba92761425bbcb6844ea868c56d0429e313ee963d1288a446edcd9725135076002012001bf01c002012001c101c2009b1ce3a049e29918ae936048c91ebd3031b0b6a581b17a8b1d6190ff24bf42319295677bc63c4002a863ed6a7a871a023d9beb6ee16304988b5dc61e3ebc7d0911b35becc2bdf617c284de350d93e0009b1ce3a049e2b2669dc07802d97f8c9bdb777e532a8f67b43dd6020f401fea702a6be81bf37c0002a85b9d3379be35302e6519d43cdfff5af212c987ba369df8c801054a5e11436f41e09cdf9b3660009b1ce3a049e28065b42605c1c9052f10edbd1185033517af72048ec6320d62242c06cac3bbe98002a596b93fb44cbf0d9d05277ea1c26ab95ec012c57d5a12090749eb1ad9f3149bc6b670786cdd20009b1ce3a049e2acf07c3cf5d3c5890b63843d0400846d7895b8c7e70c71b517551df6c7a3fff8c002a34f750f8fc955805a66889fc09b433eb1cac810c5975500818e12c8e0ae0e3bdc0974768e9ea002012001c501c602012001cb01cc02012001c701c802012001c901ca009b1ce3a049e28e2874c21f65aa0965309f8954881894e3e9a32028b5ea76527c725e04fde6b50002a2e33ed419689660031191e56dde5e0ca9fac0a7adb0422ea50b5a77769ce6754124760a0c9320009b1ce3a049e2a1ea1802fa26383753979e360dfc5523295aba4d531324c2695da2409f973042c0029ef77233b055ed2dca6096524a35a32e685ba71cca426b0e3cf91c3269cd6eeb73671b7134e960009b1ce3a049e2b959ce9134d6583bf23ba2763e03c4198f7b988c178f74f2253967b3791e8e560002948663dea322187f135d6440bd6a79964873da81d2c0b7b376a26f07254059187ce262d485c0a0009b1ce3a049e29cbe195edcf34622ebbba70c4cb548bca55a9f8914da3e6d09afe5135fc9880e800290f9d2b3517df1fd43f1e6c98cb9c0d8c3b59274e1026378fdc0dbdb50eb1d801cab3747f5ffa002012001cd01ce02012001cf01d0009b1ce3a049e28938eca2e26d466968f996dd89b3e954b9afa3c65e7c3a16daf380713f4b683880028b0039997992d7a22a2bbc6f1a3b88e34d3ec3226408f6df3caff6d30785d07bd1501961a0d4a0009b1ce3a049e2992a2a1e3901acd219993eb4bc380dc9c6c0a3223fc6c4dd967253dceae61d278002883443a374f9a758a1cf665f267e2c057047cd643bcdbbddfa2d43aa470886dd9898f9fefb6d20009b1ce3a049e2a46ff41ec07e30894fae7f541aa2991d3af2565108ac4ee3f40339698241b9b6c00287d489ac96f34d20fb1dc5900e90d35582a9c256d35751c5c6220757f784bbb0bd4989a922cee0009b1ce3a049e2b253bfb908051ebb78a6b01b1035c85b60bafb1c1584a880fac0a07d2edef1e580028131a2eb54b34cb8a8fbb84820193b4d204821beac23c58cb8ec2ac314ff35ed535aee0078fae002012001d301d402012001e101e202012001d501d602012001db01dc02012001d701d802012001d901da009b1ce3a049e28cc3ed46a12b9ca0de67ab20e88d53fc15cc0efe553c7c33fbdabd90cdb2e4504002809ba6caf7de9d1dac2c9fa11b7233fb8fed809b60b2242e804da5c370c791909130c6f635d1a0009b1ce3a049e2a58e2ed78f898eb18856621d8dc2a0044be18727831988c42132df508e9b8d17c0026df5aad06ec1edf18ff6b9ec3586138047fde2a25860445693fda2306c2e05c14512b598f232e0009b1ce3a049e2a8cdf9b869488310080b09bb95f0a78f1756ed522ee07f84a9948d7e026a39b0c0026df5aad06ab633d42bc06e3a77fba211c4e8ffbfba78655fd20a3624c29e42cb03a94459242960009b1ce3a049e2b40e52cd67fc1a251370833998db02de219de004b490facb9605cef48a8b1fe500026df5aad0587a1b3489fe5453dbfe5e2c00d9a58d5920865ea58c8da8731fe37a74989b56dc3e6002012001dd01de02012001df01e0009b1ce3a049e2a9bd6c2cb6c4b89e60b288b6dac842f6dede26a5ef6c1192bcfc759b18c4de8400026df5aad053be8c356490435d8b26734a3e8523ddf06685aa2b3f48031952beb28e88b19587c420009b1ce3a049e2b112ec0feeb604bd765228390c1f39906ec816440ea2d98b07770f7df70c41bf40026df5aad040d71a547d83c93830cbde24bf104cd2a3ae9610c458ec80c1a30a2a0dcc48367724a0009b1ce3a049e2a75d79b25ce43b9e2b1d3b211e57e67fc0492e802701d3b54d179c74da4522c1c0026df5aad0355b78e30bccbc20b0da660bcdc106ceb249da6953cbd33d6713e6a4d16a42100e2620009b1ce3a049e28f44a8ff2b5c4019aaa0b18015fdf7f02132fcca82cfc543a775fe5bce36d26c40026df5aad030a1e5424030284a2643df3e9a3dc27a4e92418f7d2863b8c4d44413bf747d8eb6b4a002012001e301e402012001e901ea02012001e501e602012001e701e8009b1ce3a049e284e9f6ab299e0b28aea1183c721a8e6be89bfe1da2444e9c5e4f0541e642924180026df5aad0206af8286f75181e77418494c8b18c5b3d9056703d5650263c2aa0f45774f662862ca0009b1ce3a049e281a1fa2cb0d486e8dd41d6f1dff58018703b1384d3c7af65324d220f74b0b07680026df5aad01f139b28de42ca52a505d1c22619285238fff02d7b6fb8c96e62f7b7a465ef7b444460009b1ce3a049e2b21c13b8c082799d35878cbceeab8808c3ba4d2be34f38210e3bf6926a9ef1ae80026df5aad01bb364435e1b49423dd16a326044b7c0af9dc8d51fb43bfc21a6e0edcf011820843820009b1ce3a049e2b0a576b2788c2225fa2b8e0fb1a9799fa57267f44896950674d02e98d82f7c8380026df5aacff9efc452f31ee76d4c83a5ebdc65266998b956d7c77e963593e84acc384cf8b48689e002012001eb01ec02012001ed01ee009b1ce3a049e2999f70871bd0e3e5543edcbed3d94b697759ce6d96a869ef5b7bf07699259cc700026df5aabe54ef87d88a02253d6d6538c80a6d2083fe31c60f28bbde53e3aa1afbb68ebe8645db20009b1ce3a049e296dcb0138330520518648edc015f36b5b2d9c77b59f4352cf0f601bb3fba888b4002682a911d065dc61ea29453572e3376d806c49c80fc3f1bf871f69227bdf8413c4479036033d5a0009b1ce3a049e2bff5254a8c49bd385dd8b1adb514531aa8413240a163117e5fb73753e5baaf110002682195aaf549587ee340235f5a8975b70d9330b6dbae735efc3c36109bb53143abc134da125ea0009b1ce3a049e297b8cc0882aef478b6763c2c2f8f2d791c6cd9ed317d9499038a94fac1848a5ac00266737725fcd7c1894d7dd51f484773b9a020f2a4731cc0bea996959772f0026844aed6d0b459a0e6a644f605f9712768f9050059000000638e27a0066f3c6af1dec2664e2c520062bee8fbe0e469c96cc350543f8c474e40260f9ddea68bbe2f669b62c00d866a5e816200da5630298b92d681a83d52882d400f80a49eb813e443c4262cd5b5d3294ae9000e900a678905ecefb11288c608000000a8b1c58c4297fd3f8178c44318bee5738fa857f0ba21b547637c221ff0a6bc2a409c50c3fc69dd3048664aed22f052968889cf09a188ff6bcf0cf79552655ed190a017cd19dc05b582e25aebb2b9d03c969f14a6089f1c6d24a76d88ab964ba30200000033bfb6c8de64e58e1b9c3b6f36b2987750b17be7665fe99f3880d4fa8de4edc9402022b4e5c36aedf8621744044a1110a4bdbe689603ca2236024b8e60335356694548d375844e09e994876854915598f9d9bb16620a7b032525fb78ed0ae3350900000002d961a88bf24dfd3ba8ecdee244e7ecc41fbfa74491dfc4a316d6b61e79124940a33671c0316f82cf1b414336849aa4ec6a4069577b134e72da854016c401c86b523476c68cd23c158843dede8860b42ac818758edb24a4fed490f8edae3402000000002d09da226e65c19cf88b19ea6cf73ec03b5a027520b4f620aeabf906baf925c540e0d216805ae70ab2d8c463446247c7584cb5dcf3c5133ef2fd67bc9f18af9c7ccd09f4d252fe0fae9b9657d21336e905a043cde86839447afb2cf2a747dcba0200000036693d3d84be28418af84690766d46f370c5cbf3803e0c4c66adb6ed1803f909409e276572211a56b5c2772d663b939219febc16ff720bdd5c917ce3e7deaea8ec2512a0673d3caafd34e337d73d329552969be3c97b8dfe42a8c675caa9320b0f000000e95d0ef01758d080069d39973933a43a517c68247ad6d0706a156a8033e5de4540fd262620a2392389e98fb7ff78ea3512287afd33dbee813f85cbe879a9b738a430e4c4c2594b5610d872ea4d0414d2edeb642b7b161cc63a47a6ea006f677d0d000000444ef7efdd441714648a558d13f02f19a816e7139b192d10f3bef8a3e1e8272140ad30a3e055afbbabae11c7a3d92bb7080cbfb69b4e4d82ffbf9122e73e53bb00dbd2a46a51a6436084c28002e78447b0c9a2183785e06702e858d5b0354a8b0d0000000e179edf54684f661cb6a5d034114c88bbf9bbf3c38cdd8a1152f9ed9161ef10406a2e8bc5a299b3e96d5807e71fabb7005cf06ed460f5f089120e9268cd74189de956c9c76bfd4e6ac07a6f539bc7092d158eb0823154043ea0a1ca96efe63c0e00000033430e34fb7c049873b4f97ce4cc0c9f5f4e23cfeeb470698962ed5553a494da40299cc28caab6190323a0ad7ca0b88efdb2e54c51a6b8b858badbb7c67eb59fcc318137fc6bb9f731b498b29aa12384b7a43bfd14caa90f7c7afe5db304aa3101000000bfe192fec649b46fb140705af3459e6e708f4b568e41abd89682a83e473747764085becc1e859776af3c64edaf88b6ce70cc175b1a9346ece211858308e7f7bdedcdfb9665a1d6ee1dc423b5a58a24772a9cfd7b7f818c1f7208b7f96779fefd0a0000009503a30863e384f528508b0851c26f42a0c8f72afbebea26ee932b4a21ff80cd4043612f904457ba4f612a607468b682faca0ed7412f37e5c0b1b68772799594ab391a1df4f5c4ad974f9c566c1b3d975c145966789ac6b07a8c707ed62d26f006000000672e107a94290704f6c5726deabeb7bd64bee446bb1b3161bc1f9466f468cbb0403f563f84ceba8ac759a698ce8a6647b81254cb4ddf3ed50ae9bea1a7208150f8cd62fdb8f51f6202a39adb08bea16143be694cde2c897efa6f53a5db1729ee0f00000074a4225f7f050fb11789df71563def83cea75070a87d74befb21078e36e654d0400297c8a98446171b3a1521a530d5fe0eaecf4ec5e581ca14c17b06ea9e5c6e03cfe4ac66830e953e498277cce8b7cdfad8eda36fd1322bbcb5221849a5fe0a0a000000aeb20df10f038b15157777f0daea5ed2861530f6fc45d371c685fd22b72e510340c70e0d8588805f1038f5dbb75aead10a5147a7becfa76c5edf6cff4cb3ea624852b204f059abf2a0c137a40add7d75ff22d6b2d5abdda0774bcbf71eb1fed404000000f234c306992ce11c9672f344dd05640cc13e44f939435c04bfbc0045b77dfaa0401dfed97af4affcb443ef791328c7d4bad75c9bae6c33bec4d8537a862fd8c62fc88b1353684482c447a22e7179cf07794e469c467b3510af527b7bcb5b8d5605000000d1149597326e524818392fb73622b988b267bdf1f68d47825b6834a4f57bf9274063fb74c72dd83882cb56a5c869f7e24dcf48037c36ba7cf54f23bad177f7dfcc5e57f4b308a2541b917c3db367fbbc3db96f0cb60a6baa5f92feb24b76bd0a04000000f6fd9a857cad3694e66f70ed6ce7c97c9ce3e63b5ff014cb0baf7c5fe80e4f4940180fbfff8204fb798c2f29e3700401977fc1da3acf5cc953c64fd60553707af39f7a4b56be47ae48a822334374d1eb04c2ca56aa9ffda6046d2bb106b538f00c000000ceac7de2c34ba119166d55bbd4622b0c21a90d34db379925e8ec16d37dbcd53240e721637969ea2f68268e5e87dc1d96827f75e303dde1eae4b7558798ba8767507508ef14db1b26f6985a41cff836e7b3f841b3b1c2995bf42c59244020e94205000000b135d14f679035a7f359f5022246b45a47c04df76f534895629f538d1751eb4d40c06452615ae63dd032f84bc9ce40b8fc3d352c72c1695f2b7a9290dac4ee005cdf5d703968826812b394f33a12bff41cbe36512c236f08555f2157ef655b1a0700000026e20ff81f03a296eaa397d52aeaf5a0beec16c38409856591cbbe96e07cb1474057d8856ad7390e8e523d9556914eba145a17fadc18560bab09e27645f8c5c91051c072713315dc8d25451b81b2f9b9fd743d3bf8f8ce7216daed0ceb1d0bc4040000000916246e07d42c55c532972caa7abbf9784709923e8852983cb1971852b2c48e401f5c95839ed11e118ec48f2713620c52db0dbb3aebcdcad47cccf34f15066f03fd118febb9a05734e42e729694acc4f3f62cd065cc766ee88e965e2a74bb30060000001ef3e161a85c139588d9728e31ce96d6934a9f77275a700c818926bfd1389e1e40eeeb44e68292bc53fff88cd242327af2c63b89273adf7a84b013b12066d2c8a86bebf6562041cb883680d2299d9ff16038efbc8ef8d229ed27ec1b7b660e8a02000000b603cc2578007db798d42ab0a4d76d5d1bb674504bc92a23e69b4d8afde3efd04085ddd03051e97a67ffb4cc2df10fbc7239e8d97c230bc958ef6e50cab9d389bd30fa96028fceb9ce3010310fbaef62b6e75e71d45921ebfab639738b47f2d008000000f235ae5f57dffb5e24cda26de3e9bed8ffbf34c4186d198c0fa90b6e6ccee64e40721501df491db000af2ab9764dc2b907d890f1a714dd7858855e8554c894363dc7a00d8db2ec38dd5608845b429edfcf7880655ec9882484615d546ffcc21f08000000f54afbe960d33f0da5231db00ae8be4cac8b75646acc6f286dd53451946c386340818ee6390a6749db34f72af88b1d6bf8db189244b83a23dc0e0c7089aace3b7d97517af31b7072adf84d951fd00ec070c646fec75022d7742367763520af5509000000130ccfa8e30964f1de231c418e8c2d963facc10cc7b33625849073cdccbf1278408fe38b5fd3e200e0f0e307f7ba9299acc9e7da005d82b0f5038b6f6adfc285bbb4650d31f65777a6e3e301eb126e41b463f675b47ca9c82752dbb0090020f70e000000116378c3dd3b426f098e42d02edd6417ec5e07fdf726259fd17c1b6dd80d565040349b758a5d00f63b5fa4511ddf558efa2b6013a26b51f77aadf0d5752a3ebf8b1bc6d1350f42563d22bf12b2c4266cf0e30564d0f4c3c681dff64a8a82b7d40a00000064670b8c65317466675b39bf62e1dcaca8c0ce2fe24e0adf4a21fffd13f71fa94097dd27c50a98c6bf9f0c826ed244741738da4fea9a14abcdd211eb9125f6cd66bfe11779024e33d57c0132686e95928d5c1ddc6e976a0ac68741946f5896660800000009e75f9975bf808370edc753050a24a2222164fb1cc6720f8b18b6cdbe3d9d8e40686a8ccfec01ae95493838cc51ab0a0516aec7b727ef305296197a40309eb6abc85082962af282b94f0093d2ec5bd082a434d0a4d3b9ecd5a3f0421c03d7b40f000000fd6d9ed5294d867a42dacd4ca817ac5d0c528c252f7205f5a242d8164f24860a408837438adcaa321016fbdc40b9eca1606c58c3a1c0640718df4045b2693e089611cf1a3186c63e8d7b78362d84d5494e6d9cb14b6736a0a5b641b6fac31c1e0a00000033ebedd0f1c16acab95493447c4b14072f8503dfa66857ca8d5063792efe923a401ca496ecd2b4b9585f6e79ec81ab223d91faecb376f9d66422c627a87f0922351f02efc1634e161ec4eb3e3922b57ff17b187818d2363b71d73c3d34ab5d150b000000afd6ce0bc415383bc1eaf76532cc62280f470e28a2fdbcaf032d6c0bf6c6a77f409f3e936f07666bc5e22bace55bda44e00f6a40e13b1348bc89b60ff91ce7a557d6ca5653545d8731865511780f4db2048e756694563bdc1ea66e34ec2315b90d0000005053de5de3d0b0a6de02ef56312ee04147a306a00a58aa021a8ed8aeb22b48e0405ebfc2d5a60f1b5e975b6dd8ac4557b3d3b42b4fc9b52a839451cb44c22f92f7562d507b180b6da234fc0d147687f34760f4a030e3b8d6d80b147553726e830e000000349730c5ecd135e0f5961c805e14e347fb804a1ce42bc43e8cfc6fe43cd2d8ce40bf4c32287f727523f512866aa2e882f8c6c24553ebd3eeea21a4aea6956a62c1284892e8f09493f196ca018852672be4ce59a8ef2365cdb963c24dd58c6ba707000000c871e67669dea55d72f575e718db0039d365cbbf78e229da3ae5d5e7747d912f40c203e2c99b4bc9509d8140019a4b4ad4115308a68e79948f3021351695f6159ab14ef06109ac81970f3f78fa589df70b284bb52909311ceafd5efe3303ed0b0300000042321264c2ac9cddf0cdabffffc49df466c96438851b25aa46fb8ca544264476408a2e71e5bb304c4c225acc9c73cce7171660f5a1cae1448ac82e7e1b92b02abbca908d3fec3b0fe08afc504a55679ad270aab5959ea31b43890b2d49035daf0d00000057419f836904605efb22e7b7306d53df3ff0a433b8be1d9a62913ad592dce9914046615360a9ed199a5e3f4ac2eb2f4d2eaae40a3f552f486bf46c4cc02353eb6d65803d713d99f4308b28318dd417387e7b7f0ead9dd1a36360b6dd67928bcd08000000bf429192bdd6692baf0a54a23503f6b9fbeaeedb510025614d21c51dfed76d0440086e060860bf1869c4b5661adf7dc007018a29e8a6ff1fa93b846cf302d695843856036e8d2519bd8730e6eef21787d0dfc7c20fed5a5e8ab4491d35638b910b000000661d3c09cbd4d78c3ac9573bde7ea98ab5987b5903a3fbf4281fe8288b918bcf40e91cd267704c7d7e1f0678ba670e2a4ac449e230579857b5d06c53b5683ad594b09d36b4aa9272c26ff0a6dd66e140938a7af2cb50fd7f7e313358949558cb040000009b0b94ff5bade879f9916eda9672c6f920a6dd7304b52012f691eb7747ec4dc840d41f56a9f0c454e369b7dc1cd4122ce8385edef9cd94668c5021e1aef216a151b1a962ffc87a1d62d372a0f7372af42c31d04de21fdfb2e982e5bb258ff809010000004a492729df8c4fbfed44dcbd7ca87658f1afb0f4bdea520e954bcf0d7eaf3a5040de86d3602433ed7968257a36341582beb09e61de5c937c02d5836e1cfe12fde6a4176e1602a315960c46e3155492008404d718784ca2076b355b3e523b789c000000001f0e1bdd5e670a7415b2fd30bb2499d7f594b7841a191bc1699fd8a340ff1dc140eb79a1aab971559108ba418350cfee84f9111a3369f901c14321edf9557d89107eb6e11996627cebb16f5eed60044edbc7ba0d56da239fa4b4f410899773e4080000009ff02b88c3d8d327d7602956ecba345afd2f5d48f0387d2a2a4b2afc7bb12f71405cd66ffcbff9f497f43b4a62bd77cbd46ba11f6ec556ea4adadbb6a1cacfcfcb32244dfb5e2094269331d243e187fa0a58d4a012d79899a7f0f34577dc11860b00000047610236af5b0be42e6ac7553dbb55183fe75ef0977914bcb1d379083765437d408eec0976dfa6f01fc6d48032bbe3ea5a6afa773c28a06342e31d292bc7b229e0d56a10ed8ee3f8fb4e7111d4383cd0d013b3a29014fe2e633823374efc2902080000001eb8a44e9ea91ec3c2858952cfbe52e1b37605ed7ae99a4a34a682fd525fab8f40bea6887f89c9108aa1a1b9bc3e36124530629473201c428aa3b1afd591301a3f71f0647daed7dba8af3f1c4ee7033cf1a2ebeac4db90f883f42a85cc3f086007000000f94bec65b2ee706a05e9ada1636c1cb276d26e7e9b1090e699fda4e06b54ff2d40828dcd22b0cd14a5d88b96af3d053d0f78da63358cb781e30302e63745d70d905334608940d00e7296a39c46ff194b7768eed4ed1373bced643a438af61f980d0000002288894209cd6e993a375239b053dc7f5a3f25123fa82f0ce07d93b969b06a1a40cba2ce66e9b460225255fdfd78b2a3f9bf0c625988722341d7670f4f7a313178a69bd13849d647dd71ed5694eaf1cedf17f4962611dc0a185328e84f7ca029070000003e2d7c8e0ac0592ed108cbae46ed21701cb7ef1b6b73b1f65a3816ed317f16e540d994743da1d9d85bf846c7d14c931ddee9c0f1e37b8f5d1c39afaaf79c5c1d869c695d41c27f80a532e5e6331e2893d9a0a7fe2d8ac32f6d9d407a2623ad59040000008996e05005628d96c383610c5d5528f04cedd1d9f1201dce44972f59bdbdad4c40381990483332576bd4deec971b764924cc476aa5f91b2e25076079cedaeb22dbd592b8f2fc0ee5a99e38fdfafefb93ab2b464adad64609bdb36b7292994b7604000000ea0fefef8300b194e14e671bb0f86d6361c908ed3f289937eec957b3c3d44388400456c9afebe7fbea5147d566bc94536e32985803e5d2e020da549a72546caaddab1c0d4c29c2cd71e373268f5d91494481efbfbec8b9afdd4a64fa484d8b1704000000ec00c69999579ca78bbc4c31ed07cd7ca5496b78fe9927cb9bc78208aea1651b40a9ae8e425d12f5f2f5750507752fa4b11b3d58ab06cbf66213c41cdc4dfa00a8f23cde50d9e3eba0d7ec4bf8a6fe76c3e853c38592c8b46954978dbf42d7190d0000003cd72776bbdcb6b3bfc79ec0e97ff56ae07afb7accbc812e9a266de406e76ba4401107a76639c37fa083352379ececd2fc20041f92572504d2706a3090c14943d506201cbc8e564ecc408dcb5410d0a8b44f04e7a6a22641db87e5aaef8efd6f0c000000d09c8af4e9457148b6c173b89f5a31f4375ad8f2d7aacc0531f214ce3882719840c69db8e8ca95d1bb2391319820a7fbf870e07d2a984aa55f3b8731f59aa35dd6ec16556485f8888f5e3237bea91c73a63c5552bd7dcb07dd6d03eb2c5dbf650e000000811ca0718f2a17d735592f12fbf9677ada71f5f91da97bcc5940a7bbf66a5afe40d95dd11fa3d0e56dd5f18d4a034de8389fdf6b6254d6268fe91da5a0e363c30b435fc36e2441194402f22f9cc5bf5ab9c1f3753cd733ddb04316a6fbe3319306000000ec59be3afd55f09eb3c7bb51bedf5d41ce6f79f910434c8da80e98f553041388408d7ce2ba7e1c8d8c57f1b39ca0aaa570f641606e359b0db794adc8db162f867302524f931683d351a7374aef3d5a5536b195f77ff5ff5f709c37827315dc7f0d000000e1c5daf5ae158206dfdc60670f9aa22693ad9135374bd25dac0272d603c37db74094505f2632b61c8a35976e55ea0c43746f60d62a98f63ca8c98abacc9307828bcb271d77560e6d00269d934ad4c97ee8b59f627b62a262d45acca7b76d82f109000000d9ea7199844d796140f972b4139b6f2cbc090f90e6cda2606706dc9f9284020540169400c158de47181843066db747c7c170200855c1c4989b2debdfda3fa8417797a02dba22852251d8f9865d8a4e581845cbf61ab12a8aa2dbfc756614787608000000b2c7954f81021c95ef794c79d8268401306d2d057412e33db64e8b0c7f03159940d7b44a721cbab7386f25bd0e743876bdd9ea24f5eb3a3e9ee861d8347630cd29a20db32c320c1937e20e886818d016497417f697213267f2357c7a449d41fa0b000000eb9ac14ac759b31e9ba85de41bb523a16b471fb4b4b0f54e4a26c3c15c39817340a9c922fba6d3fc40254d74007e4d80c1e7c086800b6f65bff35964314d1a33d6f558aef204c4808edaae04edf53b490ab32981b07729c6979137a831d0d08c0f000000b9980dcce89bc24f111b8bbd200e8c0b21f773002f965b5229a7c8e249d988a940a3ffec08e82058c3ade10dcded16104c949a91bbd8ff66edce6036a1153b1b57009b5646cc8027387fcaec8ff4f1b1c299d43990499d2c22245cabc874b61f0b000000915eab978d4210ee8e45caa1593791530cf278ffc54780d7aab3767eae80c15740677b765862c24db7f8c805cea38fc7c520b82dbfd455d6bd578fd62830a211023eb611f991be209adf101e579f015304b1861fe6c7784712d6c4cbc2112db80d000000ac5613ec38dfa952e66248bf4618a01580bc9a7d1338b29e823bea4779a4eefd4045901f16482e43c299e580927f02a29bb7280098c94f25cb0b0b2ce55e2cefa19592400f86df23c178015087e1421ca3bfa51fcb5d80b6cdf98ca02a5347b700000000385bcfb6a2b9f070862ddcd699038e676b22df7e4b9cead0103bfee62181131840b92daccfdb8253dd963a4c8ae82e76e36111442ff4d60c5ec3c0d793eb0987e28483584d70b02dd7951123c45f657049a61550326c42af9859f45a9666c216060000005d1a79326377fc7a0dbbea3fea044685ea64f1f880b1d491e815acfc2e40f03340ac70c611c1ca97875bff22258287299dd0e357ab13050a5f055275058672f8b67c6243db6dcac066117e9f7487d57bb0bbf46b930488107ba1aa8c593db39c0a0000007677226f0b2299fff2848991e09aa1e812e379ed101fd3260303434ac838f0ea408ff8e2955739b97a00ca3a70a30e05077a26404286981fa569baad1c86fdae05143403cdcf4ff6f2d3cc305221d88420324b4ce45e16bb5a9e707ddfe6717a090000001a933fc60b8dd03b22f15a440ed7f1977d73421ccee55e14a9fd3269a86b0692403fe38be7609c05eb9ca84ce3120852e0b68bc6b463223f70fdbb10ec27a5c8b351c4957a35ad6b77fa113ecae30d984ed266620feb035fdbde6e5b173714290b000000ff10350e649c63641d034c130f9eb09d36bebae7d66046c2aa8ffc5c7ce3fd8340ff749f9266faa53bc25d7e057419d8a513ea4521c1ffb9c37f9331ca50e6a3e5a55498746235073e4600533fc231fc5b118a8f4f5172f65bfe85209bd29c7a080000007e1011b01d1b27f210582b3f00c963d452f0cb38754d5dd14f23a9df474801d1404e20bd2fa6eedc46df4441fc79622d9cac44665d3201e0ffbb23ef67fb3a768d9fe4b2a8aeb7dadd2beb1d15f8009a06bc58809939892667e9b61319c072e401000000590b2c463ca1aeafe07cd2e0fb1a7d8980eca1be4ed38caef24d4c57a179b32e408a247b3fb664d1b427dcbb9d757d2565c05224a0f47072a41cf1c0fd49462877ad5eb3cd8a5fa0a6fb3941b9b4d457d34c794cdcf9748ca2d7997487db4504090000007bddebf326152acdae954ee7717be2dde04389e61a98b280f0847fab5c4f722240dd5c4136499761ce7f588185bd90f3de779901ee8c64f58c419042caab117e0e2653d8d0f80f4c401b1523f5d0b4acc1152271166cb9bed6d1213298883e61060000005fff41fc367e5e4d6cc5abcb087ba1f6b4efb844fdc1db5516b20af7e1a9cbe5402dc1e99a695f0c29d3108664df29a685916c38bc03fe545d783a5fc772ce015c197f246013ac7b45ef411fe2d27cdda3d1b60e564044a3a0da131e7787b8640e000000525bd7c23bc0fe2a2ed391a32bfba0ba1ff24fd61d688d6a16a65bf1feacb3964037a8ecc8dffcec29e77d47dba87122e183b3d7e7a69af6a70527207f8b8ac544df297c4fac657cf59dc6b3b8c51b68fb11ee615adce5a2f044136f74cfaed90a000000515e36e0ee112c9735cc7d140de55e6742fbb375997bd9cdbcdece54ff42790840cb54eec38f0b0416603c43239e249e942714ac25e14b668df1ef0ad17afa0f16d4d2eebf289a3c7ac5516113c7f0d05c1063ac033e69b9ca9bf6b79ade33c608000000087d2bdcac54b839ce6616c93f5b337c2fec0bb85eead78c4ab5360d8eb3975c40d5da6895b6d059f0189a8a1a199b1b91257e027181366e341c4e772df7ff6bdea5075e332daba111c13d32d67ef28bd3ab28477ecaf4b8efeb38037e1fe34b0b0000005b662b3fb00e55a9394e67b50513e42f0e449c31a4aef0bc671f06d9ca39ac5b40f9e9bad07972fe07b9ca53a90ed9a3415939caab8b9168d735bca4501830bf6270b25e59ae6b6c1290e65ea578e33c509c0b043648087bfb60c5561c19e2d10b0000005633fda0e7f082608feb87156a2fd05fa1b8eef994185eb6cf9323258f4af06e40e510381608aa168654cbf180d20eb88e23c8499ed19bf37d6d878a07ea100ec278c64d51f5df331b1b85cda196a6314f829a370a28e4c734e181e49cc4226c00000000d8fc9247357a154f3f89d78faa4cf988dbade4bb559e8d05692a78079569162d403c9daee3899557108fc6e6c8846c751189ace970044901d8ff6eb6a9c67e0a2baf41ff5172274ae753b0d09be6ad24592a746b84b2d09190960f95b4fc6e870e000000ab2a337a941cb96fd0d9b81f2fea4ccd71536b7cd56bf1db4adec20e1d92c0ad400f907bd85428bc1c61e1061f2d350e427c300294da7135141c3cddd91bb04e15995aa92ef5bc954c36e1d3eea0e25e0921179bb92dce4b122eafef890cc4a700000000159a0bc3d3c143eb219771e5df48d29b9ebc37caf16d112b015ce6a79002756e407e092d276c2540bdd2c73b9608571a912e40198bab961c06a664e4a658f7fd117157b876cc5e39bc1cac0cc30037c09670dcf0cfd3266f23e12a331973f43d0d000000c3438b232b2c86d4b40eec0f72e2b51f94c333e4005ae17894624c5b00f6243f407bc9b024c811e80d8aec077cf3cb02c904afbb8a71dacc8603f51f836d74aeab89aff8ac22766926c6b9051dffcb2c83be4e7c23eec4187644c2636b4aeaa40f000000ea2be26af3733573d5e615770e004bf96acc8c1ee092406091c0a35f9ec8a8b1403b78769aa44c8a943f472aa2f5382029a23978cf8d78dad20b5c672120e8956813c95340fe5ed1818ccff388b1584cf540273cae32095bc41221aa1afd60a309000000e497ab7c1d161c4ea157fc6f1f7f00c7db8e2604554b12ab00cea0852bfa398140df5c55bd4677d837835dfbf3eb25dab0f42a71c15bc6f291b2c3177152c43a5aad417fea45659def9985473660d3f56a3e9d43956eeb463d6c3423c54ace1c0600000085a56a40b4f978702fb53d30be73dd23d9fd317ed0c9f6aea2c98157088219854061d089f028d4c63d7ba76ad0137e00d4fd57bff9eaf928aacfa8eb91d63bb75a36d2eaf6b54cd71ad52b165eac1464146f9dbdaf0f0c469abd2c7f593d92d90f000000d9673cd0de4742543b9709af2e0d6d0ce13fc37974afa668f276f63d404ad09e4012050ffd46da89be9265a41ff53d84c6cdc6b6fb84b6993c785878049724a7690b43b8fc0d8a75a516cfc6f71d6530992ed4b8c7016eee3d432827631d2791090000009a60c3eda9b57c27a1d3cf4b73367372c695f87395d67a7ef4aca4f57d8ab6cd402addff701ee55b9201ae1dcdb8284f729cd1ec4c88f06c8fdee1e3b71501604693fba4b4ad210471832e8835c4968118bda8be6c47c38fdd89ce502ef455cc05000000b95f647ca7a9ce90291fc759e62c5737ffbed817a0384bd3a00f6dc22912991940e8533346605d6e2c832ec2164a9b9782d05917929bcfc72e4c1e27d974a17df0ea147bcd42f7dc8a7a3c4e2c795879abc6f178d3bfc0fbbd548eca34091a420a000000ceddfcc0f7d1ed89c49b269706b4a3b616752fec806d4686d5511d2c4f50f8a340414579a7c9dfba06aba8099e908aefd699bdd8ae4fa7b2eb6dc9aa5acf8befe1099858c96c066604e0e3357dd74dff0fdd9078cb689ff7a17108365ed42cc30500000050006c881eb0bf412324439a36b8c65820ac6b8a4df3320599ec9995f94e2e38409ad12147cdb26216210b86c5897107f4075831391ae5ad7877a1f8a885d5c98b376a43a66474270f42a9c87cbcf5513e468e007e92a6afabb722b384bb2f4d0e0000001cce0f52b5757299ffffffff0000000000000080288e910169711bcf20c2df5accb81d0852c8ae264aa907895a2a09d4a68614fb7b879564966c2d0269acbdfd68f67cc4b8699a5d7ab21d4c7cf42bea08398e6c97aafefeffffffff00000000000000801b9791017247ffacc4a7364235fa0dd765c1e097b9013944f903fc932d1184d2ec1c0a222258f58864a910183d0192e3072e44f99234387c1f12b63b599247b5de9bc470fe530100b5ee9c7201020701000147000946037247ffacc4a7364235fa0dd765c1e097b9013944f903fc932d1184d2ec1c0a22001901241011ef55aaffffff110203040501a09bc7a9870000000006010191971b0000000100ffffffff000000000000000063b5fa1600001f1de8c9020000001f1de8c90204acc0ff470005f98a0191971901918e28c400000003000000000000002e0628480101c4a9b35152d8c0c28ceace9b88e06c83d2d36f35dcc15f6edd69410a93c67be10003284801015b7306c0faf426a524a79741a4b9985e8e0bb3084b731dd8b8bff4462d3f08be00182848010159f15331ddea37d0cfe9394aaa1bea6e47de45f33b028ac2e0259ed6b199d44b0012009800001f1de8aa7d840191971a514dc9cc928172df41427a94ea30f7c218939047e9e9da9da0ee545504222ced0df5309b4c058e1e2d7029e8369c0faa24dc743e78dccac5b88b327529a6818600fe985200b5ee9c72020201f1000100005288000009460369711bcf20c2df5accb81d0852c8ae264aa907895a2a09d4a68614fb7b87956400210001241011ef55aaffffff11000200030004000501a09bc7a98700000000060101918e280000000100ffffffff000000000000000063b5da1500001f1d55fa9c4000001f1d55fa9c472771f9050005f96801918e2501914e59c400000003000000000000002e00062848010106c813eeb237ec2b48b28b0e5afb35c5aab00705c3d0fea98b6b433ee4b7509e000328480101a92f1576be77b52d637e133b3333ee5addd05ba71e6ed27e59276bed53e1abb3002024894a33f6fd03afaef9a6e06149bb59124954365c5115cc0b6440f694442a6fd931e0b5e0e28c8a88348b63cf29c547db7708eddcf2a9e2f1f05c34c37cb16e9fbab7c19de4c0000700080009000a009800001f1d55eb5a0401918e2723728a0eba9a5af32d0045cbbcc3e62ca274338a1bb3833c4983c1199c4d05560b8372336189205ab18a1e55fd869537ad23c2b3bec33a1fbfd7e22e136b688928480101638d289462d57151ca1940764a4947b671c95db273f4c6202e0c78f9df8b57c50010284801017c9d7b65a394f9892638e5a565ebbc8be785fd05f0fafaa0e3314a33d5feb156001028480101fa44659b9dcb1103e5d6a21de85d8e205135299f48750d414ca5eeab490bd76f00132457cca5e879a59baa43b9aca002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac000b000c000d000e28480101854c4a9684eaefc7cc9b645630f08a59bdc7b7a8f0eb5731c7511bf64956d9430002003fb000000000400000000000000021e6966ea90ee6b2800879a59baa43b9aca004210150000f22012000100011284801011d84166ef88d7a8278564046c5c40a5596a9863813fd6b9e91509dc3fc1e9c7600032202d8001200132848010124d21cf7ae96b1c55a1230e823db0317ce24ec33e3bf2585c79605684304faf200072201200014001528480101fd78695ffd58402e209cb0b060c95b1a8a83dae389c7eac9554a3c086e52b898000722012000160017220162002100222848010114265b804cdb772e1c9a48d1dd67ad6e9315495151d6f49bf5f203b2b883ae7c000c2201200018001928480101ff9fb607464434b8240b30817c4e6c358ad723c3ddeed45b2b82d45b9fb0f6210004220120001a001b2848010135495972e4dffc56ffc325d2abeaa6db04e07d832cc8b8847ae195158fd724d20002220120001c001d220120001e001f28480101ab446ae5250a0e5acbf42540f12f69bc49e22d74782881442954471a01c67d6c0005010120002028480101e1e66c22df500de6499c055de17ff3d1216fe5f15247186dde0708e01c52526300010024c201000000fa000000fa000003e800000017220120002300242848010119e2e39653b8c29c2934e5ebd76d25c42fc0971336746d9b566111bdeffcd365000a28480101a29c4ffee5f88175f94aa05c38149626d3eb05723f7ebdf62f022c9717622d96000a0101480025012b1263b4fa1363b5fa1300e600640fffffffffffff87c000260202c8002700280201200029002a020120002f0030020120002b002c020120002d002e020120003f0040020120007d007e02012000bb00bc02012000f900fa0201200031003202012000330034020120013701380201200175017602012001b301b40201620035003602012000370038020148003d003e0201200039003a020120003b003c009b1ce3a049e2999000f2d8ad62f9964018734f6d0258c5b85b88c95fed7aa2558fa1f1c2946740025f3dc46b810f8ce67a68d27ba3c67fe1590ab9df0a8837b33e5873aec114dc432e30a986bfe8a0009b1ce3a049e2ba6b54ce1a0af0f680d7669f7ceb4c54c1023da9c0235551e5aa096b0f919c2ec00255459e2d25d3bc107ef3afcbeb159ee00deb0da381cf8eaf7ee3c54258ecb9fe354cfb3d9f8d20009b1ce3a049e28629ce122b89f2c7e2aa2642f171c9d77fc591439e32671e5082cf7739be6f7e400247f019ae80976183e3467b8107ade8d739831136c871851b1714017416f7471676f8f45bad8920009b1ce3a049e2ae6bb8ae7f3e2efc44e4635055369b95e04a7b8d51d09e31e443da13c7b10307c0022df66662345d17eec3f9b0e8ec4f7252197b59249072ed20a89cb36c7864d28212ee858d6ed9a0009b1ce3a049e2a15df9572666acc4c8cad446204d56b8a361667893c3fd82917882ae2ff608bc00022beed892488e86d31d2170d3bb67765785fe00cab6380beb648993790c6b62f6d6f9aa8653d660009b1ce3a049e2a9931fd1d2c91aeaac08f55d1ef78916758a8635f3cbee07bacbbc19862c064a80022284589b8a4d65fe10377345d60992f0c173a8ee2383d821c494cc3c9c95f069d8b51855d473e002012000410042020120005f0060020120004300440201200051005202012000450046020120004b004c020120004700480201200049004a009b1ce3a049e288ae47bf96cea4a4e778054418ca40bd530383446ca02f438ce661371368c7c70006678d09d29ee83ba04c54d49d0c2a248697f32eaba92097fd5d726fa4e91f749e61f55e1b37d460009b1ce3a049e2ba38088514324df3b7f11c33ce1d4f13ba866b528b1aee850c701d7aa185fcf98006678d09d29ee8318e28452aad9bd641f98e55d7744039595724c1ae5286a6a26ac2917414715c20009b1ce3a049e2b9c354c86a19f9de3b51b199a1d6b5d9486874c0d226375e46a8a261d57566aac006678d09d29ee805e0cfa335d13c8bdc2cb6c84c534419d6a4a0d1d2427f5f7c6b3d52e5377ffae0009b1ce3a049e2a3558f0f6f045046506aaba247496e32d2bea496d2422a8dbcefc9060d0052e68006678d09d29ee83e141a8cd5031943574478d98f63ac3454492ad47adb30c1b3531c8cc349a7ad20020120004d004e020120004f0050009b1ce3a049e2a58d2ec0e69a6e8246efa0da105e0a8cb567bc18587cef5f08334f7528e6bb300006678d09d29ee80a73ab24af4170e8a646f6faf62520a9e70ae02f66a8faa8d739ef087bfc7e5ea0009b1ce3a049e29163fe7a7bd23566f1dd25bc25b0c501aa94c49a29d06a4e5ae72b702ac152a64006678d09d29ee8027b0096de4bc955d34d0aec0615701d8a028e921f17a53bb9348a002f13d86fe0009b1ce3a049e2985930f49133df09d6ff595b752dd7dece846d1adac28305eb021501a93a3c60c006678d09d29ee80dcdb94b5329e0ff38fb4327c57407542d0bcf751c201644c0ec7eb9dfc76c84a0009b1ce3a049e29f72bbe6eea4efeb35bd72a1cd3217ef2b296c822e465b9a6b9b80f0264fcc658006678d09d29ee808491234782701a48ea4a5a886cf15f978781699d77e4c3f6bf2ea201b3ebab5a0020120005300540201200059005a0201200055005602012000570058009b1ce3a049e2be599849ad9e19369c214ce692fa2ba58efbbb06a396d5207a1956951d29d4898006678d09d29ee8278b4f2d833b5dfc6c48d222ade39fa4a96bc874e62b16ade02c50ac553929e920009b1ce3a049e2a1fc9ef0236deda1aa0030f90dfd79a4063767323a1374940cce1c3761b4da700006678d09d29ee824ccb3c8c877acf99513bd653d35def60e18fae62414b0b3be77073c36abc72760009b1ce3a049e281116b78fcfe379f79268e33041085fb68c252b5e07c7ceb9f62f1e87b6434a8c006678d09d29ee818a899164b1822d2e39dac978d93383eb78d0354004ae047083bd1275fa5323b60009b1ce3a049e2af0d60920ab57004ce466f0a78976dfb17ca6811762b4cc1582b09a56996a80b0006678d09d29ee82354621106c08ebc3e44c338088f0c135efbbc18605d7ddfab414ab0b88c4806e0020120005b005c020120005d005e009b1ce3a049e29919dd3b82267c08e77b6e39b52aebe54577ab4a03980449f24c50b0cb176c1fc006678d09d29ee80bbd302453127d952ee1de2b6eb1b4d3effa98ee8a6a66d2d1cf34f60a8adf4ee0009b1ce3a049e2ae0564b2c4dbaaf1d6d90d22d5074235989de78bf31fec34df5c957f5137f1a8c006647e6ffd01176648a634deee5132ed07cc454c7e774e25efa5b427d89aa80656253524aa9f8de0009b1ce3a049e2a3a1a4c16f462e07799f4bdf94b9e3c60849afad13ade0c9b1ee8fa98e2a71b7400657c3e7ba94e3034c8f378c65a7a2f837c86a9c061d6afb43bb893755048ae64876e99d2b0c2da0009b1ce3a049e2919489654602b59db14ef2d83abe85f3ce9314bfcdae30a5059a709ce05ae770c00655a0eb198e9e118743ced0ce2f84909844c1b90f000a3ec96c66896d5a2ef71c3cfab5f2125fa002012000610062020120006f0070020120006300640201200069006a0201200065006602012000670068009b1ce3a049e29849096d9acb87c825f9e47a9dfc3621c3fceaab91c25940642be3fb5c3b196700065571d6834329653e530f138dc23034ab3a93aa105beba7f3adfc8fac6756c6a41d3b17ec8c0520009b1ce3a049e2bdeb22797df33efdf69ad5134a754a07f13a91e6134dd8c801597403fb5d0a09800651c38712a8d5a88373683b06a1fcb1f2e01f2e650b9cd6f64e5df8e5826b646f4a4e8028df2ce0009b1ce3a049e2b04bda008462216e4d3ce02225317486e94776ca439e03f83c0dcd61fabed464000649bd9651cba62a8515f6674aabf8a62957c6ae2a152b3503cb3fe2e55597c82b36b99373df36a0009b1ce3a049e2aa40d4090256bf3345fada49cb8d06fa8c5710a3521b762c4c3cf4e8f19b75d0400647b01d37e47947a104cc175cff079e7ddc767de7c18945406ae521e14ab5093ddc4ed618175e20020120006b006c020120006d006e009b1ce3a049e2a322a20d22d8f3ca7151f6ddc23b773caa78bc7c170d30df2c5ba7eeadf06779000645d39b2559ad8116118ca6141513385bce13e34d6854fac170cba9d216efc5f71c1423d3ca8e60009b1ce3a049e297a583dc8fb062c03c202c6b4c844c1548d0c89ed3ea6cff1932fb36ad926656800645d1abb6774f2427283ea0bd92891d48b32f4464f1489fae9684ef47e15bc33d865089bc8da720009b1ce3a049e29cf22d6b0792b6cd873f1e3abb0aaa2cb30e450200fa9e6290cbd083a642eba6000645ceaf8533a1258127502a6c4d42b201970a44a30069fa999390d4df8425368c992461161f4760009b1ce3a049e2874d6e57bf970b02b26da0ea585f9df810146aa694589a640463b74a3352b16e000645952e20267a1ffa7efe55a1b9a55e20d9a0d5b34ddda9cc8fb15cd3810480f41b5fabcb599a2002012000710072020120007700780201200073007402012000750076009b1ce3a049e2bed3620980f89ceaadd971dd5b95a9f0f7fed0855949fccd455806aa5e151cd74006448a2f9667ba6325a469419b77eb341c7cb49b14545c1ee06df4301a0ac566bdda425e82e883a0009b1ce3a049e29cf21cfb2bc19f8d2ac850198d14d94dabfea365708a9cd88efaf00353c6bccd800644864523652dc83b4199504264abb17d1db2b27514b626c70d308431230755e346d1aa0a902220009b1ce3a049e2a3cfbfc5369787bf65b3dddd08bb0378c8eec576baa623236830d9af1eb835f2c00644546691fb36ab820f19876b593dcd332fd692fb7ce62f133d69afd1538ddaed2d10df2ed32720009b1ce3a049e2aa37d09ffba6ea7bb86abd19efbf3f6b1b491b7fb1f067c1631b1da608f626bd4006444febbcdc40752accf8f07d56050efd8fb3e0ac9ada86b58d4526bf3694237f3d4f77bd27a8600201200079007a020120007b007c009b1ce3a049e293a960403bfc2caa79d5aeb0531448a5e73203e5505a8a0b350e1da1c12e3eea800643ea747b6f8d34a6303ed5565e9878c5b727902d93cdac1a9c9c3531c56a42db05aaabb7a25220009b1ce3a049e2928388030db6f9334dd2d63705ac9869e9f4171fe5755a0785c3b84189e4ce4900063dcfd413cb437c27cd80b3fd0e46b373e778d9de40a15bdd34327d709724c56d12e679830b3c60009b1ce3a049e2b124e4fc45ed7926bdf9abdbe374d896ff0e69574ce5e81308229603e8f213dd000627becc5327021ee4b71ea37c53a39d78c22a7d5444337bcab1ea092bffc9f7bb7550d0fa929fe0009b1ce3a049e288ef6b9053395a4979f6348965f0610730a08acd6a1c517f320fbe7235ec19e88006100f321218c407d38e728dd85d6c10021deded0962c65c77f742201cf5e27d2382e3cd525f31a0020120007f0080020120009d009e02012000810082020120008f0090020120008300840201200089008a0201200085008602012000870088009b1ce3a049e2869ccd0e05360eb2d08c11b745c8c41851ae431f2fffa821a95b01fc83df71bdc0060573a1f19623418dfd4152ff370f50ab0a7de08ede0cd56d266a28868d87b6099a40a45353c6e0009b1ce3a049e2b70d35f39cf529b50980ba7c492cadcbca7b94bf36466b62758cffde0b8343d240060029678269027c8f78839e5db3ad4221bd66f6d6180cf1184d5d96583bf2ed103649493e116820009b1ce3a049e2bee1da091042da9e13447bcd7c726bf151858e8ce0590bedd99d9ec528f728168005ff026490fb16f14cb33c7d6fe094c752529ee15ce9a43482d7e9cf6f76583ef338760706c84e20009b1ce3a049e28571f3f3b31820dccbbcb4acbcd66a2b4b8ac61ade9e88d9f8460f9a2f748920c005fd71fab588d41d6c2dc87c6cfb33d88ffd3b1f2f220f90092ee20f25a0cf94490b56b50cfee220020120008b008c020120008d008e009b1ce3a049e29aeb96fe5ab9d1eb38cc7e50c1af91bfff4458ffd9263b31c82a5d0b13989351c005fd5a99d3f68c27ecc28b733ac93e707cf11ab01189010d43e05211703894bac9a0f9f6b7e9d9e0009b1ce3a049e2be2b1f27568718bb05293e66ddeb79d331dd0e02d009b9809cd0d5639f99dbc24005fd4acdcf1d34a4b8c2ebccf36bbbb976ebbcbeb7953d5946c815783d21c88131d32e40692dd220009b1ce3a049e296975481ea6bdf05eea97f543eca93b9d82b13c880e49aa8eee6d50fa2d98cf64005fd3bf41450d11a3325d669b08511eda154caf8e2a894674119b58682a68c27e24f20ccdeb07660009b1ce3a049e2ac06ecf0ba0fb91de0584de7084afc22e1012e9f0b2bdc30f81216cd439058ad4005fcae53f6f81f27a33cc15c7eb18478d558617106c49971e53fb44cefdcfd01def54676324c8aa002012000910092020120009700980201200093009402012000950096009b1ce3a049e2a1b3faf521e9aa85e1acf3f1d09fa0acfcb40373f9dc9e2483246ff7290065298005fc807240cf7b307c0bf6f11a135ee1c6c851d45a7348cb431f9172132ee32466b138b1525fa660009b1ce3a049e28f6c4ce3864a3134a9111b3860d9168f1cb472ba738dd92964b5f9745debeb06c005fba0a78680d053fc4158940c46108797153c2e535b84c6d4fdf70f945f866d2bb19774a38d57e0009b1ce3a049e2b7a9a1d3bd961c604305cdc71691c6929dd72d888a75f382052100803cbdc9144005dd0959249a66eb0650a4773c4cb96e0d7674437b0084f8dbcdde8a5a06da4f55381027ee840760009b1ce3a049e2a44d913618c309fce36ebc3c9572be02543d5d71e397e407266e6312e77c51888005dc48d87e6d7a4df8da74fd965e4d1bb896131555669d612c644f8e8e2d51b91521ccc12a575d200201200099009a020120009b009c009b1ce3a049e2b0e5f35a961248d84fca92fb05d109986d4d7846e18c03839b0d9536e85fb75a0005d8ddf25f5153b58225a84ba60e141b1a49f40e964bf444a9135d940fab32e8a3cc9ae2836eb7a0009b1ce3a049e29d68ca103ad9488e651e5528eb6f6578639b351186f081de2b685353e18dca1f8005d2e9e1fcd77784c02af186d0d951f649d9091d98f7646afa8e1336f3c97523262947a2f7f66260009b1ce3a049e2979feec802862bdffaa3e6348bc9db013222165868f464b6d4a520e62d7a63d04005d1e24e321888acb7250bf2fc6c9bc6f91dfb5151f1354900de181ddc4e471069af8c40c7d2c3a0009b1ce3a049e28b559b017dd10b399e9106d81354f033f95e1d668c248ab85bd9442d29931e454005cf91846e925576b90d0b43e4f4e2004fa75686da2228a063f2c36015dae01b3aba01233956c960020120009f00a002012000ad00ae02012000a100a202012000a700a802012000a300a402012000a500a6009b1ce3a049e2b4a7aca34f7904133b46ef591e0878ce15205428b7f4aa5ca9490c80f2d96bfd4005b7eafec0fe35ff95778029be79b4a96dfd0a7896c2f1b2303e461971d9ebea30943f4cbcbe40a0009b1ce3a049e2bba7c40e907bdff3abce4d3c545b7e1f7588aeef08e6065c6597ee66bb0b8c810005b6f47818172e2778e76b5162b3acd0d538d0ce14f1f870abc0d7b4516106d364582e1e4bb31060009b1ce3a049e2b7dd93ebb8dfe1706087cc6595b14235816221a288f00a009304ae8c9fa6ab574005b356a731531a396ff9b8ad8c438eafc451fd474a77e974b1bfa3e3a53a5d549c84f365471a24e0009b1ce3a049e2bd8e25412106e425ffa94db03282b459fce5d76c96e9303ed13bf79da9e2579dc005b354ef076384cb2b2f620d8add53a175a14d651ce70897b905fa513c6c747fd62077c0ac132ae002012000a900aa02012000ab00ac009b1ce3a049e28dd48e52926a857eee1275f59b7e46e98339ac452c3b07dd4518d8363a08efe8c005b2a8face4a93d9867e1d8c71f6175a5ea27ba5cfc9e1d27e6234e65fd7306a363e0a1de3c51120009b1ce3a049e2a9d92ef23710ef45f308c8e20d1cda96632452b0e15287edfc7189a8a9d24fb54005ab6d8e2eab666b045d350f2fc365eba43228e9c2f627dcd81169daab5f647006d9446a31d92760009b1ce3a049e2b82293952b11ee9bf7e296a597af7b06920a82e3d4d24057b9ba0b42f8796113400599d126cb620eac0b948f616efdbdce362a389bdc2ff7c1596075ae4b69a6092b2a7535ff8c2360009b1ce3a049e282e05fe5036e17e225e8c78c524e8b8d635abd4fe8581412f264d838464a315540058d99db61dc74b6802d2ba64eec84cad5b03ab06554b3f0e1e57ac20967e14ebc37106f31153ae002012000af00b002012000b500b602012000b100b202012000b300b4009b1ce3a049e284b1264f3395ac0bf02b19428949af0360ca57539985b41f673f1186c39a47e7800589be802a137628cfae9a113091b84c87afe09d9300d3b4a590b6e84e8bbfa27c08ca0ddebb6720009b1ce3a049e2a6920dddc0cc4b852687df14eb21e1bbcc2ec1d67844abdea411962bb0787527c005737bfe4fdf42b2b91def8b3e3c77a66db288991637f705e981aef30a18455d634d26513930cce0009b1ce3a049e28b828b77be922ad4e9e170666daa39a649a5f6dab798de235a151bc087db76a94005721fc6a625195cedd6eb17b65e5f17f4dc0adaa102c83f8c64aa3000dc42d836bff6ded8e1a160009b1ce3a049e287fb2dd43285d4cbd304840773e06c2c46cbee53ac3cb7a2e3a35ccfe8ebcb8700055df3964a2c43fd80efb75ceadab7558f7439deef102082c17590bbf61765112f2e10f9a417e96002012000b700b802012000b900ba009b1ce3a049e284044576ac1016cc26fe758ec7144a8e776998e9d61680f0a3fe0148c2f727fb0005502de2b3af6293cb7269341296477bfe73faa48d3b782a9d242932658b1fbc0dd9da4dd8eaf6a0009b1ce3a049e29b1f80da9fd0d0ebc087d324e35bc0ea61c6e94bcec5d13ecb9aca63f9973037400538e7b67cca9fa9fe01ee4c98aa31c42d62389794ddae1692e08d60154e0b6a8674d7a46cfd6160009b1ce3a049e2901496b3dbe28e3e61c9c90226bd436719125d8d8c75850d65d6d0d801d5ce9f0005315f2062c0f3106a492cb59bef4c9ab52def25e140442bbe9f26e63e71ae787a9a7fbfa1aa8860009b1ce3a049e2baffb4a3a58f740ac37d0d207929b3d55384c0c9e5f0232df0696f6158ca6ae6c0052ccd5e0ea6f82517e02c8ac346b58789397d3a6037f74656cd72e1ec4b6567992d58e07d98d9a002012000bd00be02012000db00dc02012000bf00c002012000cd00ce02012000c100c202012000c700c802012000c300c402012000c500c6009b1ce3a049e2a4ed227ac260b5c52e613a17936c1a0caa3d1a2d35f49457b9def02f44af57e3c00527e298faa4134a9cd2bf686dbe7ba6d440aaaf67f9be34e0b3d990749e7e700949d420578a8a60009b1ce3a049e2a05a346cd9be6511e966065190ff9ff0705ec58b395c845669e6048e13c740fb800527c4fd761d805559766f814cee12945ec3c4a16cd5fe28b8aa917aabc059569c0591e5ab8eee60009b1ce3a049e2ab232ad41a106390ca860386b4fc111d1553bd6320103b98972009b34ee8b95f800523edee46412d7af9675e686c90fe2a02290d434d32e987beb21ecda88dc46dbbec0f2537f5e0e0009b1ce3a049e2a60158826f10016d613f88ed19243cda761bdfbabbdd986c1779cea4e387c4db8005153bb921f2ded2e07107e20b6685a7c898dec3007a9785808ed41d747c0d75078d63b7c76d0e6002012000c900ca02012000cb00cc009b1ce3a049e28899c3dc197f05b522489c96393df69fc544f97dd367ee1fe428d12193a95fdb8005153bb921f2dec51e74a504d562876807e239c6cb607461d858c47336791a1bbfa84f3964353960009b1ce3a049e29ff264eade32402636531c2df4a311fa959ba922fd07dd95b5c88dcae22fee1c0005153bb921f2dee158086f70a6e1366c4ddf33f82641fe760fed5c84a92fe68da8a3967be66b7760009b1ce3a049e29cea8aea101124e92d056cbfb3c92bc510c1c611a55a51c5f54dd5b4e69c11b38005153bb921f2dee2a10b37bcb1ec1baed930bf99ce1842d6380c306b80fcb5ff2971f5fbaf3cd3e0009b1ce3a049e29cb7b7c318a6fb38e2dca7f16aa6c73ebdad1ee0f1059fd552fb431305e347470005153bb921f2dec940fa67fc37c020ba8a5ce7e7a9e40073034f2005e95432538a8f9d72a496b0e002012000cf00d002012000d500d602012000d100d202012000d300d4009b1ce3a049e29885aa1e7e7229ba5908d8eb491226b8f50f9c4d09f49994a456b7c3c0be818d0005153bb921f2ded8ada53fbe1b8204016a111b642c5c10b6efb15a9157ee01f73d1fc76ce6f42b20009b1ce3a049e2bf8054133dedfa28b40fbdfbb9ad70f7af42e5bada9dfb5432310861a168c818c005153bb921f2deeb823314e26d653a3dce059977a0c83c970a98befcf5e75c937aa9db29d67feaa0009b1ce3a049e28bf7f144013fe213b54901288037e804b1c598f72cb960dea6202cf2abc6eeba0005153bb921f2def0e08c7ddf1bfc3c18fc59d5a8c49b262d4a98de685d888117d87e80e3688c12e0009b1ce3a049e2a43c3b40005a64a7495fcfb95e26c9cae6d343fb7eb64366ae1b5d35d6f954ecc005153bb921f2dec9b866bb0a015a1b9cb4a04259e75c2854e14017f653f3e42e34e3e2f87ebeb1e002012000d700d802012000d900da009b1ce3a049e2848bac7a36240d7654bc849644a521f4d3251c01371804c547baf483bd8a63b68005153bb921f2dec264b4a58989a560db1e2b784ec64a2cd7f1e31f707785189844a455aa2f019da0009b1ce3a049e29619c3a0211c435cb3372041f92bd9d1fc2396a5eb85385a8137daac89ac1b1a0005153bb921f2dec200da27d131557afb6ca1c7542ed43c867320507d68f6595dd01e0bb32c471ae0009b1ce3a049e285541662f1ba98fa8cffd42c8ea5cd92747729531359b9d17ec303d04de8b2714005153bb921f2dee22d3e8b9e0208c7324c00eaf69b7ea62df5ba4fa59714f465dee6a87953d8c420009b1ce3a049e2a3e0d5a8472c6767b413381c7779bb2bec6cf59406655568ecdd96cea3b1d71d0005153bb921f2deffec45c828ddfd9fc9b3f6fcc0b358d37753667ccb44a8a5af094e0c9c6ec3606002012000dd00de02012000eb00ec02012000df00e002012000e500e602012000e100e202012000e300e4009b1ce3a049e289134584d68ecb12893f5a4746e37d02bf34fe51fcfc771cb58c4d682296a112c005153bb921f2deebc819c25d36ea49ec9b99cfdd3cfaf91d642ba9dc94ff8273ef4a7b4fd1690220009b1ce3a049e29ea734c6345619e55dc24a1a67adaa04e215caa4705970774f03f1b90ee5835b0005153bb921f2decc9ba8487cda2ccc88d92c89a7c1459c7585459e44f942bb38fcf192199fbfba20009b1ce3a049e28f76582fb32aa2846fa04289b92ad6f68e126a8eb59ea82123e54e0b4f8dfd4d0005153bb921f2ded6680c6a2a94f3515ee812cc8865a8cfb40ae24128c0f68230d7f03c9055c1dae0009b1ce3a049e28f68ccc369de018eb91c2b04145dd990467ea50a53d647f1c07c9b548fe9949e8005153bb921f2dec82336dc9226ff3651616ad7d83224c1c7bfdfc647001283ccfeabb8a38e52612002012000e700e802012000e900ea009b1ce3a049e2bc5bea91dd3cd8c9c23d218325fdc3f6934676807cf6dc1eeccc382a2d8dd6418005153bb921f2decc9c22d344f11ca4eb99dd0fbb543fc11dfb1e86e3206669bb76df787e1f02bbe0009b1ce3a049e2bd68838001a3f9cb1e02ca797e488eab7af7cecafc1370983275ebb8091f509e0005153bb921f2dedba3eccda1a1a67603cc4de6a8b3de4f6f42c68b481bb25667ad0f2a4882697e20009b1ce3a049e288247213551c11218607b814cafba83a92fd1c78c4d5662a309500a843164b45c005153bb921f2def32f2c478c701e91245aa3d88dd55817e44c73d0c42da9f2e84161d79c27c223a0009b1ce3a049e285b568e42e2c88b6a392363f78520711924d0d30660d42b2b18e2b49fffad69e80050fe0153cf39af6f9bd85d5b0016f6d5dfa99d23eb5ac4b1575af05db1dedd6a9a39f171313fc6002012000ed00ee02012000f300f402012000ef00f002012000f100f2009b1ce3a049e2ae8a45354e0169a873b3cd922bc033eb91cc0a918ee55bdd8ca64f33e5dc768000050ba8516522092dcc150c16fe0897241e80f4413339d2e0415efaa02a2c352173263a0a0b3e2760009b1ce3a049e2b8ac419cc18c44129eaf8a209bde54092205782880108d9058c1bcc47ff66a0700050a7f49041964e0d011e830eeaf39b99ed78f7c7e91e0914678ca4a7c6edec4be7ab6a18ffaea20009b1ce3a049e2bd0389d58bb091d306cd7751371e6763be567c5cd6078b70f1fbee459302a1704005043ff7f08e7e6e4e016f51815d3338ab8c29e0bd03890feab9e861f0fcb68ed8353d02b6b02460009b1ce3a049e2927a142e27e57fd1953229b4fb3f9d7c292bce2a35e3bcbe795158953d62aecec00503b09d64c3267909342cba491b08507f8a25ba54c409ba6d10cf7b9cb58a3eaf5e464fd7bfe5e002012000f500f602012000f700f8009b1ce3a049e29530db2f5ab2a00e9fdfed87d70e411004e9ba055f40aa2118697ab40cf846ad400503b09d64c324460dd58645d6b8d97fe4ba07286e084488fabb602c0872b5e57c6705ed9de64020009b1ce3a049e28ea5529ccf45ec775509521a7616fe2315e3c83e6d03212360c51ea2f16053d9800503b09d64b19601bed0b68ff4bf4108f22687b94f94b3a45c56a98c5a293986b062a2c72c4da460009b1ce3a049e28954a6d052843654f11b3902b39d1320c890eb91111cef9cf2459fdbe3fd6c9d800503b09d6487bacbf783a061684fbe1608e701ea2c6f13371cf276862016b349ebc1150977c05360009b1ce3a049e28f3150e30d025d5c34050b013bec00c86a6de0e7511ffbcd72c17b3149a29019800503b09d52acb628ea011dc72f54b87e8b43c94a59c6d499c19394fa56f6d0df127a393d11b77da002012000fb00fc0201200119011a02012000fd00fe020120010b010c02012000ff0100020120010501060201200101010202012001030104009b1ce3a049e2849c38fc7c4d721cf29193b0731fbe0e5d5aad9c0c68ecfb4d4c7a01353c5dc38005001d9cb868a0024f830979f1ba394187d506e3dd3568fed7c2f320e5760c540b5393b590983f20009b1ce3a049e294ef23f9508e9fd0a62cc0d65493bdf00f35282e5c063d7759d8377f03b1e2080005000a15f3dbe6023fef9cf49149b2e2a3fd7dec7dda3a1f0d120cdd262f6ced9b72be999785cb60009b1ce3a049e292cbd3c412d39a8a2808ba6ff8551f18e097efb4a79267a1ce428935484b4ab38004ee1c7d82d2b446095072f6eb127007e98b0c2c855151bac6b94c20700df1f544969a2a7f853460009b1ce3a049e2b9e442be15acd0024ce265a90b11694616b428efe18b09098887a36afe828bf78004e74b25825716fce1db1c705c494511a33bffd387a79d10f195d0ba82653325f88a7d52b8ee7260020120010701080201200109010a009b1ce3a049e2969890670619f6d5df374f4e69f452185efbfb81e0ce2d57aa1ecb068d5845d44004e2ef80297eb0cfd203e334de61abfcf85b23a17c6f87853d99aa68eec646047abda2fc837ae860009b1ce3a049e29062ad59a017355d715cabe7ea78871358fd97a865b1f203bbddf183baf97aa68004e02e52e89329dcd9245931ddfc6d508b411ab4018995c5f62752e054803c9f82d15485be001fa0009b1ce3a049e29ec4008c95c2e37a1440f6739d91e91488a07e5bac8f7d2f812676e6848e7c23c004ded58ab83bdcc932130f044374de6c5cbd9e723044aec3af3f77b18de54c9b9f7cf43290db89e0009b1ce3a049e2876d7d3f81d785fcaa0f95e78efd05b70013606f812dbf1f535c70cdeb7057c5c004ddb54f2dfaf0d6d40d6f38e60cb6b302febdb408fcaa67fff8c3271a40929b1ea0274b2e730260020120010d010e02012001130114020120010f011002012001110112009b1ce3a049e28eec1589d034d465d74bad216cf80cbe5e0131dfcb59d848dfb33ca7d61047400004da615e848f76e220f165e4717e1f52cecafc84e487107c80ec6b4b65d993b9262347297dd74ae0009b1ce3a049e2bfd88e6dde58f53b1336de8454a2d9e1abdc72fbf2ebb45f8e45108e3d2b0c3dc004d9fda6ea8ce96923f7fbb1c77f24be5deabda8e6b8930675d0751aa2d8335dc8d710cb929842e0009b1ce3a049e28f815378ba72c5457eb24cbeb9eaa5b2d331be4650cb369caa0bea9d2ce55de38004d9faef10d18be95ae334a41002a3acb6bd81cee5ef4258f7c1003c7d2f7f4c3b9b385c711968e0009b1ce3a049e2b9159bbf92e48ab8750130861212f63b51937519a92ae48faa554a1031fac00c4004d9d2e20225f96495ebb678b36f86245c959728e2166f3600d364b3843284667a297061efb9b0600201200115011602012001170118009b1ce3a049e2af50968debe1f658f5cbfb6382bd5242c0079a0799ffccd6543cffd14328960a0004d9cecd9d31a65528e1f2a08f6c977deb5e1ba1eabecda6ce4b2ee114eb8f678ca2918f77b615e0009b1ce3a049e28c72a8a1db7ece00f4de1989dcb6682f5e044b5aa78e72e0307d29c7175e220c8004d484fc3de9c528b43081357b4885f7d6a67a762a88101e31026031cf6ec6bc1fe92976035cd8a0009b1ce3a049e2a0e5b53d53d8bb07b9a3ecd3394f869c60c6e0ba1583cf2b0cb4d9ae72dcc0618004cffa8492684b8424f5e283adc3e8da52c90a2dcbd07e311c826dbc4b63dd81990fb6cb7309bc60009b1ce3a049e28b315cacf038c70a7d6036c71ab45e1f49e805560b4b5361042422cf7b4d49830004cc415bae10f30848cc771bbc8361d86f381187db7bb35f83fe8ad8241d33b8c2c9acaf59723b60020120011b011c0201200129012a020120011d011e02012001230124020120011f012002012001210122009b1ce3a049e2a47085c8c0a7796638ee69e7cfa6b6b3dbc9449f46a4ad528d6ca2258dd4b3788004cb26ec5b8c2719a28a87acfaff5de1c222cf4af07dc11e8e3fa4aadef5dab7ce01c114e5b9f6a0009b1ce3a049e2b27216d7b21bc8ce3b71588b3ae52e336fd9b43eb8d8805ccc51932fc87b02a58004c306043b47a12e53147ee1c9a4d4900c0c292df9fee569b02e0554c91ea3774f861af81fc3c960009b1ce3a049e2bc0974f85b8847233e6562e9f3516d4142984798bab32515e160ee9403cc2e24c004c306043af8a6125ea341585947baa0194b1406662fccc2693dd8932211203a1326a59f50ce64a0009b1ce3a049e28d5797b99daf5ead383efcee908eba7908450f72e6d8055b56f8cf2e87c8c48dc004c3060436dcafed16d52d1d34af75b70c1a1c7363abfc373cf7fbf3229cc8be80276825670bff200201200125012602012001270128009b1ce3a049e28c06b9ca34e2671c7fdade4818fcd1e93a4290af98a7d31e62dfa7289ef0dc0ec004c3060431cc79798c7b95f42a89c2a5ed53d6ae8dc665a1ae424ef1e961bac85be227ae5dfce5e0009b1ce3a049e2966bd617868999d1941fbebac10ba400dfd384a52695b2eac84aba3052cc0682c004c2a089e73969323623fe37a6a77b0547345396708c9363518d18af94528b92014a6d7950fe9b20009b1ce3a049e29538c4fa763ecb50b386350081fef81b3eee70d294eff943e1e3b8ec9eab6c698004c2a08991ab0ba8dec11592e433234901611fce32fadd47e24f7536ac942b81c5ef7c26d979dae0009b1ce3a049e2bfcd3d2ab64ff4829c0733e44f04c3ece0d49c63f22aa01bb4f840067a961c644004be7c8337b4123d9b69681f6a2d635073aeaad83c2107fde9639331762bbdc489662d80881fa460020120012b012c02012001310132020120012d012e020120012f0130009b1ce3a049e281f9a62868bb42c76d7fdcfb372aee660a2e284f7241067423631248cdc697cb4004be7c8337b4123b08339ae393d96b9a5c519258e1c62c12c65bd32222ad5c45d8f201fa7c8d29e0009b1ce3a049e2ade1e7c4f6cdfd6972a817197f0cdef81be5dd2eac9366ecda53d52757ea001ec004b9cb6d92a087fb41318996d6e8ce34927a5ab553a01ea365fc17998486465516d4fd420aa885a0009b1ce3a049e281053bfce91d46fa5f0816bb90355efb78391e2c2526d4afcf0865e001533fa34004b94783969326badf573699dc359e1c159690b32f85c446b8d8f73651aca205b06560f081d11f20009b1ce3a049e2b612da895d6866124317da97a0b8693e0e87589373dd5589688457af33d24fc78004a2b9801d72032b3ff15b5771e8aa82e713e2ff3943969629e0f64e0ddb68165d190c2557ce5b600201200133013402012001350136009b1ce3a049e2af8e65ff97d6fd6de969d81bd8a8ceb85579218477a3ff8dd3d69ee5fc3a1cf88004986fcf8a0f75ca82e510b4d9f501503c4769c8f05cc7f25236f156f00aacdee9b7e06eb07ed820009b1ce3a049e296c06991dbc136446bd038fc19a84d2e508dabd60f2a687a6e150a2ddde055a9000494b4e992e8176c7839a36d9c3a50549fe17f50cbb02e554a4b2c1d257004b4c9f707134a7c6e20009b1ce3a049e2ade2301cd5b4001ea9bf63065a90a8339a364e6cbba995321814f35fdddc25318004940b6cebf106ea3ea0c15b74bf9ca563a8cecb1faec9acdb620557a084a7c862e19df048f83ea0009b1ce3a049e288137f3f485a68ca9ec1cd5165e170a323443adcb96cbb2a6edd37c43cfcad9600046c3cd0ee4a0780be1e2bdb47318045ffe1bb6e79f6bdbd0bb5413fa37fc222bfbcdfee2e857a200201200139013a02012001570158020120013b013c0201200149014a020120013d013e02012001430144020120013f014002012001410142009b1ce3a049e2a4bd6b704e6503656a6d35d8e07e8148c229377bef0b65257a6e346cac0846ec0004620bd9ae24f605d2496398d7959f433a2c366c5656ef64a8b1e04f32f4b49c4156665ec1a258a0009b1ce3a049e2bff6404666c70ea6c569d4121c5b5f91c06b8526c63e854ef7fb6467f239a42f80046205f6e81f5aa3a49af7f589fe5c368507b67a2fbbdf28486af9372c42a64f913017cd699bfa20009b1ce3a049e2bfd75d35b68fd32771655b138b8a19e65aba09046d827a0c3d2c3db859e7e4688004608c8b6dc37883536dae1af1fc09513176aff7c79d638ee99ae975fd964bf942db7d0fb91b77a0009b1ce3a049e2b1eb553a689b59d86fbd8aca55b66f73ed3269d7903d539b8df9af7a3c9266c54004600877e373571a13f11ff3180a7b3dd16e833c3a411c9cd17c8859c0c288098c80fa80b47b67a00201200145014602012001470148009b1ce3a049e288f2b88c6a77f41c424756cdd20fcdaf8b951bf62e8db84ef4c8f424f8b86bba40045cbe8352062bc48921455da5b253bf0a0373e940dab1f62c33db1b6c38e2c2509e90b18d6d8b60009b1ce3a049e29455c8c1f1307ded544b775cf0483f496b23aa70b88fb3a88900ebe72b2332d3400453bfa1bff4d711f36a9b75b9687f793dec216c606e3f7c6bd8abbe1afa40a288e30de2950ef1e0009b1ce3a049e28c2d0059bf2e3ff9f2a82bf2179d3250952bf1a9f32ed7233dd90bf76a805f0bc004480586e74d7e563dd94a980935e004b618f63008b1227557d464cc7cf26e705a8a109108c4efe0009b1ce3a049e29ed5cd5d2b01b95d09d88b3bd0af8d0c3271a3ae8a631fca9e3c33a9a6f59b46c0043d71eebc34a8c3943525f8161f8aec2fb535335fc2bbb1ab0b47681903cb447cca69824f1b9ce0020120014b014c02012001510152020120014d014e020120014f0150009b1ce3a049e28607f6f25175092f1e3827be90536d417b0726a55c68138287c7394df8b38ace8004399cc634a1f69152a1387280f0236710681053bea0ce857f8c0b5bb8bf39b78d0698a1b25b0a20009b1ce3a049e2bd9d34d9d1b25274f37bf8454baefd3053ea569cd354265973f6d642e02c6b83000433af9666a77bbaaa83f00bd051fbb5536517bb5a916537bcc03e27a87a7ec0af1943fa239f3420009b1ce3a049e284306a77916440c1c3c15a693773d0469a9a8d757e9a44183f458d0436f0b0e4800432599696d0a543c44edb7d681a9eefb9ee72b66ec874c2dcdbbefef4f9cd0ec9131c6e32ba0420009b1ce3a049e29a70efbab738ed7ad4e11ea76213c0c05cc221e3266b30224e41b60c153c7768400421b4cf7523ed9663ebf5b15b05dd8974676487cccb33fed640bc4a68b490626d98f540fc1c7ce00201200153015402012001550156009b1ce3a049e2ad81e5e080c139b1eebe035e3ed99c287bb5fba520bbaa9e4110c519a8c6fd3fc0041d467054b7c4381055db64e196e3396ede7bea28437c1d49f6db06acff8689eb73b13ea3f53420009b1ce3a049e2b66884e535f7a9e8218bfa63c3a84d782b6125ac1783eea89a9099642f3ce88180041a3c6690c210464170278680894f6ea68ca69ed38d7c8004d9acc66269c52dcba495130bf58960009b1ce3a049e298dacb4bb084e45a9580ffae6220e54aff51a8750b4112aab1ce375870de9923800414e4b9fd3a5bcfeac07f0e4bc11320a8da8b1b3a66462b53c494a4e14e76c238f26664fffe24e0009b1ce3a049e2b419eb7733d29f7ad5d4d00839b13c80133009ce02b47d931c9127d176480671800413fb19de4b2ca30b8e5463bb6f4bae077e1956a261234d3f1df5317559c2c0cd5f4b8057f475e00201200159015a02012001670168020120015b015c02012001610162020120015d015e020120015f0160009b1ce3a049e2aac7949165e19781e3f4b6577130f0248b4109a7b5059f26642da1c60e3581f3800402c1880371324303963b55830d2d2853361134b7618ab43528bbdaf687a69d26867141792ffca0009b1ce3a049e29bb0b62588fcc0297353fe659bcadc5f9f1f0ffa31644b620da8add46fee54270003ffa2f0d8f88be6ba35a67d878b9ce8cd176458a2afbf5b8d642531b3f489a9fde93f24a1ec7120009b1ce3a049e29ad53ae9a32a6a56cc5358557ea76539ee2874727c698de01db9b37da24f3b82c003ffa2f0d8f88bc9a0aba445a362a7aa7b5be60b52a9885315a3c192b5313e881d68322578e79a60009b1ce3a049e2993417d3f565a099dfc9d4c22a38ba5995ee61c06324255d3c6f2daa7e24bef8c003fc51b7772041963653295d7a0ab3ffe70a8e39b431046c93e5a51976ec30f17c81151a28b624200201200163016402012001650166009b1ce3a049e2b7e581ca3e92d8fc43eec213ecc514263427b8cc5c60629cab624f9b00dc5409c003f00d18f18ef58e5b6248ae957819c53195463dd7a29277835a5b27323db64cea1c0b8712907ae0009b1ce3a049e283554628c0a4c72434fda3a78127c2a0fadb470d2dafac9d44e9baed3a0ee4250003eee0679242c707a27dbb19ba353b571991f65bffe5aed1f4760ec1b5e2ffb23dc9430e3a0be220009b1ce3a049e2bf56096957d5dd020d88fd7204474f5a9ce25e0b76eade18703701aaf6f7e17e0003e771609e8ca27751d7dee28e7a37b1e3572a62abd33af2ca3f86d1858a0cce6ff60bda6e3459e0009b1ce3a049e2aee54222940df044c981cfa466e43fc4998da6961048beb7f7c638da28574de7c003df7f4d8cc1de4d3a5c152504a1ce49bbd0c5f022169be07c1f530da7255c17855a8bd810dde7e00201200169016a020120016f0170020120016b016c020120016d016e009b1ce3a049e2b159a415a5902835396b78909517c399df94ddaea42a3b70acc955d0268593840003dc1af510346267242fbe7fc4774f4d3dab3613e7cafa7b079fa124a33a6fc90ca96baa69704c20009b1ce3a049e2b63d064a162481d5e31b12dbc13549bdd99ddd9a8be5ab390e790b3871d930634003d8feb91d74a0405ab8bbe1c5e2e3b1e546636910d34eb91b232b31e21ba0b3b2162e599de997a0009b1ce3a049e2a353a8ff59b242d117efcfb4630adc1e6206f3ef9c777d4a7245add7015d43ea0003d7037f8b732c0fb2578a99c369561d684eb320a8f13ef320143899fc9850c38e74e95b0eaf40e0009b1ce3a049e2bcd0166764ca6eb413e0191f118d5793d702b827193f97afdaefa0aa87fa36420003cf390ea7c8ff3b6d3b4430cdbe843e76d179865e48f49a36bb16867897d45dd53b004067be3e600201200171017202012001730174009b1ce3a049e2a9114678b7174a4e5b5801173aca3e55ed3449e8d000559687823b2fe5ce60ecc003cdc82669e16a1eb73d6117661e38f086a8631096061f73baa8ca5181082177fe773edeae06cd20009b1ce3a049e2ba1f1de69df338309269c2115e9760bfa09df2bede3bf584fa59d64ca27f3e69c003c93f8fa9852829944ac68574578f8ed0bddfca72d4ff96126182d0aba84e1eec9c49d3719eaba0009b1ce3a049e2a3325675d0e81977a0a99af8316decd0a98a39dfe34455320eeb9d770ef8bb508003ba3d47734964706d5026994fa04e5b710b4e68c4429a9e705ce1a95c7c0813127b2a8fe381ea20009b1ce3a049e286c6bffdc0f31cd424475ab3f2dcb41084ff98dd64a1d4fda3c6705f101a45354003adb747857849ac196c5b1cb6bc04add46eb9eb075aa93d31826c69b548eff130b118aa1f09d26002012001770178020120019501960201200179017a02012001870188020120017b017c02012001810182020120017d017e020120017f0180009b1ce3a049e28e52c03c4b6ca285d2e72823c75715b6bd5815ae542cbe62cfefaa51b755a3618003a00116fa669fdf64bdc3ee3effd34f1eb0ebb0fb48e99c40e5b042c18661f7cf2837d3965c3e60009b1ce3a049e2b4b38fdd5818c0ecf14bba0b786fd140b7a68196b0eb77194d44afa0d7e4c52b00039af030e5ec13e1ea43d67ab725691048a03b4a4b10be18c03fc4447238864ebfbe528e9afafa60009b1ce3a049e2888973f5ec47cae6e8fe4fdc415217f442bc031ad3c2ef84b1d05fa0a372f9cd80037bc79d040a90e4bf04f4e4bc1f57ed53926a829ac7687196fac601487c228d65acece629cf61e0009b1ce3a049e2a72acb8de4b6489b0dee016a05b2215de5442d2b0931ccffd3c4e24891d51033800379a7860ad7b04c243e0ab84c6ce8324939e1888aea6363bc3b081d6ad18eca492fb89a8125c9a00201200183018402012001850186009b1ce3a049e2bc6c1523a08b6062496cc2eac8a0de75585042c5430170df79db0d1f3e4465be0003674fe10107dc3d5f13b8eb2fb2811f8f2fd2248f8897e151bd652c93f307b1e0d0c71dbdbd10a0009b1ce3a049e2b1988f629ccc52114ea24e0c53e788c8ab89cfb29a4e58164c42ce8ba9b8ffc100036557779d6edf4df97491a293787166266f3c3ec9e93390f0aaeb74b079e92dc6694e9ec7747fe0009b1ce3a049e29cf418c7b24d8dcca9f267e5011aebefc5a1fb1502e6fb45138de01b83feff32c003637d002febbd7f09a1ca5182f7a1832d9964fdae6786d148544642138d9c1d91c3660a3bca58e0009b1ce3a049e2a94b50336cf5edd4790662a0dcad3233e292605ed6dc5380988e58a0829c64e780036004b0e2356929d32e6213ac7ee6541c7691835955b5c383bf1e277aca1dba4825d8b8e5b09e200201200189018a020120018f0190020120018b018c020120018d018e009b1ce3a049e2a780babc5190dcd10e329703665fc2abbff783fb71849409a825a47481d1bdc8000347120df5459f724c43b5243ee6b2f766a6f24f55b171fa37a3a125b9c72e6a7abeefbc3620ee60009b1ce3a049e2a2cab45ca893035e47c443cc7fd1ca22057976ff8944145e7f9fe43f110e1851800334ab89f20a42a9ea2d14b979198992f73ff458a40d76fe3157ee74c5a780e1d0cc1e93f3260520009b1ce3a049e2839ab700812697b4051206e9daab610949016ab2b49a66ea738ede952722c7d8c0032f705aa23ccdba48075ecd741d50fee154318dc3c16bda368046babcf4d0ae90619e10a3b27be0009b1ce3a049e2931720cd0dcdfd0badde7ae79d63afa4652809132375487f3871234645af77f500031e8044fe9d6d3b88705d8a1a927b941511fa4dc9dc5d50d0da4cf7fbb48496bf1a962df4ce1d200201200191019202012001930194009b1ce3a049e2854716ac2f188e28454614f23acbba97c175a4d6eefa0ee7e89c5ded97d2268840031b7b3d86fcd7959f9e9965bc9c6efe6f26e25fbef2f719aa70c4a5b4cabe873169e5adc9dde360009b1ce3a049e2b5da2aba49abb9e3b13b0609f138f1cde092700cd40820350659c716be12ff550003132dc9245abfb85c1cfdc020bd8aa220810902f1bb066557e3927968850f219267da0bed3d52e0009b1ce3a049e2a496becc7993c7344e5c0d656f63a6e4878cc96bca3a3f45594b82dea7dd44ffc003132842eb834d0dbc32e7f98f5f18ddf0847960f69dc56903cb7924ff0bd4232512ea170108e660009b1ce3a049e29a9874d9523e0e60f970c3cced3f6d71e325509a2da549e9a6ba1d104fc8236400030727c819793b62bae4ce9ca3b27c4b57c5bfd4c91ed11f604df3803cf0beddb4437b63c7ccfb600201200197019802012001a501a60201200199019a020120019f01a0020120019b019c020120019d019e009b1ce3a049e2a539684947bf3972acc7129ff8b8c95d2cbaca8e83a8cb1ec3756ca2de13d55f8002fcc4f3e1445f06dee48b7d754cb10756ee56e24b1f947b72bb5d6c4dd820300e1a254e716ddb60009b1ce3a049e2baa67881359422c6ead4a0ee76c965ea7b186d2255a5aa47ffda5f73d39027fb8002fac98d12df4ab3de3900acaa1c1d147728ab1a4274054f1e3e7870d5a30dbe53d31bf2e559e7e0009b1ce3a049e298998c1751c67bdc54e4158bcad57fa52c53617dc986c6633bd0a804c13969e10002f519af270bf47e11c57246e6770c27b5507791009d09e3912f7c16e08bda5e5ef9506c4694e560009b1ce3a049e2acd03d64e5699205ebae0f271aa8626628c6ed183dc7349e30a7697b3892517d4002efd2950b562f58324d3181966a141c514523c202e2a22d8aed2506b06ebd09b6abe0dfff3ffd6002012001a101a202012001a301a4009b1ce3a049e289d6b3a8d8bc84bdc4203f63d3d4f2a493125762741ca56dc15513cb7b23ad62c002eeb4927e02a0b5d219533d6a9d383f0a19caf6dd415e9c444edf0a7739081733c5669a72c94ea0009b1ce3a049e28e9c7dede98da9c1a0e99b5250283fa5402e5bd2fd30d8d6ab8e4d1e5f636fc54002ed339b83b4be1fe968e6748584d4833998ab0f2118fc101699e06d3b0659322cef4c666802ebe0009b1ce3a049e286d1a67fabc336c959baa78fd4be503ea923982d063f589f01183e07bb8414224002e7bc17ccef3a629141b26bd203d751782e5ec505807ca9574e9c73296495de83d5b39b51523fa0009b1ce3a049e28b45e39ffb538266ec48674398863f2ca5223616cdc1a0c6a9ba3385a12d90dd0002e095f36ba1b29571b3ab859148402488b98e9dda1fd151968863eb72d61528d989d9f3d96b166002012001a701a802012001ad01ae02012001a901aa02012001ab01ac009b1ce3a049e29a1cd0adcb891ea4b849444735df7d68ccff084fa7cbc94f40b7f563cf709d314002dfa4ab8d8035256d776e804f4c2763599d0bf0b586833ba8e36c474f43238da2169b0746157620009b1ce3a049e29efb8c47d741f7e9ea548334383470288891f03e95bf7753eb97f0d50405f5360002dc220455948f09e744c630804d331bc19d8ea9526071fb66743a527259298eb9b175e2c4a49de0009b1ce3a049e28096050de1c8869c0e5e44a4e3bd8189341f7bd00ed6964e8cade5125f8a6c4bc002da19aacdc61873be7af211d13b1637d8ac7086c5f4ee0faa764f3d951943ee00ef5468c76617a0009b1ce3a049e2998ffea1f5450aeaae104662faf0109b2fb07ac6f129525721ccc66e5c5db2da8002d98f83cda1c24cb07efad3a6a6b2b17df9688981b3b75ceacc5bc448fd9e5dcf567933d474eda002012001af01b002012001b101b2009b1ce3a049e290e9737cbb0c5b33420ce2fbe4f675ee819053e536764a2f8360f85de2d0dd4b4002d8830cf209759a24819b16ef4e614fff38afa70fa7d6f7a68b75728272b882e324f5680cb623a0009b1ce3a049e28f4aca701c894bc54f7b4f802989456c26eda829f776dc513f4359cc90ecdb2f8002d6bab08600fe22146cf7c9dd9e666392a3c3f6b4d3032b13332abc5b3f83e047c4a556a8a380e0009b1ce3a049e2b29c47e86ee56408442130bd20f1021fdaa3962830cb0d73409ecc8bcf1fc5c18002c9c51e2976d0bb1f366ec8202d0d1dd0f7428a8f2368678939775dfd43322e3caafd2f9a69ac60009b1ce3a049e28323ad3763c139aa45bf83808edae3c00f291fcfb1b4af038c78f2afe4b17b4a8002bbd423be796b967339f65d1a206965adb6c3f41c0332f0408ab3b37eb1a1e5030776b0cbef34e002012001b501b602012001d301d402012001b701b802012001c501c602012001b901ba02012001bf01c002012001bb01bc02012001bd01be009b1ce3a049e2ab4b710d35dc28cba8bbcacd96d8420fa1ac44ef4e12b78dfb1eb9f00f6d4e560002b82b0709e8cdda17d1d73ddd00cba98a4cf38b3ac649bb9e6ce7064d651c825b650ef7e5e005a0009b1ce3a049e288bc9acf8d2171ae8bd59e552a053612afc2fdd3a449b377c6ef0e41fc1d4eb0c002b50e2e61ebc02c55aa14232e9228032dbb019fd765435ed319f633cbef102114ccaf1609f64420009b1ce3a049e28de6118ca890e13731443d4e0f81a31c4227685981cde56dc898128a55183c36c002adb09da09006dee9c4e215c1203ad0f95cd8dc58bfbc667801c1ec68886d16573346915867b620009b1ce3a049e2b0c1e5cefbb7a10ffba429be7e65273dd122903273a890a5167f2d95e4076e6f0002ab89ec35efbe52ba92761425bbcb6844ea868c56d0429e313ee963d1288a446edcd9725135076002012001c101c202012001c301c4009b1ce3a049e29918ae936048c91ebd3031b0b6a581b17a8b1d6190ff24bf42319295677bc63c4002a863ed6a7a871a023d9beb6ee16304988b5dc61e3ebc7d0911b35becc2bdf617c284de350d93e0009b1ce3a049e2b2669dc07802d97f8c9bdb777e532a8f67b43dd6020f401fea702a6be81bf37c0002a85b9d3379be35302e6519d43cdfff5af212c987ba369df8c801054a5e11436f41e09cdf9b3660009b1ce3a049e28065b42605c1c9052f10edbd1185033517af72048ec6320d62242c06cac3bbe98002a596b93fb44cbf0d9d05277ea1c26ab95ec012c57d5a12090749eb1ad9f3149bc6b670786cdd20009b1ce3a049e2acf07c3cf5d3c5890b63843d0400846d7895b8c7e70c71b517551df6c7a3fff8c002a34f750f8fc955805a66889fc09b433eb1cac810c5975500818e12c8e0ae0e3bdc0974768e9ea002012001c701c802012001cd01ce02012001c901ca02012001cb01cc009b1ce3a049e28e2874c21f65aa0965309f8954881894e3e9a32028b5ea76527c725e04fde6b50002a2e33ed419689660031191e56dde5e0ca9fac0a7adb0422ea50b5a77769ce6754124760a0c9320009b1ce3a049e2a1ea1802fa26383753979e360dfc5523295aba4d531324c2695da2409f973042c0029ef77233b055ed2dca6096524a35a32e685ba71cca426b0e3cf91c3269cd6eeb73671b7134e960009b1ce3a049e2b959ce9134d6583bf23ba2763e03c4198f7b988c178f74f2253967b3791e8e560002948663dea322187f135d6440bd6a79964873da81d2c0b7b376a26f07254059187ce262d485c0a0009b1ce3a049e29cbe195edcf34622ebbba70c4cb548bca55a9f8914da3e6d09afe5135fc9880e800290f9d2b3517df1fd43f1e6c98cb9c0d8c3b59274e1026378fdc0dbdb50eb1d801cab3747f5ffa002012001cf01d002012001d101d2009b1ce3a049e28938eca2e26d466968f996dd89b3e954b9afa3c65e7c3a16daf380713f4b683880028b0039997992d7a22a2bbc6f1a3b88e34d3ec3226408f6df3caff6d30785d07bd1501961a0d4a0009b1ce3a049e2992a2a1e3901acd219993eb4bc380dc9c6c0a3223fc6c4dd967253dceae61d278002883443a374f9a758a1cf665f267e2c057047cd643bcdbbddfa2d43aa470886dd9898f9fefb6d20009b1ce3a049e2a46ff41ec07e30894fae7f541aa2991d3af2565108ac4ee3f40339698241b9b6c00287d489ac96f34d20fb1dc5900e90d35582a9c256d35751c5c6220757f784bbb0bd4989a922cee0009b1ce3a049e2b253bfb908051ebb78a6b01b1035c85b60bafb1c1584a880fac0a07d2edef1e580028131a2eb54b34cb8a8fbb84820193b4d204821beac23c58cb8ec2ac314ff35ed535aee0078fae002012001d501d602012001e301e402012001d701d802012001dd01de02012001d901da02012001db01dc009b1ce3a049e28cc3ed46a12b9ca0de67ab20e88d53fc15cc0efe553c7c33fbdabd90cdb2e4504002809ba6caf7de9d1dac2c9fa11b7233fb8fed809b60b2242e804da5c370c791909130c6f635d1a0009b1ce3a049e2a58e2ed78f898eb18856621d8dc2a0044be18727831988c42132df508e9b8d17c0026df5aad06ec1edf18ff6b9ec3586138047fde2a25860445693fda2306c2e05c14512b598f232e0009b1ce3a049e2a8cdf9b869488310080b09bb95f0a78f1756ed522ee07f84a9948d7e026a39b0c0026df5aad06ab633d42bc06e3a77fba211c4e8ffbfba78655fd20a3624c29e42cb03a94459242960009b1ce3a049e2b40e52cd67fc1a251370833998db02de219de004b490facb9605cef48a8b1fe500026df5aad0587a1b3489fe5453dbfe5e2c00d9a58d5920865ea58c8da8731fe37a74989b56dc3e6002012001df01e002012001e101e2009b1ce3a049e2a9bd6c2cb6c4b89e60b288b6dac842f6dede26a5ef6c1192bcfc759b18c4de8400026df5aad053be8c356490435d8b26734a3e8523ddf06685aa2b3f48031952beb28e88b19587c420009b1ce3a049e2b112ec0feeb604bd765228390c1f39906ec816440ea2d98b07770f7df70c41bf40026df5aad040d71a547d83c93830cbde24bf104cd2a3ae9610c458ec80c1a30a2a0dcc48367724a0009b1ce3a049e2a75d79b25ce43b9e2b1d3b211e57e67fc0492e802701d3b54d179c74da4522c1c0026df5aad0355b78e30bccbc20b0da660bcdc106ceb249da6953cbd33d6713e6a4d16a42100e2620009b1ce3a049e28f44a8ff2b5c4019aaa0b18015fdf7f02132fcca82cfc543a775fe5bce36d26c40026df5aad030a1e5424030284a2643df3e9a3dc27a4e92418f7d2863b8c4d44413bf747d8eb6b4a002012001e501e602012001eb01ec02012001e701e802012001e901ea009b1ce3a049e284e9f6ab299e0b28aea1183c721a8e6be89bfe1da2444e9c5e4f0541e642924180026df5aad0206af8286f75181e77418494c8b18c5b3d9056703d5650263c2aa0f45774f662862ca0009b1ce3a049e281a1fa2cb0d486e8dd41d6f1dff58018703b1384d3c7af65324d220f74b0b07680026df5aad01f139b28de42ca52a505d1c22619285238fff02d7b6fb8c96e62f7b7a465ef7b444460009b1ce3a049e2b21c13b8c082799d35878cbceeab8808c3ba4d2be34f38210e3bf6926a9ef1ae80026df5aad01bb364435e1b49423dd16a326044b7c0af9dc8d51fb43bfc21a6e0edcf011820843820009b1ce3a049e2b0a576b2788c2225fa2b8e0fb1a9799fa57267f44896950674d02e98d82f7c8380026df5aacff9efc452f31ee76d4c83a5ebdc65266998b956d7c77e963593e84acc384cf8b48689e002012001ed01ee02012001ef01f0009b1ce3a049e2999f70871bd0e3e5543edcbed3d94b697759ce6d96a869ef5b7bf07699259cc700026df5aabe54ef87d88a02253d6d6538c80a6d2083fe31c60f28bbde53e3aa1afbb68ebe8645db20009b1ce3a049e296dcb0138330520518648edc015f36b5b2d9c77b59f4352cf0f601bb3fba888b4002682a911d065dc61ea29453572e3376d806c49c80fc3f1bf871f69227bdf8413c4479036033d5a0009b1ce3a049e2bff5254a8c49bd385dd8b1adb514531aa8413240a163117e5fb73753e5baaf110002682195aaf549587ee340235f5a8975b70d9330b6dbae735efc3c36109bb53143abc134da125ea0009b1ce3a049e297b8cc0882aef478b6763c2c2f8f2d791c6cd9ed317d9499038a94fac1848a5ac00266737725fcd7c1894d7dd51f484773b9a020f2a4731cc0bea996959772f0026844aed6d0b459a0e6a644f647ffc0ac8af905004d000000e95d0ef01758d080069d39973933a43a517c68247ad6d0706a156a8033e5de45409ce0aa04c6116c483e4797f71be121d0dd6af0b1fe39c293babf375f555d7a5f5b385abb8435fb85d6e10faedf5810a33dab5697e7553b0c65c4d4f0ecfa220000000033ebedd0f1c16acab95493447c4b14072f8503dfa66857ca8d5063792efe923a40a1f23411ce03e8a9de9c602762db597f779bccc48e3a6682fe132fa939048a1854b743b82ec4483f0530c8f5ca309bf54e1da050e1985ef6bf1e45521d3d160f0000009b0b94ff5bade879f9916eda9672c6f920a6dd7304b52012f691eb7747ec4dc840ca28cd3140c8bed81e65ea4e8080ab73af425498b8e0aa84ae365cc2caaad34d42906638096df3345b039eb74b4c3f207b19f8038cee4aeeaef26e998a2936070000001eb8a44e9ea91ec3c2858952cfbe52e1b37605ed7ae99a4a34a682fd525fab8f4008bd1fb1a57120c98ea1c7c36949aca73ba2eb2f0360cad73749d1fa516baab74cb5e7ee63dc72b6f0c6be91814dbf470f51655ac6823003704763052c9ff407000000915eab978d4210ee8e45caa1593791530cf278ffc54780d7aab3767eae80c1574001ade2c0e937ee10387a95537598ddb9ad5174ecd7290b5a919d17749547856403ddb56939d97a7ad84f3fe921b74a6250f65bc965d3f4df3aef7d6bdef5e309000000811ca0718f2a17d735592f12fbf9677ada71f5f91da97bcc5940a7bbf66a5afe4029f0ba0104ec7cd8c99bdc74e396471390e5f07a06addc8f4a8c53fc3bbf201b93bd29f57d3a477e2667eaa150eb4ab37f84d152321020688a4c0c5e6dfd560e000000bf429192bdd6692baf0a54a23503f6b9fbeaeedb510025614d21c51dfed76d0440996779b78c6bc63b6acef4d5452d95f15271488c1a49d29a9b99172e29296e62dd012788a957e308616e98ce1ce82de56244ff2b001419f47d4a7214a8bd510f00000039ee44d3b657407076621b1099b74cf9da13accb4d6ae4a550d2d61cc33ecc9c4037471e865753861035eb71bfdf9cc53fa71d31f6a21e133cb2ba0e8664dbab61d9cf2d03dbbef9417b088874202ec2a7c06e501c15de7cdc69fd65fda428fd0b00000009e75f9975bf808370edc753050a24a2222164fb1cc6720f8b18b6cdbe3d9d8e40376355864cef88c25ef4446339f2bc4fd1d5a6ce0c248aa58a47322d66d74aebb7cba238359169236f1f3fd7aae01e0954d96c8c59e2b988cf781a46e7249f02000000349730c5ecd135e0f5961c805e14e347fb804a1ce42bc43e8cfc6fe43cd2d8ce40fa8ca492aac21b916cd1c74129607ecc492c45e639837a0cad49227a47583acc0cc80a5cc1d2fddcba2e13743d73018724f91ea1e39c7d3a9f93f25ecea5760600000002d961a88bf24dfd3ba8ecdee244e7ecc41fbfa74491dfc4a316d6b61e791249407a0a55d19b510d3af079bebf54bc0fcf0a6207b897e6452f2d891d7f0e92153c14f5a3ec9d993d85121928dccc0466abfd0a88157098ddc56069e662cc26180c00000033bfb6c8de64e58e1b9c3b6f36b2987750b17be7665fe99f3880d4fa8de4edc9400aa47964a1b9d7aafc7a1529c86e50cca081691a50ab65a7022812033ede5d38ce993b588a78d37f03b9fe5286a069929b21acb502f9ffb4c127a73d32e3ae0b000000116378c3dd3b426f098e42d02edd6417ec5e07fdf726259fd17c1b6dd80d565040fa545a09088908acf420aa7ea1141827aac87ba221460759559bb5d3f92343786438999b7babdf43220472f8136f9345fbd1f68f2c537dbf0effe972876946000000005d1a79326377fc7a0dbbea3fea044685ea64f1f880b1d491e815acfc2e40f033404419dff4b9d2967b755e4dc8aa0f8619a0436b8df77d86a8ce4e738ff3df88ca730679e752f6238f5ba7fd36f8f424c793c4c9b706f4a1592551ca6207dd950c0000007bddebf326152acdae954ee7717be2dde04389e61a98b280f0847fab5c4f722240c24220be243d80564ca6bcf33395c69523c9b2b09cc9d9ffe385a6c611ee1b0e14f6d39563401555f85c84a06b23082394859d3143ca436d82ab3576891f010a000000385bcfb6a2b9f070862ddcd699038e676b22df7e4b9cead0103bfee6218113184062b183c0619f0c552e8ff60d42711f9c4065309b6209a3dda1afd3d623f65c4c9e206e5ff67adedd18ee71dfe6b736d113e0f867a069b5231222adef8ae1f209000000e1c5daf5ae158206dfdc60670f9aa22693ad9135374bd25dac0272d603c37db740ed89df243e915fdcbd8c823ab52f71ab867c89762b4f4aa40dcf7feb2230ce5dd2c674d95d85741e572a101433a8c3550e7b0476ce5125eec36c8fe9642dff0f000000f94bec65b2ee706a05e9ada1636c1cb276d26e7e9b1090e699fda4e06b54ff2d407bb6175b23bccaee58033dad86e59050b669f6ee0999b33fb0aacb7e962a94fa0ed1a34430a8d902e73baaf50f10b8c73a77d9bb8df82e5fe9e3128cceb9cd070000009be5554e66f241de6cebe105bc1b7581eec065e34700ed604993dddd3ef1daa740fd562b103f96507e0792ce159b552a5f800abbcdfbd0f8a67e624f29f382c5400427360aaa19f1d306d734c09d2943776b7e0a8c68e0536a7d3e3843ebfa170b000000d09c8af4e9457148b6c173b89f5a31f4375ad8f2d7aacc0531f214ce388271984082ccf5934e8e3aec3e1df4335cd2a65d1b06a95ee187d49f7bd28a29ac1deeaad88ca9f10b853660d7d6fe9f4eb7cfd1305f9be9b046f1f27e980cda4d7a6c06000000525bd7c23bc0fe2a2ed391a32bfba0ba1ff24fd61d688d6a16a65bf1feacb39640bad04c6389936f1d8924ee8b375a7a74f2620ae44db2e7ae1c8df2856029560891300f917ebc56d91968399fdaaab6d1537d34e0d14e29630acb93474d3db1070000005cb64c1daa7d8bb518c529d694454bb5af84f5bdbabaa81a84e409cdc1983fc940236c61510bf15f6d4207ef52f3bc25b025ead7d2889a4f5685b5f0b64f576e779b1ce6a2725d9c58ab6a12f8fecca26eb75e627a88c8d28d0b6d02486a921804000000b9980dcce89bc24f111b8bbd200e8c0b21f773002f965b5229a7c8e249d988a940913de052e37291a71e2b94a316bb73688aea499c8b392efa234ce81a2abc870418349d6372aaca4cef74f2034a965a557e7420ddfa6aeba1c67fb39f4888780c000000ab2a337a941cb96fd0d9b81f2fea4ccd71536b7cd56bf1db4adec20e1d92c0ad4035147bf90250c2911ec5faa326495ed922f4c8b406ff5259e3fba51e92fea0e7b17a0b6fd0fe92ceb3d7d45db4fe3a31cd7955dfdb8d5c6e912190e4de07c1060000000541e7ddf602a5447afa23b6fb310d2c37b5b854d3d97786beee180d321e16224079e73f93b105f773940175b87fd8aa9d71e765aa5a9b5fb15b432c33576eff73640166d7dd52248ce096d734b21cf92da93c0a26a01704b83e7c9ca8a0a3db08000000f234c306992ce11c9672f344dd05640cc13e44f939435c04bfbc0045b77dfaa0400b5ff762724e8f52b14122efeb69fa598e55366851fdf3813a3e1db25df8c53f1c031b948def9855441764b0828017cfb1fbca047ba28d3344cf6bea084fb501000000aeb20df10f038b15157777f0daea5ed2861530f6fc45d371c685fd22b72e510340aa11223ed787cec19555c5fb2335537555925b431ee33ac67f09950fa2e984e34a736babe746ba928a8dbcc83a057f2a880fb56a46477b88b0e16e5a377dd80a000000638e27a0066f3c6af1dec2664e2c520062bee8fbe0e469c96cc350543f8c474e401a762039bb90240c4c553be2dbc36f58febc16ead8d1a06dde3c47a5a3bcc33f0a2ebc5994ca166b0dd107fd3592840dc2d3a89eb0dca34319bc68879c13440600000085a56a40b4f978702fb53d30be73dd23d9fd317ed0c9f6aea2c981570882198540ce1dff1242de1f14288eac090602b92dfdc8994e91b94570f607c173b7b4df69e1db76bdc6114ff05bc201740d804960ab00e88eecc2e502c3db43e56943c70200000074a4225f7f050fb11789df71563def83cea75070a87d74befb21078e36e654d04081ab9f326ab91adc20d4e7204a39116d073a337f070e8565ce35da132e422779dccb541d6a38427b5a3ca4622f77c84038b0313f9b48ba5296bc4fd7dfbbaf0f0000001f0e1bdd5e670a7415b2fd30bb2499d7f594b7841a191bc1699fd8a340ff1dc14023d7169747ae9a75b26a716d2dbc1a37a4dcb4a51f19c3aa1fcdf793d6b8d0e9607e1824187f79618f507d02ecb094389f85972995720338680a37c104b2ed0e0000003e2d7c8e0ac0592ed108cbae46ed21701cb7ef1b6b73b1f65a3816ed317f16e5409392bfc282e1e04135bdfbe08212fd6e75fa62b6a1f5d27c3aff06d46808f3a18a93a78f7235a72f7375c39487d38be44ee40a39f4953b9be0fa4842e3c77f0e000000f235ae5f57dffb5e24cda26de3e9bed8ffbf34c4186d198c0fa90b6e6ccee64e408e92c1a3119586533f449993767714fb28a562c55040978d2cb882711ce2a555f94a1960f3009780cba373fba6e16d43b5233a4af9c8286f42ccb7c661c0d9030000009a60c3eda9b57c27a1d3cf4b73367372c695f87395d67a7ef4aca4f57d8ab6cd40f07fecb8df1f5b8ab4d6e21a7287157f8959997756bd795f25c00d3eefc7a8e48d20c461b4ff403536c69e868e0ea520cfb784af36f004abde02ba4837a9fb0d0000002288894209cd6e993a375239b053dc7f5a3f25123fa82f0ce07d93b969b06a1a40035b36187cccdc7235620ce8322b13b92ac49f46253ecb242481c85573929c6b4433ca304f2fad8564203f0e80464be3b51cd743804f03691d8f60a46d5992050000001a933fc60b8dd03b22f15a440ed7f1977d73421ccee55e14a9fd3269a86b069240cd51ef0727925965e3cf0d2eb6420d01cf8ced05d00ee206b64f6285703488d1cc12cb38478403e1f99ecf37153b6e340b73e61e2c19cd5a16b1105a24807b0f000000e497ab7c1d161c4ea157fc6f1f7f00c7db8e2604554b12ab00cea0852bfa3981409006af3b84b9ebe4418cb954395d72861baf03063616eee84fdccbbf8d8314ca648df3a88f943afc7469e187d4eddb0aa14dd3a82df62f6492f286374e5e54090000003cd72776bbdcb6b3bfc79ec0e97ff56ae07afb7accbc812e9a266de406e76ba44074eaa8a4d2f869d3a95238068a9320686c73bec9e7120b098121107719d69168362150b8bbbd2e8576910d01c7305b6e9c0586235fdc17d47fd51ee452590b070000005fff41fc367e5e4d6cc5abcb087ba1f6b4efb844fdc1db5516b20af7e1a9cbe540fdc3e41a507138fed4e62eb57511553f9f84cc69e74959b110aeb0a70950ad4aa54d367ed6d69d58c39e45fb2ab606573fe1eb4d3060160d32995e020db3fa060000005053de5de3d0b0a6de02ef56312ee04147a306a00a58aa021a8ed8aeb22b48e040781c3395af2a0bbea7c0202902f42f7cc4fe1d1135e05500dffbbdf6bafb6cc1b79b1837738d141ffded9abae4017648c146cd2c373a0f0772945091ead9030b000000f54afbe960d33f0da5231db00ae8be4cac8b75646acc6f286dd53451946c3863400b59de5d382e183fd6f4a85b8f272e652f638834b0775c65ff0213759ebb3bfde68e09242c1a6f0d2a945c9071f310d1533d7ca48412be0a871a5c700ce28c0d000000ff10350e649c63641d034c130f9eb09d36bebae7d66046c2aa8ffc5c7ce3fd83403cd7109c7e45c6b38c871302c87c20d8436f21f8e747d885ea6b2942fa8a9f7641a7313d5b332ab6bb622e109cd9a07c16c02cf5688a64626986bd2312e8d409000000087d2bdcac54b839ce6616c93f5b337c2fec0bb85eead78c4ab5360d8eb3975c40aaa33798e8428e950d14fc35f7b4cb58252e2317d4854d8b17c5b87024704ec0aa2f7ff9fa0f989e798d393a29ebe431a5850a802ac1ae9392d021742fa1750f000000ceddfcc0f7d1ed89c49b269706b4a3b616752fec806d4686d5511d2c4f50f8a34088e778a078d6752a507b48936d1b83945ed82c34086b1d60a77cd16c5140d1cbd94fee212c6697e7dcd151ac94009192622e0f67902b98df8d2c4ffceb701903000000130ccfa8e30964f1de231c418e8c2d963facc10cc7b33625849073cdccbf1278402f5443558a56a4e851688551d76228e84d6c7cd5423983239df4aeeff986f11d8bdcb39afd77b5f05a0cc04c9851ae614d506ac189861a0410ebfd327f121b0000000036693d3d84be28418af84690766d46f370c5cbf3803e0c4c66adb6ed1803f90940734fafb0213ab835b87ff4c926dba4553b17b51346bd3c68625c8f982886f0c18a703b92f1acb133ef81fb0051c784f9a5da9618931e7a7e5d72d50dcdf89b00000000515e36e0ee112c9735cc7d140de55e6742fbb375997bd9cdbcdece54ff427908404257a6782586bd9136f8a607fbd90ae995360be0affea1d11ad836e092136d8789768b11e1e698d91b08a4b87a88ea9d4c1701459221e711e2eeaf5c884b4105000000bfe192fec649b46fb140705af3459e6e708f4b568e41abd89682a83e4737477640d5b78c1cb8917f39c85f499a09c830c463651550a603fc509aaebfb1fcb5126875d2d609dd58d9c3fb4a142b74ade22d4acd90106c1a7ff25d99e4c00c1b5e040000004a492729df8c4fbfed44dcbd7ca87658f1afb0f4bdea520e954bcf0d7eaf3a5040bc1d25ec75725b4ba7e20f122a548babd091e5ffaa0069c60cfd2624cbe2e00d6893eac78268b81ae8311fd803bb152958e9cf9fbd6fe93c058f9b67e820300b0000000916246e07d42c55c532972caa7abbf9784709923e8852983cb1971852b2c48e404423f0af5970e79c72d210c0be079200e4c84ddb69b7d85476c2d0340f99b35d5791e8d83971d94b95a71d56abb9cfc5201314999a07ab415f565f2209c67f0f000000f6fd9a857cad3694e66f70ed6ce7c97c9ce3e63b5ff014cb0baf7c5fe80e4f4940453431fe8b4512b54971436ec4969605b8423b05aaba386b735f5867f341f95bb9695ed0911c551b4e5c3081c78c62f8a27675272fb5a6bfcf8422902df68702000000c871e67669dea55d72f575e718db0039d365cbbf78e229da3ae5d5e7747d912f4021576966d0ad766feffff8f7d4655b374a43ad667433ddbba0c7d4a8795c337ba685c815516d907d35fe751302b78cb9c61e0bd726005d8453e152c8547a140f000000d9673cd0de4742543b9709af2e0d6d0ce13fc37974afa668f276f63d404ad09e4036cf5d70077b5d1369183e6d70cf258ffeed1ca726a77c52c5c582ac1d724a798d78aeb7460ada41232b4eeaeedb7b5ef52cda21a0f5b75ff325dc63cef6ee0a000000eb9ac14ac759b31e9ba85de41bb523a16b471fb4b4b0f54e4a26c3c15c39817340b6bd3c272c48528e6f8652db8323f215ecf7d3f6b016d22f63223ddfd3ef532dc2ba883766927263f30105ee0b9f6144610e482f8317d8819c3b1633684fb009000000b603cc2578007db798d42ab0a4d76d5d1bb674504bc92a23e69b4d8afde3efd040469c1c1a03866c760216f488644858dc0ac9c45b27dfbcbe54216fe5e7a101076e7d684ac0d148b50f15a369a1f06af6156639541e0500c45805f5e9a5c8af000000008996e05005628d96c383610c5d5528f04cedd1d9f1201dce44972f59bdbdad4c40ad416070d38dbfa36cb9ee5fa0ebff4f2d26bb2bd6b29e54cd3a582a8c1526ea75f3c09a84bb1b73606e997cee7de0cc00e5de94d35e199241a0241c52ef8b00000000b2c7954f81021c95ef794c79d8268401306d2d057412e33db64e8b0c7f03159940f2f1c5e75dab69afd99f241553f4c92091dbf4ec5fb1ad1409185153b6e1702660481c62399914c6b25007fdb6e7ffc8fd9e0a26fd479df232bf5484d6b41503000000672e107a94290704f6c5726deabeb7bd64bee446bb1b3161bc1f9466f468cbb040e3cf1173c2dbd04edb11698f04a1a5e0164f5a62a747c889f0f399ba05da7f5c7481e63e70b7ae144d3b2352654b91a0c27a5e4041adc5ef3cb8cf03badb6c05000000b135d14f679035a7f359f5022246b45a47c04df76f534895629f538d1751eb4d401d20e8c55165d53f08b791e2195e5e9ac1cd284d914fc1c7ec43518cfcc42f18c2890969d5f64602b9abb21d4e55af4ea49772805828a169c773d4b82e7d9300000000d9ea7199844d796140f972b4139b6f2cbc090f90e6cda2606706dc9f928402054039c9810978ea61881b8cc526d65153e1c5036a116cbdc0d5b378d33cf7e9ac0e5375e45148c322b5cb9cbddd9118df6e3d56d41ac8219a47b88801725995590c0000009503a30863e384f528508b0851c26f42a0c8f72afbebea26ee932b4a21ff80cd405df734e6a1c33ab9f433fac63af7c0c55d0745c4fd3e23658533b195176883d09af8c5a9764cac3a8db08938077bbd9fade26f0501579364918c5820cb43450b0000003306785eac2e8fc5873503b0d5793a990ace221564b98436ad9b6f84b5e39f57401a47a97d3212ee59a209f5468df6832ea68a912b7c39c0fc814d80433cb35eba27654077474eb2317b94535893cadb34b01b722d93032ede8ab74682f20f9300000000b95f647ca7a9ce90291fc759e62c5737ffbed817a0384bd3a00f6dc229129919400bddbfc9140cf8102cce5f85b198c5876238d5bd51a17ab77495f0b551f04a368c5762253e40bb19e8b0ce79b98033e5fcdcd8469c87aa4816341675a5d2a607000000d8fc9247357a154f3f89d78faa4cf988dbade4bb559e8d05692a78079569162d409f5c2bf30e624d42186c03833ec811e78574b69aba0af4eee3d48a199ab077e0dc5c69bb7bcb68159102246aefac5a1084607336fccc038f8d8ffc4faabe1b09000000ea0fefef8300b194e14e671bb0f86d6361c908ed3f289937eec957b3c3d44388402c8fb4641be82b5c8eb5fefde1a0835d1f8dc52869cafa6b33dd5698471d9cc39ed78fbbfcf88ae6bcd3d43e1d327de0aebd37327b052e220e36f384eed3d00e000000c3438b232b2c86d4b40eec0f72e2b51f94c333e4005ae17894624c5b00f6243f402a08065be7b092c5318be6ccbf7c2350caa5525f2c8947ad3d757b31ef207f5cd27ead5b8d94237edbc84786486647a69e6f7da0c2c103f3ef0fbf56747e75020000002d09da226e65c19cf88b19ea6cf73ec03b5a027520b4f620aeabf906baf925c5407adb3f4427690e4cd2f6afa766295c533b0eabef70214f378d930c6a8bd97655a86a0357fea8625abee2190ef59b62d9d5fb3f4afbebe96298794c1b91f0ff010000005633fda0e7f082608feb87156a2fd05fa1b8eef994185eb6cf9323258f4af06e407e3b178a4833e4ddd62243ecb037162a6105b3ec96c71fc7a8e73e6029e59f9f78576fbc61f5b2407659bcc0e6d8c3d4395904ad8e1c750bb63df7f04fdd9f0b000000a8b1c58c4297fd3f8178c44318bee5738fa857f0ba21b547637c221ff0a6bc2a403e8dd4d6f8225b95a4dc325db744df6f500e2e8a13d030b1cadde5ba21426a3e34b13d8d921719610e8c09b20d43000de00792d2e763caa1cfecb333f84ce30e0000000e179edf54684f661cb6a5d034114c88bbf9bbf3c38cdd8a1152f9ed9161ef10400c83e2f881c37b40183e8470741199155fca1ef4eaea58e062145e286818df6c7813ad07d5f541d7574ffe2b313e9fbeea104b91c40d6274caf65603e1c83d0900000042321264c2ac9cddf0cdabffffc49df466c96438851b25aa46fb8ca544264476405581649c3936d4124c68a1f80c4b7446cc88f8bf621a46a3177e022239dc2745190b1b0641c20b4f3c4907bd63d515419fcb74c835c93bd54fbb6d8d2a34b50d000000661d3c09cbd4d78c3ac9573bde7ea98ab5987b5903a3fbf4281fe8288b918bcf40f0d9297ec66b4ba7ad9ace31bc63a9199ccc8707c806106c31564c87c78b56e1001ec73ae5ec01c1258738ad4f9b37b7640ee1ad4d33ae79875967578f064f0100000026e20ff81f03a296eaa397d52aeaf5a0beec16c38409856591cbbe96e07cb147403a1bbb70dfc999c8d30d017ed396efe5ec1e8eca25ef4a8d3f647bcf6ef40aca29404687d57c68596564460bbda8370c17f41e921277839add526514ea5a4d0500000064670b8c65317466675b39bf62e1dcaca8c0ce2fe24e0adf4a21fffd13f71fa940719c3dc75bb93020ec1fea267571fdb10c22ee3dd4d7bd737f71054073da302540f9d3cfcb6c3f54b6e4580bc02e464fe7af3048dc79036a43c8c69987dd210a00000033430e34fb7c049873b4f97ce4cc0c9f5f4e23cfeeb470698962ed5553a494da4008bc79a9550b6555c3818d0cf4fad054299033b83b05947fd8896bd6cba25cc40ae28bf9346e4fbd489385631f815dadb9fc86e11ebd3ea9bd46df1a6666aa0d000000159a0bc3d3c143eb219771e5df48d29b9ebc37caf16d112b015ce6a79002756e407d601262c781a5918b20baa621489c8b6ed46c95a4cddd6b9576725802f1954ce9f539705ec172d5393b1faa94a1dc9c0457b0e5d6d3cea1b1242f297c00ec0500000057419f836904605efb22e7b7306d53df3ff0a433b8be1d9a62913ad592dce991405acb2d02fa3ae645377d53c34c589f738dc00c91da76d4e42ccbdf9557197b81f37f6c33cb015840703a0a20b69f6f014feae4842c08e43986ab7ee5940a68040000001cce0f52b5757299ffffffff00000000000000801b9791017247ffacc4a7364235fa0dd765c1e097b9013944f903fc932d1184d2ec1c0a222258f58864a910183d0192e3072e44f99234387c1f12b63b599247b5de9bc470ffffffff0000000000000080e9d59101118df003fae71ed74ddc39c446dd97d6c50d337efedbc0bf48ddc22f63ecefc5c2b70f7a2b9e7d54009cf2cd0d996af08b4e995eb86b604bc34ee55bf01014b2fe530100b5ee9c720102070100014700094603118df003fae71ed74ddc39c446dd97d6c50d337efedbc0bf48ddc22f63ecefc5002101241011ef55aaffffff110203040501a09bc7a9870000000006010191d5e90000000100ffffffff000000000000000063b6da1500001f22027b8ac000001f22027b8ac76fe104470005fa710191d5e70191971bc400000003000000000000002e06284801017ee68d1f5da6427dcb62e7f42b83a17a490e2da21fe07466ae190c747d792895000328480101635978f09808d93ab83827b44048d1e83d963f70a6de275333bc133638e481da002028480101c63e19815472cbed4bb2a78791908e3f707b4732ac0707f5c882d242590ed2530014009800001f22026c48840191d5e8c231eb54fde59a0971ed78a23e895cdb39fc8c8d45ca65d8261afd36c545495e9de4345d09a2d96be10d97e5b45177af4158bdeb6571b630b2c4ad3851ee6b8600fe9a5100b5ee9c72020201eb00010000518a00000946037247ffacc4a7364235fa0dd765c1e097b9013944f903fc932d1184d2ec1c0a2200190001241011ef55aaffffff11000200030004000501a09bc7a9870000000006010191971b0000000100ffffffff000000000000000063b5fa1600001f1de8c9020000001f1de8c90204acc0ff470005f98a0191971901918e28c400000003000000000000002e000628480101c4a9b35152d8c0c28ceace9b88e06c83d2d36f35dcc15f6edd69410a93c67be10003284801015b7306c0faf426a524a79741a4b9985e8e0bb3084b731dd8b8bff4462d3f08be001824894a33f6fd7ad0e18867be8919b8b00d6fe2078b7c97af9dc69e7fee28d13a05fbbd0927647dcaef9bba93bfacd6f5ca8734c85fbcaca5b208b9196e69ae6e03c0993f3196c0000700080009000a009800001f1de8aa7d840191971a514dc9cc928172df41427a94ea30f7c218939047e9e9da9da0ee545504222ced0df5309b4c058e1e2d7029e8369c0faa24dc743e78dccac5b88b327529a6818628480101972f6d7cda2ddee54daad13c56849cbce332324c0a0500b2615b4b43d6e66ae300040001022848010122012dc4152831a1cd12d1979d5647a30ce1c66d77f3bc109e570c189e40bf4600072457cca5e8f0cfd7c04773594002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac000b000c000d000e28480101affe7e830fc644d403d061945c5d149945016c40cd5e146f5a010f83dfe23e4e0002003fb000000000400000000000000023c33f5f011dcd650008f0cfd7c04773594004210150000f220120001000112848010157916254275f377f40dbeb23fc729f71d4e073e95c7ac88595403749ec2fcec300032202d8001200132848010124d21cf7ae96b1c55a1230e823db0317ce24ec33e3bf2585c79605684304faf200072201200014001528480101fd78695ffd58402e209cb0b060c95b1a8a83dae389c7eac9554a3c086e52b8980007220120001600172201ce002100222848010114265b804cdb772e1c9a48d1dd67ad6e9315495151d6f49bf5f203b2b883ae7c000c2201200018001928480101ff9fb607464434b8240b30817c4e6c358ad723c3ddeed45b2b82d45b9fb0f6210004220120001a001b2848010135495972e4dffc56ffc325d2abeaa6db04e07d832cc8b8847ae195158fd724d20002220120001c001d220120001e001f28480101ab446ae5250a0e5acbf42540f12f69bc49e22d74782881442954471a01c67d6c0005010120002028480101e1e66c22df500de6499c055de17ff3d1216fe5f15247186dde0708e01c52526300010024c201000000fa000000fa000003e800000017284801018a578354d0e325c947e233195601d025ecd3eff0ebee1ccb50f6c73069ff1bb6000a0101480023012b1263b5fa1363b6fa1300e400640fffffffffffff8ac000240202c80025002602012000270028020120002d002e0201200029002a020120002b002c0201200039003a0201200077007802012000b500b602012000f300f4020120002f00300201200031003202012001310132020120016f017002012001ad01ae0201ce003300340201200035003602012000370038009b1ce3a049e2a648d2cbc355a633c404e2518caf9b3f623e524a4d98f3ce1ac48601d9721314c0025ed5f7ff6825aabaafe477aaec7b83921ba90cf18dd33ff4f03e2f7b35bc4a4e9c582722763860009b1ce3a049e292c5c6d6f954a867c892357ac80f88481f3a48f7b0c77a5aa9f1665255b589bb8002575d45a86c57904ceefb39cc1209d689bc4c761581b3f27d9cc7c1fd281b36c58013fe7f1d1d20009b1ce3a049e2b18faf76e895cce74f6c9d3c950f542006c4389b8117560f43861b11740c67ba40024e45e786e507af7222a228ac5c6afc0ce82e4f2b06c03fcc2ccc11f18f74102de79e527e3db320009b1ce3a049e282c1bdd531d3dd9732bc96c2ebaf4eb3f9b62b19183748789d536306a74f00600002474ecfb38a96e183e3467b8107ade8d739831136c871851b1714017416f7471676f8f45bad8920020120003b003c0201200059005a020120003d003e020120004b004c020120003f0040020120004500460201200041004202012000430044009b1ce3a049e289c9e73f191d4283177c92bf8ac1f0da7c1da78bf7e2050920230272838fa1310006d5ec6f1a9fc4fba04c54d49d0c2a248697f32eaba92097fd5d726fa4e91f749e61f55e1b37d460009b1ce3a049e280bb131734f31b4ea3d4e917adc09c1e84abb46a8068ee100c9a6b1b167fa80b8006d5ec6f1a9fc4c34c8f378c65a7a2f837c86a9c061d6afb43bb893755048ae64876e99d2b0c2da0009b1ce3a049e29c9b8ce9bbde05be12a4d9f3affdcd369b8bc5b5e8b53cdf4d69003f40f363cc8006d3d187e636f6fc27cd80b3fd0e46b373e778d9de40a15bdd34327d709724c56d12e679830b3c60009b1ce3a049e298ce689b1a1a0f969f4e25761c72bf00934048864f06e6ba9a94c5593f200cf70006cbef524d0fce258127502a6c4d42b201970a44a30069fa999390d4df8425368c992461161f4760020120004700480201200049004a009b1ce3a049e2935d404474364ba370a633a61f54e67a41093d6955d7642babb97c89bde6beb34006cbdcbfcc76e34116118ca6141513385bce13e34d6854fac170cba9d216efc5f71c1423d3ca8e60009b1ce3a049e2bb83ce23746c4e4bc632a548c00f6c0a824d5e29dd6f645047da88ac8aa48bf6c006cbd445b2ffafe427283ea0bd92891d48b32f4464f1489fae9684ef47e15bc33d865089bc8da720009b1ce3a049e2a8ab7999f15bb906dde3662f920f755d3751081a1516c23c14204f4eb20b858a0006ca9c06034fdf5ffa7efe55a1b9a55e20d9a0d5b34ddda9cc8fb15cd3810480f41b5fabcb599a20009b1ce3a049e29736ace17163c9b62a2b50e19d1e3d0922a9f6539bb38aeacd69a4010b658fa10006ca03b170bd4a07a104cc175cff079e7ddc767de7c18945406ae521e14ab5093ddc4ed618175e20020120004d004e02012000530054020120004f005002012000510052009b1ce3a049e291c40800100a97b005de385d5818fb2da6ce07e094672d6a2dc2a4a952abc0c60006ae6d2d365d97518743ced0ce2f84909844c1b90f000a3ec96c66896d5a2ef71c3cfab5f2125fa0009b1ce3a049e28469db1b334cd9f397039743d91e9981eaa16abb270250014c5e16a58ca1b5c7c0068b34574b86f1f4a6303ed5565e9878c5b727902d93cdac1a9c9c3531c56a42db05aaabb7a25220009b1ce3a049e295939b69764168cef7dc95ba41d204950bdd3d7e6239afae80999b756a0567e940068b313a505b72a325a469419b77eb341c7cb49b14545c1ee06df4301a0ac566bdda425e82e883a0009b1ce3a049e287abe91624072afb041d2822f30cafd98bc89b007b137a2ffcd7d4f99ddbe33880068b30e2e08c48483b4199504264abb17d1db2b27514b626c70d308431230755e346d1aa0a9022200201200055005602012000570058009b1ce3a049e2b742ec54052f50dfcd06eb602be3d5fd3a23e648c22832667213e69eef5e7066c0068aa2a251e7bb2b820f19876b593dcd332fd692fb7ce62f133d69afd1538ddaed2d10df2ed32720009b1ce3a049e2974540a78d19fc2c0e725b1d66db33cf1e951b2b3aa965a97f21f45060fa529d00068aa2a250c32d352accf8f07d56050efd8fb3e0ac9ada86b58d4526bf3694237f3d4f77bd27a860009b1ce3a049e295765ed49357ef9f563a7b57dc2d9e4f5358b3039a1de26ac49b958c2c96029c80065eb23c6fc02100345699c0a7769e728979a56dabbfbed01233bd99dd2d0bc544bcb54b9cad9ce0009b1ce3a049e291bada8b50a880ba4c01f71aab4f94f8ac15055312f4d341daabeb412906581d80064458e29fa6caf18e28452aad9bd641f98e55d7744039595724c1ae5286a6a26ac2917414715c20020120005b005c0201200069006a020120005d005e02012000630064020120005f006002012000610062009b1ce3a049e29aa2c572a23a5eb09f0dbf28441786b7d5250ac6a78637e59a9f0b78ede76e3c0006442b3dd6c77945e0cfa335d13c8bdc2cb6c84c534419d6a4a0d1d2427f5f7c6b3d52e5377ffae0009b1ce3a049e29e2c17894ae88a0252b2587efaba791da2b5c94c6671d2bab2bd398365fe5ce94006441afe0203047e141a8cd5031943574478d98f63ac3454492ad47adb30c1b3531c8cc349a7ad20009b1ce3a049e293d74bb369b5bf57114768e8cbda9bd5ec27e4cb769078be3396aad85550222c0006431cae1743bcca73ab24af4170e8a646f6faf62520a9e70ae02f66a8faa8d739ef087bfc7e5ea0009b1ce3a049e2baf5b30f31d7f79c56871dd3254a11bd04aed5658ece0f5ada93ee479d19c3ab0006431caded1652427b0096de4bc955d34d0aec0615701d8a028e921f17a53bb9348a002f13d86fe00201200065006602012000670068009b1ce3a049e2944e8b288d770e4637043c530929a3585582a884e3ab938fa1c0a54c013b3d41c0064316ee853abf0bbd302453127d952ee1de2b6eb1b4d3effa98ee8a6a66d2d1cf34f60a8adf4ee0009b1ce3a049e28b679d697f94b2f5d1d21ea69cccc8a48ed14cdc524a0309566061e9b24757b8c0064293736a90abcdcdb94b5329e0ff38fb4327c57407542d0bcf751c201644c0ec7eb9dfc76c84a0009b1ce3a049e29c0984a39aafbea5a4bcb6aa5a786f0518915f46d418f7677f9454b5f9344c0a000642924e11f304a78b4f2d833b5dfc6c48d222ade39fa4a96bc874e62b16ade02c50ac553929e920009b1ce3a049e28f28257b99c0b218434227a09313b8505a7c04e00bf153f2048a63d767efc9f6c00642924e0bb08748491234782701a48ea4a5a886cf15f978781699d77e4c3f6bf2ea201b3ebab5a0020120006b006c02012000710072020120006d006e020120006f0070009b1ce3a049e29471da9a9f98130ab3db64267de80cb1ada29e6235b3b0a1eeaa1f50ed4f57154006428a1856db3558a899164b1822d2e39dac978d93383eb78d0354004ae047083bd1275fa5323b60009b1ce3a049e2987e2236f137f4d728b18ba37f8206f788ac0556476fc9e061d5ea9a6ab42414c006428a1855b1682354621106c08ebc3e44c338088f0c135efbbc18605d7ddfab414ab0b88c4806e0009b1ce3a049e2b29ea27cc6837a07e7ab08b0a2d7f01ed05bb2cd4026a555b8e08cdee3d46556c0064283931c52d4e4ccb3c8c877acf99513bd653d35def60e18fae62414b0b3be77073c36abc72760009b1ce3a049e29449b59801b217261dda3bde3c159feb4bbd9a9f1b7e508ea108bcec4d8cc807c00625aa4d8c2e142778e76b5162b3acd0d538d0ce14f1f870abc0d7b4516106d364582e1e4bb310600201200073007402012000750076009b1ce3a049e2add2fbf51b1058e67e00af9442cb3f6acb96e944be2c495f05bd81531e453fe5000625a888def58e0df8da74fd965e4d1bb896131555669d612c644f8e8e2d51b91521ccc12a575d20009b1ce3a049e282bef33d05affc64081b515e96905f539f950be330fc45ae26195830fc08156c400623ace56ad25787d38e728dd85d6c10021deded0962c65c77f742201cf5e27d2382e3cd525f31a0009b1ce3a049e2aa6706f8ebb11f9ac5bcaf744507f26d46922f55c9c6356433888268ef617d6840061df06b59ce3dec585c80807a816a6d3ac84a149a069ede2c4aebb370439d8419e8e05c7dddfae0009b1ce3a049e28321025936dd95a87da4d5d09275065b8f7f2f1bcd32e8ef7f5b5288a74b9d4180060cf919844976253e530f138dc23034ab3a93aa105beba7f3adfc8fac6756c6a41d3b17ec8c05200201200079007a02012000970098020120007b007c0201200089008a020120007d007e02012000830084020120007f008002012000810082009b1ce3a049e2821ba74620ce2d667a28a6df5ba02c6ae25b8ed853e946b830b6f4966bdd641c00060390f9a32985fc8f78839e5db3ad4221bd66f6d6180cf1184d5d96583bf2ed103649493e116820009b1ce3a049e2ba09003b41c58e8db182ff64175287e5bf15a87929e4585f02376d1f05650d77c005fe4cece117c5e4b8c2ebccf36bbbb976ebbcbeb7953d5946c815783d21c88131d32e40692dd220009b1ce3a049e2bab268d19018bf5728faf4d05057a7d0daaf120499451c0a7298a164d078a8824005fd865cc547bbf07c0bf6f11a135ee1c6c851d45a7348cb431f9172132ee32466b138b1525fa660009b1ce3a049e28fb755bc661dfe0b0dbf86a70788f1f3ca1b9db2e6efed7d0cf551764e53d988c005fd1e419c7a2ca7a33cc15c7eb18478d558617106c49971e53fb44cefdcfd01def54676324c8aa00201200085008602012000870088009b1ce3a049e2b4a6cf189c2c9f974e98e12ec9bd05b676ef6e6fede28ad5be9a79f0704e9dc44005fab11246b9c19d6c2dc87c6cfb33d88ffd3b1f2f220f90092ee20f25a0cf94490b56b50cfee220009b1ce3a049e293f62b721828a6cd53fa91268ff8607debee1f2b441a3720f02916edb55432358005fa6503999301f14cb33c7d6fe094c752529ee15ce9a43482d7e9cf6f76583ef338760706c84e20009b1ce3a049e280abb49fe846ce7a52f395e39475f99078f9f7e22a5c66a9008035df7ed157ce8005f9fc7fead3bbe7ecc28b733ac93e707cf11ab01189010d43e05211703894bac9a0f9f6b7e9d9e0009b1ce3a049e28aeeef9b82ab860278bb5c4be9079507aea5f2331ec789ddb7a17df2b66812644005f8aef6462def9a3325d669b08511eda154caf8e2a894674119b58682a68c27e24f20ccdeb07660020120008b008c02012000910092020120008d008e020120008f0090009b1ce3a049e2911ed6308937ca4e76e6ee7b314b29739c12aa766f4a510e506658d741abe8020005f697be1762d153fc4158940c46108797153c2e535b84c6d4fdf70f945f866d2bb19774a38d57e0009b1ce3a049e2b3ce51fd6ba23f3fa5a54b4bd2cf53eee8529463786dbfcda54611775717f7988005f3ad2947f113018dfd4152ff370f50ab0a7de08ede0cd56d266a28868d87b6099a40a45353c6e0009b1ce3a049e29e5a415ab3b728ba97f6ab54bddadeedb87195adad960fd501dc4f0f26683181c005da9e82b4397f688373683b06a1fcb1f2e01f2e650b9cd6f64e5df8e5826b646f4a4e8028df2ce0009b1ce3a049e2a279a07b15068ba07074382484fee7d123226e488e6953f1ab17a7f22af7918e8005da90b177a6aa13cb7269341296477bfe73faa48d3b782a9d242932658b1fbc0dd9da4dd8eaf6a00201200093009402012000950096009b1ce3a049e29066297aff61ae68ae2bdfc1b96dbfb9e2cc40e8115682b7063bea7e242130608005d2315b533151c4c02af186d0d951f649d9091d98f7646afa8e1336f3c97523262947a2f7f66260009b1ce3a049e2b6ab2d3612fe83e1afe38015079a3637c654335eea9793b35570c111ce6f235a8005cfbb61187fa6ecb7250bf2fc6c9bc6f91dfb5151f1354900de181ddc4e471069af8c40c7d2c3a0009b1ce3a049e2a6bacd2a55191790f11941f2539d11a203cc15829af1e7733d21146ef98cd35a8005ce906dcc206c6b0650a4773c4cb96e0d7674437b0084f8dbcdde8a5a06da4f55381027ee840760009b1ce3a049e2b02e78ac66245f54e4682b256e2e1e78a3845495149bf30ffe1029d8df2a7df58005ca3759f5a16eb6b90d0b43e4f4e2004fa75686da2228a063f2c36015dae01b3aba01233956c9600201200099009a02012000a700a8020120009b009c02012000a100a2020120009d009e020120009f00a0009b1ce3a049e2aacd93eacad13ade2660491bbdf0aebb138b95506d0f94fdaee1d00e52af6f1cc005c85a63e65d165ee4b71ea37c53a39d78c22a7d5444337bcab1ea092bffc9f7bb7550d0fa929fe0009b1ce3a049e28c1244c21bcc517e1b19d41a304a9ba4be6243f6955227308b13448348ed84818005c23f0e7bb20776f9bd85d5b0016f6d5dfa99d23eb5ac4b1575af05db1dedd6a9a39f171313fc60009b1ce3a049e29496906da5a771d92195f62b47ed9e381889ccd2a62b0a97f3da2a8bd88598fd0005c064f51cfe12cb2b2f620d8add53a175a14d651ce70897b905fa513c6c747fd62077c0ac132ae0009b1ce3a049e2bbde6b1c06d0787acbcfa999e72079aa3a73081934dc2ed8272ad5db937986498005c061f9324eea396ff9b8ad8c438eafc451fd474a77e974b1bfa3e3a53a5d549c84f365471a24e002012000a300a402012000a500a6009b1ce3a049e28071d124a8884a614c9eaef2e53227a0f4a586063e3a37f406a42c6e994949eb8005bfe81000b963ee4e016f51815d3338ab8c29e0bd03890feab9e861f0fcb68ed8353d02b6b02460009b1ce3a049e29a60507ab894206f666d586bc3e3169274f155d17e66604ef0f435a20b50ded4c005aa2d7d1281a13f95778029be79b4a96dfd0a7896c2f1b2303e461971d9ebea30943f4cbcbe40a0009b1ce3a049e295f4bc0764858cfa785675684fcb6b1d6289e47ea7f808c1e4ab4d2bac81342cc005a9d2958e09216b045d350f2fc365eba43228e9c2f627dcd81169daab5f647006d9446a31d92760009b1ce3a049e282ed580d24d171512fdc784b5244846bbb68dbcb11aeb6db9169cf2e67dc046380058eba2ffb3a8b68cfae9a113091b84c87afe09d9300d3b4a590b6e84e8bbfa27c08ca0ddebb672002012000a900aa02012000af00b002012000ab00ac02012000ad00ae009b1ce3a049e2841c00676953c946df9279c57744e189df9deed07ac0d9d386a92682d2165e028005734c1e1ac757b2b91def8b3e3c77a66db288991637f705e981aef30a18455d634d26513930cce0009b1ce3a049e28013eb1b19ed74c7864c67e2131f655e21be545b075aef8fb8bd65be0d5a19f10005710d2626ad9b1cedd6eb17b65e5f17f4dc0adaa102c83f8c64aa3000dc42d836bff6ded8e1a160009b1ce3a049e2b241d7ae252df18d31930630a2a931fb2957331a36a065af606c2eabcc66ad39c0055b11e90cea9db8b972b6a9871b613e1a8d863525ba82f6631e7b71e5abe6256e0bee0f2d99ae60009b1ce3a049e2871cf25bbccee0121308f659db480711c04a92852990d25f7131244a3f5b0fc500055b11e90cea9d9e07ef68daa54c13e081ad58d7d53812e9544b3ebfdde0940e36ee1414531ba6a002012000b100b202012000b300b4009b1ce3a049e299aa96f8e12b98e4c72db8785dff1d3e21598a5c0d0a110cd96a2aade3b49a5600055a0f4362dcab0c243e0ab84c6ce8324939e1888aea6363bc3b081d6ad18eca492fb89a8125c9a0009b1ce3a049e2b1933b700065b16ed4fb76429320efaa3b2a1b35e4d85e041ece12e559df3f0ec00555de81200af799867e1d8c71f6175a5ea27ba5cfc9e1d27e6234e65fd7306a363e0a1de3c51120009b1ce3a049e28bcd155b600077be4f3bef744eda1c7bd07bbb2789b5b49b0bfb5007aa4bf35c80054ea39e797181f64ad9c733608f13df6351de16e5451bc614bff07d4f753123d1b2eee0c03bb460009b1ce3a049e2827debb2d6982b406c4fd12aabb08e04c6e49d0fccc0b6445faf6eb0a3eff9db80052ac334bc437176802d2ba64eec84cad5b03ab06554b3f0e1e57ac20967e14ebc37106f31153ae002012000b700b802012000d500d602012000b900ba02012000c700c802012000bb00bc02012000c100c202012000bd00be02012000bf00c0009b1ce3a049e2901275f1ce9f450ba8cc6db7c15cac2cfb9f063883e6965043a97554188e7117400527ee657885b5d06a492cb59bef4c9ab52def25e140442bbe9f26e63e71ae787a9a7fbfa1aa8860009b1ce3a049e2957c241e45b2bdd488ad056fab9193bce7853dce8746804d43a8c88ffbb80ce0000522ee508b5af3faf9675e686c90fe2a02290d434d32e987beb21ecda88dc46dbbec0f2537f5e0e0009b1ce3a049e2b61ae9b7374312add98b92caa2571707028262a7912b6f90dea389e20cbd19ba000513bfff15007cc51e74a504d562876807e239c6cb607461d858c47336791a1bbfa84f3964353960009b1ce3a049e2aed4353c188fe743d6f7d48f71e1deb788007f79be942a0a2d427ccad38fe7bd000513bfff15007ce158086f70a6e1366c4ddf33f82641fe760fed5c84a92fe68da8a3967be66b776002012000c300c402012000c500c6009b1ce3a049e2b40020c31f5d18eadfcb6a894e9897fff04574a3cc8672a57064d93e0cee890e000513bfff15007ce2a10b37bcb1ec1baed930bf99ce1842d6380c306b80fcb5ff2971f5fbaf3cd3e0009b1ce3a049e293030b0b541c233401599189d016f4b6fe09855ed32a2a63bcb7e969a7ed844c000513bfff15007cc940fa67fc37c020ba8a5ce7e7a9e40073034f2005e95432538a8f9d72a496b0e0009b1ce3a049e293943dd49fb93a7a5f6543e0e60286814853696794613aa8772a7351e1211846800513bfff15007cd8ada53fbe1b8204016a111b642c5c10b6efb15a9157ee01f73d1fc76ce6f42b20009b1ce3a049e2af03069a54dfd5be35f5387176eac3b1482818e083f0d8c24bf449667515681cc00513bfff15007ceb823314e26d653a3dce059977a0c83c970a98befcf5e75c937aa9db29d67feaa002012000c900ca02012000cf00d002012000cb00cc02012000cd00ce009b1ce3a049e292a300ad4cdfd4caa273d16c87d76f16b915c1eaa6e7f2fa2474860159e5316e800513bfff15007cf0e08c7ddf1bfc3c18fc59d5a8c49b262d4a98de685d888117d87e80e3688c12e0009b1ce3a049e2a919b28c41a9ec7dff19fa47f94e480268a6d1016f3cbe71fb85d34af80b8ed1000513bfff15007cc9b866bb0a015a1b9cb4a04259e75c2854e14017f653f3e42e34e3e2f87ebeb1e0009b1ce3a049e29a29773dcbb99c21b4880e3e272fbd337ca9fe1e049fb6a4f55c24fe294a564c400513bfff15007cc264b4a58989a560db1e2b784ec64a2cd7f1e31f707785189844a455aa2f019da0009b1ce3a049e28d25715d7c509e77edd76694f8f26eec7c8413251411909c7af567b5db6e44e6800513bfff15007cc200da27d131557afb6ca1c7542ed43c867320507d68f6595dd01e0bb32c471ae002012000d100d202012000d300d4009b1ce3a049e2a3e6ca3646e38e7a31f5c50297770cc2b349459f55a56d0e58a6ce681c9f8044800513bfff15007ce22d3e8b9e0208c7324c00eaf69b7ea62df5ba4fa59714f465dee6a87953d8c420009b1ce3a049e2abb0f8a556557122b1c78dd74dc42320717e2dc77709b6255edeeda39707e526000513bfff15007cffec45c828ddfd9fc9b3f6fcc0b358d37753667ccb44a8a5af094e0c9c6ec36060009b1ce3a049e2831f5c26c4b084533faecf41685b8a471c5b9d9cec7863aa5a3c034ed00fd246400513bfff15007cebc819c25d36ea49ec9b99cfdd3cfaf91d642ba9dc94ff8273ef4a7b4fd1690220009b1ce3a049e2be29785d1bc4a0f51980c8fd49124d40eddb1f15596870e038e264975d6f893d800513bfff15007ccc9ba8487cda2ccc88d92c89a7c1459c7585459e44f942bb38fcf192199fbfba2002012000d700d802012000e500e602012000d900da02012000df00e002012000db00dc02012000dd00de009b1ce3a049e2bb0f233d872fcb2d228d3207d1f13d4bece7de908aa57172d16fc2b18ddf4a85400513bfff15007cd6680c6a2a94f3515ee812cc8865a8cfb40ae24128c0f68230d7f03c9055c1dae0009b1ce3a049e2b8db14c6aaa2f866fb2f4ff42d1ec9eec7b9e5cd5928e7637c9767e1f92e12c3400513bfff15007cc82336dc9226ff3651616ad7d83224c1c7bfdfc647001283ccfeabb8a38e526120009b1ce3a049e2b80ffc517086cace7e3a2dcdd346fc7038818f639f3bfdb8c7c7d21ab48f86ae800513bfff15007cdba3eccda1a1a67603cc4de6a8b3de4f6f42c68b481bb25667ad0f2a4882697e20009b1ce3a049e2999f32052a727f0f9b97b6b464100e7b98497c51a3a09891d45f20a2a1469461c00513bfff15007ccc9c22d344f11ca4eb99dd0fbb543fc11dfb1e86e3206669bb76df787e1f02bbe002012000e100e202012000e300e4009b1ce3a049e282e648d2ca0e6df4a2f1d1c7eb28d3aad3222d0a09772a76fb59f9d2e25c1204800513bfff15007cf32f2c478c701e91245aa3d88dd55817e44c73d0c42da9f2e84161d79c27c223a0009b1ce3a049e296cce7759d0f8bbe6d8ed7eb04ef03cb6aab0d3c526dca33ed760c7a3548b3ec400513bfff15007cd2e07107e20b6685a7c898dec3007a9785808ed41d747c0d75078d63b7c76d0e60009b1ce3a049e2a1204dcc80b3894cbbd36fbc8109c7e00c021a7c5f97c89d9bee58ca939b6e89c0050f4493edf91f7909342cba491b08507f8a25ba54c409ba6d10cf7b9cb58a3eaf5e464fd7bfe5e0009b1ce3a049e294d9e08f5db713462be9d6489395f307791061022fead57d702f881e4bf4bd2900050f4493edf871cbf783a061684fbe1608e701ea2c6f13371cf276862016b349ebc1150977c0536002012000e700e802012000ed00ee02012000e900ea02012000eb00ec009b1ce3a049e2818ad2888674a9749cc3bd067072f8accd45df22ba072bb2c222d1e6311fd19880050f4493edf46741bed0b68ff4bf4108f22687b94f94b3a45c56a98c5a293986b062a2c72c4da460009b1ce3a049e28a61b304d9fc54d663f44c234ca5d48cfafdeed2a016b77b252e39a0fda9d2e300050f4493edeb9ec60dd58645d6b8d97fe4ba07286e084488fabb602c0872b5e57c6705ed9de64020009b1ce3a049e282bf0073c918630a258c74ff2f414c54937905130abbdf9f3bee14a483b9c59e00050f4493dbf2bf68ea011dc72f54b87e8b43c94a59c6d499c19394fa56f6d0df127a393d11b77da0009b1ce3a049e29a0941cd8acf3766d2e116d82cfeb978e30d9781792c49c4e25af56206b0989940050f3a919aba794a9cd2bf686dbe7ba6d440aaaf67f9be34e0b3d990749e7e700949d420578a8a6002012000ef00f002012000f100f2009b1ce3a049e2aa8c29c567df57e4c607e855c32109db1067b64a19e311ea4d6282e167c4328d40050b5e83035c32c24f830979f1ba394187d506e3dd3568fed7c2f320e5760c540b5393b590983f20009b1ce3a049e2ad2972c8630fe91a3bc02ef85cdc3fb79a0ed805f7cc475e14cb8874b0154c1a80050aa2164c7b71023fef9cf49149b2e2a3fd7dec7dda3a1f0d120cdd262f6ced9b72be999785cb60009b1ce3a049e29c245d6cff5686353ddfc05f7e68b2971c6db45fce1e1dcb4bb6be30ba6a820dc00507d2df05ad25864170278680894f6ea68ca69ed38d7c8004d9acc66269c52dcba495130bf58960009b1ce3a049e2968874d8beb06f71ef35715d46ccbcb2aa9ce478a2858fb7a3d33ab2254a645f4005043e80999e13c424f5e283adc3e8da52c90a2dcbd07e311c826dbc4b63dd81990fb6cb7309bc6002012000f500f60201200113011402012000f700f80201200105010602012000f900fa02012000ff010002012000fb00fc02012000fd00fe009b1ce3a049e28cb5061606d422bb7ad6d7d7d8a28489cb08095eb45570cdba6c56c2b7d17c604005016ff638652aac0b948f616efdbdce362a389bdc2ff7c1596075ae4b69a6092b2a7535ff8c2360009b1ce3a049e298c8191c9bae4c59adc82cf4c6e045716c573523b7316b2060bbcdfe096d86460004fec538606bde6dcc150c16fe0897241e80f4413339d2e0415efaa02a2c352173263a0a0b3e2760009b1ce3a049e286e5ad77d7667fcff3bc6e02b676e6ab8ce1e37119ce02d3fff6b110d9b81f638004fdad9770d0b69559766f814cee12945ec3c4a16cd5fe28b8aa917aabc059569c0591e5ab8eee60009b1ce3a049e2b19c93731a4cd513cd7d2fe3d4a5c2942a1a045dd983f4dd4a4f15ba034116f80004ec863067eb28a9fe01ee4c98aa31c42d62389794ddae1692e08d60154e0b6a8674d7a46cfd61600201200101010202012001030104009b1ce3a049e2a0b1572161f50ddfb8832cc799d3533c511619f47e8a41e304593a820af4a03c0004e999ea7b557d2a3ea0c15b74bf9ca563a8cecb1faec9acdb620557a084a7c862e19df048f83ea0009b1ce3a049e2ae46b832d576995b717be55d264c91c7402b0fc68d0347dd81d1952187436a20c004e0f8ab3058996c7839a36d9c3a50549fe17f50cbb02e554a4b2c1d257004b4c9f707134a7c6e20009b1ce3a049e288d595a7d3cfd701f98ab41ffbcaf7428cca3f52c334acd63d3d0dddce7ccd910004d9745c144804c5fa55f0aa07f8a913949529f844a6d4575c26fe919a23051ac8ba288dadf10e20009b1ce3a049e2b7b09c75e45ad8a49aa3aa812b82c081202c5aee99fa8c60d548802c79b4bf444004d8af4ea10e74d528e1f2a08f6c977deb5e1ba1eabecda6ce4b2ee114eb8f678ca2918f77b615e002012001070108020120010d010e0201200109010a020120010b010c009b1ce3a049e29ad7ddfef762f538241d3f90c0a9687d8f40ab17601501900a396ddb54cc53d88004d8ab975375c82495ebb678b36f86245c959728e2166f3600d364b3843284667a297061efb9b060009b1ce3a049e2b083d2e5fdfc69d99ff919eb171efb62a9ba26427464aa896a861f9d34c420c80004d882a060e942a923f7fbb1c77f24be5deabda8e6b8930675d0751aa2d8335dc8d710cb929842e0009b1ce3a049e29d5decb6fe87ae4271f9c7927ada5ea5dae5ea9271d0aa801db52268796a9e588004d875aef1a343695ae334a41002a3acb6bd81cee5ef4258f7c1003c7d2f7f4c3b9b385c711968e0009b1ce3a049e28037f2b97dc5f1cc95756631452889d6978d87f646f16fea3f7db618fb209bb98004d355fa800573bce1db1c705c494511a33bffd387a79d10f195d0ba82653325f88a7d52b8ee7260020120010f011002012001110112009b1ce3a049e2b99dca674075767452664538af4916e07466d2a6902c4b0416f88ef491ac96024004d3118e16e77628b43081357b4885f7d6a67a762a88101e31026031cf6ec6bc1fe92976035cd8a0009b1ce3a049e2a08543d096759612006102899937682337abec8c99ea22a74490808d89d48d61c004d0d88d5e4e6c8d3a5c152504a1ce49bbd0c5f022169be07c1f530da7255c17855a8bd810dde7e0009b1ce3a049e29d0f5b485f67f770c2248d72698bef387777000200e5166e98a852da4ce166cdc004ca3fddb4acc759a28a87acfaff5de1c222cf4af07dc11e8e3fa4aadef5dab7ce01c114e5b9f6a0009b1ce3a049e2ace273f15936c3c404f706056186debd8d8321f6daf9650b727b8545dc9bca398004c216a2bf9fc1ee53147ee1c9a4d4900c0c292df9fee569b02e0554c91ea3774f861af81fc3c960020120011501160201200123012402012001170118020120011d011e0201200119011a020120011b011c009b1ce3a049e2924fcdcc09b78f5096dfdbdffa013a7b4a1ff1d05af7bd1af5ad935a5e702256c004c216a2bf9584125ea341585947baa0194b1406662fccc2693dd8932211203a1326a59f50ce64a0009b1ce3a049e2a300b60ad13036dc87697cf43e63972320e25649119412e4cf6df6058d245de08004c216a2bb8dfaad16d52d1d34af75b70c1a1c7363abfc373cf7fbf3229cc8be80276825670bff20009b1ce3a049e2ab12281b0854af59c56225d0c562d823cfd83269e98931719349a8e2117bf88f8004c216a2b68c7e398c7b95f42a89c2a5ed53d6ae8dc665a1ae424ef1e961bac85be227ae5dfce5e0009b1ce3a049e29a27e13b44c773be4852de10bc24c9b814a65157044a0a7eae79bb1f151110220004c1b0b26c43d5f23623fe37a6a77b0547345396708c9363518d18af94528b92014a6d7950fe9b20020120011f012002012001210122009b1ce3a049e2994792e1552bdef171bb1d93f6c7246ebeb0988ff760560eb03a609cb691ea020004c1b0b2170412a8dec11592e433234901611fce32fadd47e24f7536ac942b81c5ef7c26d979dae0009b1ce3a049e2bd2f44edd04176d8018e822ef816d3d802567f137ab8f013bddd49b97ce4df238004bd1a19b09d383d9b69681f6a2d635073aeaad83c2107fde9639331762bbdc489662d80881fa460009b1ce3a049e2b4f6ce3a8f250cdaa01bba3f279bc80b1eda3e77302cc92d6280c0056ce9b3770004bd1a19b09d383b08339ae393d96b9a5c519258e1c62c12c65bd32222ad5c45d8f201fa7c8d29e0009b1ce3a049e28829ab227396eea1895f682b335b0cbdae6647d5b81126be2bdc5589fae5c0168004b92044883e911d1dac2c9fa11b7233fb8fed809b60b2242e804da5c370c791909130c6f635d1a002012001250126020120012b012c020120012701280201200129012a009b1ce3a049e2b224ff31ab5f56948096284966641b2af4e94d97b95f0119cc21e168bc255bbb8004b34770b15253e2bae4ce9ca3b27c4b57c5bfd4c91ed11f604df3803cf0beddb4437b63c7ccfb60009b1ce3a049e2a034d1800320c50f81924247fd828f530568d0a7a4c129aa4df4bb3de14ba2f88004a79c285d45e25a13f11ff3180a7b3dd16e833c3a411c9cd17c8859c0c288098c80fa80b47b67a0009b1ce3a049e29dd92968002cdf8e1a3b3db7b2c73a5c61cef94c5725e67f170d2084b820f89e8004a6719a4493e8c848cc771bbc8361d86f381187db7bb35f83fe8ad8241d33b8c2c9acaf59723b60009b1ce3a049e2883951b4017535ded005f60d9ec07c7d1309ee1de98cf763953fe22e42e4097e0004a21b6822126a8a82e510b4d9f501503c4769c8f05cc7f25236f156f00aacdee9b7e06eb07ed820020120012d012e020120012f0130009b1ce3a049e2b636363fdad067925fe16f02a0cc3e6bf889b18c02390984ac1cd4a1551eedc5c004a15f308f70142b3ff15b5771e8aa82e713e2ff3943969629e0f64e0ddb68165d190c2557ce5b60009b1ce3a049e2a52b5f5406fab7c27fa6cc5f672d57ac89134796b9dcd8fd25615ebc926266e5000496b45d7150a906095072f6eb127007e98b0c2c855151bac6b94c20700df1f544969a2a7f853460009b1ce3a049e2af250dfce89a4743d2db425937d774e6e62a96859849c3f1909bbb5a4df96c2980048e63768bb7bd3b41318996d6e8ce34927a5ab553a01ea365fc17998486465516d4fd420aa885a0009b1ce3a049e2ae02a34a1ee88ad3117c65f46f23d3ac72d8724d265078b265194445a850eaf0800483f5079edfcf2220f165e4717e1f52cecafc84e487107c80ec6b4b65d993b9262347297dd74ae00201200133013402012001510152020120013501360201200143014402012001370138020120013d013e0201200139013a020120013b013c009b1ce3a049e2b81fb03b5d303e1f29460d2d04dca417dfe604219fd32efcf9d9424e35bf6d284004792a28c6b944c3943525f8161f8aec2fb535335fc2bbb1ab0b47681903cb447cca69824f1b9ce0009b1ce3a049e2bb26ad8504486b44dddcdfe1118045af1f591be6175fff702871470474f96667800477cb2c3c514600be1e2bdb47318045ffe1bb6e79f6bdbd0bb5413fa37fc222bfbcdfee2e857a20009b1ce3a049e28704ab94923f8bceaaf6e16a144d457f43893f619f210896ee1852cf34bb92c2c004699d3d747aa585d2496398d7959f433a2c366c5656ef64a8b1e04f32f4b49c4156665ec1a258a0009b1ce3a049e28cd5c7246d1041f0b137b4d98caf78fa88638891a0a27823c3ee148e4a3ae8928004686792c6bd60c3536dae1af1fc09513176aff7c79d638ee99ae975fd964bf942db7d0fb91b77a0020120013f014002012001410142009b1ce3a049e2afa1433e595f165d650dab74e52719ce2ed8aeb63a1986dc02d9219379fac95bc00466a146f61157048921455da5b253bf0a0373e940dab1f62c33db1b6c38e2c2509e90b18d6d8b60009b1ce3a049e28c8178eb58eff23c25395a602f6c4eef3d091c30ffb3dd7fd4b1e1b7503eef5000044f31a687517a23a49af7f589fe5c368507b67a2fbbdf28486af9372c42a64f913017cd699bfa20009b1ce3a049e2a8ec93f523e0d87a6539f62015ccce9651b43232b39a5b889e8af9ea3d4b645bc00447417692cfc17a152ab83b747d20af6cae343449237c3b902628861aff74ba65a90133c0e489e0009b1ce3a049e2b099345955edc1f17e08eafafda6bed2cd4b47a2fa6a146d4b1b75d5516e2c6bc0044724a042d0d5d63dd94a980935e004b618f63008b1227557d464cc7cf26e705a8a109108c4efe002012001450146020120014b014c020120014701480201200149014a009b1ce3a049e289a33d4bf8ca5daf4047958ae60c9c138aee25e3e5ec23fa580e4d35c5278db540043d9022fa5018c3c44edb7d681a9eefb9ee72b66ec874c2dcdbbefef4f9cd0ec9131c6e32ba0420009b1ce3a049e2b75c190b3dc3bf6b766a8cfce44cd859f314d29faf6a81ef3af61c294e398d6a40043275ae1d6fae7aaa83f00bd051fbb5536517bb5a916537bcc03e27a87a7ec0af1943fa239f3420009b1ce3a049e2b93568e49fb4455c8226b7cbdc387b7f041632b4bceddf322d7a4efde3a26a3f8004266d6d915536f81055db64e196e3396ede7bea28437c1d49f6db06acff8689eb73b13ea3f53420009b1ce3a049e2a13017f78f9830370ad7b826c440efb3c96643f2480487ef9264860c948c6ca1c00424987dcf2fa1a763a6c36379ecbe3bd2c9d80028a02c67b03e5e663eb0a06339ab1fb7caecfa60020120014d014e020120014f0150009b1ce3a049e2bb7791e901913649db9fee664b93067d1005b677b9c091a77901f526ff1f9ebd4004145f0da9e2c1cfeac07f0e4bc11320a8da8b1b3a66462b53c494a4e14e76c238f26664fffe24e0009b1ce3a049e2b5cdd7f18e3e7b4bd6a1ff6c132ad586f67b8af71c31162438bdbe3ebbd9b97dc004136cd23d1f06a30b8e5463bb6f4bae077e1956a261234d3f1df5317559c2c0cd5f4b8057f475e0009b1ce3a049e2b4e6ba955fa35aa7232779838aeb8c4f32e7e6e6fec8757549f1730f7db992ed400411547fcbd4afbe6fb39fa18008021f69cf749ebd9830bafe10e67757265e392706ee3c38acd6e0009b1ce3a049e2b0b8fc02a5376ee47bb3383ddd8535fb8d28201499b4f2c98ee7e3f1baf8a3e5800411547fb9dfdae9944ac68574578f8ed0bddfca72d4ff96126182d0aba84e1eec9c49d3719eaba0020120015301540201200161016202012001550156020120015b015c020120015701580201200159015a009b1ce3a049e288e83b5266d673af1d57f43fce8a73c09f3c892a42ee243a0f0e593e45b000b740040f33830cb8511d347c45cc9b3c30a240a3994be6e75f39126d0d63cf6a853769ef998ca6d590a0009b1ce3a049e294cd3049ad17207b2bdd4398a0657d504dfae435da41da4f11c359bebad1baa800040033df01c78049a0aba445a362a7aa7b5be60b52a9885315a3c192b5313e881d68322578e79a60009b1ce3a049e2b18745f8e2abf5bae9f5ef9b2fb895dd23a38964a44403615d87e5e19f2ba1844003fe7838f7ff7ea6ba35a67d878b9ce8cd176458a2afbf5b8d642531b3f489a9fde93f24a1ec7120009b1ce3a049e297a7e573f3e6da9ff1354e66fc047c9aca5a413c775d1e266e2ba69e1107f76cc003f730e6021dde47a27dbb19ba353b571991f65bffe5aed1f4760ec1b5e2ffb23dc9430e3a0be220020120015d015e020120015f0160009b1ce3a049e29f49d9527d90ccd614879ffe2440d0c92c2475898433d9bf274d968cfb5282b40003f5622c4952a34e5b6248ae957819c53195463dd7a29277835a5b27323db64cea1c0b8712907ae0009b1ce3a049e2806257e8398aa4d5083c05e62b0526af7955f8dae598dc5d56e961b6d38e8d008003f31d6fded2b7d63653295d7a0ab3ffe70a8e39b431046c93e5a51976ec30f17c81151a28b62420009b1ce3a049e298cc5339b4c90ddb2bccc9ac134c98339b2568cf08e01a6a0383cc1d1d927e784003f1f43143ca274303963b55830d2d2853361134b7618ab43528bbdaf687a69d26867141792ffca0009b1ce3a049e2bb748430931370f7f91a6bd9f3b5546efe00ad46e6a6f8c0cb2589b7e61208ea8003e84ed82b0b082648a634deee5132ed07cc454c7e774e25efa5b427d89aa80656253524aa9f8de0020120016301640201200169016a0201200165016602012001670168009b1ce3a049e2bce19df642b05786149f5875f7d1d54896e4f16b3bff084e6109ff2f80d8c6e78003d485a450422c11f36a9b75b9687f793dec216c606e3f7c6bd8abbe1afa40a288e30de2950ef1e0009b1ce3a049e299af4d236bd78846d16b0af9db8fc04ea7eb68455d790f373c77c9c9dba013754003d12c945504511eb73d6117661e38f086a8631096061f73baa8ca5181082177fe773edeae06cd20009b1ce3a049e283aeacbbe7fba8ece71f5698f70896aa6ce4e681c796ec44e65a8ba6a828d808c003cb45d245b65767242fbe7fc4774f4d3dab3613e7cafa7b079fa124a33a6fc90ca96baa69704c20009b1ce3a049e2abe221fc419d51e16fcf6e3db290d702a38aecf6a75186157a71467b605f11528003c023fde8593fb751d7dee28e7a37b1e3572a62abd33af2ca3f86d1858a0cce6ff60bda6e3459e0020120016b016c020120016d016e009b1ce3a049e2a2308d04fc34dae1fac5e0cfb62d3e10c96282c5e042c1f985fe4d7b4cf593500003b926cff56c49f06d5026994fa04e5b710b4e68c4429a9e705ce1a95c7c0813127b2a8fe381ea20009b1ce3a049e2bcd9846363876b4a7152b16d0dd18dafc25c91ed23fda855063d0d21f783a3400003af666ef81a1441894d7dd51f484773b9a020f2a4731cc0bea996959772f0026844aed6d0b459a0009b1ce3a049e2ad108d43c2f33194de16b29d0a2a6a9e2f5a69677007bcfdc172ab35d8982265800399e2dbca886a21ea43d67ab725691048a03b4a4b10be18c03fc4447238864ebfbe528e9afafa60009b1ce3a049e289be5aaaf1a161d23e98e6f0c11bdca66ee82e7f83a3900307088336b7f32d47c00394b4cafdae3e43117a1436555507b67b126b413f84b55c58482661f7a5e81105ba616ba26df72002012001710172020120018f0190020120017301740201200181018202012001750176020120017b017c020120017701780201200179017a009b1ce3a049e2a7eebfed314fd0a8eb1f3a3e6f1f15d7a4bbdc597a8be8e1aa50e43a13026e64c0038bdb4f68b9f95a023d9beb6ee16304988b5dc61e3ebc7d0911b35becc2bdf617c284de350d93e0009b1ce3a049e2b65a7d1a928c1fc0e2968fe10d576ee9ac1b910890e9405ede79d00e5d274e794003761263cc18d4bd812c697eae700ac388711e6f6732690f3232914d4ed8050d0c4a89e7aa035960009b1ce3a049e2b4ae0da525b07e5915c91b50817ad0bc034499fce0a20ea7676a5676715f94f8c00371b434c764460932130f044374de6c5cbd9e723044aec3af3f77b18de54c9b9f7cf43290db89e0009b1ce3a049e2b45736496e4621cefe30fba69a6b92bbdb0ae78124564b751c281e52e722e3c3c0036af13f32f34d1660031191e56dde5e0ca9fac0a7adb0422ea50b5a77769ce6754124760a0c9320020120017d017e020120017f0180009b1ce3a049e29aa1d6f2a7c0b4fbc05a2aa683fb8e00bc65bdd2aedfec4c14c29d70214bb27f000364ea331c514fd6d40d6f38e60cb6b302febdb408fcaa67fff8c3271a40929b1ea0274b2e730260009b1ce3a049e2b70069ca5c8cd9850b2ffd760b474ac0163683e9d14bb4165e4bc6558e44b30f8003627fd987aeefbf09a1ca5182f7a1832d9964fdae6786d148544642138d9c1d91c3660a3bca58e0009b1ce3a049e2993e53ecf83c6438984442895537ee60b77ab8b0e06a85cb932baf8c6177dbf280035f088d741eec69d32e6213ac7ee6541c7691835955b5c383bf1e277aca1dba4825d8b8e5b09e20009b1ce3a049e2a8218259e1fea1603f17c386db27fc8e66b804a463d7ca295db3891633e38bd4c0034b652073df13ec196c5b1cb6bc04add46eb9eb075aa93d31826c69b548eff130b118aa1f09d260020120018301840201200189018a0201200185018602012001870188009b1ce3a049e28045f1c6d673776ffff51dd0a2d60ed017113163cd0cc62f460db9fb4d7e0c75c0032e8264623ebffa48075ecd741d50fee154318dc3c16bda368046babcf4d0ae90619e10a3b27be0009b1ce3a049e289c560df834669b5eca49b8f33d1d9795f7c3b38bed1eed60a2dd410d6b20e5a800325a0642307032517e02c8ac346b58789397d3a6037f74656cd72e1ec4b6567992d58e07d98d9a0009b1ce3a049e2aff45d6cd1038d85bd1fbc7de5cbdb98ce21e96ba5aa68649fce921b754ae68b4003128d7ce462e30dbc32e7f98f5f18ddf0847960f69dc56903cb7924ff0bd4232512ea170108e660009b1ce3a049e2b9702ac6f1b34556bfe4a494deb4f2e5c65000de35915cea31af49cad18a0c51c003128350b498f8f85c1cfdc020bd8aa220810902f1bb066557e3927968850f219267da0bed3d52e0020120018b018c020120018d018e009b1ce3a049e280cc47485e39022b0e52f7ed96eb17605eb8e48ce8c938f7b6e0abc3cc6bd12080030a349e8ae5c369ea2d14b979198992f73ff458a40d76fe3157ee74c5a780e1d0cc1e93f3260520009b1ce3a049e2b3818081c12a25a0685c1aa4d5a35c6dfa3b7e3106c0f3000c6e47228df0baaa400302249d821c61656d776e804f4c2763599d0bf0b586833ba8e36c474f43238da2169b0746157620009b1ce3a049e29f85179ba3c62e6df1d1ec789c6c95e9e2ba58d33cf3fb4f00f576344940a4ea0002fd6e2bae51c675d219533d6a9d383f0a19caf6dd415e9c444edf0a7739081733c5669a72c94ea0009b1ce3a049e2a61874467c765f73c99c4bd2e1256c43cc51857deaaa52665e32e71bebb6fae08002fbcaa9113fd23e6f8d83ea8942b09d61d60366fc0fcdedb5415ac13f4d2cd690136d3d02d26ae002012001910192020120019f01a0020120019301940201200199019a0201200195019602012001970198009b1ce3a049e2b09fe56e3d621caed1d6830548ef7fec19b6f9da686522fb6386243b9a2fac3c8002f149c7f9d53397a22a2bbc6f1a3b88e34d3ec3226408f6df3caff6d30785d07bd1501961a0d4a0009b1ce3a049e2b818d0607638489ff6c6cdcb8154f9ab553ed7143bd536fe53cde188ae20b5cec002f0ce9dd8e74bdee9c4e215c1203ad0f95cd8dc58bfbc667801c1ec68886d16573346915867b620009b1ce3a049e2a555eeecaca93de3d4361fe4d2b11403f6088db79de66f3a7ad9970b06e8dba94002e7a6f4d1f0e495805a66889fc09b433eb1cac810c5975500818e12c8e0ae0e3bdc0974768e9ea0009b1ce3a049e283b549840fa90dc8bc7b211fa307c31aa64ab55a2570e2146ae874fab49b770ac002e6456149fea6b5302e6519d43cdfff5af212c987ba369df8c801054a5e11436f41e09cdf9b3660020120019b019c020120019d019e009b1ce3a049e284474845f50943d5d2b22facb4717fdfd04e308a642c1079bbcff3ef04d1e3e24002e14aaa58948dad2dca6096524a35a32e685ba71cca426b0e3cf91c3269cd6eeb73671b7134e960009b1ce3a049e2a6e677179da8dab1bc2da79176b6a0ff3cde047b59bbddee24f37b51f487707b4002daf88081e43ae29141b26bd203d751782e5ec505807ca9574e9c73296495de83d5b39b51523fa0009b1ce3a049e29cd55a63830813c5c87e6d34b82608d3b559e6e96d2950264127298cb1bb43578002d975867409aab3be7af211d13b1637d8ac7086c5f4ee0faa764f3d951943ee00ef5468c76617a0009b1ce3a049e28351d63fb3f018d0da8461f342c687077a321af5ceb48feb32e05abaff02a379c002d00e60b65b8009e744c630804d331bc19d8ea9526071fb66743a527259298eb9b175e2c4a49de002012001a101a202012001a701a802012001a301a402012001a501a6009b1ce3a049e2aeb048f14ed6d51984a6b930b42e87f092a680516ace5202428a842b53632c38c002cb96095c8eb5ff0d9d05277ea1c26ab95ec012c57d5a12090749eb1ad9f3149bc6b670786cdd20009b1ce3a049e2bdefe5b0d0d98af5e8f5746e7f0071a7a3a645fc5e1e789ecae732c756eadf728002c138777d22f1187f135d6440bd6a79964873da81d2c0b7b376a26f07254059187ce262d485c0a0009b1ce3a049e2a2f2c401809b9067696db8815f33bd0f6a59c41e3c78a29690c95490f2e8adb3c002bc5d772d5fc4da17d1d73ddd00cba98a4cf38b3ac649bb9e6ce7064d651c825b650ef7e5e005a0009b1ce3a049e2aaf960e4be43765e54c3cd629cf62e113a6ede408294180b56461ccac468ae180002bb2516d31d0e167339f65d1a206965adb6c3f41c0332f0408ab3b37eb1a1e5030776b0cbef34e002012001a901aa02012001ab01ac009b1ce3a049e29acdcd0adbdd904a1fdf68c4410c39671b128c4eadbdeb68f17540bb8a77b07c8002b5b4cd6ccbe1fb1f366ec8202d0d1dd0f7428a8f2368678939775dfd43322e3caafd2f9a69ac60009b1ce3a049e29eb7e0e6cbeb13fe777a9a8c6a47d88ba1cd8a285629a1cd81cbedef301b5a324002b4d0d364f5abe5424030284a2643df3e9a3dc27a4e92418f7d2863b8c4d44413bf747d8eb6b4a0009b1ce3a049e2962a9600a818fea9e38e1008512f91f9090fbe4adef5be84f647b3eb79f5e96d0002b4d0d364f45338286f75181e77418494c8b18c5b3d9056703d5650263c2aa0f45774f662862ca0009b1ce3a049e285ff126b82de450204e653373675c64de86d6ce322da29deb312272d64ff838a0002b4d0d364f4530c356490435d8b26734a3e8523ddf06685aa2b3f48031952beb28e88b19587c42002012001af01b002012001cd01ce02012001b101b202012001bf01c002012001b301b402012001b901ba02012001b501b602012001b701b8009b1ce3a049e28f5edc826ee3e40a68270e3efc59316bb633e0e2fa6e8256a170619956f41fdac002b4d0d364f0f3f8e30bccbc20b0da660bcdc106ceb249da6953cbd33d6713e6a4d16a42100e2620009b1ce3a049e28660d2e9b0fca8698d52a0259e0425f0d706da9bbaeb7d959501dc9d4583f143c002b4d0d364ef9cedf18ff6b9ec3586138047fde2a25860445693fda2306c2e05c14512b598f232e0009b1ce3a049e29211dd50a40611bf63cc7c4d754726d5de17f7ebb303d3ae086aecd65d2800538002b4d0d364d1ec24435e1b49423dd16a326044b7c0af9dc8d51fb43bfc21a6e0edcf011820843820009b1ce3a049e28d70544df754145a9fe22191d5f5b5a6144dc70d5ea10fbb020dc8a4734efb2d0002b4d0d364cde33808b604c0ce8b366048d6d932d77b0dc270dd59287dd9cae58c5c599887fb83e002012001bb01bc02012001bd01be009b1ce3a049e293c8de1e7fbf4590b651a2c681a559d44ca3cbb6e8ba3bc43cdee9d5ac37ad858002b4d0d364cbdcdb3489fe5453dbfe5e2c00d9a58d5920865ea58c8da8731fe37a74989b56dc3e60009b1ce3a049e2bfe104bd295f6a24842e075de38fbada3edb951692f9800cfa5f4bf5758810f9c002b4d0d364bbacbd67baa0a2ec93ba4a924e50bf0815259cad58a0e0e8a47d0a7feb3f19bb256be0009b1ce3a049e2869d67cec39d4bcecfbb035f2138dbda588fe0ea017fb27f1dde523edb9735770002b4d0d364ba5397d57ae37657359404c1e94e5ae5d51fea8bfdd72801c75fff533c325915f25d20009b1ce3a049e2a7ef91e52f45d9020576f9aa195ae5a6df5243d8d89dd01065c2f0ad5c2aeb614002b4d0d364b7a01b28de42ca52a505d1c22619285238fff02d7b6fb8c96e62f7b7a465ef7b44446002012001c101c202012001c701c802012001c301c402012001c501c6009b1ce3a049e29e7684c599e9eb6187b769cfd1a44da91c47531224107f92a98a5a61da1b63da8002b4d0d364b6470452f31ee76d4c83a5ebdc65266998b956d7c77e963593e84acc384cf8b48689e0009b1ce3a049e2876f5e9e9dfcd1008cdecc4884fc4d210a290c8f22975ab1623a1809b76157520002b4d0d364b238b3d42bc06e3a77fba211c4e8ffbfba78655fd20a3624c29e42cb03a94459242960009b1ce3a049e2ba659b448e78f2bf9f1c40f65764bd73d098a8f5e91e9f48e027e303d63e3edd0002b4d0d364ae2e3713e6329c1e0f7355ae0667f209856d13e7efc9fe21d87c8016e2e0c83aadc7a0009b1ce3a049e29ed4b1664b4f8167fc35fd6389e900b245d1b3266c038276ebd6bb93a78b4c3f0002b4d0d3649b4bc79ea4eacc9d314d9f1aae3a9dde43bda77e6bd4d95eaa76a20c8e004ea9f00ea002012001c901ca02012001cb01cc009b1ce3a049e29a485a103cd6e942b04d8ea4c0306161aaed6a672b54fd0e58a92ea130edda40c002b4d0d3648c725a547d83c93830cbde24bf104cd2a3ae9610c458ec80c1a30a2a0dcc48367724a0009b1ce3a049e2b3052a7b5743011fca83e98daaea6ca39ab87598eac7be1eca9c2ea1cf311a1d4002b4d0d352e5ddc7d88a02253d6d6538c80a6d2083fe31c60f28bbde53e3aa1afbb68ebe8645db20009b1ce3a049e2a46f298fe8cd5dbca09fcaf0128bd0d80e8c383d7ca50451b66789131eb2e767c002ae9c5a0c3a734cb07efad3a6a6b2b17df9688981b3b75ceacc5bc448fd9e5dcf567933d474eda0009b1ce3a049e28e682932fe509d200c9730898908586353d8d4ed60baf9f0bba82e86a09ad8484002acbeebb0b8f83b88705d8a1a927b941511fa4dc9dc5d50d0da4cf7fbb48496bf1a962df4ce1d2002012001cf01d002012001dd01de02012001d101d202012001d701d802012001d301d402012001d501d6009b1ce3a049e2bbb6fe1fd98d5200840be7282dd9f5ff2a16d669da9cd1df35a1be11ff2019ef4002a8e9f75a335192ba92761425bbcb6844ea868c56d0429e313ee963d1288a446edcd97251350760009b1ce3a049e29d2dd03feee3d1befb3fde8e42a702de2750deca5a921af3a7f5930628b623118002a4871c3fbd8ddfe968e6748584d4833998ab0f2118fc101699e06d3b0659322cef4c666802ebe0009b1ce3a049e2ac098693332aa93e9bbaa34300adbb59c698980851fe77a9842e8b8ad702dca000029f5798d8f90f3e11c57246e6770c27b5507791009d09e3912f7c16e08bda5e5ef9506c4694e560009b1ce3a049e28e709f34d27fad8e416a6637873ae655b8a4f9ee399170033f926d6c7b020e2740029f0af2654a9658324d3181966a141c514523c202e2a22d8aed2506b06ebd09b6abe0dfff3ffd6002012001d901da02012001db01dc009b1ce3a049e2bdbfe6ebd69317bdd504b8ca90827a7283c8f4b31b8942da21233eb31d04cf1540029c13bdfeb1a906dee48b7d754cb10756ee56e24b1f947b72bb5d6c4dd820300e1a254e716ddb60009b1ce3a049e2a5d92d5e8d3cac8e63c6fdbfa21820fed03c3a0549490012a6862a111c7ee86940029b88be129f4f1a24819b16ef4e614fff38afa70fa7d6f7a68b75728272b882e324f5680cb623a0009b1ce3a049e28f6402d74aa730b031475d8e6f3a582e2f33876f98dbc8037cdfbaea460d6b674002944f2836ad69f3de3900acaa1c1d147728ab1a4274054f1e3e7870d5a30dbe53d31bf2e559e7e0009b1ce3a049e2bd730d8cbdd280222fd7bac9bc117880b66f625e7251daf78afb2913d227b10100028e3c12d13885f1fd43f1e6c98cb9c0d8c3b59274e1026378fdc0dbdb50eb1d801cab3747f5ffa002012001df01e002012001e501e602012001e101e202012001e301e4009b1ce3a049e28a6e317672fdb0c757801534d5273adb429ba145a97735aa275755de1c4ec11040028e1cd50e239bf58225a84ba60e141b1a49f40e964bf444a9135d940fab32e8a3cc9ae2836eb7a0009b1ce3a049e29e827733693456acaad432770ea32c3b52b1ad354caf02125cad79260c8c02e7c0028832c4a8b7b2805ab8bbe1c5e2e3b1e546636910d34eb91b232b31e21ba0b3b2162e599de997a0009b1ce3a049e2a9f2532cda46f279ec6959e7320497503a1b4cfd86493477e74b83090cebb046400287771ad744a1a758a1cf665f267e2c057047cd643bcdbbddfa2d43aa470886dd9898f9fefb6d20009b1ce3a049e283c0534086f552ecd24c5ddffb652b1fc73a631bf8e19097b83f81f8fe688c6dc00281c47d59d085ccb8a8fbb84820193b4d204821beac23c58cb8ec2ac314ff35ed535aee0078fae002012001e701e802012001e901ea009b1ce3a049e2a20d52abe63b9d6ab46779fc02f3b38b941d434272227fc6765796d3a87e3e588002769bbf85805e60d011e830eeaf39b99ed78f7c7e91e0914678ca4a7c6edec4be7ab6a18ffaea20009b1ce3a049e292e7b5ed8a8de675d157f1fcfab934113e8a645f4c8ab39e574654feb9b1cddb000271578b433c0be2146cf7c9dd9e666392a3c3f6b4d3032b13332abc5b3f83e047c4a556a8a380e0009b1ce3a049e2a382e6d1777fdcbe66aadac7abb0c00e237f5a4c435bbe42a4daa20835ebd750000267dde524b17bc61ea29453572e3376d806c49c80fc3f1bf871f69227bdf8413c4479036033d5a0009b1ce3a049e29e9bbb4ec560d5fca1e74a7569e41eb7beffde4a92d07bf389ce435e021457e7400267dd9d5a41c6187ee340235f5a8975b70d9330b6dbae735efc3c36109bb53143abc134da125ea00000e6a644f64704e16f71fa050057000000695f43402f4021b65db9a3a8b5debb992215eb80337f4b32671fff49874a47fb40bb081ff882aa690d0d26f7e2e534ffa899085a62bf31fed77fcfc8a1aece92f568504b9e6523324fd791e329f8eb63ff351d595e9cff5017f6d0592f157c9d0e000000bf407e7849a2233412b9e100255d14b14834b011257a3991a1896a5b564f4b2340a96055d7cf4d1ef575897c3cc0d59ebb05c1264dffb16dd63431c565b5341f91a9ef8b55ec5aa657de4a3bb535c95c5c2da19dd0ddf7d06b64d6ec77dc283f060000001bfecee6c97b73581a3d6a0c98d2046fb67d84d680add1920bc355da5ea93f934097288091f29f3add66d65b59edabe5b29c69145cdd1eeb7a77c713e31b0ada0d56797320201c62c698ec177e07ea6a1b9378644e9e0b6b4be8644cc6bab7450e0000002f5ddf390e10835a63aa6aa10907015f00bbff619fe4ffe6000abad9395b64224045966a9ca1599e351eeddcbdf4def5e7d099d6cba5f635392dfc17352ee7f4d24fb99d6b600b59781ff6a33766790565406289651959f53335d68eddcca8ce0500000057dff0ba7bc146be404c1475d4a7c58ebf33e490cc86f950cc38aa6382a02fd540304baed215a592a173dbaf06e3e700d7d9bceb8941dafb6eb6c8b60ce9eae85d521c121669272214592f838aca0ccad6ed6666848cafd84ce9c52819c626f00f00000023344d03b3bf3be9ec03f2a455378050afdc3c9ebcfb5b8fa2dcef26d33234064020723c0f05608d0c6f068c80f9a2e0f431771551e3d6c02e5f8b3c5e335fc58f2238d42d01603b60b80a3a4269d2b751264a70aa2a6ae853df76bf4fc99ebe0300000044a29a4bfe2e149c4050abc61df8dd9586b298bca3e37b54cbc379b6d562d27440154de878ee590a0c2b1aeb50baa0cb2edaa19f99a56b0272ded9a049ec0c75c2f99f8d4a8f886f78bbb9ebcd52f5cc2738fd0eec505c012bfe2e0b0c86b7c707000000aace1f26e2af46e3c548be715540a070af75aa32110190b864edd2b984f62bc940e62c6c5a083a30328e3e8fa5d2a011a2d17b4cd69e12b63936187d5c353df91c26b28f1d3f61b8dd2c4e41949aff6e57bffd346785c8ea300571e10f2ccbf40a000000072dd3ddec50bd295b83293fa79c44fb890456894b699d1e0a3037fb5a5a8197407621b44eac47019d63714ef6957d4e1817a3f625fa88c62659e086d1011075919e4253923972de7de7d2a47c5fdb51acd7594822a86abea2618c3c6f71b6680600000056a1fd04a85afac6c113a40ce6fe04e6a99d5d6f9bfbe758041248062df634e4406541e544e8842c5ce73cb211a9ce14944a807a7740aa957706d3d0eac3ac32056c149401f5c4a2a145dbd6cc5a57fcbe2e1155b53129b8442cbf88c0d3e04c0d000000b46adaa4a14367de0736b42b0e22bbac9498e750a94e7379cff0e315649df667404a9be82b322851be4c90bc9734206cfeceac93dc91f8e312ee04995bce028a3cf5321e85d6ae4eeedcfce26e4709963e658a9277b8b5ead658f2d9dd7d04b40900000084c4068a1c652ed72942d0e6bd43211c9dbf367bb840785ff060c874239caa2a40193f38145b761e6df730dc551231f3413138bc6a9bf620dccf539d58498043abed715e2034d4dbb9c66b4fbe63d58ba0740f40cf51af2e927bfec5f6e47a560e000000257930a681334d75551d64f1d50ef80d8d942617d461d879fe45eb5155c5ebf040a1a4cd9144852cf306798181134554ed7e754a0d1911638d96610ba05eda15faf88af6823dd7bac786c2a0555a3cef79a061398df952265090c6cfcdfae8110800000096871d0e559c02f284641cef360baa3f4a23bb0d0a71641293399d7425e52c3b403ebea7eec91b6c159fbb9e32e2dce3e522eb38d7e20ba7b2512574c96b7d83392f2df118595652fe11f2726da4ab99e96aeed56e974cf5647c912a50438ec20f000000242c9fac742f3b810613f26d884516566c8b292337b8d5bcd6327dfdcefd223c4058d59a025a8fa6d8d84209b0ee2b7c2e77e2c9431704af606330f063a1ba13a9a7fd1a3fb67b3d12892bffb008382eae1fde7f16a846516135f642f8682b6e080000000a4b2cfac623daea19613ba9d758a8db9629869a01a00232d8c0006ad949a1584039ba7a4b23651ade29bcb483edba0da8a33152a86c6c4c6375e3bacab68b1767a368306e41299a5f0521aae0d6f833b50e299c955f37460402587841d39cfc08000000f000dabbdffe7020198c6de74ea39e35d36494b78e28959ca218e7bdda4ab93c403a1badc96a340e0694636c2b818ce8cd4986e7f57cc068186073b38915f872a0ab77655b274a7fc028a1ad0c251491ba64b4be07b63132fc1fcac7b62f510c0c00000084c7a17f81fb47099835dbd43ff6bc6cc4fd42967d417736d70618aedc908ad4409845f95876d0a169136512206b3f858fb922dc6b9061ca6f7d942157e622573328a497743f55f600ebd681207fe5427837b67e5afbab3edde8cb24a7ad66b604000000d645552f6d06d7aba24256ac20b467d2e6ec6ea3a60c26dbb324f2ab9a24bbf940b8a809eba1707892799e29265b931592e3fade83f7e32ea61210bbc861b3a50eb335bf82f9324a59bae446d1836aac9d486153b93bf46f1ddad71cce4b3c03090000001ade561f75d4cc358358ae8e7ae6425d5f943c869d9fd1dc063c32a09bbd3315407b7d8f30605ac5bc723af91c2d743a6c18513ce7faa50f348519ae6dd7ef746a0dd34d91998dc8bb3812c595fa0a221879bebe431bfdfdbaa3f8f531f3bd13000000009c04a24ece4671e610b0b31fab4e6013f855882d16551b491647975d6514a7d3400c0cffb3c146dafe26613f30a97ccc08a27c2d2e2dd2682125a5e4eefbb0b4802e26b9e632f0a272f55df4a84a2751d40074c09be6dc51557ec80c25b3aebe0e0000002d395f537921667e104cb1d1754578f05ec9843472690c77eabebd27bdbbc7974038bf554097c89c9659c11e8c8e9e3a54678e7a8269c658c6843e176a992b17dfaceda2a0d59d30fa7a2119c691c0a4908018d5756d6dea34f3cc57645d1d9000000000879a56ff686666ae11131d2ea8b4d0ddc81eb68b8fbce563832ec73f6b15d8374007ea573ffcbb54e56381d9326ec25b2368d6bdf586335f0758bb5c484ffd68a46aed200f8c731b6db6216e0f018b12172ad6ea37e2ce02d39977bab4a269ab0e0000008143d04c8a079fcd48531be305af2559e247b7e889eb099212251676e04e4fc240f7809b66784525aa915c661c26a3a325227e5d7ddecf5c61ca004e7a8f24e109df2a892f167fe0c92553f9636d8c0a676530c6738c38b9973f7a95261b43b10c000000ceefb16f526068c918a5897c950383c1f6e421d1872695ff08444707c4603b4440139619c943e3dbf4c4fb3ab8e6bcd9f9225c34bed04601df5f2316f21af91dfba02c9c49488b3c9171eebdd1c7feb2d1dcd81a31fe462af11743ce17cd81650c000000282248ad3c0460a06761b34cf40ebf9aa495e2150dcf7291aa4db0070f7bc57540e4fa1bc52639c6b5ce5a14787190c027d62f3a85f2c20fd4ab1da0a129e71e5ea50fbc5291fc73f1c4f22e6f3399a814e0691504b84b2b1c35be6d57d4793c04000000305ee492d0e215da331c5e7ccdb83edaba650a24c0bd0eee0a432e788094dd8640b8f56f2a01c305bc6c3b776ff4e08826d8e88fc6ed4d737c3bc27b74972c7c2f00cb9483e0d1de6337260fed5f1574d5ca77985020e7f2889375421c586a200e000000baad41b74c09818326218090889c05783f1f66bef45d71213a177d6c0d0af593406f3f3bd8dabfad6a1c3f1ce1272628622f2723f1eadb277b5b164a9caadaa0894f81c91ddfca97f4c19d352511ab1698a9e8df12409ef791bf463097803d49090000005c9acba057ddc6db4abd528685b9d76aa8b5137601a3d3049b7521901b227f274014fff55f32c75fda851c5fb3122e92cc7a121e23dfab49e926a3edcacd5dfaa1ee1fd287a914cf9e9aa6b74a8f6bfe7a1388e6d62c730d185122edb9a4566d0b000000a27e533515d26bc544dd1d079aab5310999f43e5e8cf58d54123c1cbdbcdef1040b6324061e99d9829f237347bfbf7c84375cf4944953b57091ee4f5353431d54761c69df9bc441b64deadb4a93cbe4ed6eb0bff4d768c5622cf980426f58ec70a000000789b75106abb56a723909de8adf528b698a9cbf7f11a8d698f4675fa2db1d6a7400e77aa7d524ccc84d9729d5a39ebed1abab6e8407e6a177d5bc3dd75d710e45fb2a9fe2212c5b3f47d804966a12cdd4b17d53771acc9e0a82450ddc066ed53050000006ebdfab990de52ddedb1672c2a14cab3dde8e71664c9fc425fef3ce53233425040e736a095c7f37dfa1220d3156d42bd0ebe491d554807dda0278d10572453de5c07fc01f3d18454cab96ce7c220b61311d76ac4df175138efe387f21a40264205000000e3b78d88ca156c1705659929f41276358220ca8edd4de082643b6625b66bf29e4084621451f23a1f06abd5bd72538ddd0f081c2a64a3860ae817438b860ac0d2644860424ff8eee6b1b5c5d30b2a3c11bf585aa79fbbe5e2bdd82d09079124a90300000069dd5ba89fab800ec337babb3c97ac7fcce24982b46cda3adf8e7f3de365b50e40f413f789476363d6851a05890721702180dfcc06d1f21ea3417673edd987bc3679c1a517b71de8006417b6dc8b97f197de48117ef965fab9db12c7223fc2b00b000000f85609168cee70243239716ec49a472fcf043b19cf2aedf50fbe0dbac011259d40820fd7608e7970664112fd510e7093f320daa629e0d8847d4ab1f2fd47f6cf76ef91fca0d0a6b5f793629f93d6cddfc79cd483b668110fcacc420b178070e80f0000009dcb833af57b718aee2add66b863111d263324dce5d62c0ddff6d98babbc2193409afe68e3e2a9363bd1af657277aaa806788911d37ed0ee7af613833c9b24387c3da1a733232a7454280e4e4f6a7df9c4628306cfbbb92b56c8128b9085195e00000000b109b7248a170cdd806becccd19b3aa8e9369a8b31c59ef62be9b8ca8b42cb65403d1403ca84eb2dc9d507bf16819094379c6553931536a9838a82a3bd983cc2fcb47bc9b7ee88f7fc3661e9a278df76da2f20e94f811b6c598175e71f0c1cf705000000ef76e7ee7d4104ceaa5dc54b287f850f6bf3c4444ce16cebec09a1fa6120a17d40e85d1a4406ec350a24a68879736568e267caca14afec7d6babaeeec8fc7e27ee73b76b0b0230afd24ece39532132de502f5ab0ebd08a833ff093576738734f0c000000112bc899766c822742efb8112138d8a24f5227452a553b85dad6a140d179d1c3403be27afae82c0121978591e90f279bb1d9099ea367e523b7910e958833e3f0684bc43b7d04d31726b4b3f91c235cc8cbf4146c67a7cd634e8bcf41a46e009007000000725220cfa890cd0e76b8a60ce99410807fa1410830e5314beaa5271cae1a3a3b40bc2813bab87776ef8fc97b097a8c7495d048a72ac79748b97c3bcbea7017708abeaf06c382a4af02603f3d2201728568643634c0059ad9e0535152e618ab3308000000cebf5ba22860537450d2522d1f80a8f432decd87ed62b26820b9f5be0d4801d54020f3aee0f648306fdbd874b94aaec17eee0d413afadf8d5e2be45ad793836bc1c6ee649d7f7e33d2a2acd8b1a06b897505f3314269ed7bca6683c307eea15500000000ea014d98907d9ef811ebb1a01d349c034cd8ac9d1bd16c7c577dcd039c06d5ba40452f2bdde6ebd556c3cb8c60fd58bff4ec204a62a5b0d0539bc7c31607431adce402279773c18ae3786efe94503d3027909f24301f06502019dc2f7ff612a60000000029c18998a1e58395de37cb7aeacc88300deb7737d6ee2d00959b2481e2c38e3f402102b044f089f5119917b33f62201439d72c9f05181c2742e6219f8b41a6c452e783ea3acf45100188a9d488430fbfbf864e6aa6cca542a6d21f4ec87275d405000000d7bba9388590b2ccf1a41c2efd2b5d7a3bc002c4b1cd9cbbccf303217416a69340a03e3e466e40196fe148a261487e8a4c5f262577e4e163d6b05ba14f993bb7a7327857a0515df42900a98ea686a852c8b82deabd171101a4a67167081b892d05000000d5569972a35d66d09c46e63b7969775ae2bd6116c729a6e4c6c635481eacfdc94005630fb8d75ebf29aafbce6ceda51bddb5ef49943d80c419466b010e79c911d38d2c7b844a6a0296fe45e02cbdc1aec31f1298ab2d0cdd2e14b3414c73689f0500000081e1c29e84b83d56b0a5665df26b7079f7e0569689411de9bc8e463819077a0f4028f5028b5c6d2c2bb997bbdb9e904007876418e736e83b3ebfc885899ecfdc7ee120006d7b0a555b2d80db908eca0445e69ea8814d1503b70ce09ea5ff9ced0a00000076435035537acfd9cccb7b03cf5467bb274214f4523566b18963e43e273f5843401c7c3ede9295c8fa659ee4d7a9d115c583c16c6de3747958c158e2353a9058cb0431d5fc2c95dcc463aca9674890a3cd4a08605e56f26e57f6ed989da36bcb05000000b6db0a882ae039e4a3084e03a14bbccaa7439be764182830c56bd874ad84488a40965f528fa379c52c74a40fb84c4500da634b0c1ecb65631a065a37c5d4dcb848d076d5668e24f719286a0a36f2ddad5b2320e75bf990f69db3e95266abbef704000000f89691ed90aff7ebb8635b30220b5c8d3a2a305db82b5e8bd26f51afe957f9d9408dba3fa7a3e243586f25b6771f231f1218e9d76ec7d4ffe5feaad657995ec7c10c1b3656180a32019df69b00167c495842dc58a6f78f811caf10ec4d847a2d0e0000008dfc7e3f4691c29f775723a02df0d2c411560c932f1fa2d74683bc51b7d025bb402fe308dcbc835d2c13a3ffcb057dfeb300197ac19eff41cb5e46a2f8628e6465731d34384e80968198026ac52447f0bb4c158e6bff7f657647ef8ff1effa930f00000053809515ceb972819434b38958088347f6216ea96b360e4f67e06ebd9260d8954092746e36d7c94cd3228a0816794164a8f45e837e3b3fa7ed90e068b4a6323dab53b02e9b94d268ace607131dc6131dc6393476881c95c3b9b58c024f0107ab0d0000006aff1efad48e10656aab31c7c96fb6f847781989e0b479639f9cb8b8d9482e5740762f661c2142783bd35489ef1273d870925df67fb2a6b0436e8fa66e4f92aa03fdbb7f94604e4ff95ce887bf1d9c4a85310369145c49217df5b6023d70a935040000004644dcd91ba159ac8ceb1ce87ba7f9885990634a7fe7952955199d70148dc3ea40c0a60560f0ddbe528207ca8cf5fa527189f8923ef5338c04d96fec8e8e2fac76b321d7cabf960c6ff17ea90d1cce379ac1dd17887876f0c8a40205515c9cf10b000000119eb9452c65693ae9d3ad9c9172cd45ad7e06c77469c63d01dff2a777b2176b40d71422f16bac745f4d72edaec5b4f6896372d28243c08b969b0694fd3087e3af3e545ddadf0a158a56b7872e31bce1983813d8fdcb568d99b36f9e210fbcbe02000000e8a57291e495121e25400e1758e3377530fad10d5dad370160e5819dcf1ff740409d007c295f9fa6aa5fc8cd92b3e6ce1c6d6a6e844aff4589d4ed167776053a4d3180d9ee5c6e9fbae37a979a965b9d37142ee3d043fc755f5a4f428730f28b09000000c1e51d9a74702de784942575328015f8e25c3dc846361176d71bcc518fe2ff7a4017e0ac9f6f460684f3226ed98a372c909f0d187561dab6a99f4c264243f5859b1d9c3466ca45bf492ee35819c04c612e47a90456c008965a2b43c012ed92470a0000003b5428f6fe291581f796786e7e96f25963da50505c21cf483a4f8a8513efc10f401908d7dde4fc83b18bbcd77db670aa7fc918cf4ae8089f0743792ec3d8c893b6e99ec82037b964b3d238a9505e2ba0fffba6638e6fb46f50ab027915770ae10d00000078357c54fa1281974594bf49dd1ba6f53c6387f1b8361caf4648e749813d5a4c40c94b2add5c900f6ce9d2f51cc9d15980ae711cd5d3b0f526d54af4add22e6b7c47640b2397feffe313ce235e2f8e0e58d4f3ecb0edae33b016e15011826b140100000018c3f4130f90b7957a6e8877bcad037fe8eeb4c8ce3bccc5f55d795b0085ab91407b99136821f053923ed8ab248d7f3414652391d666967b3c343941a034fcfd214718edc85b5762cf8ac2bb39921579c59aadce9a4ee09ff8f06e858937ac760c0000002cd70b366d6c387d7b849684f56b76e8f560eda03d44fb60a365c553cf6ee44140fcd8a788c098faf41cd3eb22316e9c0a2ac374d7ebbc819a7bca580da3aede56c38c684174e22f78625952b0e4e28996573616162aecc5029d1d5a05250cd30f000000351272854b6e7c1f99ad6dad60cdf1280fcde5e328de3d312c101f0b6053b38e4032cb54ecd27dd044424f92d546ec9b577cb31358ef303373bb6eec60b6c726697f3ffe85de7d30a7aa4f3405335dbdd345b7ad23cc9e4ec21de4889539fa0400000000ea2ff16ffe93ee57a4f1cb6f9ca4ee40994ca3cac84350c8108205509aaa0c49403ce0ca286a7b54c52de222be4bfbe502e72374bd459ebf7273294bb9707d277dff7dbc440efac75fef7517b5a4ddea13f25a293ed8dd38898889cef57ef01e0a0000006446d1dd6d847b1611bdba81c855bea8918498a830b8aa8c4014a28779a8cb954006b4061ab883a214b673bfaf6dd3695402d4482c4a2528d757461ce3971ba378e2071c191751f3240df88c9efe8eae7d5b9bbd57b091b656b85058491647fd0100000088bc11586369ea4e14ee3245e743f2ed3469fa482a626bcde68900abbdcbc197404e0ba194d40a8c104fe9147ca47d8edd56a8e77246639dfa7b641f38d467dce6f44404fbdb815c28f174657c35efdce448ecad1515e58579edd666b2f87adb0700000084565a82530165ad837ecb917602a69eefeb0284a63dad11d37f973fffed100840b34b28bbdb5600fccb3db6721cc9e5e64bd379c47c926063e7a948a51aae71e8e70a8b038525cc9a1482cfcd5f299a667b812756d9567f23ff0de67ae1ef91010000009e69d8dba820f9d84b07021d7c6169b7ab9fa6f698080984bfd723aff00e1d8d40bd960c1ddd13237f04971ebcc14c4476a79d8043614f191d562ea0606be45ee5e9c6d980aeb0244762eb8d961891fe300a965a20676ed2dc706c38ab62e3360d0000008b2d28ca47f77dc84d67e67dece16a301392611e91277a2e581ee9f83703c48740deca5d568cb712cb822ff9192ddfda1e5cb2a0a8d0b7c359ce4de375153b2301b097d533226afcda1273e4178867f56dee504d939d406f56bf8c140da5616b0c000000ea45630898058cfb0d1a23747a8120486d1484416358f91e937229e8a3427b3140718df0f5f7e1185b52b7948593b7588cc32852ac2dd51f94f3e65361f5dd9fcbecca164e0527a232173b3f878fcf22e1fa32fd1e726c6afa1f660cf09acfc80a0000008ac6ba96a8a9c978456736a6d0e479d1d3eac87327139b107365727cbd4dfdc540a1ae6385619963353dd9903848f47194437a205f744a4c280134114773d604a4cc2244c05bf950ddfdfa510c779afbeb2f3f00d20df9a4bc6c01506b2a7c4b0a00000073fd1f09fb5bd0766a5c65e63f2f6fb1f92a9cab3df8d540c3a380bc43532e5c406b61b9b27dc36cb5d7b0fe9beef5391ccf8a3b671cee49fd764d9cdaf85319a33b117432d18181b6212627beb158cda1620822aee2362142a066c0fba7cbbf06000000e6c99ad403e37a0e3bb7a3aa12ffa50af1b6ea5789bdddc20c8875af5b58cab14015fcb9ab3922cc62bca19198e5078a3c44c521d1eb4b915560252285adf519586f81ffa61446326c00cc7d126b3b96cc6d4eb5861880940f0f4504a8bc73a00100000009da70a731cfd39757eb16a0623b347b84eecb1d6ba64dd12d286b08d184a4974039be818187ffcda6b14b354b5d31dd0f9a1132919c503b598a0c69da10c5e8cdb2f462cee3777cd0937fe7cf9cb2765681689e4d4581a231d79e8de0ebb23d0f00000057a17c5565d2df8b05204566ecef3091bbb058bb3f528e457a100611c4f5a5ea402dc92e4c0d64c381d8223685c1c597697f80c5ca83aa73e91096b372b582a610a1734346b17745df8717a54e6e116365b4f458f6da412339ed240940542671060000008b7ba73afcfece7a3b53d066e8eb7c4470bdb274e4d4a3d48427fe25909e872e4041d48c03d38fb338ac56addb1cf2521045cefbddb5318e54edfe1f387b8ad4a8314b3aa51d6b9ec527f01b3697f038705a197d7d5d75d10c5fa832990a13590b0000003272ea843b5adfd8e856a0a8bf54bbc9bf010c6ba4428dac4f5f6e2fbc3af60240caba91d387739dde6b4f02f8e208124e2488eced0cce4916ecf2b282323d41238ca1d521800938fad6c090ed8d40a05852957a52ee08f58ed14793271e2cd00a000000c11a7a86eb5852550984e96cc7d20415b036673dcd9ea7f88317bba9efa5de7240fee96be41e597db8bd676023471cef789de27f6514883ce0dcf5ed36dc48f4d54d928e3e10d51e3c508e1201797a8bb115bc4347b98ba34dc74274eb4778680c000000e6556f033a15ed933aae6ca21f4f98ebe3084e4c5ea3ab43f67e49d3d47511e140d6ec3af10b03def6649f012989183ad866220b6f34edddc58c64f21160679c1558d142218201b14b2f764d9db271efc96f4a506cd8e2bf89d8c784eb5fb1540c00000041edb1ecdecb64de3ac7e3f35cce371073525e95ccb8c57e05b2f6c8bf0025844079ca1bbc935349f99e1de678ed9194666736a1f45186afdd3f44382a1733398908a4b437dc01ca1e43cd14c26c17a819ecb4e9e2c467f0cfe656e05aab72ce0e000000e3a0b0e091044d331c84f51fb273f8aaabb186350eb25ff644d3322df97ea14340993cc71e97c4f3710415e23c59010ed20ae1b4f92369b78d3efa8ccd43b081b60c487bdc9ccf2eaf6fc6df1f64ca45ccfe869eb23841194326093e8bc12d8c01000000459d622c9b93534bc444374eb78a744675cda93cb03c53062989d627ff87e71c408acafc9e705360980e6e95f0c428f93d7658f7622dbf0a45304345001bf09e986fabea47cc6803a8166578e7e689ac9f242913d455a13d7d74fc5d2dfa9da80e0000003d6898110e6fec71bdaf546d71dd6924ae1ba6aff033441867b4b22683f6cded409ddb8bbc529d09aaec90eacb38d2355fe8e5ee97bb3dbc636c404bdec66eb843785b1f94448dac9097d765a33659011ef05e0c26e63355285c0bb728a4b1830900000060d2041432fff56db7953a23fc9a4bd6676277b9a96b92d7766938c5a784145e40e2a7d4719a6363830442f9a1058d631d01991ff764a86859afab258ebaac732613f48e43c5ec5224b596de7b555ecad355cb2604f4048ad55e5b9a9a55c7190e000000dda6512b3f2a2e1d2cc3805b1794292d5e9762d2b7fa7e7ffc495cfa459f545d408af64a60ef053e292d0b9f5fb6d86f86feb98eeeab6fc51fd6ab107b36d65316d69c0d96668a4b6cec42ede500572cbb98842ce543c2bec2698ba6a3ba5f21080000004f6788acd63531558e34bd72067dd44d84b2fa712e80746bc6f834e48a217795401ea50bd7a76eaf417f1fde91a1ab6a01f0947ced87200d1e5c89ebc24bf928203dfdf248c9f40a54d3349665c55250f5ebee627810f68540961dd6bd4dec9c080000005c657fc15ee1a298b5ddbfda4370e86fafcb496f40cd318c260ef94458f95f6640acb75c154b612b7f5bf4b71dc54fe2e23e9dc32e9805cc154e22446d286927a6813a09d4010f9f2ec05b2ab2d715e22a3a206854c85e63826e7e40bdaa611d080000006683f669c81280b3529b7326a04ab71d0727c9e755f9a76358002649d09e6b9b40da12bce937b17f14afe79ead517a1472371801dd19c84ec4f5108ecc3b4e0425c95bd783f0ff65be7a66dcdc7c19b75eff800d845d11e7b6e5461aa96828ca07000000fb14b946fe73410285981ea856170d3354f9c386c5f9311b7eb22da50f908ed240b566e97e69b67396292db78a0ed8348554aea8c6d20c90ffddae48722f62a2a65add5af9a06fb306c89f363372668576286251790899c514c720154d6437890e0000001cce0f52b5757299ffffffff0000000000000080e9d59101118df003fae71ed74ddc39c446dd97d6c50d337efedbc0bf48ddc22f63ecefc5c2b70f7a2b9e7d54009cf2cd0d996af08b4e995eb86b604bc34ee55bf01014b2ffffffff00000000000000809bde9101a1dee4544a61def784429326397b2ef07b1900bb1ca24b90b38fff77bc4085bd6276e5c568441bb003ae073f7e452e8554b23c000fc027bc40e468bc41571bfafe530100b5ee9c720102070100014700094603a1dee4544a61def784429326397b2ef07b1900bb1ca24b90b38fff77bc4085bd001901241011ef55aaffffff110203040501a09bc7a9870000000006010191de9b0000000100ffffffff000000000000000063b6fa1300001f2294b15a0000001f2294b15a04e9301feb0005fa920191de970191d5e9c400000003000000000000002e062848010151f646ff7e4bca99193e5b8f25898e231248ff7f34f299a214f230a03170628a00032848010162a9ad506b0843ca504bf3e957f412675555198307ea48f55357a852389ae750001828480101cc87a6848f875fbe3258b2beb4330cc6c9d143c35e15e71ce9c87f850cc473090012009800001f2294a217c40191de9a5ea2abe274ee93808966659b50eef0a060130ef42760b7814c69ec4d2c83305b96c9159d9c1c88d7cb95d5dc57f9ec3fbfce267ef4322910b2d74e5dbe414f0200feea5100b5ee9c72020201ed0001000051da0000094603118df003fae71ed74ddc39c446dd97d6c50d337efedbc0bf48ddc22f63ecefc500210001241011ef55aaffffff11000200030004000501a09bc7a9870000000006010191d5e90000000100ffffffff000000000000000063b6da1500001f22027b8ac000001f22027b8ac76fe104470005fa710191d5e70191971bc400000003000000000000002e0006284801017ee68d1f5da6427dcb62e7f42b83a17a490e2da21fe07466ae190c747d792895000328480101635978f09808d93ab83827b44048d1e83d963f70a6de275333bc133638e481da002024894a33f6fdfb1f19e1801934a5272aa5eb188d68a9f4ecb1c31cdd469e982c39472e7bd7f3d29b3c6270b27e5d3a6384bb26f416d9dbbdb9bfb78a2b56fa69e7c1c13a7711c0000700080009000a009800001f22026c48840191d5e8c231eb54fde59a0971ed78a23e895cdb39fc8c8d45ca65d8261afd36c545495e9de4345d09a2d96be10d97e5b45177af4158bdeb6571b630b2c4ad3851ee6b86284801017939dae6480b2d44f78d7816fbc8343e5c95270cc025a431c1ad04f7333836bb0010284801016a5ac2c8b5dfc0eb5b3673015167ed402d0c6bae49ad27a25cc559b74aa76390001028480101723cafa865fb8393f84c588a561dad5182ce5fed44ea557e4f80aecd2ad7815500132457cca5e883090e2c43b9aca002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac000b000c000d000e28480101312d1250b9122d4307ff825a7d3c22b6f4a9976e41659e849fc3446fcdb6c01f0002003fb0000000004000000000000000220c2438b10ee6b2800883090e2c43b9aca004210150000f2201200010001128480101a0963b1f50bd88e1c11dcc5993250cd8a7aa930a1d449679023125917dee18b800032202d8001200132848010124d21cf7ae96b1c55a1230e823db0317ce24ec33e3bf2585c79605684304faf200072201200014001528480101fd78695ffd58402e209cb0b060c95b1a8a83dae389c7eac9554a3c086e52b898000722012000160017220162002100222848010114265b804cdb772e1c9a48d1dd67ad6e9315495151d6f49bf5f203b2b883ae7c000c2201200018001928480101ff9fb607464434b8240b30817c4e6c358ad723c3ddeed45b2b82d45b9fb0f6210004220120001a001b2848010135495972e4dffc56ffc325d2abeaa6db04e07d832cc8b8847ae195158fd724d20002220120001c001d220120001e001f28480101ab446ae5250a0e5acbf42540f12f69bc49e22d74782881442954471a01c67d6c0005010120002028480101e1e66c22df500de6499c055de17ff3d1216fe5f15247186dde0708e01c52526300010024c201000000fa000000fa000003e80000001722012000230024284801014dc11d21501312a2ba3607d8c80772f8644304732a957dec2701d4760ef7bd7a000a284801018a578354d0e325c947e233195601d025ecd3eff0ebee1ccb50f6c73069ff1bb6000a0101480025012b1263b5fa1363b6fa1300e400640fffffffffffff8ac000260202c8002700280201200029002a020120002f0030020120002b002c020120002d002e020120003b003c0201200079007a02012000b700b802012000f500f60201200031003202012000330034020120013301340201200171017202012001af01b00201ce00350036020120003700380201200039003a009b1ce3a049e2a648d2cbc355a633c404e2518caf9b3f623e524a4d98f3ce1ac48601d9721314c0025ed5f7ff6825aabaafe477aaec7b83921ba90cf18dd33ff4f03e2f7b35bc4a4e9c582722763860009b1ce3a049e292c5c6d6f954a867c892357ac80f88481f3a48f7b0c77a5aa9f1665255b589bb8002575d45a86c57904ceefb39cc1209d689bc4c761581b3f27d9cc7c1fd281b36c58013fe7f1d1d20009b1ce3a049e2b18faf76e895cce74f6c9d3c950f542006c4389b8117560f43861b11740c67ba40024e45e786e507af7222a228ac5c6afc0ce82e4f2b06c03fcc2ccc11f18f74102de79e527e3db320009b1ce3a049e282c1bdd531d3dd9732bc96c2ebaf4eb3f9b62b19183748789d536306a74f00600002474ecfb38a96e183e3467b8107ade8d739831136c871851b1714017416f7471676f8f45bad8920020120003d003e020120005b005c020120003f0040020120004d004e02012000410042020120004700480201200043004402012000450046009b1ce3a049e289c9e73f191d4283177c92bf8ac1f0da7c1da78bf7e2050920230272838fa1310006d5ec6f1a9fc4fba04c54d49d0c2a248697f32eaba92097fd5d726fa4e91f749e61f55e1b37d460009b1ce3a049e280bb131734f31b4ea3d4e917adc09c1e84abb46a8068ee100c9a6b1b167fa80b8006d5ec6f1a9fc4c34c8f378c65a7a2f837c86a9c061d6afb43bb893755048ae64876e99d2b0c2da0009b1ce3a049e29c9b8ce9bbde05be12a4d9f3affdcd369b8bc5b5e8b53cdf4d69003f40f363cc8006d3d187e636f6fc27cd80b3fd0e46b373e778d9de40a15bdd34327d709724c56d12e679830b3c60009b1ce3a049e298ce689b1a1a0f969f4e25761c72bf00934048864f06e6ba9a94c5593f200cf70006cbef524d0fce258127502a6c4d42b201970a44a30069fa999390d4df8425368c992461161f47600201200049004a020120004b004c009b1ce3a049e2935d404474364ba370a633a61f54e67a41093d6955d7642babb97c89bde6beb34006cbdcbfcc76e34116118ca6141513385bce13e34d6854fac170cba9d216efc5f71c1423d3ca8e60009b1ce3a049e2bb83ce23746c4e4bc632a548c00f6c0a824d5e29dd6f645047da88ac8aa48bf6c006cbd445b2ffafe427283ea0bd92891d48b32f4464f1489fae9684ef47e15bc33d865089bc8da720009b1ce3a049e2a8ab7999f15bb906dde3662f920f755d3751081a1516c23c14204f4eb20b858a0006ca9c06034fdf5ffa7efe55a1b9a55e20d9a0d5b34ddda9cc8fb15cd3810480f41b5fabcb599a20009b1ce3a049e29736ace17163c9b62a2b50e19d1e3d0922a9f6539bb38aeacd69a4010b658fa10006ca03b170bd4a07a104cc175cff079e7ddc767de7c18945406ae521e14ab5093ddc4ed618175e20020120004f0050020120005500560201200051005202012000530054009b1ce3a049e291c40800100a97b005de385d5818fb2da6ce07e094672d6a2dc2a4a952abc0c60006ae6d2d365d97518743ced0ce2f84909844c1b90f000a3ec96c66896d5a2ef71c3cfab5f2125fa0009b1ce3a049e28469db1b334cd9f397039743d91e9981eaa16abb270250014c5e16a58ca1b5c7c0068b34574b86f1f4a6303ed5565e9878c5b727902d93cdac1a9c9c3531c56a42db05aaabb7a25220009b1ce3a049e295939b69764168cef7dc95ba41d204950bdd3d7e6239afae80999b756a0567e940068b313a505b72a325a469419b77eb341c7cb49b14545c1ee06df4301a0ac566bdda425e82e883a0009b1ce3a049e287abe91624072afb041d2822f30cafd98bc89b007b137a2ffcd7d4f99ddbe33880068b30e2e08c48483b4199504264abb17d1db2b27514b626c70d308431230755e346d1aa0a902220020120005700580201200059005a009b1ce3a049e2b742ec54052f50dfcd06eb602be3d5fd3a23e648c22832667213e69eef5e7066c0068aa2a251e7bb2b820f19876b593dcd332fd692fb7ce62f133d69afd1538ddaed2d10df2ed32720009b1ce3a049e2974540a78d19fc2c0e725b1d66db33cf1e951b2b3aa965a97f21f45060fa529d00068aa2a250c32d352accf8f07d56050efd8fb3e0ac9ada86b58d4526bf3694237f3d4f77bd27a860009b1ce3a049e295765ed49357ef9f563a7b57dc2d9e4f5358b3039a1de26ac49b958c2c96029c80065eb23c6fc02100345699c0a7769e728979a56dabbfbed01233bd99dd2d0bc544bcb54b9cad9ce0009b1ce3a049e291bada8b50a880ba4c01f71aab4f94f8ac15055312f4d341daabeb412906581d80064458e29fa6caf18e28452aad9bd641f98e55d7744039595724c1ae5286a6a26ac2917414715c20020120005d005e020120006b006c020120005f0060020120006500660201200061006202012000630064009b1ce3a049e29aa2c572a23a5eb09f0dbf28441786b7d5250ac6a78637e59a9f0b78ede76e3c0006442b3dd6c77945e0cfa335d13c8bdc2cb6c84c534419d6a4a0d1d2427f5f7c6b3d52e5377ffae0009b1ce3a049e29e2c17894ae88a0252b2587efaba791da2b5c94c6671d2bab2bd398365fe5ce94006441afe0203047e141a8cd5031943574478d98f63ac3454492ad47adb30c1b3531c8cc349a7ad20009b1ce3a049e293d74bb369b5bf57114768e8cbda9bd5ec27e4cb769078be3396aad85550222c0006431cae1743bcca73ab24af4170e8a646f6faf62520a9e70ae02f66a8faa8d739ef087bfc7e5ea0009b1ce3a049e2baf5b30f31d7f79c56871dd3254a11bd04aed5658ece0f5ada93ee479d19c3ab0006431caded1652427b0096de4bc955d34d0aec0615701d8a028e921f17a53bb9348a002f13d86fe0020120006700680201200069006a009b1ce3a049e2944e8b288d770e4637043c530929a3585582a884e3ab938fa1c0a54c013b3d41c0064316ee853abf0bbd302453127d952ee1de2b6eb1b4d3effa98ee8a6a66d2d1cf34f60a8adf4ee0009b1ce3a049e28b679d697f94b2f5d1d21ea69cccc8a48ed14cdc524a0309566061e9b24757b8c0064293736a90abcdcdb94b5329e0ff38fb4327c57407542d0bcf751c201644c0ec7eb9dfc76c84a0009b1ce3a049e29c0984a39aafbea5a4bcb6aa5a786f0518915f46d418f7677f9454b5f9344c0a000642924e11f304a78b4f2d833b5dfc6c48d222ade39fa4a96bc874e62b16ade02c50ac553929e920009b1ce3a049e28f28257b99c0b218434227a09313b8505a7c04e00bf153f2048a63d767efc9f6c00642924e0bb08748491234782701a48ea4a5a886cf15f978781699d77e4c3f6bf2ea201b3ebab5a0020120006d006e02012000730074020120006f007002012000710072009b1ce3a049e29471da9a9f98130ab3db64267de80cb1ada29e6235b3b0a1eeaa1f50ed4f57154006428a1856db3558a899164b1822d2e39dac978d93383eb78d0354004ae047083bd1275fa5323b60009b1ce3a049e2987e2236f137f4d728b18ba37f8206f788ac0556476fc9e061d5ea9a6ab42414c006428a1855b1682354621106c08ebc3e44c338088f0c135efbbc18605d7ddfab414ab0b88c4806e0009b1ce3a049e2b29ea27cc6837a07e7ab08b0a2d7f01ed05bb2cd4026a555b8e08cdee3d46556c0064283931c52d4e4ccb3c8c877acf99513bd653d35def60e18fae62414b0b3be77073c36abc72760009b1ce3a049e29449b59801b217261dda3bde3c159feb4bbd9a9f1b7e508ea108bcec4d8cc807c00625aa4d8c2e142778e76b5162b3acd0d538d0ce14f1f870abc0d7b4516106d364582e1e4bb310600201200075007602012000770078009b1ce3a049e2add2fbf51b1058e67e00af9442cb3f6acb96e944be2c495f05bd81531e453fe5000625a888def58e0df8da74fd965e4d1bb896131555669d612c644f8e8e2d51b91521ccc12a575d20009b1ce3a049e282bef33d05affc64081b515e96905f539f950be330fc45ae26195830fc08156c400623ace56ad25787d38e728dd85d6c10021deded0962c65c77f742201cf5e27d2382e3cd525f31a0009b1ce3a049e2aa6706f8ebb11f9ac5bcaf744507f26d46922f55c9c6356433888268ef617d6840061df06b59ce3dec585c80807a816a6d3ac84a149a069ede2c4aebb370439d8419e8e05c7dddfae0009b1ce3a049e28321025936dd95a87da4d5d09275065b8f7f2f1bcd32e8ef7f5b5288a74b9d4180060cf919844976253e530f138dc23034ab3a93aa105beba7f3adfc8fac6756c6a41d3b17ec8c0520020120007b007c0201200099009a020120007d007e020120008b008c020120007f0080020120008500860201200081008202012000830084009b1ce3a049e2821ba74620ce2d667a28a6df5ba02c6ae25b8ed853e946b830b6f4966bdd641c00060390f9a32985fc8f78839e5db3ad4221bd66f6d6180cf1184d5d96583bf2ed103649493e116820009b1ce3a049e2ba09003b41c58e8db182ff64175287e5bf15a87929e4585f02376d1f05650d77c005fe4cece117c5e4b8c2ebccf36bbbb976ebbcbeb7953d5946c815783d21c88131d32e40692dd220009b1ce3a049e2bab268d19018bf5728faf4d05057a7d0daaf120499451c0a7298a164d078a8824005fd865cc547bbf07c0bf6f11a135ee1c6c851d45a7348cb431f9172132ee32466b138b1525fa660009b1ce3a049e28fb755bc661dfe0b0dbf86a70788f1f3ca1b9db2e6efed7d0cf551764e53d988c005fd1e419c7a2ca7a33cc15c7eb18478d558617106c49971e53fb44cefdcfd01def54676324c8aa0020120008700880201200089008a009b1ce3a049e2b4a6cf189c2c9f974e98e12ec9bd05b676ef6e6fede28ad5be9a79f0704e9dc44005fab11246b9c19d6c2dc87c6cfb33d88ffd3b1f2f220f90092ee20f25a0cf94490b56b50cfee220009b1ce3a049e293f62b721828a6cd53fa91268ff8607debee1f2b441a3720f02916edb55432358005fa6503999301f14cb33c7d6fe094c752529ee15ce9a43482d7e9cf6f76583ef338760706c84e20009b1ce3a049e280abb49fe846ce7a52f395e39475f99078f9f7e22a5c66a9008035df7ed157ce8005f9fc7fead3bbe7ecc28b733ac93e707cf11ab01189010d43e05211703894bac9a0f9f6b7e9d9e0009b1ce3a049e28aeeef9b82ab860278bb5c4be9079507aea5f2331ec789ddb7a17df2b66812644005f8aef6462def9a3325d669b08511eda154caf8e2a894674119b58682a68c27e24f20ccdeb07660020120008d008e02012000930094020120008f009002012000910092009b1ce3a049e2911ed6308937ca4e76e6ee7b314b29739c12aa766f4a510e506658d741abe8020005f697be1762d153fc4158940c46108797153c2e535b84c6d4fdf70f945f866d2bb19774a38d57e0009b1ce3a049e2b3ce51fd6ba23f3fa5a54b4bd2cf53eee8529463786dbfcda54611775717f7988005f3ad2947f113018dfd4152ff370f50ab0a7de08ede0cd56d266a28868d87b6099a40a45353c6e0009b1ce3a049e29e5a415ab3b728ba97f6ab54bddadeedb87195adad960fd501dc4f0f26683181c005da9e82b4397f688373683b06a1fcb1f2e01f2e650b9cd6f64e5df8e5826b646f4a4e8028df2ce0009b1ce3a049e2a279a07b15068ba07074382484fee7d123226e488e6953f1ab17a7f22af7918e8005da90b177a6aa13cb7269341296477bfe73faa48d3b782a9d242932658b1fbc0dd9da4dd8eaf6a00201200095009602012000970098009b1ce3a049e29066297aff61ae68ae2bdfc1b96dbfb9e2cc40e8115682b7063bea7e242130608005d2315b533151c4c02af186d0d951f649d9091d98f7646afa8e1336f3c97523262947a2f7f66260009b1ce3a049e2b6ab2d3612fe83e1afe38015079a3637c654335eea9793b35570c111ce6f235a8005cfbb61187fa6ecb7250bf2fc6c9bc6f91dfb5151f1354900de181ddc4e471069af8c40c7d2c3a0009b1ce3a049e2a6bacd2a55191790f11941f2539d11a203cc15829af1e7733d21146ef98cd35a8005ce906dcc206c6b0650a4773c4cb96e0d7674437b0084f8dbcdde8a5a06da4f55381027ee840760009b1ce3a049e2b02e78ac66245f54e4682b256e2e1e78a3845495149bf30ffe1029d8df2a7df58005ca3759f5a16eb6b90d0b43e4f4e2004fa75686da2228a063f2c36015dae01b3aba01233956c960020120009b009c02012000a900aa020120009d009e02012000a300a4020120009f00a002012000a100a2009b1ce3a049e2aacd93eacad13ade2660491bbdf0aebb138b95506d0f94fdaee1d00e52af6f1cc005c85a63e65d165ee4b71ea37c53a39d78c22a7d5444337bcab1ea092bffc9f7bb7550d0fa929fe0009b1ce3a049e28c1244c21bcc517e1b19d41a304a9ba4be6243f6955227308b13448348ed84818005c23f0e7bb20776f9bd85d5b0016f6d5dfa99d23eb5ac4b1575af05db1dedd6a9a39f171313fc60009b1ce3a049e29496906da5a771d92195f62b47ed9e381889ccd2a62b0a97f3da2a8bd88598fd0005c064f51cfe12cb2b2f620d8add53a175a14d651ce70897b905fa513c6c747fd62077c0ac132ae0009b1ce3a049e2bbde6b1c06d0787acbcfa999e72079aa3a73081934dc2ed8272ad5db937986498005c061f9324eea396ff9b8ad8c438eafc451fd474a77e974b1bfa3e3a53a5d549c84f365471a24e002012000a500a602012000a700a8009b1ce3a049e28071d124a8884a614c9eaef2e53227a0f4a586063e3a37f406a42c6e994949eb8005bfe81000b963ee4e016f51815d3338ab8c29e0bd03890feab9e861f0fcb68ed8353d02b6b02460009b1ce3a049e29a60507ab894206f666d586bc3e3169274f155d17e66604ef0f435a20b50ded4c005aa2d7d1281a13f95778029be79b4a96dfd0a7896c2f1b2303e461971d9ebea30943f4cbcbe40a0009b1ce3a049e295f4bc0764858cfa785675684fcb6b1d6289e47ea7f808c1e4ab4d2bac81342cc005a9d2958e09216b045d350f2fc365eba43228e9c2f627dcd81169daab5f647006d9446a31d92760009b1ce3a049e282ed580d24d171512fdc784b5244846bbb68dbcb11aeb6db9169cf2e67dc046380058eba2ffb3a8b68cfae9a113091b84c87afe09d9300d3b4a590b6e84e8bbfa27c08ca0ddebb672002012000ab00ac02012000b100b202012000ad00ae02012000af00b0009b1ce3a049e2841c00676953c946df9279c57744e189df9deed07ac0d9d386a92682d2165e028005734c1e1ac757b2b91def8b3e3c77a66db288991637f705e981aef30a18455d634d26513930cce0009b1ce3a049e28013eb1b19ed74c7864c67e2131f655e21be545b075aef8fb8bd65be0d5a19f10005710d2626ad9b1cedd6eb17b65e5f17f4dc0adaa102c83f8c64aa3000dc42d836bff6ded8e1a160009b1ce3a049e2b241d7ae252df18d31930630a2a931fb2957331a36a065af606c2eabcc66ad39c0055b11e90cea9db8b972b6a9871b613e1a8d863525ba82f6631e7b71e5abe6256e0bee0f2d99ae60009b1ce3a049e2871cf25bbccee0121308f659db480711c04a92852990d25f7131244a3f5b0fc500055b11e90cea9d9e07ef68daa54c13e081ad58d7d53812e9544b3ebfdde0940e36ee1414531ba6a002012000b300b402012000b500b6009b1ce3a049e299aa96f8e12b98e4c72db8785dff1d3e21598a5c0d0a110cd96a2aade3b49a5600055a0f4362dcab0c243e0ab84c6ce8324939e1888aea6363bc3b081d6ad18eca492fb89a8125c9a0009b1ce3a049e2b1933b700065b16ed4fb76429320efaa3b2a1b35e4d85e041ece12e559df3f0ec00555de81200af799867e1d8c71f6175a5ea27ba5cfc9e1d27e6234e65fd7306a363e0a1de3c51120009b1ce3a049e28bcd155b600077be4f3bef744eda1c7bd07bbb2789b5b49b0bfb5007aa4bf35c80054ea39e797181f64ad9c733608f13df6351de16e5451bc614bff07d4f753123d1b2eee0c03bb460009b1ce3a049e2827debb2d6982b406c4fd12aabb08e04c6e49d0fccc0b6445faf6eb0a3eff9db80052ac334bc437176802d2ba64eec84cad5b03ab06554b3f0e1e57ac20967e14ebc37106f31153ae002012000b900ba02012000d700d802012000bb00bc02012000c900ca02012000bd00be02012000c300c402012000bf00c002012000c100c2009b1ce3a049e2901275f1ce9f450ba8cc6db7c15cac2cfb9f063883e6965043a97554188e7117400527ee657885b5d06a492cb59bef4c9ab52def25e140442bbe9f26e63e71ae787a9a7fbfa1aa8860009b1ce3a049e2957c241e45b2bdd488ad056fab9193bce7853dce8746804d43a8c88ffbb80ce0000522ee508b5af3faf9675e686c90fe2a02290d434d32e987beb21ecda88dc46dbbec0f2537f5e0e0009b1ce3a049e2b61ae9b7374312add98b92caa2571707028262a7912b6f90dea389e20cbd19ba000513bfff15007cc51e74a504d562876807e239c6cb607461d858c47336791a1bbfa84f3964353960009b1ce3a049e2aed4353c188fe743d6f7d48f71e1deb788007f79be942a0a2d427ccad38fe7bd000513bfff15007ce158086f70a6e1366c4ddf33f82641fe760fed5c84a92fe68da8a3967be66b776002012000c500c602012000c700c8009b1ce3a049e2b40020c31f5d18eadfcb6a894e9897fff04574a3cc8672a57064d93e0cee890e000513bfff15007ce2a10b37bcb1ec1baed930bf99ce1842d6380c306b80fcb5ff2971f5fbaf3cd3e0009b1ce3a049e293030b0b541c233401599189d016f4b6fe09855ed32a2a63bcb7e969a7ed844c000513bfff15007cc940fa67fc37c020ba8a5ce7e7a9e40073034f2005e95432538a8f9d72a496b0e0009b1ce3a049e293943dd49fb93a7a5f6543e0e60286814853696794613aa8772a7351e1211846800513bfff15007cd8ada53fbe1b8204016a111b642c5c10b6efb15a9157ee01f73d1fc76ce6f42b20009b1ce3a049e2af03069a54dfd5be35f5387176eac3b1482818e083f0d8c24bf449667515681cc00513bfff15007ceb823314e26d653a3dce059977a0c83c970a98befcf5e75c937aa9db29d67feaa002012000cb00cc02012000d100d202012000cd00ce02012000cf00d0009b1ce3a049e292a300ad4cdfd4caa273d16c87d76f16b915c1eaa6e7f2fa2474860159e5316e800513bfff15007cf0e08c7ddf1bfc3c18fc59d5a8c49b262d4a98de685d888117d87e80e3688c12e0009b1ce3a049e2a919b28c41a9ec7dff19fa47f94e480268a6d1016f3cbe71fb85d34af80b8ed1000513bfff15007cc9b866bb0a015a1b9cb4a04259e75c2854e14017f653f3e42e34e3e2f87ebeb1e0009b1ce3a049e29a29773dcbb99c21b4880e3e272fbd337ca9fe1e049fb6a4f55c24fe294a564c400513bfff15007cc264b4a58989a560db1e2b784ec64a2cd7f1e31f707785189844a455aa2f019da0009b1ce3a049e28d25715d7c509e77edd76694f8f26eec7c8413251411909c7af567b5db6e44e6800513bfff15007cc200da27d131557afb6ca1c7542ed43c867320507d68f6595dd01e0bb32c471ae002012000d300d402012000d500d6009b1ce3a049e2a3e6ca3646e38e7a31f5c50297770cc2b349459f55a56d0e58a6ce681c9f8044800513bfff15007ce22d3e8b9e0208c7324c00eaf69b7ea62df5ba4fa59714f465dee6a87953d8c420009b1ce3a049e2abb0f8a556557122b1c78dd74dc42320717e2dc77709b6255edeeda39707e526000513bfff15007cffec45c828ddfd9fc9b3f6fcc0b358d37753667ccb44a8a5af094e0c9c6ec36060009b1ce3a049e2831f5c26c4b084533faecf41685b8a471c5b9d9cec7863aa5a3c034ed00fd246400513bfff15007cebc819c25d36ea49ec9b99cfdd3cfaf91d642ba9dc94ff8273ef4a7b4fd1690220009b1ce3a049e2be29785d1bc4a0f51980c8fd49124d40eddb1f15596870e038e264975d6f893d800513bfff15007ccc9ba8487cda2ccc88d92c89a7c1459c7585459e44f942bb38fcf192199fbfba2002012000d900da02012000e700e802012000db00dc02012000e100e202012000dd00de02012000df00e0009b1ce3a049e2bb0f233d872fcb2d228d3207d1f13d4bece7de908aa57172d16fc2b18ddf4a85400513bfff15007cd6680c6a2a94f3515ee812cc8865a8cfb40ae24128c0f68230d7f03c9055c1dae0009b1ce3a049e2b8db14c6aaa2f866fb2f4ff42d1ec9eec7b9e5cd5928e7637c9767e1f92e12c3400513bfff15007cc82336dc9226ff3651616ad7d83224c1c7bfdfc647001283ccfeabb8a38e526120009b1ce3a049e2b80ffc517086cace7e3a2dcdd346fc7038818f639f3bfdb8c7c7d21ab48f86ae800513bfff15007cdba3eccda1a1a67603cc4de6a8b3de4f6f42c68b481bb25667ad0f2a4882697e20009b1ce3a049e2999f32052a727f0f9b97b6b464100e7b98497c51a3a09891d45f20a2a1469461c00513bfff15007ccc9c22d344f11ca4eb99dd0fbb543fc11dfb1e86e3206669bb76df787e1f02bbe002012000e300e402012000e500e6009b1ce3a049e282e648d2ca0e6df4a2f1d1c7eb28d3aad3222d0a09772a76fb59f9d2e25c1204800513bfff15007cf32f2c478c701e91245aa3d88dd55817e44c73d0c42da9f2e84161d79c27c223a0009b1ce3a049e296cce7759d0f8bbe6d8ed7eb04ef03cb6aab0d3c526dca33ed760c7a3548b3ec400513bfff15007cd2e07107e20b6685a7c898dec3007a9785808ed41d747c0d75078d63b7c76d0e60009b1ce3a049e2a1204dcc80b3894cbbd36fbc8109c7e00c021a7c5f97c89d9bee58ca939b6e89c0050f4493edf91f7909342cba491b08507f8a25ba54c409ba6d10cf7b9cb58a3eaf5e464fd7bfe5e0009b1ce3a049e294d9e08f5db713462be9d6489395f307791061022fead57d702f881e4bf4bd2900050f4493edf871cbf783a061684fbe1608e701ea2c6f13371cf276862016b349ebc1150977c0536002012000e900ea02012000ef00f002012000eb00ec02012000ed00ee009b1ce3a049e2818ad2888674a9749cc3bd067072f8accd45df22ba072bb2c222d1e6311fd19880050f4493edf46741bed0b68ff4bf4108f22687b94f94b3a45c56a98c5a293986b062a2c72c4da460009b1ce3a049e28a61b304d9fc54d663f44c234ca5d48cfafdeed2a016b77b252e39a0fda9d2e300050f4493edeb9ec60dd58645d6b8d97fe4ba07286e084488fabb602c0872b5e57c6705ed9de64020009b1ce3a049e282bf0073c918630a258c74ff2f414c54937905130abbdf9f3bee14a483b9c59e00050f4493dbf2bf68ea011dc72f54b87e8b43c94a59c6d499c19394fa56f6d0df127a393d11b77da0009b1ce3a049e29a0941cd8acf3766d2e116d82cfeb978e30d9781792c49c4e25af56206b0989940050f3a919aba794a9cd2bf686dbe7ba6d440aaaf67f9be34e0b3d990749e7e700949d420578a8a6002012000f100f202012000f300f4009b1ce3a049e2aa8c29c567df57e4c607e855c32109db1067b64a19e311ea4d6282e167c4328d40050b5e83035c32c24f830979f1ba394187d506e3dd3568fed7c2f320e5760c540b5393b590983f20009b1ce3a049e2ad2972c8630fe91a3bc02ef85cdc3fb79a0ed805f7cc475e14cb8874b0154c1a80050aa2164c7b71023fef9cf49149b2e2a3fd7dec7dda3a1f0d120cdd262f6ced9b72be999785cb60009b1ce3a049e29c245d6cff5686353ddfc05f7e68b2971c6db45fce1e1dcb4bb6be30ba6a820dc00507d2df05ad25864170278680894f6ea68ca69ed38d7c8004d9acc66269c52dcba495130bf58960009b1ce3a049e2968874d8beb06f71ef35715d46ccbcb2aa9ce478a2858fb7a3d33ab2254a645f4005043e80999e13c424f5e283adc3e8da52c90a2dcbd07e311c826dbc4b63dd81990fb6cb7309bc6002012000f700f80201200115011602012000f900fa0201200107010802012000fb00fc0201200101010202012000fd00fe02012000ff0100009b1ce3a049e28cb5061606d422bb7ad6d7d7d8a28489cb08095eb45570cdba6c56c2b7d17c604005016ff638652aac0b948f616efdbdce362a389bdc2ff7c1596075ae4b69a6092b2a7535ff8c2360009b1ce3a049e298c8191c9bae4c59adc82cf4c6e045716c573523b7316b2060bbcdfe096d86460004fec538606bde6dcc150c16fe0897241e80f4413339d2e0415efaa02a2c352173263a0a0b3e2760009b1ce3a049e286e5ad77d7667fcff3bc6e02b676e6ab8ce1e37119ce02d3fff6b110d9b81f638004fdad9770d0b69559766f814cee12945ec3c4a16cd5fe28b8aa917aabc059569c0591e5ab8eee60009b1ce3a049e2b19c93731a4cd513cd7d2fe3d4a5c2942a1a045dd983f4dd4a4f15ba034116f80004ec863067eb28a9fe01ee4c98aa31c42d62389794ddae1692e08d60154e0b6a8674d7a46cfd61600201200103010402012001050106009b1ce3a049e2a0b1572161f50ddfb8832cc799d3533c511619f47e8a41e304593a820af4a03c0004e999ea7b557d2a3ea0c15b74bf9ca563a8cecb1faec9acdb620557a084a7c862e19df048f83ea0009b1ce3a049e2ae46b832d576995b717be55d264c91c7402b0fc68d0347dd81d1952187436a20c004e0f8ab3058996c7839a36d9c3a50549fe17f50cbb02e554a4b2c1d257004b4c9f707134a7c6e20009b1ce3a049e288d595a7d3cfd701f98ab41ffbcaf7428cca3f52c334acd63d3d0dddce7ccd910004d9745c144804c5fa55f0aa07f8a913949529f844a6d4575c26fe919a23051ac8ba288dadf10e20009b1ce3a049e2b7b09c75e45ad8a49aa3aa812b82c081202c5aee99fa8c60d548802c79b4bf444004d8af4ea10e74d528e1f2a08f6c977deb5e1ba1eabecda6ce4b2ee114eb8f678ca2918f77b615e00201200109010a020120010f0110020120010b010c020120010d010e009b1ce3a049e29ad7ddfef762f538241d3f90c0a9687d8f40ab17601501900a396ddb54cc53d88004d8ab975375c82495ebb678b36f86245c959728e2166f3600d364b3843284667a297061efb9b060009b1ce3a049e2b083d2e5fdfc69d99ff919eb171efb62a9ba26427464aa896a861f9d34c420c80004d882a060e942a923f7fbb1c77f24be5deabda8e6b8930675d0751aa2d8335dc8d710cb929842e0009b1ce3a049e29d5decb6fe87ae4271f9c7927ada5ea5dae5ea9271d0aa801db52268796a9e588004d875aef1a343695ae334a41002a3acb6bd81cee5ef4258f7c1003c7d2f7f4c3b9b385c711968e0009b1ce3a049e28037f2b97dc5f1cc95756631452889d6978d87f646f16fea3f7db618fb209bb98004d355fa800573bce1db1c705c494511a33bffd387a79d10f195d0ba82653325f88a7d52b8ee72600201200111011202012001130114009b1ce3a049e2b99dca674075767452664538af4916e07466d2a6902c4b0416f88ef491ac96024004d3118e16e77628b43081357b4885f7d6a67a762a88101e31026031cf6ec6bc1fe92976035cd8a0009b1ce3a049e2a08543d096759612006102899937682337abec8c99ea22a74490808d89d48d61c004d0d88d5e4e6c8d3a5c152504a1ce49bbd0c5f022169be07c1f530da7255c17855a8bd810dde7e0009b1ce3a049e29d0f5b485f67f770c2248d72698bef387777000200e5166e98a852da4ce166cdc004ca3fddb4acc759a28a87acfaff5de1c222cf4af07dc11e8e3fa4aadef5dab7ce01c114e5b9f6a0009b1ce3a049e2ace273f15936c3c404f706056186debd8d8321f6daf9650b727b8545dc9bca398004c216a2bf9fc1ee53147ee1c9a4d4900c0c292df9fee569b02e0554c91ea3774f861af81fc3c96002012001170118020120012501260201200119011a020120011f0120020120011b011c020120011d011e009b1ce3a049e2924fcdcc09b78f5096dfdbdffa013a7b4a1ff1d05af7bd1af5ad935a5e702256c004c216a2bf9584125ea341585947baa0194b1406662fccc2693dd8932211203a1326a59f50ce64a0009b1ce3a049e2a300b60ad13036dc87697cf43e63972320e25649119412e4cf6df6058d245de08004c216a2bb8dfaad16d52d1d34af75b70c1a1c7363abfc373cf7fbf3229cc8be80276825670bff20009b1ce3a049e2ab12281b0854af59c56225d0c562d823cfd83269e98931719349a8e2117bf88f8004c216a2b68c7e398c7b95f42a89c2a5ed53d6ae8dc665a1ae424ef1e961bac85be227ae5dfce5e0009b1ce3a049e29a27e13b44c773be4852de10bc24c9b814a65157044a0a7eae79bb1f151110220004c1b0b26c43d5f23623fe37a6a77b0547345396708c9363518d18af94528b92014a6d7950fe9b200201200121012202012001230124009b1ce3a049e2994792e1552bdef171bb1d93f6c7246ebeb0988ff760560eb03a609cb691ea020004c1b0b2170412a8dec11592e433234901611fce32fadd47e24f7536ac942b81c5ef7c26d979dae0009b1ce3a049e2bd2f44edd04176d8018e822ef816d3d802567f137ab8f013bddd49b97ce4df238004bd1a19b09d383d9b69681f6a2d635073aeaad83c2107fde9639331762bbdc489662d80881fa460009b1ce3a049e2b4f6ce3a8f250cdaa01bba3f279bc80b1eda3e77302cc92d6280c0056ce9b3770004bd1a19b09d383b08339ae393d96b9a5c519258e1c62c12c65bd32222ad5c45d8f201fa7c8d29e0009b1ce3a049e28829ab227396eea1895f682b335b0cbdae6647d5b81126be2bdc5589fae5c0168004b92044883e911d1dac2c9fa11b7233fb8fed809b60b2242e804da5c370c791909130c6f635d1a002012001270128020120012d012e0201200129012a020120012b012c009b1ce3a049e2b224ff31ab5f56948096284966641b2af4e94d97b95f0119cc21e168bc255bbb8004b34770b15253e2bae4ce9ca3b27c4b57c5bfd4c91ed11f604df3803cf0beddb4437b63c7ccfb60009b1ce3a049e2a034d1800320c50f81924247fd828f530568d0a7a4c129aa4df4bb3de14ba2f88004a79c285d45e25a13f11ff3180a7b3dd16e833c3a411c9cd17c8859c0c288098c80fa80b47b67a0009b1ce3a049e29dd92968002cdf8e1a3b3db7b2c73a5c61cef94c5725e67f170d2084b820f89e8004a6719a4493e8c848cc771bbc8361d86f381187db7bb35f83fe8ad8241d33b8c2c9acaf59723b60009b1ce3a049e2883951b4017535ded005f60d9ec07c7d1309ee1de98cf763953fe22e42e4097e0004a21b6822126a8a82e510b4d9f501503c4769c8f05cc7f25236f156f00aacdee9b7e06eb07ed820020120012f013002012001310132009b1ce3a049e2b636363fdad067925fe16f02a0cc3e6bf889b18c02390984ac1cd4a1551eedc5c004a15f308f70142b3ff15b5771e8aa82e713e2ff3943969629e0f64e0ddb68165d190c2557ce5b60009b1ce3a049e2a52b5f5406fab7c27fa6cc5f672d57ac89134796b9dcd8fd25615ebc926266e5000496b45d7150a906095072f6eb127007e98b0c2c855151bac6b94c20700df1f544969a2a7f853460009b1ce3a049e2af250dfce89a4743d2db425937d774e6e62a96859849c3f1909bbb5a4df96c2980048e63768bb7bd3b41318996d6e8ce34927a5ab553a01ea365fc17998486465516d4fd420aa885a0009b1ce3a049e2ae02a34a1ee88ad3117c65f46f23d3ac72d8724d265078b265194445a850eaf0800483f5079edfcf2220f165e4717e1f52cecafc84e487107c80ec6b4b65d993b9262347297dd74ae0020120013501360201200153015402012001370138020120014501460201200139013a020120013f0140020120013b013c020120013d013e009b1ce3a049e2b81fb03b5d303e1f29460d2d04dca417dfe604219fd32efcf9d9424e35bf6d284004792a28c6b944c3943525f8161f8aec2fb535335fc2bbb1ab0b47681903cb447cca69824f1b9ce0009b1ce3a049e2bb26ad8504486b44dddcdfe1118045af1f591be6175fff702871470474f96667800477cb2c3c514600be1e2bdb47318045ffe1bb6e79f6bdbd0bb5413fa37fc222bfbcdfee2e857a20009b1ce3a049e28704ab94923f8bceaaf6e16a144d457f43893f619f210896ee1852cf34bb92c2c004699d3d747aa585d2496398d7959f433a2c366c5656ef64a8b1e04f32f4b49c4156665ec1a258a0009b1ce3a049e28cd5c7246d1041f0b137b4d98caf78fa88638891a0a27823c3ee148e4a3ae8928004686792c6bd60c3536dae1af1fc09513176aff7c79d638ee99ae975fd964bf942db7d0fb91b77a00201200141014202012001430144009b1ce3a049e2afa1433e595f165d650dab74e52719ce2ed8aeb63a1986dc02d9219379fac95bc00466a146f61157048921455da5b253bf0a0373e940dab1f62c33db1b6c38e2c2509e90b18d6d8b60009b1ce3a049e28c8178eb58eff23c25395a602f6c4eef3d091c30ffb3dd7fd4b1e1b7503eef5000044f31a687517a23a49af7f589fe5c368507b67a2fbbdf28486af9372c42a64f913017cd699bfa20009b1ce3a049e2a8ec93f523e0d87a6539f62015ccce9651b43232b39a5b889e8af9ea3d4b645bc00447417692cfc17a152ab83b747d20af6cae343449237c3b902628861aff74ba65a90133c0e489e0009b1ce3a049e2b099345955edc1f17e08eafafda6bed2cd4b47a2fa6a146d4b1b75d5516e2c6bc0044724a042d0d5d63dd94a980935e004b618f63008b1227557d464cc7cf26e705a8a109108c4efe002012001470148020120014d014e0201200149014a020120014b014c009b1ce3a049e289a33d4bf8ca5daf4047958ae60c9c138aee25e3e5ec23fa580e4d35c5278db540043d9022fa5018c3c44edb7d681a9eefb9ee72b66ec874c2dcdbbefef4f9cd0ec9131c6e32ba0420009b1ce3a049e2b75c190b3dc3bf6b766a8cfce44cd859f314d29faf6a81ef3af61c294e398d6a40043275ae1d6fae7aaa83f00bd051fbb5536517bb5a916537bcc03e27a87a7ec0af1943fa239f3420009b1ce3a049e2b93568e49fb4455c8226b7cbdc387b7f041632b4bceddf322d7a4efde3a26a3f8004266d6d915536f81055db64e196e3396ede7bea28437c1d49f6db06acff8689eb73b13ea3f53420009b1ce3a049e2a13017f78f9830370ad7b826c440efb3c96643f2480487ef9264860c948c6ca1c00424987dcf2fa1a763a6c36379ecbe3bd2c9d80028a02c67b03e5e663eb0a06339ab1fb7caecfa60020120014f015002012001510152009b1ce3a049e2bb7791e901913649db9fee664b93067d1005b677b9c091a77901f526ff1f9ebd4004145f0da9e2c1cfeac07f0e4bc11320a8da8b1b3a66462b53c494a4e14e76c238f26664fffe24e0009b1ce3a049e2b5cdd7f18e3e7b4bd6a1ff6c132ad586f67b8af71c31162438bdbe3ebbd9b97dc004136cd23d1f06a30b8e5463bb6f4bae077e1956a261234d3f1df5317559c2c0cd5f4b8057f475e0009b1ce3a049e2b4e6ba955fa35aa7232779838aeb8c4f32e7e6e6fec8757549f1730f7db992ed400411547fcbd4afbe6fb39fa18008021f69cf749ebd9830bafe10e67757265e392706ee3c38acd6e0009b1ce3a049e2b0b8fc02a5376ee47bb3383ddd8535fb8d28201499b4f2c98ee7e3f1baf8a3e5800411547fb9dfdae9944ac68574578f8ed0bddfca72d4ff96126182d0aba84e1eec9c49d3719eaba0020120015501560201200163016402012001570158020120015d015e0201200159015a020120015b015c009b1ce3a049e288e83b5266d673af1d57f43fce8a73c09f3c892a42ee243a0f0e593e45b000b740040f33830cb8511d347c45cc9b3c30a240a3994be6e75f39126d0d63cf6a853769ef998ca6d590a0009b1ce3a049e294cd3049ad17207b2bdd4398a0657d504dfae435da41da4f11c359bebad1baa800040033df01c78049a0aba445a362a7aa7b5be60b52a9885315a3c192b5313e881d68322578e79a60009b1ce3a049e2b18745f8e2abf5bae9f5ef9b2fb895dd23a38964a44403615d87e5e19f2ba1844003fe7838f7ff7ea6ba35a67d878b9ce8cd176458a2afbf5b8d642531b3f489a9fde93f24a1ec7120009b1ce3a049e297a7e573f3e6da9ff1354e66fc047c9aca5a413c775d1e266e2ba69e1107f76cc003f730e6021dde47a27dbb19ba353b571991f65bffe5aed1f4760ec1b5e2ffb23dc9430e3a0be220020120015f016002012001610162009b1ce3a049e29f49d9527d90ccd614879ffe2440d0c92c2475898433d9bf274d968cfb5282b40003f5622c4952a34e5b6248ae957819c53195463dd7a29277835a5b27323db64cea1c0b8712907ae0009b1ce3a049e2806257e8398aa4d5083c05e62b0526af7955f8dae598dc5d56e961b6d38e8d008003f31d6fded2b7d63653295d7a0ab3ffe70a8e39b431046c93e5a51976ec30f17c81151a28b62420009b1ce3a049e298cc5339b4c90ddb2bccc9ac134c98339b2568cf08e01a6a0383cc1d1d927e784003f1f43143ca274303963b55830d2d2853361134b7618ab43528bbdaf687a69d26867141792ffca0009b1ce3a049e2bb748430931370f7f91a6bd9f3b5546efe00ad46e6a6f8c0cb2589b7e61208ea8003e84ed82b0b082648a634deee5132ed07cc454c7e774e25efa5b427d89aa80656253524aa9f8de002012001650166020120016b016c020120016701680201200169016a009b1ce3a049e2bce19df642b05786149f5875f7d1d54896e4f16b3bff084e6109ff2f80d8c6e78003d485a450422c11f36a9b75b9687f793dec216c606e3f7c6bd8abbe1afa40a288e30de2950ef1e0009b1ce3a049e299af4d236bd78846d16b0af9db8fc04ea7eb68455d790f373c77c9c9dba013754003d12c945504511eb73d6117661e38f086a8631096061f73baa8ca5181082177fe773edeae06cd20009b1ce3a049e283aeacbbe7fba8ece71f5698f70896aa6ce4e681c796ec44e65a8ba6a828d808c003cb45d245b65767242fbe7fc4774f4d3dab3613e7cafa7b079fa124a33a6fc90ca96baa69704c20009b1ce3a049e2abe221fc419d51e16fcf6e3db290d702a38aecf6a75186157a71467b605f11528003c023fde8593fb751d7dee28e7a37b1e3572a62abd33af2ca3f86d1858a0cce6ff60bda6e3459e0020120016d016e020120016f0170009b1ce3a049e2a2308d04fc34dae1fac5e0cfb62d3e10c96282c5e042c1f985fe4d7b4cf593500003b926cff56c49f06d5026994fa04e5b710b4e68c4429a9e705ce1a95c7c0813127b2a8fe381ea20009b1ce3a049e2bcd9846363876b4a7152b16d0dd18dafc25c91ed23fda855063d0d21f783a3400003af666ef81a1441894d7dd51f484773b9a020f2a4731cc0bea996959772f0026844aed6d0b459a0009b1ce3a049e2ad108d43c2f33194de16b29d0a2a6a9e2f5a69677007bcfdc172ab35d8982265800399e2dbca886a21ea43d67ab725691048a03b4a4b10be18c03fc4447238864ebfbe528e9afafa60009b1ce3a049e289be5aaaf1a161d23e98e6f0c11bdca66ee82e7f83a3900307088336b7f32d47c00394b4cafdae3e43117a1436555507b67b126b413f84b55c58482661f7a5e81105ba616ba26df7200201200173017402012001910192020120017501760201200183018402012001770178020120017d017e0201200179017a020120017b017c009b1ce3a049e2a7eebfed314fd0a8eb1f3a3e6f1f15d7a4bbdc597a8be8e1aa50e43a13026e64c0038bdb4f68b9f95a023d9beb6ee16304988b5dc61e3ebc7d0911b35becc2bdf617c284de350d93e0009b1ce3a049e2b65a7d1a928c1fc0e2968fe10d576ee9ac1b910890e9405ede79d00e5d274e794003761263cc18d4bd812c697eae700ac388711e6f6732690f3232914d4ed8050d0c4a89e7aa035960009b1ce3a049e2b4ae0da525b07e5915c91b50817ad0bc034499fce0a20ea7676a5676715f94f8c00371b434c764460932130f044374de6c5cbd9e723044aec3af3f77b18de54c9b9f7cf43290db89e0009b1ce3a049e2b45736496e4621cefe30fba69a6b92bbdb0ae78124564b751c281e52e722e3c3c0036af13f32f34d1660031191e56dde5e0ca9fac0a7adb0422ea50b5a77769ce6754124760a0c9320020120017f018002012001810182009b1ce3a049e29aa1d6f2a7c0b4fbc05a2aa683fb8e00bc65bdd2aedfec4c14c29d70214bb27f000364ea331c514fd6d40d6f38e60cb6b302febdb408fcaa67fff8c3271a40929b1ea0274b2e730260009b1ce3a049e2b70069ca5c8cd9850b2ffd760b474ac0163683e9d14bb4165e4bc6558e44b30f8003627fd987aeefbf09a1ca5182f7a1832d9964fdae6786d148544642138d9c1d91c3660a3bca58e0009b1ce3a049e2993e53ecf83c6438984442895537ee60b77ab8b0e06a85cb932baf8c6177dbf280035f088d741eec69d32e6213ac7ee6541c7691835955b5c383bf1e277aca1dba4825d8b8e5b09e20009b1ce3a049e2a8218259e1fea1603f17c386db27fc8e66b804a463d7ca295db3891633e38bd4c0034b652073df13ec196c5b1cb6bc04add46eb9eb075aa93d31826c69b548eff130b118aa1f09d26002012001850186020120018b018c020120018701880201200189018a009b1ce3a049e28045f1c6d673776ffff51dd0a2d60ed017113163cd0cc62f460db9fb4d7e0c75c0032e8264623ebffa48075ecd741d50fee154318dc3c16bda368046babcf4d0ae90619e10a3b27be0009b1ce3a049e289c560df834669b5eca49b8f33d1d9795f7c3b38bed1eed60a2dd410d6b20e5a800325a0642307032517e02c8ac346b58789397d3a6037f74656cd72e1ec4b6567992d58e07d98d9a0009b1ce3a049e2aff45d6cd1038d85bd1fbc7de5cbdb98ce21e96ba5aa68649fce921b754ae68b4003128d7ce462e30dbc32e7f98f5f18ddf0847960f69dc56903cb7924ff0bd4232512ea170108e660009b1ce3a049e2b9702ac6f1b34556bfe4a494deb4f2e5c65000de35915cea31af49cad18a0c51c003128350b498f8f85c1cfdc020bd8aa220810902f1bb066557e3927968850f219267da0bed3d52e0020120018d018e020120018f0190009b1ce3a049e280cc47485e39022b0e52f7ed96eb17605eb8e48ce8c938f7b6e0abc3cc6bd12080030a349e8ae5c369ea2d14b979198992f73ff458a40d76fe3157ee74c5a780e1d0cc1e93f3260520009b1ce3a049e2b3818081c12a25a0685c1aa4d5a35c6dfa3b7e3106c0f3000c6e47228df0baaa400302249d821c61656d776e804f4c2763599d0bf0b586833ba8e36c474f43238da2169b0746157620009b1ce3a049e29f85179ba3c62e6df1d1ec789c6c95e9e2ba58d33cf3fb4f00f576344940a4ea0002fd6e2bae51c675d219533d6a9d383f0a19caf6dd415e9c444edf0a7739081733c5669a72c94ea0009b1ce3a049e2a61874467c765f73c99c4bd2e1256c43cc51857deaaa52665e32e71bebb6fae08002fbcaa9113fd23e6f8d83ea8942b09d61d60366fc0fcdedb5415ac13f4d2cd690136d3d02d26ae00201200193019402012001a101a202012001950196020120019b019c020120019701980201200199019a009b1ce3a049e2b09fe56e3d621caed1d6830548ef7fec19b6f9da686522fb6386243b9a2fac3c8002f149c7f9d53397a22a2bbc6f1a3b88e34d3ec3226408f6df3caff6d30785d07bd1501961a0d4a0009b1ce3a049e2b818d0607638489ff6c6cdcb8154f9ab553ed7143bd536fe53cde188ae20b5cec002f0ce9dd8e74bdee9c4e215c1203ad0f95cd8dc58bfbc667801c1ec68886d16573346915867b620009b1ce3a049e2a555eeecaca93de3d4361fe4d2b11403f6088db79de66f3a7ad9970b06e8dba94002e7a6f4d1f0e495805a66889fc09b433eb1cac810c5975500818e12c8e0ae0e3bdc0974768e9ea0009b1ce3a049e283b549840fa90dc8bc7b211fa307c31aa64ab55a2570e2146ae874fab49b770ac002e6456149fea6b5302e6519d43cdfff5af212c987ba369df8c801054a5e11436f41e09cdf9b3660020120019d019e020120019f01a0009b1ce3a049e284474845f50943d5d2b22facb4717fdfd04e308a642c1079bbcff3ef04d1e3e24002e14aaa58948dad2dca6096524a35a32e685ba71cca426b0e3cf91c3269cd6eeb73671b7134e960009b1ce3a049e2a6e677179da8dab1bc2da79176b6a0ff3cde047b59bbddee24f37b51f487707b4002daf88081e43ae29141b26bd203d751782e5ec505807ca9574e9c73296495de83d5b39b51523fa0009b1ce3a049e29cd55a63830813c5c87e6d34b82608d3b559e6e96d2950264127298cb1bb43578002d975867409aab3be7af211d13b1637d8ac7086c5f4ee0faa764f3d951943ee00ef5468c76617a0009b1ce3a049e28351d63fb3f018d0da8461f342c687077a321af5ceb48feb32e05abaff02a379c002d00e60b65b8009e744c630804d331bc19d8ea9526071fb66743a527259298eb9b175e2c4a49de002012001a301a402012001a901aa02012001a501a602012001a701a8009b1ce3a049e2aeb048f14ed6d51984a6b930b42e87f092a680516ace5202428a842b53632c38c002cb96095c8eb5ff0d9d05277ea1c26ab95ec012c57d5a12090749eb1ad9f3149bc6b670786cdd20009b1ce3a049e2bdefe5b0d0d98af5e8f5746e7f0071a7a3a645fc5e1e789ecae732c756eadf728002c138777d22f1187f135d6440bd6a79964873da81d2c0b7b376a26f07254059187ce262d485c0a0009b1ce3a049e2a2f2c401809b9067696db8815f33bd0f6a59c41e3c78a29690c95490f2e8adb3c002bc5d772d5fc4da17d1d73ddd00cba98a4cf38b3ac649bb9e6ce7064d651c825b650ef7e5e005a0009b1ce3a049e2aaf960e4be43765e54c3cd629cf62e113a6ede408294180b56461ccac468ae180002bb2516d31d0e167339f65d1a206965adb6c3f41c0332f0408ab3b37eb1a1e5030776b0cbef34e002012001ab01ac02012001ad01ae009b1ce3a049e29acdcd0adbdd904a1fdf68c4410c39671b128c4eadbdeb68f17540bb8a77b07c8002b5b4cd6ccbe1fb1f366ec8202d0d1dd0f7428a8f2368678939775dfd43322e3caafd2f9a69ac60009b1ce3a049e29eb7e0e6cbeb13fe777a9a8c6a47d88ba1cd8a285629a1cd81cbedef301b5a324002b4d0d364f5abe5424030284a2643df3e9a3dc27a4e92418f7d2863b8c4d44413bf747d8eb6b4a0009b1ce3a049e2962a9600a818fea9e38e1008512f91f9090fbe4adef5be84f647b3eb79f5e96d0002b4d0d364f45338286f75181e77418494c8b18c5b3d9056703d5650263c2aa0f45774f662862ca0009b1ce3a049e285ff126b82de450204e653373675c64de86d6ce322da29deb312272d64ff838a0002b4d0d364f4530c356490435d8b26734a3e8523ddf06685aa2b3f48031952beb28e88b19587c42002012001b101b202012001cf01d002012001b301b402012001c101c202012001b501b602012001bb01bc02012001b701b802012001b901ba009b1ce3a049e28f5edc826ee3e40a68270e3efc59316bb633e0e2fa6e8256a170619956f41fdac002b4d0d364f0f3f8e30bccbc20b0da660bcdc106ceb249da6953cbd33d6713e6a4d16a42100e2620009b1ce3a049e28660d2e9b0fca8698d52a0259e0425f0d706da9bbaeb7d959501dc9d4583f143c002b4d0d364ef9cedf18ff6b9ec3586138047fde2a25860445693fda2306c2e05c14512b598f232e0009b1ce3a049e29211dd50a40611bf63cc7c4d754726d5de17f7ebb303d3ae086aecd65d2800538002b4d0d364d1ec24435e1b49423dd16a326044b7c0af9dc8d51fb43bfc21a6e0edcf011820843820009b1ce3a049e28d70544df754145a9fe22191d5f5b5a6144dc70d5ea10fbb020dc8a4734efb2d0002b4d0d364cde33808b604c0ce8b366048d6d932d77b0dc270dd59287dd9cae58c5c599887fb83e002012001bd01be02012001bf01c0009b1ce3a049e293c8de1e7fbf4590b651a2c681a559d44ca3cbb6e8ba3bc43cdee9d5ac37ad858002b4d0d364cbdcdb3489fe5453dbfe5e2c00d9a58d5920865ea58c8da8731fe37a74989b56dc3e60009b1ce3a049e2bfe104bd295f6a24842e075de38fbada3edb951692f9800cfa5f4bf5758810f9c002b4d0d364bbacbd67baa0a2ec93ba4a924e50bf0815259cad58a0e0e8a47d0a7feb3f19bb256be0009b1ce3a049e2869d67cec39d4bcecfbb035f2138dbda588fe0ea017fb27f1dde523edb9735770002b4d0d364ba5397d57ae37657359404c1e94e5ae5d51fea8bfdd72801c75fff533c325915f25d20009b1ce3a049e2a7ef91e52f45d9020576f9aa195ae5a6df5243d8d89dd01065c2f0ad5c2aeb614002b4d0d364b7a01b28de42ca52a505d1c22619285238fff02d7b6fb8c96e62f7b7a465ef7b44446002012001c301c402012001c901ca02012001c501c602012001c701c8009b1ce3a049e29e7684c599e9eb6187b769cfd1a44da91c47531224107f92a98a5a61da1b63da8002b4d0d364b6470452f31ee76d4c83a5ebdc65266998b956d7c77e963593e84acc384cf8b48689e0009b1ce3a049e2876f5e9e9dfcd1008cdecc4884fc4d210a290c8f22975ab1623a1809b76157520002b4d0d364b238b3d42bc06e3a77fba211c4e8ffbfba78655fd20a3624c29e42cb03a94459242960009b1ce3a049e2ba659b448e78f2bf9f1c40f65764bd73d098a8f5e91e9f48e027e303d63e3edd0002b4d0d364ae2e3713e6329c1e0f7355ae0667f209856d13e7efc9fe21d87c8016e2e0c83aadc7a0009b1ce3a049e29ed4b1664b4f8167fc35fd6389e900b245d1b3266c038276ebd6bb93a78b4c3f0002b4d0d3649b4bc79ea4eacc9d314d9f1aae3a9dde43bda77e6bd4d95eaa76a20c8e004ea9f00ea002012001cb01cc02012001cd01ce009b1ce3a049e29a485a103cd6e942b04d8ea4c0306161aaed6a672b54fd0e58a92ea130edda40c002b4d0d3648c725a547d83c93830cbde24bf104cd2a3ae9610c458ec80c1a30a2a0dcc48367724a0009b1ce3a049e2b3052a7b5743011fca83e98daaea6ca39ab87598eac7be1eca9c2ea1cf311a1d4002b4d0d352e5ddc7d88a02253d6d6538c80a6d2083fe31c60f28bbde53e3aa1afbb68ebe8645db20009b1ce3a049e2a46f298fe8cd5dbca09fcaf0128bd0d80e8c383d7ca50451b66789131eb2e767c002ae9c5a0c3a734cb07efad3a6a6b2b17df9688981b3b75ceacc5bc448fd9e5dcf567933d474eda0009b1ce3a049e28e682932fe509d200c9730898908586353d8d4ed60baf9f0bba82e86a09ad8484002acbeebb0b8f83b88705d8a1a927b941511fa4dc9dc5d50d0da4cf7fbb48496bf1a962df4ce1d2002012001d101d202012001df01e002012001d301d402012001d901da02012001d501d602012001d701d8009b1ce3a049e2bbb6fe1fd98d5200840be7282dd9f5ff2a16d669da9cd1df35a1be11ff2019ef4002a8e9f75a335192ba92761425bbcb6844ea868c56d0429e313ee963d1288a446edcd97251350760009b1ce3a049e29d2dd03feee3d1befb3fde8e42a702de2750deca5a921af3a7f5930628b623118002a4871c3fbd8ddfe968e6748584d4833998ab0f2118fc101699e06d3b0659322cef4c666802ebe0009b1ce3a049e2ac098693332aa93e9bbaa34300adbb59c698980851fe77a9842e8b8ad702dca000029f5798d8f90f3e11c57246e6770c27b5507791009d09e3912f7c16e08bda5e5ef9506c4694e560009b1ce3a049e28e709f34d27fad8e416a6637873ae655b8a4f9ee399170033f926d6c7b020e2740029f0af2654a9658324d3181966a141c514523c202e2a22d8aed2506b06ebd09b6abe0dfff3ffd6002012001db01dc02012001dd01de009b1ce3a049e2bdbfe6ebd69317bdd504b8ca90827a7283c8f4b31b8942da21233eb31d04cf1540029c13bdfeb1a906dee48b7d754cb10756ee56e24b1f947b72bb5d6c4dd820300e1a254e716ddb60009b1ce3a049e2a5d92d5e8d3cac8e63c6fdbfa21820fed03c3a0549490012a6862a111c7ee86940029b88be129f4f1a24819b16ef4e614fff38afa70fa7d6f7a68b75728272b882e324f5680cb623a0009b1ce3a049e28f6402d74aa730b031475d8e6f3a582e2f33876f98dbc8037cdfbaea460d6b674002944f2836ad69f3de3900acaa1c1d147728ab1a4274054f1e3e7870d5a30dbe53d31bf2e559e7e0009b1ce3a049e2bd730d8cbdd280222fd7bac9bc117880b66f625e7251daf78afb2913d227b10100028e3c12d13885f1fd43f1e6c98cb9c0d8c3b59274e1026378fdc0dbdb50eb1d801cab3747f5ffa002012001e101e202012001e701e802012001e301e402012001e501e6009b1ce3a049e28a6e317672fdb0c757801534d5273adb429ba145a97735aa275755de1c4ec11040028e1cd50e239bf58225a84ba60e141b1a49f40e964bf444a9135d940fab32e8a3cc9ae2836eb7a0009b1ce3a049e29e827733693456acaad432770ea32c3b52b1ad354caf02125cad79260c8c02e7c0028832c4a8b7b2805ab8bbe1c5e2e3b1e546636910d34eb91b232b31e21ba0b3b2162e599de997a0009b1ce3a049e2a9f2532cda46f279ec6959e7320497503a1b4cfd86493477e74b83090cebb046400287771ad744a1a758a1cf665f267e2c057047cd643bcdbbddfa2d43aa470886dd9898f9fefb6d20009b1ce3a049e283c0534086f552ecd24c5ddffb652b1fc73a631bf8e19097b83f81f8fe688c6dc00281c47d59d085ccb8a8fbb84820193b4d204821beac23c58cb8ec2ac314ff35ed535aee0078fae002012001e901ea02012001eb01ec009b1ce3a049e2a20d52abe63b9d6ab46779fc02f3b38b941d434272227fc6765796d3a87e3e588002769bbf85805e60d011e830eeaf39b99ed78f7c7e91e0914678ca4a7c6edec4be7ab6a18ffaea20009b1ce3a049e292e7b5ed8a8de675d157f1fcfab934113e8a645f4c8ab39e574654feb9b1cddb000271578b433c0be2146cf7c9dd9e666392a3c3f6b4d3032b13332abc5b3f83e047c4a556a8a380e0009b1ce3a049e2a382e6d1777fdcbe66aadac7abb0c00e237f5a4c435bbe42a4daa20835ebd750000267dde524b17bc61ea29453572e3376d806c49c80fc3f1bf871f69227bdf8413c4479036033d5a0009b1ce3a049e29e9bbb4ec560d5fca1e74a7569e41eb7beffde4a92d07bf389ce435e021457e7400267dd9d5a41c6187ee340235f5a8975b70d9330b6dbae735efc3c36109bb53143abc134da125ea00000e6a644f6eb1f30e992fa050054000000e6c99ad403e37a0e3bb7a3aa12ffa50af1b6ea5789bdddc20c8875af5b58cab140294ff0f5c9d41ab6e5e3c202b61dbb03f92604aaf571971aac2a062a98c5f2571d3dc76023976974dd9a92da434b9dc39b1e35447b0b9517926c121c0d3a210e0000001ade561f75d4cc358358ae8e7ae6425d5f943c869d9fd1dc063c32a09bbd33154037097ce6fb30f0fbc67cbc48e8ef3da3aa221129d401c4c1f073553a48527c99e32e59f81cf27d8dcb2c126aabb35a8f3d4f7163e3fe09f0bab40c79ec54f10000000078357c54fa1281974594bf49dd1ba6f53c6387f1b8361caf4648e749813d5a4c404854cf8a7a04e5a569109e865ef0ae72544e549b81387817c111369a032e8753c820fd9f95238f3dfa8974fb6d49d4e9d6abd35695bd49f7bcc1b1fcb203940400000069dd5ba89fab800ec337babb3c97ac7fcce24982b46cda3adf8e7f3de365b50e405ff557753df3b318418f4ea40706af31e3678bf8962d089b072a9ad315dbc483e14828a0675c24996fc495368922f7a5351c271f7414eb35455ada36970da10d0000005c657fc15ee1a298b5ddbfda4370e86fafcb496f40cd318c260ef94458f95f6640c102652b3dd218c5adbf52b8c4428c3691da3f8be6a6cbf91e5c48ac4f63dcf08627cbef0625ffd9d6b63a0e5c3a5e5a5d77c09ef431115d3935d837d1b821050000002f5ddf390e10835a63aa6aa10907015f00bbff619fe4ffe6000abad9395b642240669c147f252202e67a2328c01e7d64ab1017b6fbbb6c4ee1d80e11e1d5ca7b8c15111527643aa3566ca30e3485e5821e9f2d27a904884ac3a8d289aa7a873806000000e6556f033a15ed933aae6ca21f4f98ebe3084e4c5ea3ab43f67e49d3d47511e140f878a715279186878df8ee88b4f22e93d16f60dc277e276edfc756316c806de0e66bb2f99aebdb6bf7fd05be49b2114a3defa427cbe43964cf72c0c6481752030000003272ea843b5adfd8e856a0a8bf54bbc9bf010c6ba4428dac4f5f6e2fbc3af60240e1cf48e322410eea41158573d3360dd5fb19acb91c12569e7c6fd3c8f198f56f7d11c37c7f02c2d21a84e5c5c74e68e66c79cb4f00f5f7cdcb1a1b5b196c420e0000008143d04c8a079fcd48531be305af2559e247b7e889eb099212251676e04e4fc24040b2d0200dc33ea78640c4a81882337a0dd5b016de8f4982d05f44de56cbecebffd9fc48d249b15ec8b8a1b0d210b0367158b79b6b87d6955d624c175fc73e020000006ebdfab990de52ddedb1672c2a14cab3dde8e71664c9fc425fef3ce532334250406e7a1f711a753a524c94c6c660f5dddf5447c573a9ee27237fca30446e3e3d1911b99d0bb1d829139a3b9bf223748384c87f123ee75a78f9597fa8b9517a4500000000f12e89a62a1d94eeaf6349054810f09ddb0b1744b16e6ce8e4f0daf5b9eb11cb405f4fe1779e7183854b62f177b5d44acdb911846aa5687c508c2eed3802f31ea35631f7b36278c36b2a06803d2911502b63905435fc94ca021c1d178c8166490f0000001e6308bcdb61bf00e81a26f6b3db720603dd6143c8446d986e6a848741a53828402cec4445f62826ad6a471cb0c7d4f7a5148fdbf42c20ecdf21b9b08e12237a92eda8231ec861bd98e27d105e63611c650cbad3671c24f2e1737ff66c28ab540900000084c4068a1c652ed72942d0e6bd43211c9dbf367bb840785ff060c874239caa2a401ba3f78237916187e98320541b046639aaf2d53445aae858849f5c7b6dd9e9dc91088e222efb25c5188d90ab06dcf96e9517b6dd7d9f90f64ef95ada020b8f0f000000257930a681334d75551d64f1d50ef80d8d942617d461d879fe45eb5155c5ebf04023fac2a92cd9ef78fc53d53d9c64949a384db83d39f11b264899db722482987c29511966d9f3814cf5efa5d773d400d7573ee52d879fa739740dc2233f37b40f00000056a1fd04a85afac6c113a40ce6fe04e6a99d5d6f9bfbe758041248062df634e440b61e43b50fd7ac874c0af2bb47dcbce0134b51b0c800c2a831096efd2867240eeee40937e358cf7fb0be9eb1ceb41d7b562756105d302e79f6dd3266f945d907000000282248ad3c0460a06761b34cf40ebf9aa495e2150dcf7291aa4db0070f7bc57540956b9f1b4c2dc15dd4865b189a01b55b7126238a0093ceeef61b069c085aa19a82905697b7988c8977b6b72c2fed058724038af5ee359090267ef27f59e1220100000029c18998a1e58395de37cb7aeacc88300deb7737d6ee2d00959b2481e2c38e3f409364ed2ea1d6e74b6cfe2ac6b6c9b74b9833650c3aed5de82605f58cf0a40ac16414c06ed9da35f1af08da84551cc835d4b8811ee7e00615a96b8239ae653605000000b6db0a882ae039e4a3084e03a14bbccaa7439be764182830c56bd874ad84488a403d9386af8e57ca7c7172750bcddf1fcee8e2b793da9c0924f68ab05fead127aa75df1fbd46c986e932e0f01500eb28513562c88e2379aa4106706e04e570e30f000000bf407e7849a2233412b9e100255d14b14834b011257a3991a1896a5b564f4b234055113d5fcd662cadd163b5d2d51a09c086b8c1753da50bf719be917a12b3ff87d29cb7fc16532471136ff6977060098500c1b3ff5821bd95e33ae786381c110f0000004f6788acd63531558e34bd72067dd44d84b2fa712e80746bc6f834e48a2177954056a0a6b6f2f726836759aca70d916ea9365f90ad4e065962833e03eac044b79c6d5df96ff9213ab643fabe64cec7bf7360f773be738e6d28caaae951628f260a0000004a16e138490e35a6f3241e057d54fa7b4b36a3c789ae028c25ff2b21dbd88ee0407d91413c64e6bd00886ee2a55b57bb7f32ec46d8f12ccfbfa167d5b0f6d71052e5217b0701bcf138fed96b013915b41ef14dbd4642e44ebf8368f9c5287a0e0d0000003d6898110e6fec71bdaf546d71dd6924ae1ba6aff033441867b4b22683f6cded40229c7df9a93f93ac52c01289fdd9bd93b8c4b20640e872caa4b0d2c26187a8f8282e24dba334c7f379d1abc108c847cd179e58bc75701f99bcf44e14e7f4240a0000002cd70b366d6c387d7b849684f56b76e8f560eda03d44fb60a365c553cf6ee44140668292ed45279a26403bb9785dd0bb2fe0279847dca99582d47563f2efdb2c11d133975e9a4a4b971b0d2f03e3242adee3996a3409c1987473905a211b88140e0000005cd2be6edfdc1b4789da5cdcac18e8f344f60521f8c8182205545fcf2bec8f3940cbf5ee956dc1b4f8c579753d9d03021692f864f6a47c72267de9a6740522b3dd648e61f12812904714a22e92dd4d07b0e3fe0d6c2759d97aa644277c3431470500000009da70a731cfd39757eb16a0623b347b84eecb1d6ba64dd12d286b08d184a497409195e6d4646c54d3020c12d273a1b2643f6259e6d3ad226af4e5ed0f9d563e591e2743ae775ac08b9fe059c5e62f6dad0ef841df0c26b61beeb9f4c3030fb10c000000d5569972a35d66d09c46e63b7969775ae2bd6116c729a6e4c6c635481eacfdc9400297304c12842117a58d2d36b4e2575cb141f2b38516815a895e7533b36508d873f2cf286a7483457fa2d7bd38fb3b745e8874c5e5081d4f159886c92a0e01080000009dcb833af57b718aee2add66b863111d263324dce5d62c0ddff6d98babbc2193402895ae2f1771c1f55205d40509c1deb8bb33f6f618d45976d8a8ff969b62144f72ae446c1ab85d738e00fb5f085e0d1d0552fecf38f80faf4d468fb7d8ead30000000023344d03b3bf3be9ec03f2a455378050afdc3c9ebcfb5b8fa2dcef26d332340640fb2517165acfb239fb939893a29929c67193fd0b8332ed190b55b0d0304f13a75f67b6d47919b7c123d0c525de4e5dafaa5762bf0d858e424ce44c0db6d4ec0e000000072dd3ddec50bd295b83293fa79c44fb890456894b699d1e0a3037fb5a5a8197407a92403c9a062bc1e84739b81d2b1fb4e1cf371d0ebb318dcd5815615e28ab6cd58cd173c87411cb7db98426ce39e16ba6249f5831a65f434c25879fb9c48f040000003b5428f6fe291581f796786e7e96f25963da50505c21cf483a4f8a8513efc10f40860aa66d6bf472ccfdaf1e6301603b5a642ca99aa46df3175ba9d3523badd2d57d6a09f38356bbd7c276d3b37cae4107b04b4f66fa7c160175764c1cc5ede40f000000dda6512b3f2a2e1d2cc3805b1794292d5e9762d2b7fa7e7ffc495cfa459f545d404f929c40e414bb759aeec31437a782c2dcb7d12cdb5b312a1b2f004a80142deea8987257ba37610a93bd85509c27a6b6c6186384f6502530d4ccf7b90be6a30600000057127f00d17813c78edd7511a60cf279efaabcbd95dfdc034d1cd3261f8e857c403d9d7e28162a151ae8c8ef1c7a0b44a70846aba762706bd8bac1288f654ab1620ab20e3c49c1e997d63f91df01ca03012a9d30441142b29f30729eb54dc9940e0000006446d1dd6d847b1611bdba81c855bea8918498a830b8aa8c4014a28779a8cb9540f99ce6fef8c2b3cfaebaa7fbe06d3ab4b694a3bd6fd8d027fa4154979056731f88a6e30c185e1f91e3428d7b3046af87eeba202f7c4f76cd800d13f0c9087206000000f000dabbdffe7020198c6de74ea39e35d36494b78e28959ca218e7bdda4ab93c409f09690c449665cd796c60d8e38dc9643efe43aeaf81f0d9ef3d0a327f621c43dc5ad7d5f8ea71c67810b372f83551230b52237b81872a5c034697eb5414ac0f00000044a29a4bfe2e149c4050abc61df8dd9586b298bca3e37b54cbc379b6d562d274406dfb3cc35ca0593bb69ee17d92376b77cca54623038cc54c7a4b9d50b6c08e1f9e434527a030a06da1b69a85229b56eea3b7df19f39876f49bcd44e724a1cb0c000000351272854b6e7c1f99ad6dad60cdf1280fcde5e328de3d312c101f0b6053b38e40173ce974ce21bcc9bb05e2e3b5fac42b305929fffb554e9d346d2225330ddd61dbd5fc48b796308281d463532cc8c4e5db1374cfbbc5721dd9a62b9b1e4055050000008b7ba73afcfece7a3b53d066e8eb7c4470bdb274e4d4a3d48427fe25909e872e40430362693f69eee648164cba165d45a53357c2253fa44ceb3b5af55901cdce86301bd623690fcee5384c1675ad0a681e1b6225a1066cef3a8483b90c21d89c06000000695f43402f4021b65db9a3a8b5debb992215eb80337f4b32671fff49874a47fb4039839580020578c1957fb299067428ea3633a6681848bb00edd8c2c47df50c10d6e7f8b9fabd5b626cf02e8d656dec7edf345c48163db9dbf561b38a3fc84907000000c11a7a86eb5852550984e96cc7d20415b036673dcd9ea7f88317bba9efa5de7240d6e9d850466c585349009ed8e5412e2a03451a109869b036b2726d388c4efe9593db551cbd058c24eda063c7c86f343a3835f2e17c9a6b75fefa5a23ac6ee60f000000459d622c9b93534bc444374eb78a744675cda93cb03c53062989d627ff87e71c40592987632cf8d186a2ec6ba4ce3e61659d47edf5e51e7e534dd911243e8a4298fc8646af8a3676f228c6567d30e0d56deb56c6db599ad885db2c4f53ebbe6201000000879a56ff686666ae11131d2ea8b4d0ddc81eb68b8fbce563832ec73f6b15d8374065a8128de78412400b101cb33c74eb9dae1f140103ccdc12b5a2ec535f668c1a936a2fae9fb47d81b949e31958ff2b6132fc80668cd0f0e5a71c7c364c555209000000f89691ed90aff7ebb8635b30220b5c8d3a2a305db82b5e8bd26f51afe957f9d940d8420732cc1bd88eebd6e67993cf94d0b5d2e42b34ea064c0ef06b58a5c842e03b07dadcaee8436db72a7d11ce246affedabc61aeb4f7766275d0b3aefc51c06000000119eb9452c65693ae9d3ad9c9172cd45ad7e06c77469c63d01dff2a777b2176b40df227c09e5b4008f5836162e6e6fe860b8a8dd57188d82b5d2231ef63d47134efd655c794cd1b080beb8811baabaad7319b1b730281a883b38431d368b014c060000000a4b2cfac623daea19613ba9d758a8db9629869a01a00232d8c0006ad949a15840ef895e3619dafeb17b630bf5c3b730b6e2b2636ca3c68590cf27f0ea96aa4fefb2828a39e556f0b72bdf2bc7981c7cbb612bfd66bbac2d5e3bcee5ba4507460f0000006683f669c81280b3529b7326a04ab71d0727c9e755f9a76358002649d09e6b9b4057524188ca7034a360681ceb71f366e28a133bd6c98fb160b0e0bdecfb0f0d58f9ac804a734159d33fce3f86afd5e1a76f658f32d46ab91af3e94c995d628909000000c1e51d9a74702de784942575328015f8e25c3dc846361176d71bcc518fe2ff7a405f19806c444ee68704b30dedf85e4afd760d65bd8f079b148d7d12228a5f1703d55794b71350e85464a21ebcb9cf1a5792a64c751c5285caeb2c51c9bc5349030000009e69d8dba820f9d84b07021d7c6169b7ab9fa6f698080984bfd723aff00e1d8d40f64431898a7a8d05f0b83cbc93666fad551eb53f0ea28353bd85869480174d62e0d8dacd25d51b9ccfce4ab8e1b0d236ac320cbf2f4f3be19d6c572c8265fa0e00000076435035537acfd9cccb7b03cf5467bb274214f4523566b18963e43e273f584340b8d68d186804a8146de045045831b1fa39adcb3ac6e3b35e697c31d5fa99d3dcb6280bcafb1f669b9ccbebf99b4f7213e24edf5cd91fe693d7ff290c7061a00400000057a17c5565d2df8b05204566ecef3091bbb058bb3f528e457a100611c4f5a5ea40f9c40fa0d73323516eee10b604373272ee2d0308b64645a0d42068ca0488e2da6e49ab4aab1ad8672b81bc9d16cc8ac29c72203d782406f26bc8b29c3708f70b000000b109b7248a170cdd806becccd19b3aa8e9369a8b31c59ef62be9b8ca8b42cb654004e2d57251ab918e2319738b631eb2eb615c09305e441b256301f868eef92f4aab2540d537bda5f5150dac4dd5eeed50c0787b2a13162bdc385ffefc38971e0e000000ea45630898058cfb0d1a23747a8120486d1484416358f91e937229e8a3427b3140dca25d16e8b581c5b9d3086e84dbccdab32d034eedefadb88611ec669e9c7a38485195a1b25f71c1e7515394e8df5f07fa4c2affa69d06a7819df21792c53903000000e8a57291e495121e25400e1758e3377530fad10d5dad370160e5819dcf1ff740407ea941e9fa4ac82648f9f8e648d8c70c81bf3fe9591063f5d56831ab5f7e7dcf8102a960c9ca0c4073b91a8791da0a5eef30e44f28c589cd925da07e6f9553080000008ac6ba96a8a9c978456736a6d0e479d1d3eac87327139b107365727cbd4dfdc5400667ea2391288020f262372649df9472b1e1b88427ddf028c4ab2b3dbee21f23d0fbcaf441111c4897e2dcb7aaae5b83a27becda727bba9ef0ba4ca7a8c61300000000112bc899766c822742efb8112138d8a24f5227452a553b85dad6a140d179d1c340bbe246c5b0bd30be496ef220915a49272555806b2d7131c8088c2a1c9b1c4d0b17818f9a40c816e61135965e7c222cbb076ef994e8dbedc9b32a64f2dcc5a10c000000bdb0c2552d2b31f724e378c9e5482fa80cb5d84ed3b52006c35f9b54be7ce47d40d5b5419eecfc3852e31dc263ce3e5159e9346093c07c153158b9cf143c338e10321dcc92400e9eccf1d7591cf79fe3eaf38475ce1626634a12cdae873ce8320c00000096871d0e559c02f284641cef360baa3f4a23bb0d0a71641293399d7425e52c3b40e7e2f5e965e0fc888f966eccf1ae88b4a8e74889947fbf59e470208ad80880bf559ea12acfe3d2ebb0b979ccc4d2c9506351199c9bc7e2a902ec6a22696620010000008dfc7e3f4691c29f775723a02df0d2c411560c932f1fa2d74683bc51b7d025bb404e0207e09536ef28ddf33f3285b7262923d6d4b83240ceeb73034c964214d6f4d613f56ccadcda9f41ab74bad5c7cabb14878bc8b066202b3fbcd626e4279e0a000000ea014d98907d9ef811ebb1a01d349c034cd8ac9d1bd16c7c577dcd039c06d5ba40c76022c9891289de51d86b0d10103fdc6c719c6534174d6cf7d46d70e707bb79fca3d12b3b6d7baef09e70a31b6dee5c3784b49ae316e8f07bf40a84bf39ad050000004644dcd91ba159ac8ceb1ce87ba7f9885990634a7fe7952955199d70148dc3ea401d832a87b2eaba6d9f0c0752d9521de446e7a9c3da04539ac759970a816431bcfcbf50a88de3cf848f35f1212e91e1f4bb08b1a7fb8fe63da21425a05a887b0b0000001bfecee6c97b73581a3d6a0c98d2046fb67d84d680add1920bc355da5ea93f9340d9bf69d0b6a6988408721c14e4ebb617304e9f09523218ca33e6e027555f7450ea1a7ef0cac394792d931fd3b4d4ed51b71dd82e1d7b2d99f8c1ccf8bb569a070000006b9fe232bbf84452e7a87e3580ea0b2173b309f0a437ef737c7b60b69241adb340b9fc2109aeba312ec98d97ae0ece0d107e9147456004678c43618ac88342189b11b8b6ba5f429157b9b71254b5a1597d98a30512df4523136164c03932552b0f000000cebf5ba22860537450d2522d1f80a8f432decd87ed62b26820b9f5be0d4801d540b0476870481b6d92370d5c6b42309bbfcbba4f0e0139e973bd13eb9fd2e43bf6f35ea1b5b8c908e38f0fee79d9f94f7d827cbca26830964b87f0824359cba10c00000041edb1ecdecb64de3ac7e3f35cce371073525e95ccb8c57e05b2f6c8bf00258440dc2fa74a8682ac10426ed360a400587b5a7f126a60b9acb1dfdbc954af5bae48a46a9cfa7028f4e93b70716ee171ba868bcc097277737dfefff19b0f233e570c00000060d2041432fff56db7953a23fc9a4bd6676277b9a96b92d7766938c5a784145e40089cd2e8d8ab483a3f8c57f2535cd9c2651177ddd65cf3b1cf178e067d575bb6453544a71df5bc195d9bba1de0dc310b8ba6cc7e0f0c5f2cc18f37769bfa9305000000baad41b74c09818326218090889c05783f1f66bef45d71213a177d6c0d0af59340d17cd2b8ad94ecbbb9bb517c2fb39c49ffe9c64cf4678e5127144d39dd8282b6e4041653e6e8070579936afbe569e84437d88c4d097fd2aaf2704c68ab0397060000007f68c2f7bbdc1ac1dc5b48760dc4241720c1bdcfe6c42d60ed13b322c0e8aded407850f85e6487a36ebf0f9e7da35df39c8246a4f84fa84e8559e9be39794e4fcb96e2f03a4e399681461dd5233631a76185e837e12f94d68cda0ba7e9a9204b0d000000d7bba9388590b2ccf1a41c2efd2b5d7a3bc002c4b1cd9cbbccf303217416a69340d07a4f24af8708e28ab6c270c92a7d042ccd6790edd336e2daff8706373a458368283198cb85f900a4b790fa9fa9a45de7629e19a8aeb531a44a5dea0d17dd06000000e3b78d88ca156c1705659929f41276358220ca8edd4de082643b6625b66bf29e40f9bea50a380a4ef27c30964dde3a9f3323955701136a03a51effdad9816c3c854e1d4c0510b043cb0e394f2f25e181a0d854d65bde992fc967fd05f9ee37ec0e0000005c9acba057ddc6db4abd528685b9d76aa8b5137601a3d3049b7521901b227f2740228a9b5c3624fb2edb9282ef32ec6cf35816c115190b9609e692f77bc5aef4eb14f2d68adfbb330cedd264bbe048742c7df59f01c08ffb61fe43c382b31b7e0e0000009c04a24ece4671e610b0b31fab4e6013f855882d16551b491647975d6514a7d340f4cad429f234fc736a836b9e1a1a9df4065d31d579950e711046cfd31b3d9ea95e451ff97f9f8b9219354e746f4e1245263a7e52a1e62694f87cafe272efdd0900000053809515ceb972819434b38958088347f6216ea96b360e4f67e06ebd9260d89540680d33e2655edb03c58cebe9f07318cf1216bf6248e19eea78e4a5340e664b5f8e97cdc7b502743c84f4290e6f484d13687d95bc4fb08ef5c3d04656353b8402000000f85609168cee70243239716ec49a472fcf043b19cf2aedf50fbe0dbac011259d400ba98475fa132146b9a2ce183a569cc1fc747b062234e5033c5ca37b7c12c3682cc14e2e2346297efb0848138f355b4c73a9fd185fb2d29b28ba65b28c32cf090000006aff1efad48e10656aab31c7c96fb6f847781989e0b479639f9cb8b8d9482e5740b9a752454550ce7f6cefd4121c64029a113b35078c17922dcaa30f7d29fe52fcce4cec12235a1c0ccd7ee4f280b7c9d93f67f70793051980d7ba31085be4f70700000084565a82530165ad837ecb917602a69eefeb0284a63dad11d37f973fffed100840387bae3a313527ce301bc508825ed3620e996f7d57d1affd2660a7a6b9f0f5a3896e0ab537bd264daa1596e0b75543afb9366b1fb8b3b00935a0551871bb9208000000305ee492d0e215da331c5e7ccdb83edaba650a24c0bd0eee0a432e788094dd86406419c55588e23a5419db54caef255c0a9c52808da2a9c08b4b0fa517a9de265b78782943d0ec096bf76ab3fc6f471bb0717d717be1327ff858f2701332ba570800000057dff0ba7bc146be404c1475d4a7c58ebf33e490cc86f950cc38aa6382a02fd540af7d38d0dc8a250ba30051c2382a51366643d6215a8b5f9d899f9db6fdcdc4c7845482644fe58b5452073af04667a4c0c7475fa2ed61a16d0094e5169656df06000000a27e533515d26bc544dd1d079aab5310999f43e5e8cf58d54123c1cbdbcdef1040b7d485f0ba850b39a6c3ca3958e64987c2cdc209e64549eb9c0e360d207420a7adc223b80d047ddc06385ae533c615a06a68ccf7abb4fc663c6f7598e7289004000000242c9fac742f3b810613f26d884516566c8b292337b8d5bcd6327dfdcefd223c40890eef70f16a873949cc4aee17823193ca1593f6665f1ebe3087cf00f3c6fa662f49efe5d4de880eab593b1643b29db8bd97c20b86b48cb0b878639f880cb80e000000a81a40e25dc853436188ce08bd959c57fb0cea0de2df193742630cd4dc27033c40d45c33b72be65d49d2ba9a0ecff40723e2774c4061cb95ab3c85368b6c659d0bc3845a6be8d6eee8eb7dbe65d33568f826c877814e852841461934838c50890c000000ceefb16f526068c918a5897c950383c1f6e421d1872695ff08444707c4603b4440851232008f8b2bbc4f0e5c9ec2fd182b3aecbeaf3e9b5ac15de02331269c35868dc5f7de3c60a1e32dc42448546b7cf928b0e8236a08cb559afdbef39121280300000073fd1f09fb5bd0766a5c65e63f2f6fb1f92a9cab3df8d540c3a380bc43532e5c40273b8514b9ea1cf9d430d15c50383734f3ba7425506ee16de54ce09b9f97b91f99ee7413090fd3e5e5b5b7dc6b464f5861010ccf15f9c142e8dbf718e7a1090b00000081e93ae2e3ac8a033f984f41e8e2bc3a45fca7a84b3a2b67a638994d5cf54ba64074a6c85e4086fdc89385b0506e04e07378903b6a5b8f42cb30eda44a7b78bcae6569428ec312d3060e8720f06c5d77fe3302dbe4bab9e403f3f6dc4320ebf206000000ea2ff16ffe93ee57a4f1cb6f9ca4ee40994ca3cac84350c8108205509aaa0c4940b9841c398575f841205860e9e5635cd2973a5dad8a78aac026e55ae7796e0c2eebf2c11c56e426d1e46f6d2ad8c5046fce690ee61ebc2b79ce2ae5b62b91a80400000081e1c29e84b83d56b0a5665df26b7079f7e0569689411de9bc8e463819077a0f4048d3cf33df73102560edd259e3e16b8d6b42e7ca6bb7747ceb88ec6342d46a2185b87dd025e01ae44b250c50179b6c7c199cb8409d68f80446c3857b98fe3b0d0000001cce0f52b5757299ffffffff00000000000000809bde9101a1dee4544a61def784429326397b2ef07b1900bb1ca24b90b38fff77bc4085bd6276e5c568441bb003ae073f7e452e8554b23c000fc027bc40e468bc41571bfaffffffff00000000000000808a1e9201178375bc85bda753fcf05df5a19527b17567ebe39ed3ce18eced62fbb29e5bd5a1d0fe30a8b0a906cdb6c9572deb89b1c3b133a7d076a0238e1c61784b35b4b6fe530100b5ee9c720102070100014700094603178375bc85bda753fcf05df5a19527b17567ebe39ed3ce18eced62fbb29e5bd5002101241011ef55aaffffff110203040501a09bc7a98700000000060101921e8a0000000100ffffffff000000000000000063b7da1500001f269df075c000001f269df075c704b87f140005fb7901921e850191de9bc400000003000000000000002e0628480101ebdd61e6b1074935941c42dca96ce8665181d2e067e81ddde48578c123475480000328480101c2b24675cce0625fd5432eed31a27f2bef43ace4f7082065452fdad1c9ed68d40020284801013835d3661363122871c85e4c2640fe894155011be0b870b596aaed6b52ec0aec0014009800001f269de1338401921e89fb35086d8b144fcf0c2a19ce98284ad234c26cff9cb126353066534a36c8aa7476c64bab36b06f1bc4126b4dcdfab33f32b77a234da4421a3efb2acd8c528ba100fe485200b5ee9c72020201ef0001000052380000094603a1dee4544a61def784429326397b2ef07b1900bb1ca24b90b38fff77bc4085bd00190001241011ef55aaffffff11000200030004000501a09bc7a9870000000006010191de9b0000000100ffffffff000000000000000063b6fa1300001f2294b15a0000001f2294b15a04e9301feb0005fa920191de970191d5e9c400000003000000000000002e00062848010151f646ff7e4bca99193e5b8f25898e231248ff7f34f299a214f230a03170628a00032848010162a9ad506b0843ca504bf3e957f412675555198307ea48f55357a852389ae750001824894a33f6fd248650deee7a92c1cb19e6bf28aaea68d580aeed0e7e065e5d75744b1bb9715202aed27fa11b39e94bce578e51d7e641e3e7df88a9719aa40200d77dfb455f3ac0000700080009000a009800001f2294a217c40191de9a5ea2abe274ee93808966659b50eef0a060130ef42760b7814c69ec4d2c83305b96c9159d9c1c88d7cb95d5dc57f9ec3fbfce267ef4322910b2d74e5dbe414f022848010162e9a6666fe16c18709c6407e08b6fdda3d9fb876fd779485e150fffe90a7a43000400010228480101ffc4d0ac2cbf0901a452e1d02f6151c6051847b9a37a237978220c3be6f7cb4d00072457cca5e87735940043b9aca002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac000b000c000d000e2848010199e43fb5540ac834e746a8b5c185ea2ba6cf4ae6b3aa95f572e8c4f4ff673a570002003fb000000000400000000000000021dcd650010ee6b280087735940043b9aca004210150000f2201200010001128480101c8ba3deb921f3a45128ed0c06074e02fbacb0f7e47cc1aed51a08c736eab566700032202d8001200132848010124d21cf7ae96b1c55a1230e823db0317ce24ec33e3bf2585c79605684304faf200072201200014001528480101fd78695ffd58402e209cb0b060c95b1a8a83dae389c7eac9554a3c086e52b8980007220120001600172201ce002100222848010114265b804cdb772e1c9a48d1dd67ad6e9315495151d6f49bf5f203b2b883ae7c000c2201200018001928480101ff9fb607464434b8240b30817c4e6c358ad723c3ddeed45b2b82d45b9fb0f6210004220120001a001b2848010135495972e4dffc56ffc325d2abeaa6db04e07d832cc8b8847ae195158fd724d20002220120001c001d220120001e001f28480101ab446ae5250a0e5acbf42540f12f69bc49e22d74782881442954471a01c67d6c0005010120002028480101e1e66c22df500de6499c055de17ff3d1216fe5f15247186dde0708e01c52526300010024c201000000fa000000fa000003e8000000172848010184ab9186d8abc8c0e5b12f96625a17f25fb620742af9a5501dcfb3fbf6e320ce000a0101480023012b1263b6fa1363b7fa1300e600640fffffffffffff8bc000240202c80025002602012000270028020120002d002e0201200029002a020120002b002c020120003d003e020120007b007c02012000b900ba02012000f700f8020120002f003002012000310032020120013501360201200173017402012001b101b20201620033003402012000350036020148003b003c020120003700380201200039003a009b1ce3a049e2a43e7b8899d291921eb0aec2e751bae1ce1429a738c25c573db870bb7b8a8d2f00025d7ddd1f2adc4ce67a68d27ba3c67fe1590ab9df0a8837b33e5873aec114dc432e30a986bfe8a0009b1ce3a049e2abf70cdb89f71ba71c2c1bb071b9665c11cf8edb7cee642c79e4ff8578d34733800253c19344790cfc107ef3afcbeb159ee00deb0da381cf8eaf7ee3c54258ecb9fe354cfb3d9f8d20009b1ce3a049e298c7c95e53b3288bb191d9687b06546f16e6261e1e0931923c561d31315f8b9dc0024674c59473162183e3467b8107ade8d739831136c871851b1714017416f7471676f8f45bad8920009b1ce3a049e29f5a0d4a86e9a6c3e686ceaea174482a60ee4ef32c98decb7d7a3bfd00d5528600022c8bf74285b317eec3f9b0e8ec4f7252197b59249072ed20a89cb36c7864d28212ee858d6ed9a0009b1ce3a049e29bf7822d62c8071597862dc1a0009ee4df8eeab965be31c14d64beabcec3d5e400022a85bfe9a9f686d31d2170d3bb67765785fe00cab6380beb648993790c6b62f6d6f9aa8653d660009b1ce3a049e283249be665619d6e11df6df2ec5b7ff01239d974a785d998986213c6e1c091fd800220f13bac062665fe10377345d60992f0c173a8ee2383d821c494cc3c9c95f069d8b51855d473e0020120003f0040020120005d005e02012000410042020120004f0050020120004300440201200049004a0201200045004602012000470048009b1ce3a049e28b5be7aca1749fab394d7332dc28ffedded46ce424a2468e8085eceec9bbaae2c00662d3b30412733ba04c54d49d0c2a248697f32eaba92097fd5d726fa4e91f749e61f55e1b37d460009b1ce3a049e2976eb7fbc7e63a751d91cb3f57350b667ac19b2d21fe6b186b7420397946fbeb000662d3b3041273318e28452aad9bd641f98e55d7744039595724c1ae5286a6a26ac2917414715c20009b1ce3a049e2a8a5b77bbaf917e15a61f73953eed06cadb05d66463fef498eeba509c67589bd000662d3b304127305e0cfa335d13c8bdc2cb6c84c534419d6a4a0d1d2427f5f7c6b3d52e5377ffae0009b1ce3a049e293b712a8dfb2cd23dea43e3d3a62e8017ee5d90cdc1ed9f476ea406d2cb83649400662d3b30412733e141a8cd5031943574478d98f63ac3454492ad47adb30c1b3531c8cc349a7ad20020120004b004c020120004d004e009b1ce3a049e29a29bffa178f794708886e93960d5b0404e2533a0adac1d04622d5e537248dac800662d3b30412730a73ab24af4170e8a646f6faf62520a9e70ae02f66a8faa8d739ef087bfc7e5ea0009b1ce3a049e284b2a645c6728882983c324c480c49b20766448abe7b37e39baccefc028bd66ac00662d3b3041273027b0096de4bc955d34d0aec0615701d8a028e921f17a53bb9348a002f13d86fe0009b1ce3a049e2a05e8b030b7be846e310b5af4617aa29ca03df4ad9b724bdda53cf1a604b29a6c00662d3b30412730dcdb94b5329e0ff38fb4327c57407542d0bcf751c201644c0ec7eb9dfc76c84a0009b1ce3a049e2837241697165f7c09393376e22fa2a73addbce695116911168aa84eaf6b6a1e6000662d3b304127308491234782701a48ea4a5a886cf15f978781699d77e4c3f6bf2ea201b3ebab5a002012000510052020120005700580201200053005402012000550056009b1ce3a049e282fa887812b5cfdc119b2062ebe740d381b87b4e52b248075a4296976945c6da000662d3b3041273278b4f2d833b5dfc6c48d222ade39fa4a96bc874e62b16ade02c50ac553929e920009b1ce3a049e2b8afedc19d03d29df640842ab55fa33fab9fbcaa29fd8a11259bd8139a28ed0c400662d3b304127324ccb3c8c877acf99513bd653d35def60e18fae62414b0b3be77073c36abc72760009b1ce3a049e28b1c447be4167d3653fd9b40b8cddbca62301549c83b7492663e3fd98d9d6ac9400662d3b304127318a899164b1822d2e39dac978d93383eb78d0354004ae047083bd1275fa5323b60009b1ce3a049e28dc56fb905aeadcfd6e7ae41c436e24c5ece6ff510071f4d2d0019b037afe39e000662d3b30412732354621106c08ebc3e44c338088f0c135efbbc18605d7ddfab414ab0b88c4806e00201200059005a020120005b005c009b1ce3a049e28fc99015d4a948bac908bd1114ee9c187d267b46c895b32444bf2dbfba4b40f2000662d3b30412730bbd302453127d952ee1de2b6eb1b4d3effa98ee8a6a66d2d1cf34f60a8adf4ee0009b1ce3a049e28d89507022e32daf421c58b3b1886d8c6a5b9be95f5977fa0c374fa582ba38aa00066062cd6be4c8e648a634deee5132ed07cc454c7e774e25efa5b427d89aa80656253524aa9f8de0009b1ce3a049e2af85818fe837c4398647ba1a9eec135aa716976e7f26fcadd7ebd21bc4a076d6c00653a3940eddbf434c8f378c65a7a2f837c86a9c061d6afb43bb893755048ae64876e99d2b0c2da0009b1ce3a049e296ca39577db0cfe756a20a3e938f63025456d79d483a161bafd90de0ec13876dc0065276fc6a87d0253e530f138dc23034ab3a93aa105beba7f3adfc8fac6756c6a41d3b17ec8c0520020120005f0060020120006d006e02012000610062020120006700680201200063006402012000650066009b1ce3a049e2889bb517ca5eb8d4df0dc38a98b3d98e85fb5ddf20f7a2190a413671cc883ca88006518284d75d74518743ced0ce2f84909844c1b90f000a3ec96c66896d5a2ef71c3cfab5f2125fa0009b1ce3a049e2a494dea9d5fd263deffb4f9f57886c1f913450f4d6a661e50655188b8c89353900064da5cd05667ca88373683b06a1fcb1f2e01f2e650b9cd6f64e5df8e5826b646f4a4e8028df2ce0009b1ce3a049e28783d6fee96fad1d802f4869e23400f72783083fcb29faa533e1eae14139b823400645a6684ae11c2a8515f6674aabf8a62957c6ae2a152b3503cb3fe2e55597c82b36b99373df36a0009b1ce3a049e28cdba7807558d9d090cbf71f5bfd2e9323ce3eb594f00a17049baa241e87a3288006439a498e61e507a104cc175cff079e7ddc767de7c18945406ae521e14ab5093ddc4ed618175e200201200069006a020120006b006c009b1ce3a049e280a62c87ec39de5fa4375cadebab48421d4a69ea60638e31997863d93124cc4b800641befdb5b200c116118ca6141513385bce13e34d6854fac170cba9d216efc5f71c1423d3ca8e60009b1ce3a049e2ac8a1f7ea4b90d4255d5dfa8d23546430d65a36ef07d21533dbbfcd42f91fdcd400641bd0f88e875a427283ea0bd92891d48b32f4464f1489fae9684ef47e15bc33d865089bc8da720009b1ce3a049e2a2682113de21b288bce3476fe69426f0518644d4fec02aff226c2bbeeca34352800641ba1548f585e58127502a6c4d42b201970a44a30069fa999390d4df8425368c992461161f4760009b1ce3a049e28436795bd6fc2dace9dcd48f4a6ccdb8b6b77843b16dd15c41f2f4d68ea7d4cec0064180b9541cc1dffa7efe55a1b9a55e20d9a0d5b34ddda9cc8fb15cd3810480f41b5fabcb599a20020120006f0070020120007500760201200071007202012000730074009b1ce3a049e2bc38cb2a1f65128f2aba6ee30e6c40524db547cb893d28ecbe68ae339067754080064076689d1a9b2325a469419b77eb341c7cb49b14545c1ee06df4301a0ac566bdda425e82e883a0009b1ce3a049e283062ebb59110105cc17910f4f1a742b62ad76ec77e617c8e324aa070a13a9bd0006407280b6971ac83b4199504264abb17d1db2b27514b626c70d308431230755e346d1aa0a902220009b1ce3a049e2ad6d06c6263d7ceefde332a77fe6cb6be0136021fa2c5070630226eca22c5c1e80064040c29cdffa6b820f19876b593dcd332fd692fb7ce62f133d69afd1538ddaed2d10df2ed32720009b1ce3a049e2b050df701030d4900a9f2fea7c8e3e889fc34b7ecd2447bb675ef5923869f7abc006403c4ab24b31b52accf8f07d56050efd8fb3e0ac9ada86b58d4526bf3694237f3d4f77bd27a860020120007700780201200079007a009b1ce3a049e2a6b4c71a61ae2fbd2a4f3b36a86dcf39a1f7e6e217d5b468e54052ee83a33b42c0063fd7157fad2e34a6303ed5565e9878c5b727902d93cdac1a9c9c3531c56a42db05aaabb7a25220009b1ce3a049e2be7411bf69677a81748241ab5ff66defa879177067915c7e58e7d6deb94dd39f000639c06e6ba63c3c27cd80b3fd0e46b373e778d9de40a15bdd34327d709724c56d12e679830b3c60009b1ce3a049e29462b5bf75b022faad0890dc956b34a26b65d516a1640c3e510864b8e672e63cc00623bced898dc91ee4b71ea37c53a39d78c22a7d5444337bcab1ea092bffc9f7bb7550d0fa929fe0009b1ce3a049e2a65fb29f56daee49143bdd2fc2cd15942e723c322d8779bc022debb7732c6ab080060c1bb230022c47d38e728dd85d6c10021deded0962c65c77f742201cf5e27d2382e3cd525f31a0020120007d007e020120009b009c020120007f0080020120008d008e02012000810082020120008700880201200083008402012000850086009b1ce3a049e299dd970cc226155d9bafbe7d3f7240762b73acd0194e007c5070e4dfbec9f43c8006015de258a9e4c18dfd4152ff370f50ab0a7de08ede0cd56d266a28868d87b6099a40a45353c6e0009b1ce3a049e2ac605a7ecfbc2c878a7b1f2edcae88b00ee2dee04c287f9f50131c1d58e862154005fc5fbf173e857c8f78839e5db3ad4221bd66f6d6180cf1184d5d96583bf2ed103649493e116820009b1ce3a049e291c7490f5850218b375b664903e08531cd788dd83bab741f32572fd6a1405fb60005fb1be1eca80c714cb33c7d6fe094c752529ee15ce9a43482d7e9cf6f76583ef338760706c84e20009b1ce3a049e28e26956697b0337891cbaa9121c0161edba8598ff4a9a14fbf9ec99e356f9b580005f98c7cb4d4341d6c2dc87c6cfb33d88ffd3b1f2f220f90092ee20f25a0cf94490b56b50cfee2200201200089008a020120008b008c009b1ce3a049e2989f2ff87779ec6d57c8b47a588ba8f57f4cab2e4c3b2ee82aa5a320b4f892e00005f9752b0b571ea7ecc28b733ac93e707cf11ab01189010d43e05211703894bac9a0f9f6b7e9d9e0009b1ce3a049e2ae543d1490023cc22824436695cd505dae19243bc282b9a781a4c3299f6ccccf4005f96569593653a4b8c2ebccf36bbbb976ebbcbeb7953d5946c815783d21c88131d32e40692dd220009b1ce3a049e2b93a3bdc02015bc42d2f3165b62868ac9443d59227b76b9bcc9c2c00e8eb65a04005f95699426cbdda3325d669b08511eda154caf8e2a894674119b58682a68c27e24f20ccdeb07660009b1ce3a049e2a6c34a8b6a1e47af1113c4d11ae075b0e16a9aa9b6ddd2d917ea444f713372ac4005f8c955664eba67a33cc15c7eb18478d558617106c49971e53fb44cefdcfd01def54676324c8aa0020120008f0090020120009500960201200091009202012000930094009b1ce3a049e2b9fde6023ae17b2c860a9ee5ed15deed1b3cd777e8dd6744260a1aa90bc80a520005f89b916fff14b07c0bf6f11a135ee1c6c851d45a7348cb431f9172132ee32466b138b1525fa660009b1ce3a049e2b0a8e6e8eb737e161bff67ba27e3836f8acc89d56ed444fe64c1dbf60dcfbf774005f7bc587b6fa993fc4158940c46108797153c2e535b84c6d4fdf70f945f866d2bb19774a38d57e0009b1ce3a049e28a9c2fed9416605e978cb1ea1b19608b0161c31b2e4298605e1dbf18ec985f188005d938caec3ae46b0650a4773c4cb96e0d7674437b0084f8dbcdde8a5a06da4f55381027ee840760009b1ce3a049e2b55f151b37c5a74a53507cf5941b02e219b2243570ee54e2ff75714452c497e40005d879d106cdc80df8da74fd965e4d1bb896131555669d612c644f8e8e2d51b91521ccc12a575d20020120009700980201200099009a009b1ce3a049e29a89f154d20505938845c657c3a36578a4dd41ce5f0cfd40673293b9b1da70cc4005d5103c3a807ef58225a84ba60e141b1a49f40e964bf444a9135d940fab32e8a3cc9ae2836eb7a0009b1ce3a049e2a7014ba3b31a0b799eefb400246f4324277829f2899d2e71c12c61072d8416848005cf20148aeea344c02af186d0d951f649d9091d98f7646afa8e1336f3c97523262947a2f7f66260009b1ce3a049e2814fedfab9fecc96f4e86b5eba28767f69e6e1344b2144f4ca97c20140abd65e8005ce192c5210546cb7250bf2fc6c9bc6f91dfb5151f1354900de181ddc4e471069af8c40c7d2c3a0009b1ce3a049e2acf69f3e2870bf5a0e7f899f99269a5f30a08816e702cba2b8d6940e92a43341c005cbc9e47b2f4576b90d0b43e4f4e2004fa75686da2228a063f2c36015dae01b3aba01233956c960020120009d009e02012000ab00ac020120009f00a002012000a500a602012000a100a202012000a300a4009b1ce3a049e291cc0d90ee3ef253e28bc43a6aa33dc3528a07bab57235dea6663575d5b54f724005b432bc115986ff95778029be79b4a96dfd0a7896c2f1b2303e461971d9ebea30943f4cbcbe40a0009b1ce3a049e2b9ba2bccb82a7afd945a36a84caf1c7a69a8c89e1e96cd8000b2cf9561147a9e4005b33b15eabdf92778e76b5162b3acd0d538d0ce14f1f870abc0d7b4516106d364582e1e4bb31060009b1ce3a049e2b214e3d4f50c22df3abc148bc9b5a3d19ac501eea69631b1ff066fb4f4f270cec005afa1682d5bb6796ff9b8ad8c438eafc451fd474a77e974b1bfa3e3a53a5d549c84f365471a24e0009b1ce3a049e2b80ba5884b98fc10ebc8cf5d581189b06b1f03e9a634dd7e63e80b3d4a35ed91c005af9fb12f6b824b2b2f620d8add53a175a14d651ce70897b905fa513c6c747fd62077c0ac132ae002012000a700a802012000a900aa009b1ce3a049e29a6c6424afe0931c3d517771ceb0aa36b6870aeef04a11d4151d11725b62c9be4005aef42ce93c1859867e1d8c71f6175a5ea27ba5cfc9e1d27e6234e65fd7306a363e0a1de3c51120009b1ce3a049e2a6addea0facaf57a368ba10f7c2d818ab0cc9a1122b6896abcea6a2424f6bb6f0005a7bd75993975ab045d350f2fc365eba43228e9c2f627dcd81169daab5f647006d9446a31d92760009b1ce3a049e2b9f5cd0cddd3a5c36493d77b9b25f19956b73e08ce20b06994a1f96ccafa8c1a4005962c02b112efec0b948f616efdbdce362a389bdc2ff7c1596075ae4b69a6092b2a7535ff8c2360009b1ce3a049e299d41825e394fefb4490174943a1b572a7b1c91fd32fa36974cb8d700c28af82c00589fe9cbc729eb6802d2ba64eec84cad5b03ab06554b3f0e1e57ac20967e14ebc37106f31153ae002012000ad00ae02012000b300b402012000af00b002012000b100b2009b1ce3a049e2a6bf8caabc3f4eaf9e03680433ec69c36b18ecef36205f7f6e4c96e9d4094aed40058625a86b852d28cfae9a113091b84c87afe09d9300d3b4a590b6e84e8bbfa27c08ca0ddebb6720009b1ce3a049e29970e2e72fa9d52425500f39876f20013e754c3ded5027bb5761b88ed636becc00056fef240c52d832b91def8b3e3c77a66db288991637f705e981aef30a18455d634d26513930cce0009b1ce3a049e2b7242a377818223a0031d53ec9cc6729de77f2b0dae29cad1d6fcc1cc8fe6d5100056e93ed3b4e55dcedd6eb17b65e5f17f4dc0adaa102c83f8c64aa3000dc42d836bff6ded8e1a160009b1ce3a049e2a8ee827d70de4e25d1143418028536721e04e73b316272119daa12477a4d6407800559fe27b6fbdd7d80efb75ceadab7558f7439deef102082c17590bbf61765112f2e10f9a417e96002012000b500b602012000b700b8009b1ce3a049e2a01b3e0f41cb9c0b48c000902f339075fff31611a1af0201b9239e7898b0a9da80054cb7f95954a293cb7269341296477bfe73faa48d3b782a9d242932658b1fbc0dd9da4dd8eaf6a0009b1ce3a049e286817932606ca3c120ed06488cdf79f7af590c872431b817d1a77b90e31993040005358223c0a20aa9fe01ee4c98aa31c42d62389794ddae1692e08d60154e0b6a8674d7a46cfd6160009b1ce3a049e2b7046d2c2177814be66221119d68af12cc502e29c2c4f222f334c04ccde7a259c0052dfe75398682106a492cb59bef4c9ab52def25e140442bbe9f26e63e71ae787a9a7fbfa1aa8860009b1ce3a049e29464afef91bca6aae41fbab7d62358b074976da1f6d1135d994a4d45c54cfb774005297024056e786517e02c8ac346b58789397d3a6037f74656cd72e1ec4b6567992d58e07d98d9a002012000bb00bc02012000d900da02012000bd00be02012000cb00cc02012000bf00c002012000c500c602012000c100c202012000c300c4009b1ce3a049e2ad6d5cea6ed4f123338d97ab6529f901cb12764e8ffa1c5736f65f2d0af9f7aa4005248821125709ca9cd2bf686dbe7ba6d440aaaf67f9be34e0b3d990749e7e700949d420578a8a60009b1ce3a049e2b6162f8b56f30070e90f53c9e41396311c28c8d5b002ab7cc48bb81ec458f979c0052469b613d18cd559766f814cee12945ec3c4a16cd5fe28b8aa917aabc059569c0591e5ab8eee60009b1ce3a049e2ac4e84f13afbed0a85661e40a95d3960f9be044132c962efd9e0964bd0106910400520a741674703fce1db1c705c494511a33bffd387a79d10f195d0ba82653325f88a7d52b8ee7260009b1ce3a049e2b4515f4055067fe8dac81b4e81de69efd32faad0b6a4062046a9eaae1461bf7e800520960c9e93fafaf9675e686c90fe2a02290d434d32e987beb21ecda88dc46dbbec0f2537f5e0e002012000c700c802012000c900ca009b1ce3a049e28188eda0a1e10b9165aabd90f6a5680937a93da84e4e0b7bab3ff474ab77e1224005117bedb0ce6ae158086f70a6e1366c4ddf33f82641fe760fed5c84a92fe68da8a3967be66b7760009b1ce3a049e2ac01fda94b6f564e27fc41f0045727696e5f4e6a688a26538849486f9626bfeb4005117bedb0ce6ae2a10b37bcb1ec1baed930bf99ce1842d6380c306b80fcb5ff2971f5fbaf3cd3e0009b1ce3a049e289616c1083a95635e8e7eb85146993de654df210756b9410ef061dac8fe1420c0005117bedb0ce6ac940fa67fc37c020ba8a5ce7e7a9e40073034f2005e95432538a8f9d72a496b0e0009b1ce3a049e2b89ef232fa8111635818e1cbdfe3a1b4962c2cc07241206c56ee4b51f8606232c005117bedb0ce6ad8ada53fbe1b8204016a111b642c5c10b6efb15a9157ee01f73d1fc76ce6f42b2002012000cd00ce02012000d300d402012000cf00d002012000d100d2009b1ce3a049e28b5948377776fbf5a65772201d45f15555c2d5fdde1237449577bc59582154e54005117bedb0ce6aeb823314e26d653a3dce059977a0c83c970a98befcf5e75c937aa9db29d67feaa0009b1ce3a049e2a9acf4c712baf372c7b9f238d461330f56bd4a979ea22aba7cbd13f210daac138005117bedb0ce6af0e08c7ddf1bfc3c18fc59d5a8c49b262d4a98de685d888117d87e80e3688c12e0009b1ce3a049e2985e51b014bea9b2d1ff06dc07e07e54917be288d3d2e6951947819c07562f410005117bedb0ce6ac9b866bb0a015a1b9cb4a04259e75c2854e14017f653f3e42e34e3e2f87ebeb1e0009b1ce3a049e293846e956e47d045250ba0148ee0388077ee5b15df2fd128f75fd2cad4f4236f8005117bedb0ce6ac264b4a58989a560db1e2b784ec64a2cd7f1e31f707785189844a455aa2f019da002012000d500d602012000d700d8009b1ce3a049e2be74e7f52fff1eacab0cca72a3eae392177b16108c08bb9c801f26decd30cd2f8005117bedb0ce6ac200da27d131557afb6ca1c7542ed43c867320507d68f6595dd01e0bb32c471ae0009b1ce3a049e29ebc780f29df608d51d0e169b0b238d214378f506a869cb3291dd7319b3610148005117bedb0ce6ae22d3e8b9e0208c7324c00eaf69b7ea62df5ba4fa59714f465dee6a87953d8c420009b1ce3a049e297dcc81d4da1c6f809f72df487605166aa33c364ecf4e655e324937412f4be1dc005117bedb0ce6affec45c828ddfd9fc9b3f6fcc0b358d37753667ccb44a8a5af094e0c9c6ec36060009b1ce3a049e29c064c19a359287be64c77766ab265908db02449dd514d11854d15a99f6da70cc005117bedb0ce6aebc819c25d36ea49ec9b99cfdd3cfaf91d642ba9dc94ff8273ef4a7b4fd169022002012000db00dc02012000e900ea02012000dd00de02012000e300e402012000df00e002012000e100e2009b1ce3a049e295f656795227b17e04b4c687924e2266f2b11d91d755b30ac343c8ab498172648005117bedb0ce6acc9ba8487cda2ccc88d92c89a7c1459c7585459e44f942bb38fcf192199fbfba20009b1ce3a049e2ae78bd88851ec3a14d6f57f7e92060f7e8208e87120cfdc81d7d3ac2d85187910005117bedb0ce6ad6680c6a2a94f3515ee812cc8865a8cfb40ae24128c0f68230d7f03c9055c1dae0009b1ce3a049e28e911235c41d34454b3b8e6dc2b90e74b13421e09fc8b46bf45ecb8f04d52ff88005117bedb0ce6ac82336dc9226ff3651616ad7d83224c1c7bfdfc647001283ccfeabb8a38e526120009b1ce3a049e2b6d633195d881c8dd5230cef51f78a2e6153317db3de2ed32db1e00407000d9a4005117bedb0ce6adba3eccda1a1a67603cc4de6a8b3de4f6f42c68b481bb25667ad0f2a4882697e2002012000e500e602012000e700e8009b1ce3a049e291f858f14e18c109c68ec0967e6afd6063557a77b6dfac21022ac2eef05f83048005117bedb0ce6acc9c22d344f11ca4eb99dd0fbb543fc11dfb1e86e3206669bb76df787e1f02bbe0009b1ce3a049e2a0a4dd2fc901b3a1035ae738e4ff5d687a8cb9471655921617df632f5add79954005117bedb0ce6af32f2c478c701e91245aa3d88dd55817e44c73d0c42da9f2e84161d79c27c223a0009b1ce3a049e29ec44eb0b3b375298d7c366338ae1b1cc3cea3c809577ad3a3ca4cab24b5bfeb0005117bedb0ce6ad2e07107e20b6685a7c898dec3007a9785808ed41d747c0d75078d63b7c76d0e60009b1ce3a049e289c5ad1f1b22b34c0cd41e2d6b0f481262176d9448f30132a1aeb936be354c7f4005117bedb0ce6ac51e74a504d562876807e239c6cb607461d858c47336791a1bbfa84f396435396002012000eb00ec02012000f100f202012000ed00ee02012000ef00f0009b1ce3a049e2a4c6a8d46f4063d354cf9b1fa0bb2686260834f4213912593aabebd46e267c7c00050c9538bf7f8f36f9bd85d5b0016f6d5dfa99d23eb5ac4b1575af05db1dedd6a9a39f171313fc60009b1ce3a049e2900d860481191c631d8f9b0bb6f77e2a91de8a91efb10dd142d6705a1e258f31000508603d0767ecedcc150c16fe0897241e80f4413339d2e0415efaa02a2c352173263a0a0b3e2760009b1ce3a049e2bef1d81f639529040d93adc2c9de727fda77c9336f31581c3052c9f9f0fab7cc4005073781ae4a27a0d011e830eeaf39b99ed78f7c7e91e0914678ca4a7c6edec4be7ab6a18ffaea20009b1ce3a049e29720a0561458cf28e67ecd8a8a56698a12405df743d5c7e99dc6bf76177e4a35000500fcb6298195ae4e016f51815d3338ab8c29e0bd03890feab9e861f0fcb68ed8353d02b6b0246002012000f300f402012000f500f6009b1ce3a049e2a4cb6f287ddd6fb6b26255ce7f5a4a85b6a36d815072db6cd17ba72c8b51ffdd0005006cd8c3f92f060dd58645d6b8d97fe4ba07286e084488fabb602c0872b5e57c6705ed9de64020009b1ce3a049e2aeeb64ed0a71d5e752caf436a206b8c0ab6e606ba96a0cc2eaf9398ff926c5774005006cd8c3e7af7909342cba491b08507f8a25ba54c409ba6d10cf7b9cb58a3eaf5e464fd7bfe5e0009b1ce3a049e29c7324f72e2b70d528ead1ba965380f8ab9b6aa0ed658800d29b936c7ccac9730005006cd8c3e70241bed0b68ff4bf4108f22687b94f94b3a45c56a98c5a293986b062a2c72c4da460009b1ce3a049e2b6fda8b7aafedc7ebe72b1f46abdcba2fa453363caa47ed2c2cf3f623aaf57f58005006cd8c3e0450bf783a061684fbe1608e701ea2c6f13371cf276862016b349ebc1150977c0536002012000f900fa0201200117011802012000fb00fc0201200109010a02012000fd00fe0201200103010402012000ff010002012001010102009b1ce3a049e2bc558b76277f84a11668f6be7b981a8519d6a5d6299ff5ebef375bb1f1e91b324005006cd8b1fb8968ea011dc72f54b87e8b43c94a59c6d499c19394fa56f6d0df127a393d11b77da0009b1ce3a049e2a05de090e522af521ffc204bcd4ad0c4cf329dd6e3c95f240f97189a169270e14004fcdd0bf945b2824f830979f1ba394187d506e3dd3568fed7c2f320e5760c540b5393b590983f20009b1ce3a049e2a16e2ba41823813a8ee38b5161840c02784b3257be71bc47d9d740654f9b4a88c004fcc991eac999c23fef9cf49149b2e2a3fd7dec7dda3a1f0d120cdd262f6ced9b72be999785cb60009b1ce3a049e29464b13994b32a86cb2851b2e48258fae038fcca403fefbd7d1811db91a38b7e0004eae7a579206ec6095072f6eb127007e98b0c2c855151bac6b94c20700df1f544969a2a7f8534600201200105010602012001070108009b1ce3a049e2b9024899996fb2bb4f8e66fd375c9f5ecd457f924443ca252d42dec3d3f197a9c004e10230be90124fd203e334de61abfcf85b23a17c6f87853d99aa68eec646047abda2fc837ae860009b1ce3a049e28c2c8b330c99f6cc5aeda89b80864187dd828790d2fb5e82f4173f0ea8f116284004dd95ac72aef35e6d4bd93473ad1dc6b84176e07c834f1a1e10e2595739841ad9724a93503e1560009b1ce3a049e2be70487b3db4dee930e1ee9646caf20fc4f23f2465cfc205bf9358a7f79d04fac004dd41ed0ef3995cd9245931ddfc6d508b411ab4018995c5f62752e054803c9f82d15485be001fa0009b1ce3a049e2ae6d40b34d5df7717b3129b1dcb97884b538866352a28889bab7cde0977af03fc004dbab13404a070932130f044374de6c5cbd9e723044aec3af3f77b18de54c9b9f7cf43290db89e0020120010b010c02012001110112020120010d010e020120010f0110009b1ce3a049e2bc44a641dfaa0241ab26f7d537ea08701a669ce20587b86ee92bc0757b91915e8004da8b24f48535d6d40d6f38e60cb6b302febdb408fcaa67fff8c3271a40929b1ea0274b2e730260009b1ce3a049e28004df6a4909e87fd627e826a61549f588b44484cb20aa7359bd28871622e5704004d7387936fc4e2220f165e4717e1f52cecafc84e487107c80ec6b4b65d993b9262347297dd74ae0009b1ce3a049e2b9e295baa6053062934cb0c955e2aea883e1fa5cea8cb3b7febc1d22d6bff1cd0004d6d5e833e5a92923f7fbb1c77f24be5deabda8e6b8930675d0751aa2d8335dc8d710cb929842e0009b1ce3a049e293ca73c9ec12beb549855a59687da941e6de7ba85e2d810cdaba11bb7343cdb50004d6d3321fb9f8295ae334a41002a3acb6bd81cee5ef4258f7c1003c7d2f7f4c3b9b385c711968e00201200113011402012001150116009b1ce3a049e280ff3a36837a1d57abc86ff5b6a77bcbe0a113b55868a9983b8dd27142e466720004d6ab3f30cbcba495ebb678b36f86245c959728e2166f3600d364b3843284667a297061efb9b060009b1ce3a049e286bad457f03623ac489823c7e2c61e9c3b9ac8b7262c758d0957e383e1246afc0004d6a72d740c755528e1f2a08f6c977deb5e1ba1eabecda6ce4b2ee114eb8f678ca2918f77b615e0009b1ce3a049e2a5e500c6c75130c871837cc38c8519c93d9244ed59e75aa19662bd992e0b7b40c004d160c93b533528b43081357b4885f7d6a67a762a88101e31026031cf6ec6bc1fe92976035cd8a0009b1ce3a049e298f18710b8c53dc13f2b64ee19fb73888db4eecf1ffc56a3d74fae35ce2b94028004ce46d8bd23236c7839a36d9c3a50549fe17f50cbb02e554a4b2c1d257004b4c9f707134a7c6e200201200119011a02012001270128020120011b011c02012001210122020120011d011e020120011f0120009b1ce3a049e298a0445d1911744160b32d713007b06ce29ba616a9be78d08090bbacf11f1a720004cd9dca7a5b13aa3ea0c15b74bf9ca563a8cecb1faec9acdb620557a084a7c862e19df048f83ea0009b1ce3a049e294470a080ed10ebb1eafb056fac02f0da312997d22a75c0c4c508db3404327e70004ccd9466522d58424f5e283adc3e8da52c90a2dcbd07e311c826dbc4b63dd81990fb6cb7309bc60009b1ce3a049e284b9b4593c0f88e975affe22213b271598e87ae4d3db0001f93d196f4fd515354004c9228a09a1144848cc771bbc8361d86f381187db7bb35f83fe8ad8241d33b8c2c9acaf59723b60009b1ce3a049e29ddd6e95533c1c1e4fc71b209cc2a82e9610aa445c53bc5160965e202e2818e7c004c808d6c1cae899a28a87acfaff5de1c222cf4af07dc11e8e3fa4aadef5dab7ce01c114e5b9f6a00201200123012402012001250126009b1ce3a049e2bd27c9ebc27eae04ca8220e44333c133a60baf7a5a9e956d0387afed36284bef4004bfed396d378dee53147ee1c9a4d4900c0c292df9fee569b02e0554c91ea3774f861af81fc3c960009b1ce3a049e2b49ce0747ec1b6a3dd823a680949e49cf60cf017f27d9cc997d8e327c2fc67060004bfed396d1c5dd25ea341585947baa0194b1406662fccc2693dd8932211203a1326a59f50ce64a0009b1ce3a049e28eb05cc67692e24c974527126ad881251c1865ddc6b916a6c7e42904f2db53448004bfed3964744a798c7b95f42a89c2a5ed53d6ae8dc665a1ae424ef1e961bac85be227ae5dfce5e0009b1ce3a049e2a80104d3206cb19c56db7b3932a68737ee907f87a8a435bb15cc78dbedc12ee0c004bfed395bde39ed16d52d1d34af75b70c1a1c7363abfc373cf7fbf3229cc8be80276825670bff200201200129012a020120012f0130020120012b012c020120012d012e009b1ce3a049e2941b1de90c30a99d2b92ae9ace1f902db3b2d16839833152511d35c3eddaf5024004bf88012a3172f23623fe37a6a77b0547345396708c9363518d18af94528b92014a6d7950fe9b20009b1ce3a049e2b30c3061c3258d99893c74183d908d9e2380f67f1ed6f00fe06b36522a0192944004bf8800d5533068dec11592e433234901611fce32fadd47e24f7536ac942b81c5ef7c26d979dae0009b1ce3a049e28592d28aa3e3a068cb9198127825a14319ec62bc56970d0447d11ff00a8958a50004bafcb3e659b3fd9b69681f6a2d635073aeaad83c2107fde9639331762bbdc489662d80881fa460009b1ce3a049e2a42a62fc8023a87371beed0339218c94a1867c932762e39f27919d934685d8ff8004bafcb3e659b3fb08339ae393d96b9a5c519258e1c62c12c65bd32222ad5c45d8f201fa7c8d29e00201200131013202012001330134009b1ce3a049e2aabc6eafb8a32bf102a459709fcd7082d8587efc6b9d873d17dbdc250ac829d08004b6b798ece39f7b41318996d6e8ce34927a5ab553a01ea365fc17998486465516d4fd420aa885a0009b1ce3a049e2b836ed536f6d51806e3b3bc64c25ac7561db40a02f3a587e31c2fd84753f81524004b5cb8b7eca06badf573699dc359e1c159690b32f85c446b8d8f73651aca205b06560f081d11f20009b1ce3a049e2a89c3d1b646c41de9f1267a78fefef099131b919e3b563fecc5147f234b858530004a3313828c32dcdf97491a293787166266f3c3ec9e93390f0aaeb74b079e92dc6694e9ec7747fe0009b1ce3a049e2b3c5a8d4d788e381dfffbb8a011f58b4a23e5c82299602047a48e0c27d37b5b480049f4e2af4ef972b3ff15b5771e8aa82e713e2ff3943969629e0f64e0ddb68165d190c2557ce5b6002012001370138020120015501560201200139013a02012001470148020120013b013c02012001410142020120013d013e020120013f0140009b1ce3a049e2ab9b1bc5accf50666c6ab9e37edbdecdc9e1c2057730dc500265c84e01031f7b80049572be7693fd0a82e510b4d9f501503c4769c8f05cc7f25236f156f00aacdee9b7e06eb07ed820009b1ce3a049e28c994211c80bcba9a09eee62de33ba46759babd64fdd5fc95f2a1e9a7106b7b04004697b6f8e5966c0be1e2bdb47318045ffe1bb6e79f6bdbd0bb5413fa37fc222bfbcdfee2e857a20009b1ce3a049e29ce75657f1bd26d3fbf28ff461a2823d7f795de3ce801c8d984cbc4f356d344640045f46ea49a6d305d2496398d7959f433a2c366c5656ef64a8b1e04f32f4b49c4156665ec1a258a0009b1ce3a049e299b032da304be576d402b5f295c7dadf28ba58a54e5c8e4010767e2b2bbb4ba240045f2c4e7b6ef9e3a49af7f589fe5c368507b67a2fbbdf28486af9372c42a64f913017cd699bfa200201200143014402012001450146009b1ce3a049e288bb9fc2f974ea40d589c3b4ef264c40dab94894428a490db17e6c38e230e11080045dc999841b0403536dae1af1fc09513176aff7c79d638ee99ae975fd964bf942db7d0fb91b77a0009b1ce3a049e2aa3ca6457997bfd9fc2a97e939fcd3c67df5ecc38d7363a8b6a37c05c8382f7e80045d301b202f625a13f11ff3180a7b3dd16e833c3a411c9cd17c8859c0c288098c80fa80b47b67a0009b1ce3a049e2a749213c5e5f2377174134363da831cda44d4c0b2e4fd6f45a4dc02a27ac8060c0045a02cd9e1bd9448921455da5b253bf0a0373e940dab1f62c33db1b6c38e2c2509e90b18d6d8b60009b1ce3a049e297bbd85a3fd6942f678cf63a8c1c5f419fd165b3ce9174ad0b14ffc91a2d21e5400450ee62e30e7f51f36a9b75b9687f793dec216c606e3f7c6bd8abbe1afa40a288e30de2950ef1e00201200149014a020120014f0150020120014b014c020120014d014e009b1ce3a049e29067daf704677e9ba00a1604c7c53f0288f3a82ab53c45db5d879ea80d1489cac004453bdf5c318e563dd94a980935e004b618f63008b1227557d464cc7cf26e705a8a109108c4efe0009b1ce3a049e28b4fb4fc18735e4869f639ca1292a83efd8be67c273840e375d56fe36908d133c0043ab01acdb5d483943525f8161f8aec2fb535335fc2bbb1ab0b47681903cb447cca69824f1b9ce0009b1ce3a049e2b2c657b9a9ca41dd618688c3bab8064c12f0f11aad5780de58eaea7a899d560280043096284e460ffaaa83f00bd051fbb5536517bb5a916537bcc03e27a87a7ec0af1943fa239f3420009b1ce3a049e2a1c6fb3f7b89ce40caa1cdf4d7dd24b4e858df6b869e01b33c4d9e3265c4fa4100042fbcb4ab5efe03c44edb7d681a9eefb9ee72b66ec874c2dcdbbefef4f9cd0ec9131c6e32ba04200201200151015202012001530154009b1ce3a049e28e3e721a3893b49d49d9b01e3fc03cd5c183e2355d73048a96cf7307dd8ed9b6000429bcd4d450fda9944ac68574578f8ed0bddfca72d4ff96126182d0aba84e1eec9c49d3719eaba0009b1ce3a049e291bdabd1cd422b0f56127f21a123fe9a17938fde4cb4b5ad236e409a535d1c92c0041f03dfda60389663ebf5b15b05dd8974676487cccb33fed640bc4a68b490626d98f540fc1c7ce0009b1ce3a049e2a6607a65635a24d5ec31dadfafab4402400277596d690af53334ae6283f1ccdb400417917bcf5fc9064170278680894f6ea68ca69ed38d7c8004d9acc66269c52dcba495130bf58960009b1ce3a049e2abb7ca2ec6183a2120984c62ddaa833cf8e70dc17f1efe6d79e58ca468c8c48cc004158ead08d9ec781055db64e196e3396ede7bea28437c1d49f6db06acff8689eb73b13ea3f5342002012001570158020120016501660201200159015a020120015f0160020120015b015c020120015d015e009b1ce3a049e283e12aa568de4617f4d859acaef5c97f4a62ade4208642f8ec9378a10f26b8d00004123d3dc9812dcfeac07f0e4bc11320a8da8b1b3a66462b53c494a4e14e76c238f26664fffe24e0009b1ce3a049e29b53b79a3ac2346c8997424e83c45de7c26f179578e3dc9950c8b3eb2e62de2d00041153d89d0116230b8e5463bb6f4bae077e1956a261234d3f1df5317559c2c0cd5f4b8057f475e0009b1ce3a049e2a6e6767ff62a2e0c430a7c9c8ffd172dd5a5fca6b4add3fc4ad7ae530ec8dbb4c003fffc05cc4c54c303963b55830d2d2853361134b7618ab43528bbdaf687a69d26867141792ffca0009b1ce3a049e2865c8140ab9e1c18a923b1921981e3217c8d90bf8e13230b19926eff8c1fce37c003fe6ac71ac13e49a0aba445a362a7aa7b5be60b52a9885315a3c192b5313e881d68322578e79a600201200161016202012001630164009b1ce3a049e2acf3d21de6b7d5591be81e5b69a37ab7e26963eb960504f35afd13723c76e59a8003fcafe710269866ba35a67d878b9ce8cd176458a2afbf5b8d642531b3f489a9fde93f24a1ec7120009b1ce3a049e2bc8f2a2ebde82ffe50ed391ed870c325cc1d9cc3bf694b4d2d64f4a2b7a32495c003f9a3ffdaa933d63653295d7a0ab3ffe70a8e39b431046c93e5a51976ec30f17c81151a28b62420009b1ce3a049e2941824f0b678374f9e37c6ef68203912f74e7b3fa31dbea5c0bec22fd8aa5da14003e868f67b48bd0e5b6248ae957819c53195463dd7a29277835a5b27323db64cea1c0b8712907ae0009b1ce3a049e2a08cd7c39dcc8aeeda2f43b788650afeceac4fd064d63510fd893de413ed74098003e744aa4b534f87a27dbb19ba353b571991f65bffe5aed1f4760ec1b5e2ffb23dc9430e3a0be22002012001670168020120016d016e0201200169016a020120016b016c009b1ce3a049e28d7a06b172b809bc84ee5caa9cdb0bbe65f1be86894cafc6add2f85a77b073bdc003e4e715ec4dc8b751d7dee28e7a37b1e3572a62abd33af2ca3f86d1858a0cce6ff60bda6e3459e0009b1ce3a049e280f8192537e9aac12cf04cd229c7e40327a9ee0f40548f827300f26e6030ae678003dcf8699bac9c8d3a5c152504a1ce49bbd0c5f022169be07c1f530da7255c17855a8bd810dde7e0009b1ce3a049e2be2f5f23dcf35aeeeff34d2a5244076717b6ccb4a0ff487e6340129d0d2549388003d995d511e48827242fbe7fc4774f4d3dab3613e7cafa7b079fa124a33a6fc90ca96baa69704c20009b1ce3a049e2a0e045f4ec298cc3262ea73c7515994b51f15a26ab6c361ab56d9dd9e1130e034003d67fe05321c5405ab8bbe1c5e2e3b1e546636910d34eb91b232b31e21ba0b3b2162e599de997a0020120016f017002012001710172009b1ce3a049e2a1ec2052d7644362e8bd0e31e214bb7535679c66d82428fd99688c2c39ba08528003d42e6c6de1e6cfb2578a99c369561d684eb320a8f13ef320143899fc9850c38e74e95b0eaf40e0009b1ce3a049e298edce91709ec0b91d798bb27199aab13b36b0face9e22abfc2c72a8db3ab9c64003ccbefceb9f85fb6d3b4430cdbe843e76d179865e48f49a36bb16867897d45dd53b004067be3e60009b1ce3a049e29f9052846159e927dd019994e476575ce9a1a979dc4d617eb3bd9d99f5ac414e8003c635522485691eb73d6117661e38f086a8631096061f73baa8ca5181082177fe773edeae06cd20009b1ce3a049e29ac4a632ef0a54de1d8e68175a8b2e0a492169e88134028583de33faf3f4d3040003b77d6dafbc5e706d5026994fa04e5b710b4e68c4429a9e705ce1a95c7c0813127b2a8fe381ea20020120017501760201200193019402012001770178020120018501860201200179017a020120017f0180020120017b017c020120017d017e009b1ce3a049e2b7568b9352dbe49feb448787d3b30758d89528ad44054d3b22b7283723f2c4ec0003ab5299153a13ac196c5b1cb6bc04add46eb9eb075aa93d31826c69b548eff130b118aa1f09d260009b1ce3a049e281a5721f7140ce79f6f27158a5f99c60d676b5d2a2b90a40faef334cb01a778100039da5b58add01df64bdc3ee3effd34f1eb0ebb0fb48e99c40e5b042c18661f7cf2837d3965c3e60009b1ce3a049e282cb43cf9319a908309a78f1c2894d561f8d6e6cff8f96f7adb91ea473ea9565800398476d9e72eee1ea43d67ab725691048a03b4a4b10be18c03fc4447238864ebfbe528e9afafa60009b1ce3a049e2993f2a86f030cf87da084003ad81fc882fa29a132ad42f9702e2e4379534f39540037935d54a8187a4bf04f4e4bc1f57ed53926a829ac7687196fac601487c228d65acece629cf61e00201200181018202012001830184009b1ce3a049e2af6e0ac99b21176207c3236efd50ebced15402bc4926bf43b6b8a88ce2eff74400037764d07292590c243e0ab84c6ce8324939e1888aea6363bc3b081d6ad18eca492fb89a8125c9a0009b1ce3a049e28721876054a3ca9bd344a7499d2b1b5c5101f80ad4f8d5de9b8b8c990e8d0e0500036659b79f26c77d5f13b8eb2fb2811f8f2fd2248f8897e151bd652c93f307b1e0d0c71dbdbd10a0009b1ce3a049e296098476e7ec916c5a1c0f16766644148fea29dec096b92d4153ee078e075f4a800360fd2355c831ff09a1ca5182f7a1832d9964fdae6786d148544642138d9c1d91c3660a3bca58e0009b1ce3a049e2b1027b547fbd1129ca79c4d87142c431d51805e87420ea8e0bf6f5a8c2046f1040035d87634092e5a9d32e6213ac7ee6541c7691835955b5c383bf1e277aca1dba4825d8b8e5b09e2002012001870188020120018d018e0201200189018a020120018b018c009b1ce3a049e28cb249c97233946719546417ca8a2982cc0a2859d7ad46711baa847972921d7e800344f0a01dd9fc324c43b5243ee6b2f766a6f24f55b171fa37a3a125b9c72e6a7abeefbc3620ee60009b1ce3a049e28a85b9fae42650650359da1d3aa39566e92458defa7015cce7b0948f3404c5a5c00332968537deaa69ea2d14b979198992f73ff458a40d76fe3157ee74c5a780e1d0cc1e93f3260520009b1ce3a049e2b3b690ed2e32efad64ce9695bf60a59997515ad4d79a79162e948e2b7e8f3d6a80032d16e217a8ba7a48075ecd741d50fee154318dc3c16bda368046babcf4d0ae90619e10a3b27be0009b1ce3a049e2901a4fbad5f37c7ded74d8262107e9a1e7be89b5042a4aa9e9bae0a1069a0eff00031c78cc5218aefb88705d8a1a927b941511fa4dc9dc5d50d0da4cf7fbb48496bf1a962df4ce1d20020120018f019002012001910192009b1ce3a049e2a2b4f22aa8a6c38aab44dc1ff5be2208b6af254f7f965f56e1052a57f4a7bf6ec00319759426809d4725dc51d03947604a3cdfcc79fbe3c5b0581d8621adb33624b0014c36934f2be0009b1ce3a049e2b299a7d4d46e361e22908273195f8a3788d31cf81949d021a7fd064e736800a98003112e23d58390f85c1cfdc020bd8aa220810902f1bb066557e3927968850f219267da0bed3d52e0009b1ce3a049e293198d0acb8aeac12d9b3f90d4f591ec89a72a3f3ca1486c2737a030e15f76cb80031128a135aab90dbc32e7f98f5f18ddf0847960f69dc56903cb7924ff0bd4232512ea170108e660009b1ce3a049e281252a1041d3e9fcff30f73a377492a2c7af3eb08d3d05861f2e045f52dbf93d0002fad2ffbbb4bf86dee48b7d754cb10756ee56e24b1f947b72bb5d6c4dd820300e1a254e716ddb600201200195019602012001a301a402012001970198020120019d019e0201200199019a020120019b019c009b1ce3a049e2a58f782b756b003a0565fdbd517df018366704f15ca7b3b84f01ba0ef582ffaec002f8d871e340ab33de3900acaa1c1d147728ab1a4274054f1e3e7870d5a30dbe53d31bf2e559e7e0009b1ce3a049e28372a0d19e349250afaba9f33a968bc27367051d055fb571983219464c15e00dc002f32d2a8a6321fe11c57246e6770c27b5507791009d09e3912f7c16e08bda5e5ef9506c4694e560009b1ce3a049e2ae1b8ce38afa16ff28a6395196854d7995a4240e2457960a5e03e6fa5c2b06a9c002ede9f16caf0018324d3181966a141c514523c202e2a22d8aed2506b06ebd09b6abe0dfff3ffd60009b1ce3a049e2a1ea03332dcc24db2fa57915aa3f0a1c6a76eb5b8dde77c34acea190c176fa388002ecca7231f42bf5d219533d6a9d383f0a19caf6dd415e9c444edf0a7739081733c5669a72c94ea0020120019f01a002012001a101a2009b1ce3a049e2ae92a6426f1d10f33d470bd95f7037ea7d9e4d6316e8031ed74a49e39950c26e8002eb4bc9f8b0b81fe968e6748584d4833998ab0f2118fc101699e06d3b0659322cef4c666802ebe0009b1ce3a049e2b333c4558f9ad15b8cdd204eb7ea8cae1bdc3e2329604d5c6e55ed03daf43723c002e5d8b824e37da29141b26bd203d751782e5ec505807ca9574e9c73296495de83d5b39b51523fa0009b1ce3a049e2b757b63831e4b023587d196f50515cfcd53e8723f5be3482782740bd2c446af48002deb72f65f81cd571b3ab859148402488b98e9dda1fd151968863eb72d61528d989d9f3d96b1660009b1ce3a049e2afbece0cf21b947480c9b1c3a18612314280a758d565f6a50c87b80eb8b103b3c002ddc5adb71e59256d776e804f4c2763599d0bf0b586833ba8e36c474f43238da2169b074615762002012001a501a602012001ab01ac02012001a701a802012001a901aa009b1ce3a049e28c48e87701435bb77506bf5ed116875cb454105376614ac03d3887e1b4191a17c002da45c0edb9b249e744c630804d331bc19d8ea9526071fb66743a527259298eb9b175e2c4a49de0009b1ce3a049e28526ebf63b5a83c317b814dbc8d82244b08dc9a9ceba520915bf202e03b96d6f0002d83f2e7dcef6b3be7af211d13b1637d8ac7086c5f4ee0faa764f3d951943ee00ef5468c76617a0009b1ce3a049e2af085f12d98c40a822e344c3a80cfb3ad77406c19ac7ae87bf999505cd5db13d0002d7b40a5aa820ccb07efad3a6a6b2b17df9688981b3b75ceacc5bc448fd9e5dcf567933d474eda0009b1ce3a049e29621c7301cd24aa2f5452419d1e09b0405958b8346679d82fffdf073cc75e16c8002d6a84246bbd89a24819b16ef4e614fff38afa70fa7d6f7a68b75728272b882e324f5680cb623a002012001ad01ae02012001af01b0009b1ce3a049e2ab067ad97ac29f6aeb60484cbe2b292035ddb282d9b0f4f0b2df7c19baaa9c848002d4e2d477475b62146cf7c9dd9e666392a3c3f6b4d3032b13332abc5b3f83e047c4a556a8a380e0009b1ce3a049e2b7247055f2727df912accac56e2203c0f1d993d5b94abd80e899af4ad53ae26fc002c7f540966573fb1f366ec8202d0d1dd0f7428a8f2368678939775dfd43322e3caafd2f9a69ac60009b1ce3a049e2a76ef9d47cb6b07419a8c0c60b4e92283c64482e9f1c4a902bceffbd2f7f26220002c2f46f738a6422bae4ce9ca3b27c4b57c5bfd4c91ed11f604df3803cf0beddb4437b63c7ccfb60009b1ce3a049e2bc6fd85624ae21b9544cbe274357159b0ddad947995b1655c698205fb7c44e7ec002ba0d5cacb00cd67339f65d1a206965adb6c3f41c0332f0408ab3b37eb1a1e5030776b0cbef34e002012001b301b402012001d101d202012001b501b602012001c301c402012001b701b802012001bd01be02012001b901ba02012001bb01bc009b1ce3a049e2ae623b72a0ed895a068900d93576cd12d98f45ee2d2fef92fae5ea79d63369d38002b664d99671335a17d1d73ddd00cba98a4cf38b3ac649bb9e6ce7064d651c825b650ef7e5e005a0009b1ce3a049e28647cc05938b6e0e0bad26f46c5453a6ca949b78afc9c9520e1e4f0c4b3566f84002b34bcbf7ede2ac55aa14232e9228032dbb019fd765435ed319f633cbef102114ccaf1609f64420009b1ce3a049e28f0394d53584be6bd25c343b520ae803a482eca84092e906831639cbdb445ea7c002abf0d125a6915ee9c4e215c1203ad0f95cd8dc58bfbc667801c1ec68886d16573346915867b620009b1ce3a049e2a31262f802b4bb2a0afef0d236dad8d676a5075ef5d8148f3f9a6c3fb345da5ac002a9c7546b9bb992ba92761425bbcb6844ea868c56d0429e313ee963d1288a446edcd9725135076002012001bf01c002012001c101c2009b1ce3a049e29aa1cd7136882d3511abc41d7f1b43a1248298f87d91f3cee28bb467edc06d138002a6a876f0df365a023d9beb6ee16304988b5dc61e3ebc7d0911b35becc2bdf617c284de350d93e0009b1ce3a049e286b8f1083d6f1af9ae36d94dbebd11fb126b8134d1cf7d5d47e9722984535b480002a6a02c236dcef5302e6519d43cdfff5af212c987ba369df8c801054a5e11436f41e09cdf9b3660009b1ce3a049e2a2ce202a9214bed45234508d7b146a41142b01cb471cbbfc470d9bd8d9ac1b99c002a3dd87135816ff0d9d05277ea1c26ab95ec012c57d5a12090749eb1ad9f3149bc6b670786cdd20009b1ce3a049e2b5b5f02742ac44d50970ea64186b112e08a5a344d916b24c94e9bb66cd16c5068002a198a15df3bf55805a66889fc09b433eb1cac810c5975500818e12c8e0ae0e3bdc0974768e9ea002012001c501c602012001cb01cc02012001c701c802012001c901ca009b1ce3a049e2a6933d83c3f628ee9359ef0ff28da7d9811e4d1da1b20a547d8df4d23ec9a488c002a12cb195a5b35660031191e56dde5e0ca9fac0a7adb0422ea50b5a77769ce6754124760a0c9320009b1ce3a049e2bc280789c00d4d1a9e76e609bad98b9dcbbba37395b16512d116fb83943cfd9e40029d41acf6a247ad2dca6096524a35a32e685ba71cca426b0e3cf91c3269cd6eeb73671b7134e960009b1ce3a049e2a0c319464400e8980aa7d89093baa2fb7860cd40a0812804de7ffccaeb6d1421c00292d84da3a5f8d87f135d6440bd6a79964873da81d2c0b7b376a26f07254059187ce262d485c0a0009b1ce3a049e29945b49e250bc6f5d0c933bf04cd90ef3ee1bf8a2e8dfe20905431160e3fc1d240028f4e0bfa31e971fd43f1e6c98cb9c0d8c3b59274e1026378fdc0dbdb50eb1d801cab3747f5ffa002012001cd01ce02012001cf01d0009b1ce3a049e2b5323aa7cab5dbf92000bb2678d199ca15f860e6c47c7bdec2babc3a89d001d30002895856b3e3aa97a22a2bbc6f1a3b88e34d3ec3226408f6df3caff6d30785d07bd1501961a0d4a0009b1ce3a049e284823394c32571c36d0963bed0ebab08462dc9744277c8d3dd46c685073b3587000286562575b0ae6758a1cf665f267e2c057047cd643bcdbbddfa2d43aa470886dd9898f9fefb6d20009b1ce3a049e2b495abc5f9c8ba651d2391079e3cd72c128fa2733790f216b17e3b8f79d3f24b4002862f84d36db30d20fb1dc5900e90d35582a9c256d35751c5c6220757f784bbb0bd4989a922cee0009b1ce3a049e2b0c278b65411dc9b081553954ceba78d0797b709b85d09fce7410b5bff10785940027f91083a2e9d0cb8a8fbb84820193b4d204821beac23c58cb8ec2ac314ff35ed535aee0078fae002012001d301d402012001e101e202012001d501d602012001db01dc02012001d701d802012001d901da009b1ce3a049e2991c6d2bd48e80c3e846f2140329d76474ee632708c9e3c2e47ad109d402d17d00027efb6dbe87fa1d1dac2c9fa11b7233fb8fed809b60b2242e804da5c370c791909130c6f635d1a0009b1ce3a049e298d4607fa4f3ba27aae9ebbaaef828d7f48534ea56a05538dc36da46dcb368cc40026c8035ace3a238e30bccbc20b0da660bcdc106ceb249da6953cbd33d6713e6a4d16a42100e2620009b1ce3a049e2b2dbffcc465e76ec940bdc88f80d6dd54ba791d756e90d8d4d6a4daa1b48132f00026c8035ace249e4435e1b49423dd16a326044b7c0af9dc8d51fb43bfc21a6e0edcf011820843820009b1ce3a049e28f43901b2d90b481719febabb474ed64239d0746ed4b652c0b3adc6622fead7380026c8035accab82df18ff6b9ec3586138047fde2a25860445693fda2306c2e05c14512b598f232e002012001dd01de02012001df01e0009b1ce3a049e28c950991d8f6baf4b7a5952c5e7e5cc8a0efa9375ae96e21368110b73dbe358f00026c8035acc95ff3d42bc06e3a77fba211c4e8ffbfba78655fd20a3624c29e42cb03a94459242960009b1ce3a049e2a56d5c6483d688979a517c5b699ff672093ae396fe9d182918d3edde4ec149b640026c8035acbf451a547d83c93830cbde24bf104cd2a3ae9610c458ec80c1a30a2a0dcc48367724a0009b1ce3a049e2be7ff6a60d5b10f74d22946e1094c6180e04da2740d8f91ba232630ecaf1a8fc40026c8035acadc54452f31ee76d4c83a5ebdc65266998b956d7c77e963593e84acc384cf8b48689e0009b1ce3a049e2bf3aaec64abc45575ada715c37ffc2534d0a8a67e757eb20446357885e5752a880026c8035ac998fb8286f75181e77418494c8b18c5b3d9056703d5650263c2aa0f45774f662862ca002012001e301e402012001e901ea02012001e501e602012001e701e8009b1ce3a049e2a7a2af11401484d79209a8414d6e415cf4bdbe010ceb93e25a8b302210b9424180026c8035ac93814c356490435d8b26734a3e8523ddf06685aa2b3f48031952beb28e88b19587c420009b1ce3a049e294b4c58a43b022e281dbd0e8489fc7dfa5daa073413233edf1c87fa2174b248600026c8035ac917c25424030284a2643df3e9a3dc27a4e92418f7d2863b8c4d44413bf747d8eb6b4a0009b1ce3a049e29dddbd8304108cb09cb3187899999a73fe2520becabc07da763acdf5754fcdb480026c8035ac89685b3489fe5453dbfe5e2c00d9a58d5920865ea58c8da8731fe37a74989b56dc3e60009b1ce3a049e2bd6eeacafb504ec4a7459182133d8c6e03219031667b2786f5962dd9347e1006c0026c8035ac75349b28de42ca52a505d1c22619285238fff02d7b6fb8c96e62f7b7a465ef7b44446002012001eb01ec02012001ed01ee009b1ce3a049e2b5637be9766be93b9339467cacbd3a7ecb28f9e4f44fac573c8455ed6f8f310780026c80359b3c2b47d88a02253d6d6538c80a6d2083fe31c60f28bbde53e3aa1afbb68ebe8645db20009b1ce3a049e2a76f65f8bd1804d2dde6533479e3437b5ae016dd4dde93742ac82e4a2dfcfce60002669a41a8b4e5061ea29453572e3376d806c49c80fc3f1bf871f69227bdf8413c4479036033d5a0009b1ce3a049e2ac3631ed74eb120ee1f09d830736f45c9dd82188126b2dec34cc50360ca4294a400266914c10095c187ee340235f5a8975b70d9330b6dbae735efc3c36109bb53143abc134da125ea0009b1ce3a049e293c504ad6ffe889a94648b0a2d4a77da015dbbc1e406ad0cb3bbc67c73a73e53c00264e27d16868e01894d7dd51f484773b9a020f2a4731cc0bea996959772f0026844aed6d0b459a0e6a644f6147fb80479fb05005f000000ac74c804dec98e2ccb42ffa5d502b51edded0de9b7690db0fe8165a20561171140d6b15cbf71881547fe7b16d560ce6c6259167cb71b45ca6f64cf469ca48373aab4054ea0faed414abd994a1aa8152b7001e75b800c348afdc8fd0e7d67b8220100000056684f661ea68184ea3c06fc31eda5d0d6e4e30fa13651597c83742596253d8140b3bdd9dca1eebb5d013f84b0b1c8ea6e45fd2dd65833c604045a490277ec68d5130700fa740855e5ecf040853aaf0a0b2898d3ef21ebecc644959f5e2dd215040000007db6ad5a057e61b649cfce513f1ee5f9e769ec6d5cba1d3b2becfe20daeb01ce406704f3c6545f82326bbaddb4fbfbda071295314184d358eaea82acd0bbadd54367601dfaff09948ea16827f20ac8a32ab3f9ce374a8e0ae3c187be3ff00dce03000000211081f0137fa080c1b2053016a8f6173c08f6df8235c4a7af0d260c3919f38240cd7251acb82ea3c9d007223a3ee2438ccc9c95173e55c3ac084cc965841a7b2bc9693bba3c627466db9e65b9f00c4c13dd22b7fec9515e454f9de9e7c26cad0c000000307fd8ac841bd291d5b6aa2ccdd4bd276e69eadeb9390296c912dd94823e888f40dd1b73e8530f3e74dad1fbfc2a69ef8780758fd9a180386d6cb37ea9e6bb43efb8254598ff5dba9cf884d4813d1dc6369e3301e61bd5da5b057550e3d86c0c03000000bf77c6d78c0e7a757ab6cbbd6963c45a3a2a36428312d3e1e9108ca030670f5840abdf245e0edb5321f18cf3b80cb93d51ea08a3535fe699ff12352e87dd6c98abfe84810ab9d45de75a8d4a4d3244d2d6b5b205c46652d14b94639e8d2bb42e090000009df1a3c4e0f7f3650ed4c375f536b62a4280fd9e162eaf4cd82ca8130c57a9c140f6454319497b6fec0c02b1be045de039a9fdea69deb5a1deaa319a5987f74cdd6998e2dc9b1b8c49f6d8a00d2781cc72d727750edf872c4506c9a2057548ab08000000ddff0e00157e813f7005dbb421e9ee7c4577ab108b749c2b764542f34fdeecc440e3404186be34aa5253136d637802400b36c17c961f96597c3659def6c3058f0d4b1b942fb7bc2851c02b085df9fda50b6cd19f22c3de405b688b7a460af29f03000000f72b2d20beb82ff007e665c0ef9086464e7d380fc73fba1ae7aa67aff26c1e5b40068bdad4cc84fcfac8bdab2422562121dd9e90bffbd4a88613d15d173d99edccd3a9d3524cff26107ffd1c402bcb1af023bb874b559dd1dbe39ad1ca0d3ea40a00000050f95e0c5e2c0495505d0abcad7311936037929caaa396831718704a2a139e0440cadeb9e28f8b2892adc8a0eb090b49241febf91d404dbcfbedc4b42e6ed3d877f6527d9e128662445c2a0b0a69c7ef60e429dd07479504e6b299cd8434dc310b0000002bfeeed8722dfa82086ee51cfcb20cce2b4911315a8f204392011806efad124f408f27719fc7f67dc3e07128bd31de67069897b494ecf20281b81de6253da15d60d6165e86f9697b1962de653df6cbf9dea7ef64cb1d96a6ee6a9a59bbce7b3b0d00000031ed60597d5a22819c1cd5dc8a4d800a59d4cbd0e0b8da75043089c54129fa6340d7cb8dff7a83372e404a03a1b7df2ffda4bb98dced38fbc8f00b1dded8dbded6a070e8ee8cf2ac43035dc4a83c5988b652ea596249ad044c465e543442b947080000006d69ad563f9e78327deda1fb3235f37929d1528c5b2aa9e2ddf524ef326ce96740438f578b2c874430a27fae4546fd84ffe734433c3d408e7cdbafcfb5cb07fa9fe26f818bc2ce9ac0e9be2aaa505bf11a18845f7c2403546737df2254447a070f00000041268ab589fab3e910c3b1240b168c1d6dab3010035a3c9b5c7fc6dc0c76758f4004b99863acf9af48477ab361555ebcdcdf4f95452d7989fe10f94dc55d6a4efe8941f0b381ea2ef467f87dd0d69483e15b5497a48aabfa950b47bf4ca67e6a0400000054a50ae0dd465f06254af7177971428ca017720f72aca5c6d0d41b4237a80ab84062b19794ec8d4970a21f90d8a6d803eb9f07f0a2d0b351800d291aefcd7edd90988bb7f9b531ff74789f89e68cb5e37fe51b1bfa595bcf73b2d5bfdef37edf07000000686ff48c04b0730d014aff829d182bdb478275a2c4b38ef32e899332186afc63402ed80e5014d70795995e6d4a76bb0079f1bfb3d4d652e923d61d69726e1f4f4040eaff64c398195b82c5bbcda8ed4949bd24d83f3690a0ea079ab510cf01f6000000008d5c433d63665069d72792dd677da53594222481eeb15e09a809558aadb7c912409f7b399780195835568cc3c82fe58ea1e9ad23dfbd23a27f68ecaf1da83528e6fdd017798501f81cc7784f55cf9f479df37b5874306a6feac15fd7222930a9090000000fae929bb335a26bb1ee954545793a98da2e3b9bd5bb456b9239ef16972955524054a53d8fc6481b80cc1e8ccc905c1c653cf8110207dad94c314a73400a862a607dae48ace9ac91fb6fa3c5928dc4197b71b90e7ac20ce7f53d6b441325b88e050000007dedcef763a6cec0c334a3d8f6c0be9f39b6f07ce7943416ae55df47bb8b25dc407cdb51f10015e95585db5d3f3106d1553c989ccd6501bbd9569b610bccff3344318b89437c44f9219df871f45f90de31fec9e76d56f44df6ee1aff3b280f000b000000bbecb466f73a3f27830ba7d10f2a5e06384b7fe4eddc7381623c9075ddef7389404f2e5cd766ad7ff1d3ec080ee2b82d453da2620b91b7fd2d5aaee85c850a3c94bcbc08d176eab6f5cf9a1f3002331fe206b88d9cbeb7a130aa9024e277264700000000fb1b163e87ea744a2ca4b9cede6103fe5f43e5e070b0985ab991d6dd808076424039007a5dc0566f7b7ed914a37a64e4b0408810bf49617c19a9c63c0455c4105ad01c1ee622e5a65e345df7ac1ca62b92688d7bc6a564441ac2b3b8c2ef8f46010000001ed3e02887307c608b75ae40b1341553018febb18657b88e52b8f79af9127272402a3b551833ea2d55ca545ce6dc2eab341508d845a11a7c12dd337d97cb886af60eff9a2b7967c31a31118bb2a9be3e5e5bc1d7490e7736029bfd9062e52f200c00000060591caae75558ff4d6eba71b5f3f12412130b1086d1082d494353c7e7041c0e4070be52283a23754d2340d91822b44a1c8ac70e828f45688614eb7ffe61d9556dfd97249ee5a347e5ae3bf39c8086e0353bbfe921d0490f3c0e1cfa5d6b146e010000004f962cdfe480057007304beb83709d65744525da47a926b870cc6af5858dcd29406260193c3344c8abf9165f3f030c12f8d20f0416cef1f360e30d5cac0d5626b22434ad2f38c9ab21f554d6b045408283c0824ba2a1cdc5828e3f0008f37ca801000000eff50724a3881346edb78d0443c83b5175ce630d061c07420722493c239ff3bc40c23ce78ead4edb621a575850c5dc30b810d995a2a39b577db5eebf995f6bbca545d1a76322a152d77e27fc091067a20d70ce965bab87a06339c71bc6ada4140700000042412b18d1ec6c02734cd5d5fc4bed35dac9fb0d148d9dab9fc2f925e2eb85ff404fc53d12a156c4ca924c5a0adc37e706b820e2b7a1fe54d19ca3a18fb14c6c6ad36c8a9e647e989abea27b90e24aca18545d6dcc93a753e5e1d1e69ef239f308000000817c601ed27f73037e96a44d6c5b51a0403cee5e4cd888c27102d53f4b5d6eaf406c31dec6d379d22ecc3e3284e4ab172af789ec87c70556189c01e7ae531e790b40ab9d95cc891f12d7a836ffd9ec5cbce3abc18bb1bee22b4b54e7c4679e9f0b000000834f222e117a4e1b27daebbc9619498fa94eabad7ade873e22b56e4cb11e0b39401989c68c15237a723db2680bed25e7bd161ddcf5e3ecf72db8d881b2a0e8d873601da0784e7f5145bdc396484bc374aab67a4c13bccac656b420d3f28d438b05000000b1a92666e0704d1aa17ba4d80d1bb194fce21a939097b4c09fc9cb072878dba84074b2d0e72513397c11f6e44b9bbd022f0abeb1a86b740d13637bc47d96293e8f74ef9db263bd08832c058e8fc5e4ef969911b95c3fa36be36c0532ffd8d1f8080000006d894d59c07238d4a5a8cda307f31147bee42f27cdfc20b559cf63930f70cca14034ca4dddc15e47c1bafbb047efa5928d4b8603c92feb03a191ceeca20d90dc08e3aaaf3063f566aec850f053da1da43aa547d8e3862330f7d5ca46fa94cbd40c00000037f3dbddc21a18324b4cf457f4e4bcb52c9014c71df34a227c9ee718616731de40ce0c288e04065d221be32891a465ae00dbfbc5f107ba8e21feb4ae19daf699ee559567e940119459f935e3daae6a72f78ee3f4005d7eda0e00bd4836891faa0d00000002f64b20e479d0305aa4844d9bbe6ac629df853c05b3f729d96175945c35408c40afbc9fbc3166becfd631367bd0de8585eb0df899b7776d047bae3e435b9ebb7b5c3205997eb8f6a8d0ea5f5683a2dc009c7842fa41ce14f03e39106c88cf4e06000000a615b9e08ac55a2d8c9d284b41713dae9faef25b4e0e83cfa75259bb9d3af69240fe8e6c26a6987162233c7d066db2193929f8ef64d0e83b0b16a4fba49af7165e2f2a545041e86335cdd31cbff4907acb1d5964bdde6b6add714954c9e1c5700c000000de7d6c2f67704bdb0ae4f9b65002e615199cf736dfa60562cc89057ba0c63043402ed2b37c817b1e1230efae6e070b6f86361d8e260e6c9596355f6c25febced718bb3d4d0948fc05a2fe654cd508dd06875d4d9467b1bcdf4b0042dd1bc58fe0300000099a96daceda7ec862e9ec745f93c6f3d3e0326acb85d679790a56a26eb1a945f400e4464ddec1692f6dd71a260dc2a81d268b7da76fbd6a7efc8b8af11609c33163eb4915d94e54e3b5890208234eef6e03fbdbce4e89e1453a861800aac365d08000000bb63f3f16b7c868ea200c98d5395e74b5c5c52dd6d1a646126eb388b903202f5404a0956b70f650b56b7ff146ff1a6ec764352d7d2553413f85c1577858e938c569314cfbcce6354937ec757f42cceb074f47e2199bcbde3ed5673802ae069790f0000008fff676e4b541777e3a081dc2ca794385454bee74d579021eb3c393d2ba0b27d4075a682c496590cd67f9b42342100d22dd017bc937ba43a493b657a4075b574d20822656ce0364c7924296e3427dc6d9e5cdb5ac3fd66418dba6a83c16d4bb10b000000a364acb081ec7d732153867fc5446b184160efbd4c6475e6138b6d33edf80306400b57e3b4ca7b548b798035aff0acc95879da82616c631cb56869a1fdfe395fc9404940453e000712b98c027620d32d8f69737a735957c92c1474ca1c1db5eb0a000000c2a78dc01fb397167bda93c9f0c49a99d1db265d1e8862b4c38350050f2be74140459bb35b74763c7b15e43015dc942702c7e721baf0462e761c29610b63a494abcf9203e0825074b805f774e9ae54d93d337dd3fc0a1d32851a1b66a01d72030f0000000d004a1ff0c9c365f062df33eaa1f29b0d96171221867d07be1937d5d2b844cc4029588761149785b55e8e0c8754211cf942d3e51834bc6c9b097424656a38cdb4aff22f0c714de61f71e48d16e1f142b85946cadff0650c52a1080ca1762afa0d000000eb44de429f3bdaa70f697a81b1bead3423099a062597414874c0f980192a37344010c412a4073365c520e29f46f52566925a1f30ed59ed4cda7410e88b76bd9ed2ba848fc1ca3745f7bc00be58238f894f8682f9421c4a74ffb66a5d688313e20a0000005715b6ee27d5f61ecbc124c9b8d8718ef23d10c74cba417126cfa77dd82107c140c488f1421fe8ae19fa0383f6a1d21acf5bc45c46b2b4f7ebbcf289f431bc3c1a3e46a6b5efe411b79e1fe93b0be36790e42424514ca99a61c0192b0df384020a00000074fab8d2ef6b24751b598aef13692cb06f976d5db93ecbaa9ef35741992d935f4014583d325861354774949ebca451face4318c8f31b31e5228de5531951f7bf92d29e621264419b255d19c1fd7da95e73076648ad360ad95092bf82a93b0cbb01000000380f3c5fc917e3852a5c61a67a0c73f5f532650b81a6ee97cfc531224b7878f14066345c6484afc748881dbe975e370a1238cb8e4d3720b5609c3e0a8e6e52157be972b3aca4728586816e9e3ca8f67ac9198edc0ee743a7953b43cc372850a5030000004c03368d1eab2c7b4859b4912a2c351b1017c41d317c31bb63215e49d6445961405d9f86a829469d448fa127be8785dc2936f34c730424f0b815d483cc8de5282aa8916b30c8eb93c02adcf89d234275ef25493da4932586f4d134fc968605ff0700000029ed8f58dfb7497cf3b3f4392f0a70eb38326aa6f1eefa3358a4c70b0443c937406413854b3c4908daf2825be1fb5b912602b5b560fd980a8278b494181c65e3edc0ec568a45b0a740877eabbc17cbe79107ab0c3c00575fc019a971f2ab7d2906000000793e1fc462be4df8d5902b27b81917c2c88a41cc196d99a46cd34c834ec05d3940f45318c29151c1fa38073ac39d4dd2638234709c0d133758d3dbb027c778319572e3051bd6109c23394ef114d248e2aa5fb5d13102d43abbc5d3fc879c89ad00000000a24e264733b5b3d62a1639430a222582771c3a9b0e700aef9057b9d8d8c39898409d7866b7a1e9c58f76dc2e288b78d79853bd38197d73b1671b08dc477cac5b4eca0be36c693fb2600f91f4d7348c7674446ff3122be33c6d4e88dcbfa236e7020000008912983a1c2f6c10a1748e26a184a7f7cda99bbdce1bc1ce0b3306c1dd4924db40bff0905ba056ce0db874a91919c494ca09b1466f1128fb26629f942b5c0cad67d2a3ca62e275982eb7f1b7d4db04ad354f3a99e154ad3ec5f0ae6258090f3207000000f7dcc70034569eb9680031a12914378cd728610525f8c638b30f24e824ca304440b6d640d6dd0e1494c5258e98d929e3ea04527dc624138f091f6962938229a79a86a3b796062a8e473b7afd211d4ab23679883f9d50a574d47e9ac5e1ae4e9a030000006154246fa16b410913fda5009a718b5c9b9324b98c3397c1c62d76daded32e7440ca5128b9bef80bd2db335086925305788265ba26800d56a70ed8067fb5a8f59d9000f9df2e1ec3bdaf1ed9d73fac3cf12d3682708a593033b8e27eb9f046b805000000668f13220eb5982eccb24b98404a2fd103234b69bdd3004b3af4a3803b0816ce406b8cce51334f27e9751c7945064abe0ac2861387f4540d36f26f4ae59e846d52470dae6cddd648bc018d6bcbe965fa3382bbe634c3cb20a894635862d8e35f0c00000049b3020baa04816198d2de96f91bcbcac3b6adb424d01ce1066a385e1fb8469640822b126c1e710c354fa3dec4b45cae6d09c630d85b468fd44f9c1b9ea0888f0571b135ab478bfc6c38acad6ea86f59c8608d114d929dd9a3f5704a6531115c01000000c6b11b62c4fe7203c4182329c9e7cc23d71ffcb143ed8b9aae340c70c33f164b40a32725eec5d2d19a115b1a3a791c80c81f452c0e5871a64a40e2397aeeb6541d197d7f80d0a55baabfc0d2b6f7b09260ec7f56385b013228dea2e609cecf500b00000049c7c10ae7e9e86da9702a58ea580dc01f4b7bcf70aca83cd6c68e5f6b9715eb40182fa53467e86b7fdb38a417ade84c8ccecb7d8ae871990c6a7c5824c1d3f8457a8cdd14a66a0009940f2b73a8abbebee99ff177eb966061c4f5dc1adaf84f0c000000e74d4fe98f99e81cfb593d0e6fb85bb9c8639b696baa9d26b015dc1e13634c45403a79228c162a365a25063515e43619a3a6cbf16d8c3a5599d0c6fea86eb99b991abb9611ddd077ebdf21ca1afff1342808b4dbd59e208dbc538438187d4a3e010000008c98a7d58a326a8412a522afbfd41c2c29206294df89ec737309aba12e88dd214019d23ea3df2d228ee046b1bcd60d99120f96c1518c10cf93a1025a6dec692ee9aaae1d71c374695a8a6d7f25a338fdd58205e2f52cbad9548b66eb8546b1700d00000050077fa88a5194e36d93dfa61ce1cca27d5663ec2fc8e19f0c4943fd987a4bd94064984f5766f3c6cfe3be0b32d3699ddc8c8c6590c11c34439f99d05c0d524b20185104a3f03923030d9eb19265179d3c3359e49250e891a63607eac73dfc4101000000b1681fe901e4628cb614b5cb49b641c99c042fd54abed06577f68a6494b1bf76406bc11852979fb8de1c8e879d0721619c3b564e7800987c05af2bc13d5c90eec124bffd77ce878498a25e8642b8c0cd4c0a714b9721d5d4346328d7bbf5b8010b0000005a5457c8adb35e9f0d2eb6608bcbbbc2a04f180cf09ef2af34104d724886ea5340310d44a958577b71e34ef02ff210a376a4e9a9e29acbd19e8c6dada166640a4372b375dc5e1dec92aa47f1b3905df05f57a719d53abb84907e1204f584497a0b00000058918916b68b7210806a1fca995d06994c3eee043e819e426688beca82bc7bfa40c8bee4fa69e28f74ce22ece2d1d953688aa5f426f424044aba9acd366968c9d2fb8c2a5f105ba27760bc8b91e2fd9a8b8eaffdb2131e4c41efb082290a12820f00000016bfc556a4b583468e0b069973a82cd31f41b75bfa03095f04dbb6d0db7e783f405b6d6043aa1e6732d3f6bc90fb0de40ac760a85cf5fed2edf61c59be9bb9d609a9fd5f99ad641652d4de465d323f8c3e51e4ef465da05c8ce6c6d9e195e2840c0000005e9cb1a198737c1356e30b62e6d08ec07b3efe2e9fe18937bcc749da33c45992408c828624871def93eb15c8c01f4042acd0ac7dbc2d0eb0e07696d821804a62e87cd6ada6cf2180636b49d5aec1d12ce677aa6f90d545921e4220203223c27a0a00000050ddab66ede6efd9557f28ed79f6a35331a7303d048e2735b4559f3ab4d2530c401aca63f63ada4de2a53f31382fbc919cd55b8fd5e002a45dba58cecfc13a8927d1d637bed619052e300473ddd8f06500c0db2eb85a7643483f2afe2bd1e186090000002d2dc6ec6c35ac0af4ad281932eb8f4866cac42c499bca4449948c6e2b21e9ff40d8c25d030dac94396e48c0ed55eb80f7deaab1c3ec6bdd2d75ea8cae58252d24c1354218b086e98f44c4b9bf1ca44fe2a3367f0148364436be8334fbca2d160a00000020e8ae4ad19ade3e7dce798cea0d5e7d3de22917d2c044a508f9881643102af9407158323738f79cb6a5b01bdb9a26492d1e1051a4d4fd7ace2a8ff873ed04871cec23e8f3f0584a11967e802e69a33410facedfbc144ced5eb7d3ad3565984a01000000803b2dde690379cec7a28d7036c35a9c67df419cbd0614787715a0ec6cc9f41840d80bc853c768ea38f694d9c685351a5152ec8a50480e581c699368c8b37d3f80143c0193da90d35004c5be9954c1f11397e996f2f51c2f65e320736a8217b60a000000cafc0d0f0c0031a9fd7c3ef8c3561db31616934d513dcfefd0f1ea9e47e4f2ec400de1efe08aa8a920c0f40963d32e166b042c164d6c5f85f74498b8214cb5c34530637c097d175373b0d5a0fea1796b95e270369407f522ec0716cfd87f8bfd00000000acf555155bea9b7c4d000244aaaac54d32c79fc93321e6e0ef527661d284c7c840a72e060ca1c944919bb48ffe6c6da8b69fe13aedfdce433002940aa1771e7fc118c7937ac40bcab07eacb8876e4aab8bf3c8e082e430473fef3c06a526c1950e00000080d381ee631cbdc066365f60c378b8a8935a66e92145e02957873f0a6bbef08240db392467d21375edc9831e233d8ef2888ff747bf2ab02d0195d767d5cd6e02f288c64c17f3c02202b86797ef033ccfb966f2db471dfff30fc0ad8c722b5c8f0f0000006419108f9bb3f8345f3a471650289089500b56e971ed8fa5da226dd417071ef0404706fa50e092a8de637d6a8ef7a842fa723c1e40d39bb762b8e6f67e3850f06a8387005e118bd2cca319a3511a87f219ef387d04a2fefd1cd8ef06d93043d7020000008ace3f76910ac14a91c406fc0223c95285cd35ace12f41f992e371557ff8d16d40d01fe2f876bfd99539e4dea0e8b69bed60ae686ee92f801f6247ee9d6234668a43cc1b330d495c9efabd0f920e01951eef19fc3c94120a9cc1ec1186d7b3130a00000097a90f069f548d72f938b0b0cce64bbad2335ad76fe8920470a680d48c1b6f0540b74641ae18ad6bdb108ef1fa80d1ab9846b8374fdbaf23be117e09e9d95e9c288868d93d8c399a5e381e0f2fbcb3ff05dd7c2296cf929e16014e092a8f2913030000005f4f56106215ff9c03d3534a9f6c992aecfc7b98caba9102c5779ac1be98f63440b687d145cf45c51fb0ff474f23183e3b88fcf8ed2a6d9401d1779bdf03ce95274571321facf8b94f14db151e1758097c5e04d2539304841b7c50b72321711c0d000000e42ea1c99b6e5ab2e773b6b68851f89fd77821a6e4bf3a0b274a5d2b5a3079a04000fd37bc0e8366465fa17f3c78504a0c8dd165825e86cfa5496ea049795c803c0a7194684167d323c9858f57ff0600a935bf84d5077d879cf53f8260b3088c08000000c8ff5e25d87abc015f315f39c40375de14a2ebd3e9ad1ab9250c4afb278cc74c40d304d0a5ccd59eaa76b4c813311c1ec8e9ceb6e5f8169698be2ba652ea3c3aff40b706423f29db40df27ce0baf4b4c3423705fc5bd2f884478a2b87b9790820c000000b63ffa979b101701c1a9be656d7116fb6d0e63daf210b78f4eda56192c344f10404525a82310e55385cc90cdacdb2e6071490b3cdd152f9c032a7fc81dbab93c968f20db047e4563f8f8858ede64654e03803e790dfd030755d448b0cbd4b6030c000000ec59ace4fd77f05ce1a5e2190f347ead42138b5fc5822c4e09bd7ca90ec780e5404018dae9e97f605d88d0b9a415370821a485fd1e0aae6aabff22a37927406b58fb1ae46c7228f7ef32159d6ab4da61d8855ca5a35e0b40107a7ad301bc228203000000a9699e4bb69f5787afe4e86dcffbdc1660d49cbd13997483d69eb9c990e930114097ceb5add430688d0efa7064336c9839973118db5cf132047daf03447a2e6f6641fa5435aa41c17cd7fdd26e6297b8d39e55a105ea6ad71d22f539518905300d000000e3160f229f14b31055313981ad84537d267b731649a0f34dbc05dd0a3dc0d995403519bb5361271b5dca15722d612e5633012f0fe425ab4fe6724b22e9a1597e56e9c82bfd153659020cd6612651faf1c3f75d17fd1fd4021fd5b90ca869270008000000a18062d84391d4d03aad3b34d2f94749589431ed179a3c28d47ec00ee92c735d40bf5a50f374bf43b1507aa9b87a04f3c0af012b6894ab738cc8c182e505fb34466fc849bada89b19350af2fee0408b36b0c4c8aba9dac18fd77aebff89617a00e000000458ce27f62c7b7d6bd8ca84d0e81e826a29c9665858dbec12a6a037fb194d18b40d143dd94cbb62ac034e88b71efcd26e58372bf9eb58f7c3d1c6385b4d8725bdb457f1999d1a1c3aa93b6c63ed5a81d431f47ea6565505ed8fc00c67ba7d60f0900000004e638bd645fbca2312730690071143fc95c906c064e3d15f28b329f3d76db3c409d59258bc39ddab71910bcfa489d69c8eef09ad43372a241ca40d5c04040025b3524812882af8b13820244940d53cf4074cae6f4d254fa8afd87585c05a60a02000000e72be9eb1d42b83668d5a37f6cc4cc7987010f89687d4a9dbe8edce5a65d4abe4046f9b4902cd15bf7671fc1d9f09bacb99988596b8763eeb0fc7c50cf0d666b71246f9de44b7ec60e3032a4c1312844da146403fc05fd4bd25751c68642350f0000000049cb6a0b5d930a76d40bfd96f572ff5306967363fcc97ee3848d5a9d23fb460e400a3245ae257a9630c21bc88d07dbd38919dec5e42a8a0360fa9152f5f7ddfe88759fddc6fd7c1c0c55d07cec02513217a6fdd6e6cdf146583898a50e615f080e0000009c8fd7f788958813dfa57db9c0e281449856fe0224c01b841884b755461bd309405dd97b68d09a2aca44c3253715050471d402205377144b7943d0ef36a89be165e97d2e442d24d8e947ab00da7a1de0228fcfa5bb49264224dd5e46822d6f1c0f0000004d23e8c8bffff6f38ec45307c31ad26918395a425a0d3c54313cbb4f66965cd140de196ea6953f4a46e4f5f410ce415052cd5456665dbaa133bfbdbca71226bc9a67118f7c0718d6cd06f10beba4f1a1903c2b1e9a1d3273401fa810c0c167d0070000009994220c489eca0a6d1801d219b3aa32186f0938a970affb9237eed7d8343efe40cb099d27503ae44959f0597b9324f39852126996e40ca4a6091172e154c6c1be80e008b94cfde3c53daea747422aa4f5403e7295fd1cc715d2201f3f5844550a0000003db17cf961dc6e8288d1ceb420023912010af61e22d046f9140a318f2475992a40b3209b7a32a9ec3e945820c6b0afd44e78483ff35b75c7419ceae4d0ce1e3cf682da472007205a21cd2f94285e4b0ba748a9556e32e31ccf73018901a95b2404000000c99d5624065525391bbc38956dd1c17c1791a33383f97562a7562017c7fb3b99407f9f7c757126796559d9a96f42e207bbd2d4dc63c678590a81fa1c57157bffe0dbcca871f6b9513ff8576637b3fca5886451547e3c4a8de8617eb4dbe67ce90900000019fde35bd8a31fa068e1eec050f53b087ccb8988bb8e9f1646668f5e7bc70dab4017074ead6e5883bcecd4b63c8c54a26516c84db7b27cdcae284a8a37a6f4ab21479aa4636ee3f67359c82f307b1c26ff7ebdeed745e8ad6d3230dfc7b0be160a00000052f9e1a0be669c295003666d5742012c32549de75067426f4b96e759d0750bb640842b2197644ddeebb633db38c70eef23a160f17ca2b78e341faf28705735aa9d9d1f61e05535eb7989b6cf54a66f15736db1feafb497bb9fce7e387be6f0c90000000054300e8d5c515d79aaad08e932afff0969406229d263a74959c6b40af597386e40596c8dd08de4b98b99b66f356920ff98b33c6da155dc999f27427da18ff64707fed6433ac14adb12edaa42d9bd710a8ee1fe0c6e5463080e90eb4f75edb05e0d00000005d222d34819bc0bf85331f500324790fa754498ef2f94ee9f3b19ad2618e05f407613ff6601a05ae4d5e7b0eeb87f818393f462460eeed650cfb805db6cbe6210dbd62343bc6d3400849575c2186c2f5b1a0beff1901b69737a18f541d31a710e0000004629a37cb66c62fbb1b541f8dcf01eb7eeabcb3f031471a6557136159afdcf3b40013a319f44086bb0f15c803dfe412b4412a7aacaad12d291b300939c446787ab9acdf8d1a6473e85d6a4d743947ab17f8996692b7021039e48c741a99fd1b3070000001cce0f52b5757299ffffffff00000000000000808a1e9201178375bc85bda753fcf05df5a19527b17567ebe39ed3ce18eced62fbb29e5bd5a1d0fe30a8b0a906cdb6c9572deb89b1c3b133a7d076a0238e1c61784b35b4b6ffffffff0000000000000080a027920193de0ae79c8b712a31c5c58556a8ad9c74a159108fc702c031c583905572ebfec01aff8f3a56b7509a5850e4a08ae4de9561505148507cdb2de33516156ce9defe530100b5ee9c72010207010001470009460393de0ae79c8b712a31c5c58556a8ad9c74a159108fc702c031c583905572ebfe001901241011ef55aaffffff110203040501a09bc7a987000000000601019227a00000000100ffffffff000000000000000063b7fa1500001f273129ab4000001f273129ab44449529240005fb9a0192279d01921e8ac400000003000000000000002e06284801019ef2fed1d40eafef1cc6df6d077c96957dab4fa74c12da688d606908c6bdb384000328480101387ab96a2af64bb32ecdb12539dc39318ab43e19a3ba1dad40867f33135ad35f0018284801010db2ce96bbe1638992ae0527b34104c0728f106b270344ed883ea6e4f78d0f380012009800001f27311a69040192279fdeb6796762b40f42205d72b489489dd068e453006baccc1e465d3b5b668a6d70ac87138a5fac029d9bdac14a5e2f24fb32c85351b520fc045c53b4d386fb507900fe985200b5ee9c72020201f10001000052880000094603178375bc85bda753fcf05df5a19527b17567ebe39ed3ce18eced62fbb29e5bd500210001241011ef55aaffffff11000200030004000501a09bc7a98700000000060101921e8a0000000100ffffffff000000000000000063b7da1500001f269df075c000001f269df075c704b87f140005fb7901921e850191de9bc400000003000000000000002e000628480101ebdd61e6b1074935941c42dca96ce8665181d2e067e81ddde48578c123475480000328480101c2b24675cce0625fd5432eed31a27f2bef43ace4f7082065452fdad1c9ed68d4002024894a33f6fd4afc454992dc8fef37df3d4127bcbd6bdea2dee7c4c646952f1dbe41dfa1dd891e0f5bfba5beb47600bd21a788d003dc9e0c20ff2ca7ea94cf87ab8504e6e08dc0000700080009000a009800001f269de1338401921e89fb35086d8b144fcf0c2a19ce98284ad234c26cff9cb126353066534a36c8aa7476c64bab36b06f1bc4126b4dcdfab33f32b77a234da4421a3efb2acd8c528ba128480101ab22a3eea2a786001886a82b717851bb1dd3376d94f56b5a3c8a610ea8d9bd430010284801018e5078997c3697d84d1bfa1f30dc5014b53fa456a5cfb1f38711670523932ee7001028480101c8195be6cceb7ab3ca2eb883f558194c37a774ed5b40e8455712088e7058d56800132457cca5e87735940043b9aca002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac000b000c000d000e284801017297408b6e33f71eb835c0541db5ac54e3786d54a9faefea1e18b63418197c530002003fb000000000400000000000000021dcd650010ee6b280087735940043b9aca004210150000f220120001000112848010135755248ecc9132d4f938e08d0c413e451948e7f44402364404bc92fd6474d9700032202d8001200132848010124d21cf7ae96b1c55a1230e823db0317ce24ec33e3bf2585c79605684304faf200072201200014001528480101fd78695ffd58402e209cb0b060c95b1a8a83dae389c7eac9554a3c086e52b898000722012000160017220162002100222848010114265b804cdb772e1c9a48d1dd67ad6e9315495151d6f49bf5f203b2b883ae7c000c2201200018001928480101ff9fb607464434b8240b30817c4e6c358ad723c3ddeed45b2b82d45b9fb0f6210004220120001a001b2848010135495972e4dffc56ffc325d2abeaa6db04e07d832cc8b8847ae195158fd724d20002220120001c001d220120001e001f28480101ab446ae5250a0e5acbf42540f12f69bc49e22d74782881442954471a01c67d6c0005010120002028480101e1e66c22df500de6499c055de17ff3d1216fe5f15247186dde0708e01c52526300010024c201000000fa000000fa000003e8000000172201200023002428480101b383890b5f160289fdb81d02d5ddea9ee779d29c95081ba75ca7278a1208d603000a2848010184ab9186d8abc8c0e5b12f96625a17f25fb620742af9a5501dcfb3fbf6e320ce000a0101480025012b1263b6fa1363b7fa1300e600640fffffffffffff8bc000260202c8002700280201200029002a020120002f0030020120002b002c020120002d002e020120003f0040020120007d007e02012000bb00bc02012000f900fa0201200031003202012000330034020120013701380201200175017602012001b301b40201620035003602012000370038020148003d003e0201200039003a020120003b003c009b1ce3a049e2a43e7b8899d291921eb0aec2e751bae1ce1429a738c25c573db870bb7b8a8d2f00025d7ddd1f2adc4ce67a68d27ba3c67fe1590ab9df0a8837b33e5873aec114dc432e30a986bfe8a0009b1ce3a049e2abf70cdb89f71ba71c2c1bb071b9665c11cf8edb7cee642c79e4ff8578d34733800253c19344790cfc107ef3afcbeb159ee00deb0da381cf8eaf7ee3c54258ecb9fe354cfb3d9f8d20009b1ce3a049e298c7c95e53b3288bb191d9687b06546f16e6261e1e0931923c561d31315f8b9dc0024674c59473162183e3467b8107ade8d739831136c871851b1714017416f7471676f8f45bad8920009b1ce3a049e29f5a0d4a86e9a6c3e686ceaea174482a60ee4ef32c98decb7d7a3bfd00d5528600022c8bf74285b317eec3f9b0e8ec4f7252197b59249072ed20a89cb36c7864d28212ee858d6ed9a0009b1ce3a049e29bf7822d62c8071597862dc1a0009ee4df8eeab965be31c14d64beabcec3d5e400022a85bfe9a9f686d31d2170d3bb67765785fe00cab6380beb648993790c6b62f6d6f9aa8653d660009b1ce3a049e283249be665619d6e11df6df2ec5b7ff01239d974a785d998986213c6e1c091fd800220f13bac062665fe10377345d60992f0c173a8ee2383d821c494cc3c9c95f069d8b51855d473e002012000410042020120005f0060020120004300440201200051005202012000450046020120004b004c020120004700480201200049004a009b1ce3a049e28b5be7aca1749fab394d7332dc28ffedded46ce424a2468e8085eceec9bbaae2c00662d3b30412733ba04c54d49d0c2a248697f32eaba92097fd5d726fa4e91f749e61f55e1b37d460009b1ce3a049e2976eb7fbc7e63a751d91cb3f57350b667ac19b2d21fe6b186b7420397946fbeb000662d3b3041273318e28452aad9bd641f98e55d7744039595724c1ae5286a6a26ac2917414715c20009b1ce3a049e2a8a5b77bbaf917e15a61f73953eed06cadb05d66463fef498eeba509c67589bd000662d3b304127305e0cfa335d13c8bdc2cb6c84c534419d6a4a0d1d2427f5f7c6b3d52e5377ffae0009b1ce3a049e293b712a8dfb2cd23dea43e3d3a62e8017ee5d90cdc1ed9f476ea406d2cb83649400662d3b30412733e141a8cd5031943574478d98f63ac3454492ad47adb30c1b3531c8cc349a7ad20020120004d004e020120004f0050009b1ce3a049e29a29bffa178f794708886e93960d5b0404e2533a0adac1d04622d5e537248dac800662d3b30412730a73ab24af4170e8a646f6faf62520a9e70ae02f66a8faa8d739ef087bfc7e5ea0009b1ce3a049e284b2a645c6728882983c324c480c49b20766448abe7b37e39baccefc028bd66ac00662d3b3041273027b0096de4bc955d34d0aec0615701d8a028e921f17a53bb9348a002f13d86fe0009b1ce3a049e2a05e8b030b7be846e310b5af4617aa29ca03df4ad9b724bdda53cf1a604b29a6c00662d3b30412730dcdb94b5329e0ff38fb4327c57407542d0bcf751c201644c0ec7eb9dfc76c84a0009b1ce3a049e2837241697165f7c09393376e22fa2a73addbce695116911168aa84eaf6b6a1e6000662d3b304127308491234782701a48ea4a5a886cf15f978781699d77e4c3f6bf2ea201b3ebab5a0020120005300540201200059005a0201200055005602012000570058009b1ce3a049e282fa887812b5cfdc119b2062ebe740d381b87b4e52b248075a4296976945c6da000662d3b3041273278b4f2d833b5dfc6c48d222ade39fa4a96bc874e62b16ade02c50ac553929e920009b1ce3a049e2b8afedc19d03d29df640842ab55fa33fab9fbcaa29fd8a11259bd8139a28ed0c400662d3b304127324ccb3c8c877acf99513bd653d35def60e18fae62414b0b3be77073c36abc72760009b1ce3a049e28b1c447be4167d3653fd9b40b8cddbca62301549c83b7492663e3fd98d9d6ac9400662d3b304127318a899164b1822d2e39dac978d93383eb78d0354004ae047083bd1275fa5323b60009b1ce3a049e28dc56fb905aeadcfd6e7ae41c436e24c5ece6ff510071f4d2d0019b037afe39e000662d3b30412732354621106c08ebc3e44c338088f0c135efbbc18605d7ddfab414ab0b88c4806e0020120005b005c020120005d005e009b1ce3a049e28fc99015d4a948bac908bd1114ee9c187d267b46c895b32444bf2dbfba4b40f2000662d3b30412730bbd302453127d952ee1de2b6eb1b4d3effa98ee8a6a66d2d1cf34f60a8adf4ee0009b1ce3a049e28d89507022e32daf421c58b3b1886d8c6a5b9be95f5977fa0c374fa582ba38aa00066062cd6be4c8e648a634deee5132ed07cc454c7e774e25efa5b427d89aa80656253524aa9f8de0009b1ce3a049e2af85818fe837c4398647ba1a9eec135aa716976e7f26fcadd7ebd21bc4a076d6c00653a3940eddbf434c8f378c65a7a2f837c86a9c061d6afb43bb893755048ae64876e99d2b0c2da0009b1ce3a049e296ca39577db0cfe756a20a3e938f63025456d79d483a161bafd90de0ec13876dc0065276fc6a87d0253e530f138dc23034ab3a93aa105beba7f3adfc8fac6756c6a41d3b17ec8c052002012000610062020120006f0070020120006300640201200069006a0201200065006602012000670068009b1ce3a049e2889bb517ca5eb8d4df0dc38a98b3d98e85fb5ddf20f7a2190a413671cc883ca88006518284d75d74518743ced0ce2f84909844c1b90f000a3ec96c66896d5a2ef71c3cfab5f2125fa0009b1ce3a049e2a494dea9d5fd263deffb4f9f57886c1f913450f4d6a661e50655188b8c89353900064da5cd05667ca88373683b06a1fcb1f2e01f2e650b9cd6f64e5df8e5826b646f4a4e8028df2ce0009b1ce3a049e28783d6fee96fad1d802f4869e23400f72783083fcb29faa533e1eae14139b823400645a6684ae11c2a8515f6674aabf8a62957c6ae2a152b3503cb3fe2e55597c82b36b99373df36a0009b1ce3a049e28cdba7807558d9d090cbf71f5bfd2e9323ce3eb594f00a17049baa241e87a3288006439a498e61e507a104cc175cff079e7ddc767de7c18945406ae521e14ab5093ddc4ed618175e20020120006b006c020120006d006e009b1ce3a049e280a62c87ec39de5fa4375cadebab48421d4a69ea60638e31997863d93124cc4b800641befdb5b200c116118ca6141513385bce13e34d6854fac170cba9d216efc5f71c1423d3ca8e60009b1ce3a049e2ac8a1f7ea4b90d4255d5dfa8d23546430d65a36ef07d21533dbbfcd42f91fdcd400641bd0f88e875a427283ea0bd92891d48b32f4464f1489fae9684ef47e15bc33d865089bc8da720009b1ce3a049e2a2682113de21b288bce3476fe69426f0518644d4fec02aff226c2bbeeca34352800641ba1548f585e58127502a6c4d42b201970a44a30069fa999390d4df8425368c992461161f4760009b1ce3a049e28436795bd6fc2dace9dcd48f4a6ccdb8b6b77843b16dd15c41f2f4d68ea7d4cec0064180b9541cc1dffa7efe55a1b9a55e20d9a0d5b34ddda9cc8fb15cd3810480f41b5fabcb599a2002012000710072020120007700780201200073007402012000750076009b1ce3a049e2bc38cb2a1f65128f2aba6ee30e6c40524db547cb893d28ecbe68ae339067754080064076689d1a9b2325a469419b77eb341c7cb49b14545c1ee06df4301a0ac566bdda425e82e883a0009b1ce3a049e283062ebb59110105cc17910f4f1a742b62ad76ec77e617c8e324aa070a13a9bd0006407280b6971ac83b4199504264abb17d1db2b27514b626c70d308431230755e346d1aa0a902220009b1ce3a049e2ad6d06c6263d7ceefde332a77fe6cb6be0136021fa2c5070630226eca22c5c1e80064040c29cdffa6b820f19876b593dcd332fd692fb7ce62f133d69afd1538ddaed2d10df2ed32720009b1ce3a049e2b050df701030d4900a9f2fea7c8e3e889fc34b7ecd2447bb675ef5923869f7abc006403c4ab24b31b52accf8f07d56050efd8fb3e0ac9ada86b58d4526bf3694237f3d4f77bd27a8600201200079007a020120007b007c009b1ce3a049e2a6b4c71a61ae2fbd2a4f3b36a86dcf39a1f7e6e217d5b468e54052ee83a33b42c0063fd7157fad2e34a6303ed5565e9878c5b727902d93cdac1a9c9c3531c56a42db05aaabb7a25220009b1ce3a049e2be7411bf69677a81748241ab5ff66defa879177067915c7e58e7d6deb94dd39f000639c06e6ba63c3c27cd80b3fd0e46b373e778d9de40a15bdd34327d709724c56d12e679830b3c60009b1ce3a049e29462b5bf75b022faad0890dc956b34a26b65d516a1640c3e510864b8e672e63cc00623bced898dc91ee4b71ea37c53a39d78c22a7d5444337bcab1ea092bffc9f7bb7550d0fa929fe0009b1ce3a049e2a65fb29f56daee49143bdd2fc2cd15942e723c322d8779bc022debb7732c6ab080060c1bb230022c47d38e728dd85d6c10021deded0962c65c77f742201cf5e27d2382e3cd525f31a0020120007f0080020120009d009e02012000810082020120008f0090020120008300840201200089008a0201200085008602012000870088009b1ce3a049e299dd970cc226155d9bafbe7d3f7240762b73acd0194e007c5070e4dfbec9f43c8006015de258a9e4c18dfd4152ff370f50ab0a7de08ede0cd56d266a28868d87b6099a40a45353c6e0009b1ce3a049e2ac605a7ecfbc2c878a7b1f2edcae88b00ee2dee04c287f9f50131c1d58e862154005fc5fbf173e857c8f78839e5db3ad4221bd66f6d6180cf1184d5d96583bf2ed103649493e116820009b1ce3a049e291c7490f5850218b375b664903e08531cd788dd83bab741f32572fd6a1405fb60005fb1be1eca80c714cb33c7d6fe094c752529ee15ce9a43482d7e9cf6f76583ef338760706c84e20009b1ce3a049e28e26956697b0337891cbaa9121c0161edba8598ff4a9a14fbf9ec99e356f9b580005f98c7cb4d4341d6c2dc87c6cfb33d88ffd3b1f2f220f90092ee20f25a0cf94490b56b50cfee220020120008b008c020120008d008e009b1ce3a049e2989f2ff87779ec6d57c8b47a588ba8f57f4cab2e4c3b2ee82aa5a320b4f892e00005f9752b0b571ea7ecc28b733ac93e707cf11ab01189010d43e05211703894bac9a0f9f6b7e9d9e0009b1ce3a049e2ae543d1490023cc22824436695cd505dae19243bc282b9a781a4c3299f6ccccf4005f96569593653a4b8c2ebccf36bbbb976ebbcbeb7953d5946c815783d21c88131d32e40692dd220009b1ce3a049e2b93a3bdc02015bc42d2f3165b62868ac9443d59227b76b9bcc9c2c00e8eb65a04005f95699426cbdda3325d669b08511eda154caf8e2a894674119b58682a68c27e24f20ccdeb07660009b1ce3a049e2a6c34a8b6a1e47af1113c4d11ae075b0e16a9aa9b6ddd2d917ea444f713372ac4005f8c955664eba67a33cc15c7eb18478d558617106c49971e53fb44cefdcfd01def54676324c8aa002012000910092020120009700980201200093009402012000950096009b1ce3a049e2b9fde6023ae17b2c860a9ee5ed15deed1b3cd777e8dd6744260a1aa90bc80a520005f89b916fff14b07c0bf6f11a135ee1c6c851d45a7348cb431f9172132ee32466b138b1525fa660009b1ce3a049e2b0a8e6e8eb737e161bff67ba27e3836f8acc89d56ed444fe64c1dbf60dcfbf774005f7bc587b6fa993fc4158940c46108797153c2e535b84c6d4fdf70f945f866d2bb19774a38d57e0009b1ce3a049e28a9c2fed9416605e978cb1ea1b19608b0161c31b2e4298605e1dbf18ec985f188005d938caec3ae46b0650a4773c4cb96e0d7674437b0084f8dbcdde8a5a06da4f55381027ee840760009b1ce3a049e2b55f151b37c5a74a53507cf5941b02e219b2243570ee54e2ff75714452c497e40005d879d106cdc80df8da74fd965e4d1bb896131555669d612c644f8e8e2d51b91521ccc12a575d200201200099009a020120009b009c009b1ce3a049e29a89f154d20505938845c657c3a36578a4dd41ce5f0cfd40673293b9b1da70cc4005d5103c3a807ef58225a84ba60e141b1a49f40e964bf444a9135d940fab32e8a3cc9ae2836eb7a0009b1ce3a049e2a7014ba3b31a0b799eefb400246f4324277829f2899d2e71c12c61072d8416848005cf20148aeea344c02af186d0d951f649d9091d98f7646afa8e1336f3c97523262947a2f7f66260009b1ce3a049e2814fedfab9fecc96f4e86b5eba28767f69e6e1344b2144f4ca97c20140abd65e8005ce192c5210546cb7250bf2fc6c9bc6f91dfb5151f1354900de181ddc4e471069af8c40c7d2c3a0009b1ce3a049e2acf69f3e2870bf5a0e7f899f99269a5f30a08816e702cba2b8d6940e92a43341c005cbc9e47b2f4576b90d0b43e4f4e2004fa75686da2228a063f2c36015dae01b3aba01233956c960020120009f00a002012000ad00ae02012000a100a202012000a700a802012000a300a402012000a500a6009b1ce3a049e291cc0d90ee3ef253e28bc43a6aa33dc3528a07bab57235dea6663575d5b54f724005b432bc115986ff95778029be79b4a96dfd0a7896c2f1b2303e461971d9ebea30943f4cbcbe40a0009b1ce3a049e2b9ba2bccb82a7afd945a36a84caf1c7a69a8c89e1e96cd8000b2cf9561147a9e4005b33b15eabdf92778e76b5162b3acd0d538d0ce14f1f870abc0d7b4516106d364582e1e4bb31060009b1ce3a049e2b214e3d4f50c22df3abc148bc9b5a3d19ac501eea69631b1ff066fb4f4f270cec005afa1682d5bb6796ff9b8ad8c438eafc451fd474a77e974b1bfa3e3a53a5d549c84f365471a24e0009b1ce3a049e2b80ba5884b98fc10ebc8cf5d581189b06b1f03e9a634dd7e63e80b3d4a35ed91c005af9fb12f6b824b2b2f620d8add53a175a14d651ce70897b905fa513c6c747fd62077c0ac132ae002012000a900aa02012000ab00ac009b1ce3a049e29a6c6424afe0931c3d517771ceb0aa36b6870aeef04a11d4151d11725b62c9be4005aef42ce93c1859867e1d8c71f6175a5ea27ba5cfc9e1d27e6234e65fd7306a363e0a1de3c51120009b1ce3a049e2a6addea0facaf57a368ba10f7c2d818ab0cc9a1122b6896abcea6a2424f6bb6f0005a7bd75993975ab045d350f2fc365eba43228e9c2f627dcd81169daab5f647006d9446a31d92760009b1ce3a049e2b9f5cd0cddd3a5c36493d77b9b25f19956b73e08ce20b06994a1f96ccafa8c1a4005962c02b112efec0b948f616efdbdce362a389bdc2ff7c1596075ae4b69a6092b2a7535ff8c2360009b1ce3a049e299d41825e394fefb4490174943a1b572a7b1c91fd32fa36974cb8d700c28af82c00589fe9cbc729eb6802d2ba64eec84cad5b03ab06554b3f0e1e57ac20967e14ebc37106f31153ae002012000af00b002012000b500b602012000b100b202012000b300b4009b1ce3a049e2a6bf8caabc3f4eaf9e03680433ec69c36b18ecef36205f7f6e4c96e9d4094aed40058625a86b852d28cfae9a113091b84c87afe09d9300d3b4a590b6e84e8bbfa27c08ca0ddebb6720009b1ce3a049e29970e2e72fa9d52425500f39876f20013e754c3ded5027bb5761b88ed636becc00056fef240c52d832b91def8b3e3c77a66db288991637f705e981aef30a18455d634d26513930cce0009b1ce3a049e2b7242a377818223a0031d53ec9cc6729de77f2b0dae29cad1d6fcc1cc8fe6d5100056e93ed3b4e55dcedd6eb17b65e5f17f4dc0adaa102c83f8c64aa3000dc42d836bff6ded8e1a160009b1ce3a049e2a8ee827d70de4e25d1143418028536721e04e73b316272119daa12477a4d6407800559fe27b6fbdd7d80efb75ceadab7558f7439deef102082c17590bbf61765112f2e10f9a417e96002012000b700b802012000b900ba009b1ce3a049e2a01b3e0f41cb9c0b48c000902f339075fff31611a1af0201b9239e7898b0a9da80054cb7f95954a293cb7269341296477bfe73faa48d3b782a9d242932658b1fbc0dd9da4dd8eaf6a0009b1ce3a049e286817932606ca3c120ed06488cdf79f7af590c872431b817d1a77b90e31993040005358223c0a20aa9fe01ee4c98aa31c42d62389794ddae1692e08d60154e0b6a8674d7a46cfd6160009b1ce3a049e2b7046d2c2177814be66221119d68af12cc502e29c2c4f222f334c04ccde7a259c0052dfe75398682106a492cb59bef4c9ab52def25e140442bbe9f26e63e71ae787a9a7fbfa1aa8860009b1ce3a049e29464afef91bca6aae41fbab7d62358b074976da1f6d1135d994a4d45c54cfb774005297024056e786517e02c8ac346b58789397d3a6037f74656cd72e1ec4b6567992d58e07d98d9a002012000bd00be02012000db00dc02012000bf00c002012000cd00ce02012000c100c202012000c700c802012000c300c402012000c500c6009b1ce3a049e2ad6d5cea6ed4f123338d97ab6529f901cb12764e8ffa1c5736f65f2d0af9f7aa4005248821125709ca9cd2bf686dbe7ba6d440aaaf67f9be34e0b3d990749e7e700949d420578a8a60009b1ce3a049e2b6162f8b56f30070e90f53c9e41396311c28c8d5b002ab7cc48bb81ec458f979c0052469b613d18cd559766f814cee12945ec3c4a16cd5fe28b8aa917aabc059569c0591e5ab8eee60009b1ce3a049e2ac4e84f13afbed0a85661e40a95d3960f9be044132c962efd9e0964bd0106910400520a741674703fce1db1c705c494511a33bffd387a79d10f195d0ba82653325f88a7d52b8ee7260009b1ce3a049e2b4515f4055067fe8dac81b4e81de69efd32faad0b6a4062046a9eaae1461bf7e800520960c9e93fafaf9675e686c90fe2a02290d434d32e987beb21ecda88dc46dbbec0f2537f5e0e002012000c900ca02012000cb00cc009b1ce3a049e28188eda0a1e10b9165aabd90f6a5680937a93da84e4e0b7bab3ff474ab77e1224005117bedb0ce6ae158086f70a6e1366c4ddf33f82641fe760fed5c84a92fe68da8a3967be66b7760009b1ce3a049e2ac01fda94b6f564e27fc41f0045727696e5f4e6a688a26538849486f9626bfeb4005117bedb0ce6ae2a10b37bcb1ec1baed930bf99ce1842d6380c306b80fcb5ff2971f5fbaf3cd3e0009b1ce3a049e289616c1083a95635e8e7eb85146993de654df210756b9410ef061dac8fe1420c0005117bedb0ce6ac940fa67fc37c020ba8a5ce7e7a9e40073034f2005e95432538a8f9d72a496b0e0009b1ce3a049e2b89ef232fa8111635818e1cbdfe3a1b4962c2cc07241206c56ee4b51f8606232c005117bedb0ce6ad8ada53fbe1b8204016a111b642c5c10b6efb15a9157ee01f73d1fc76ce6f42b2002012000cf00d002012000d500d602012000d100d202012000d300d4009b1ce3a049e28b5948377776fbf5a65772201d45f15555c2d5fdde1237449577bc59582154e54005117bedb0ce6aeb823314e26d653a3dce059977a0c83c970a98befcf5e75c937aa9db29d67feaa0009b1ce3a049e2a9acf4c712baf372c7b9f238d461330f56bd4a979ea22aba7cbd13f210daac138005117bedb0ce6af0e08c7ddf1bfc3c18fc59d5a8c49b262d4a98de685d888117d87e80e3688c12e0009b1ce3a049e2985e51b014bea9b2d1ff06dc07e07e54917be288d3d2e6951947819c07562f410005117bedb0ce6ac9b866bb0a015a1b9cb4a04259e75c2854e14017f653f3e42e34e3e2f87ebeb1e0009b1ce3a049e293846e956e47d045250ba0148ee0388077ee5b15df2fd128f75fd2cad4f4236f8005117bedb0ce6ac264b4a58989a560db1e2b784ec64a2cd7f1e31f707785189844a455aa2f019da002012000d700d802012000d900da009b1ce3a049e2be74e7f52fff1eacab0cca72a3eae392177b16108c08bb9c801f26decd30cd2f8005117bedb0ce6ac200da27d131557afb6ca1c7542ed43c867320507d68f6595dd01e0bb32c471ae0009b1ce3a049e29ebc780f29df608d51d0e169b0b238d214378f506a869cb3291dd7319b3610148005117bedb0ce6ae22d3e8b9e0208c7324c00eaf69b7ea62df5ba4fa59714f465dee6a87953d8c420009b1ce3a049e297dcc81d4da1c6f809f72df487605166aa33c364ecf4e655e324937412f4be1dc005117bedb0ce6affec45c828ddfd9fc9b3f6fcc0b358d37753667ccb44a8a5af094e0c9c6ec36060009b1ce3a049e29c064c19a359287be64c77766ab265908db02449dd514d11854d15a99f6da70cc005117bedb0ce6aebc819c25d36ea49ec9b99cfdd3cfaf91d642ba9dc94ff8273ef4a7b4fd169022002012000dd00de02012000eb00ec02012000df00e002012000e500e602012000e100e202012000e300e4009b1ce3a049e295f656795227b17e04b4c687924e2266f2b11d91d755b30ac343c8ab498172648005117bedb0ce6acc9ba8487cda2ccc88d92c89a7c1459c7585459e44f942bb38fcf192199fbfba20009b1ce3a049e2ae78bd88851ec3a14d6f57f7e92060f7e8208e87120cfdc81d7d3ac2d85187910005117bedb0ce6ad6680c6a2a94f3515ee812cc8865a8cfb40ae24128c0f68230d7f03c9055c1dae0009b1ce3a049e28e911235c41d34454b3b8e6dc2b90e74b13421e09fc8b46bf45ecb8f04d52ff88005117bedb0ce6ac82336dc9226ff3651616ad7d83224c1c7bfdfc647001283ccfeabb8a38e526120009b1ce3a049e2b6d633195d881c8dd5230cef51f78a2e6153317db3de2ed32db1e00407000d9a4005117bedb0ce6adba3eccda1a1a67603cc4de6a8b3de4f6f42c68b481bb25667ad0f2a4882697e2002012000e700e802012000e900ea009b1ce3a049e291f858f14e18c109c68ec0967e6afd6063557a77b6dfac21022ac2eef05f83048005117bedb0ce6acc9c22d344f11ca4eb99dd0fbb543fc11dfb1e86e3206669bb76df787e1f02bbe0009b1ce3a049e2a0a4dd2fc901b3a1035ae738e4ff5d687a8cb9471655921617df632f5add79954005117bedb0ce6af32f2c478c701e91245aa3d88dd55817e44c73d0c42da9f2e84161d79c27c223a0009b1ce3a049e29ec44eb0b3b375298d7c366338ae1b1cc3cea3c809577ad3a3ca4cab24b5bfeb0005117bedb0ce6ad2e07107e20b6685a7c898dec3007a9785808ed41d747c0d75078d63b7c76d0e60009b1ce3a049e289c5ad1f1b22b34c0cd41e2d6b0f481262176d9448f30132a1aeb936be354c7f4005117bedb0ce6ac51e74a504d562876807e239c6cb607461d858c47336791a1bbfa84f396435396002012000ed00ee02012000f300f402012000ef00f002012000f100f2009b1ce3a049e2a4c6a8d46f4063d354cf9b1fa0bb2686260834f4213912593aabebd46e267c7c00050c9538bf7f8f36f9bd85d5b0016f6d5dfa99d23eb5ac4b1575af05db1dedd6a9a39f171313fc60009b1ce3a049e2900d860481191c631d8f9b0bb6f77e2a91de8a91efb10dd142d6705a1e258f31000508603d0767ecedcc150c16fe0897241e80f4413339d2e0415efaa02a2c352173263a0a0b3e2760009b1ce3a049e2bef1d81f639529040d93adc2c9de727fda77c9336f31581c3052c9f9f0fab7cc4005073781ae4a27a0d011e830eeaf39b99ed78f7c7e91e0914678ca4a7c6edec4be7ab6a18ffaea20009b1ce3a049e29720a0561458cf28e67ecd8a8a56698a12405df743d5c7e99dc6bf76177e4a35000500fcb6298195ae4e016f51815d3338ab8c29e0bd03890feab9e861f0fcb68ed8353d02b6b0246002012000f500f602012000f700f8009b1ce3a049e2a4cb6f287ddd6fb6b26255ce7f5a4a85b6a36d815072db6cd17ba72c8b51ffdd0005006cd8c3f92f060dd58645d6b8d97fe4ba07286e084488fabb602c0872b5e57c6705ed9de64020009b1ce3a049e2aeeb64ed0a71d5e752caf436a206b8c0ab6e606ba96a0cc2eaf9398ff926c5774005006cd8c3e7af7909342cba491b08507f8a25ba54c409ba6d10cf7b9cb58a3eaf5e464fd7bfe5e0009b1ce3a049e29c7324f72e2b70d528ead1ba965380f8ab9b6aa0ed658800d29b936c7ccac9730005006cd8c3e70241bed0b68ff4bf4108f22687b94f94b3a45c56a98c5a293986b062a2c72c4da460009b1ce3a049e2b6fda8b7aafedc7ebe72b1f46abdcba2fa453363caa47ed2c2cf3f623aaf57f58005006cd8c3e0450bf783a061684fbe1608e701ea2c6f13371cf276862016b349ebc1150977c0536002012000fb00fc0201200119011a02012000fd00fe020120010b010c02012000ff0100020120010501060201200101010202012001030104009b1ce3a049e2bc558b76277f84a11668f6be7b981a8519d6a5d6299ff5ebef375bb1f1e91b324005006cd8b1fb8968ea011dc72f54b87e8b43c94a59c6d499c19394fa56f6d0df127a393d11b77da0009b1ce3a049e2a05de090e522af521ffc204bcd4ad0c4cf329dd6e3c95f240f97189a169270e14004fcdd0bf945b2824f830979f1ba394187d506e3dd3568fed7c2f320e5760c540b5393b590983f20009b1ce3a049e2a16e2ba41823813a8ee38b5161840c02784b3257be71bc47d9d740654f9b4a88c004fcc991eac999c23fef9cf49149b2e2a3fd7dec7dda3a1f0d120cdd262f6ced9b72be999785cb60009b1ce3a049e29464b13994b32a86cb2851b2e48258fae038fcca403fefbd7d1811db91a38b7e0004eae7a579206ec6095072f6eb127007e98b0c2c855151bac6b94c20700df1f544969a2a7f853460020120010701080201200109010a009b1ce3a049e2b9024899996fb2bb4f8e66fd375c9f5ecd457f924443ca252d42dec3d3f197a9c004e10230be90124fd203e334de61abfcf85b23a17c6f87853d99aa68eec646047abda2fc837ae860009b1ce3a049e28c2c8b330c99f6cc5aeda89b80864187dd828790d2fb5e82f4173f0ea8f116284004dd95ac72aef35e6d4bd93473ad1dc6b84176e07c834f1a1e10e2595739841ad9724a93503e1560009b1ce3a049e2be70487b3db4dee930e1ee9646caf20fc4f23f2465cfc205bf9358a7f79d04fac004dd41ed0ef3995cd9245931ddfc6d508b411ab4018995c5f62752e054803c9f82d15485be001fa0009b1ce3a049e2ae6d40b34d5df7717b3129b1dcb97884b538866352a28889bab7cde0977af03fc004dbab13404a070932130f044374de6c5cbd9e723044aec3af3f77b18de54c9b9f7cf43290db89e0020120010d010e02012001130114020120010f011002012001110112009b1ce3a049e2bc44a641dfaa0241ab26f7d537ea08701a669ce20587b86ee92bc0757b91915e8004da8b24f48535d6d40d6f38e60cb6b302febdb408fcaa67fff8c3271a40929b1ea0274b2e730260009b1ce3a049e28004df6a4909e87fd627e826a61549f588b44484cb20aa7359bd28871622e5704004d7387936fc4e2220f165e4717e1f52cecafc84e487107c80ec6b4b65d993b9262347297dd74ae0009b1ce3a049e2b9e295baa6053062934cb0c955e2aea883e1fa5cea8cb3b7febc1d22d6bff1cd0004d6d5e833e5a92923f7fbb1c77f24be5deabda8e6b8930675d0751aa2d8335dc8d710cb929842e0009b1ce3a049e293ca73c9ec12beb549855a59687da941e6de7ba85e2d810cdaba11bb7343cdb50004d6d3321fb9f8295ae334a41002a3acb6bd81cee5ef4258f7c1003c7d2f7f4c3b9b385c711968e00201200115011602012001170118009b1ce3a049e280ff3a36837a1d57abc86ff5b6a77bcbe0a113b55868a9983b8dd27142e466720004d6ab3f30cbcba495ebb678b36f86245c959728e2166f3600d364b3843284667a297061efb9b060009b1ce3a049e286bad457f03623ac489823c7e2c61e9c3b9ac8b7262c758d0957e383e1246afc0004d6a72d740c755528e1f2a08f6c977deb5e1ba1eabecda6ce4b2ee114eb8f678ca2918f77b615e0009b1ce3a049e2a5e500c6c75130c871837cc38c8519c93d9244ed59e75aa19662bd992e0b7b40c004d160c93b533528b43081357b4885f7d6a67a762a88101e31026031cf6ec6bc1fe92976035cd8a0009b1ce3a049e298f18710b8c53dc13f2b64ee19fb73888db4eecf1ffc56a3d74fae35ce2b94028004ce46d8bd23236c7839a36d9c3a50549fe17f50cbb02e554a4b2c1d257004b4c9f707134a7c6e20020120011b011c0201200129012a020120011d011e02012001230124020120011f012002012001210122009b1ce3a049e298a0445d1911744160b32d713007b06ce29ba616a9be78d08090bbacf11f1a720004cd9dca7a5b13aa3ea0c15b74bf9ca563a8cecb1faec9acdb620557a084a7c862e19df048f83ea0009b1ce3a049e294470a080ed10ebb1eafb056fac02f0da312997d22a75c0c4c508db3404327e70004ccd9466522d58424f5e283adc3e8da52c90a2dcbd07e311c826dbc4b63dd81990fb6cb7309bc60009b1ce3a049e284b9b4593c0f88e975affe22213b271598e87ae4d3db0001f93d196f4fd515354004c9228a09a1144848cc771bbc8361d86f381187db7bb35f83fe8ad8241d33b8c2c9acaf59723b60009b1ce3a049e29ddd6e95533c1c1e4fc71b209cc2a82e9610aa445c53bc5160965e202e2818e7c004c808d6c1cae899a28a87acfaff5de1c222cf4af07dc11e8e3fa4aadef5dab7ce01c114e5b9f6a00201200125012602012001270128009b1ce3a049e2bd27c9ebc27eae04ca8220e44333c133a60baf7a5a9e956d0387afed36284bef4004bfed396d378dee53147ee1c9a4d4900c0c292df9fee569b02e0554c91ea3774f861af81fc3c960009b1ce3a049e2b49ce0747ec1b6a3dd823a680949e49cf60cf017f27d9cc997d8e327c2fc67060004bfed396d1c5dd25ea341585947baa0194b1406662fccc2693dd8932211203a1326a59f50ce64a0009b1ce3a049e28eb05cc67692e24c974527126ad881251c1865ddc6b916a6c7e42904f2db53448004bfed3964744a798c7b95f42a89c2a5ed53d6ae8dc665a1ae424ef1e961bac85be227ae5dfce5e0009b1ce3a049e2a80104d3206cb19c56db7b3932a68737ee907f87a8a435bb15cc78dbedc12ee0c004bfed395bde39ed16d52d1d34af75b70c1a1c7363abfc373cf7fbf3229cc8be80276825670bff20020120012b012c02012001310132020120012d012e020120012f0130009b1ce3a049e2941b1de90c30a99d2b92ae9ace1f902db3b2d16839833152511d35c3eddaf5024004bf88012a3172f23623fe37a6a77b0547345396708c9363518d18af94528b92014a6d7950fe9b20009b1ce3a049e2b30c3061c3258d99893c74183d908d9e2380f67f1ed6f00fe06b36522a0192944004bf8800d5533068dec11592e433234901611fce32fadd47e24f7536ac942b81c5ef7c26d979dae0009b1ce3a049e28592d28aa3e3a068cb9198127825a14319ec62bc56970d0447d11ff00a8958a50004bafcb3e659b3fd9b69681f6a2d635073aeaad83c2107fde9639331762bbdc489662d80881fa460009b1ce3a049e2a42a62fc8023a87371beed0339218c94a1867c932762e39f27919d934685d8ff8004bafcb3e659b3fb08339ae393d96b9a5c519258e1c62c12c65bd32222ad5c45d8f201fa7c8d29e00201200133013402012001350136009b1ce3a049e2aabc6eafb8a32bf102a459709fcd7082d8587efc6b9d873d17dbdc250ac829d08004b6b798ece39f7b41318996d6e8ce34927a5ab553a01ea365fc17998486465516d4fd420aa885a0009b1ce3a049e2b836ed536f6d51806e3b3bc64c25ac7561db40a02f3a587e31c2fd84753f81524004b5cb8b7eca06badf573699dc359e1c159690b32f85c446b8d8f73651aca205b06560f081d11f20009b1ce3a049e2a89c3d1b646c41de9f1267a78fefef099131b919e3b563fecc5147f234b858530004a3313828c32dcdf97491a293787166266f3c3ec9e93390f0aaeb74b079e92dc6694e9ec7747fe0009b1ce3a049e2b3c5a8d4d788e381dfffbb8a011f58b4a23e5c82299602047a48e0c27d37b5b480049f4e2af4ef972b3ff15b5771e8aa82e713e2ff3943969629e0f64e0ddb68165d190c2557ce5b600201200139013a02012001570158020120013b013c0201200149014a020120013d013e02012001430144020120013f014002012001410142009b1ce3a049e2ab9b1bc5accf50666c6ab9e37edbdecdc9e1c2057730dc500265c84e01031f7b80049572be7693fd0a82e510b4d9f501503c4769c8f05cc7f25236f156f00aacdee9b7e06eb07ed820009b1ce3a049e28c994211c80bcba9a09eee62de33ba46759babd64fdd5fc95f2a1e9a7106b7b04004697b6f8e5966c0be1e2bdb47318045ffe1bb6e79f6bdbd0bb5413fa37fc222bfbcdfee2e857a20009b1ce3a049e29ce75657f1bd26d3fbf28ff461a2823d7f795de3ce801c8d984cbc4f356d344640045f46ea49a6d305d2496398d7959f433a2c366c5656ef64a8b1e04f32f4b49c4156665ec1a258a0009b1ce3a049e299b032da304be576d402b5f295c7dadf28ba58a54e5c8e4010767e2b2bbb4ba240045f2c4e7b6ef9e3a49af7f589fe5c368507b67a2fbbdf28486af9372c42a64f913017cd699bfa200201200145014602012001470148009b1ce3a049e288bb9fc2f974ea40d589c3b4ef264c40dab94894428a490db17e6c38e230e11080045dc999841b0403536dae1af1fc09513176aff7c79d638ee99ae975fd964bf942db7d0fb91b77a0009b1ce3a049e2aa3ca6457997bfd9fc2a97e939fcd3c67df5ecc38d7363a8b6a37c05c8382f7e80045d301b202f625a13f11ff3180a7b3dd16e833c3a411c9cd17c8859c0c288098c80fa80b47b67a0009b1ce3a049e2a749213c5e5f2377174134363da831cda44d4c0b2e4fd6f45a4dc02a27ac8060c0045a02cd9e1bd9448921455da5b253bf0a0373e940dab1f62c33db1b6c38e2c2509e90b18d6d8b60009b1ce3a049e297bbd85a3fd6942f678cf63a8c1c5f419fd165b3ce9174ad0b14ffc91a2d21e5400450ee62e30e7f51f36a9b75b9687f793dec216c606e3f7c6bd8abbe1afa40a288e30de2950ef1e0020120014b014c02012001510152020120014d014e020120014f0150009b1ce3a049e29067daf704677e9ba00a1604c7c53f0288f3a82ab53c45db5d879ea80d1489cac004453bdf5c318e563dd94a980935e004b618f63008b1227557d464cc7cf26e705a8a109108c4efe0009b1ce3a049e28b4fb4fc18735e4869f639ca1292a83efd8be67c273840e375d56fe36908d133c0043ab01acdb5d483943525f8161f8aec2fb535335fc2bbb1ab0b47681903cb447cca69824f1b9ce0009b1ce3a049e2b2c657b9a9ca41dd618688c3bab8064c12f0f11aad5780de58eaea7a899d560280043096284e460ffaaa83f00bd051fbb5536517bb5a916537bcc03e27a87a7ec0af1943fa239f3420009b1ce3a049e2a1c6fb3f7b89ce40caa1cdf4d7dd24b4e858df6b869e01b33c4d9e3265c4fa4100042fbcb4ab5efe03c44edb7d681a9eefb9ee72b66ec874c2dcdbbefef4f9cd0ec9131c6e32ba04200201200153015402012001550156009b1ce3a049e28e3e721a3893b49d49d9b01e3fc03cd5c183e2355d73048a96cf7307dd8ed9b6000429bcd4d450fda9944ac68574578f8ed0bddfca72d4ff96126182d0aba84e1eec9c49d3719eaba0009b1ce3a049e291bdabd1cd422b0f56127f21a123fe9a17938fde4cb4b5ad236e409a535d1c92c0041f03dfda60389663ebf5b15b05dd8974676487cccb33fed640bc4a68b490626d98f540fc1c7ce0009b1ce3a049e2a6607a65635a24d5ec31dadfafab4402400277596d690af53334ae6283f1ccdb400417917bcf5fc9064170278680894f6ea68ca69ed38d7c8004d9acc66269c52dcba495130bf58960009b1ce3a049e2abb7ca2ec6183a2120984c62ddaa833cf8e70dc17f1efe6d79e58ca468c8c48cc004158ead08d9ec781055db64e196e3396ede7bea28437c1d49f6db06acff8689eb73b13ea3f534200201200159015a02012001670168020120015b015c02012001610162020120015d015e020120015f0160009b1ce3a049e283e12aa568de4617f4d859acaef5c97f4a62ade4208642f8ec9378a10f26b8d00004123d3dc9812dcfeac07f0e4bc11320a8da8b1b3a66462b53c494a4e14e76c238f26664fffe24e0009b1ce3a049e29b53b79a3ac2346c8997424e83c45de7c26f179578e3dc9950c8b3eb2e62de2d00041153d89d0116230b8e5463bb6f4bae077e1956a261234d3f1df5317559c2c0cd5f4b8057f475e0009b1ce3a049e2a6e6767ff62a2e0c430a7c9c8ffd172dd5a5fca6b4add3fc4ad7ae530ec8dbb4c003fffc05cc4c54c303963b55830d2d2853361134b7618ab43528bbdaf687a69d26867141792ffca0009b1ce3a049e2865c8140ab9e1c18a923b1921981e3217c8d90bf8e13230b19926eff8c1fce37c003fe6ac71ac13e49a0aba445a362a7aa7b5be60b52a9885315a3c192b5313e881d68322578e79a600201200163016402012001650166009b1ce3a049e2acf3d21de6b7d5591be81e5b69a37ab7e26963eb960504f35afd13723c76e59a8003fcafe710269866ba35a67d878b9ce8cd176458a2afbf5b8d642531b3f489a9fde93f24a1ec7120009b1ce3a049e2bc8f2a2ebde82ffe50ed391ed870c325cc1d9cc3bf694b4d2d64f4a2b7a32495c003f9a3ffdaa933d63653295d7a0ab3ffe70a8e39b431046c93e5a51976ec30f17c81151a28b62420009b1ce3a049e2941824f0b678374f9e37c6ef68203912f74e7b3fa31dbea5c0bec22fd8aa5da14003e868f67b48bd0e5b6248ae957819c53195463dd7a29277835a5b27323db64cea1c0b8712907ae0009b1ce3a049e2a08cd7c39dcc8aeeda2f43b788650afeceac4fd064d63510fd893de413ed74098003e744aa4b534f87a27dbb19ba353b571991f65bffe5aed1f4760ec1b5e2ffb23dc9430e3a0be2200201200169016a020120016f0170020120016b016c020120016d016e009b1ce3a049e28d7a06b172b809bc84ee5caa9cdb0bbe65f1be86894cafc6add2f85a77b073bdc003e4e715ec4dc8b751d7dee28e7a37b1e3572a62abd33af2ca3f86d1858a0cce6ff60bda6e3459e0009b1ce3a049e280f8192537e9aac12cf04cd229c7e40327a9ee0f40548f827300f26e6030ae678003dcf8699bac9c8d3a5c152504a1ce49bbd0c5f022169be07c1f530da7255c17855a8bd810dde7e0009b1ce3a049e2be2f5f23dcf35aeeeff34d2a5244076717b6ccb4a0ff487e6340129d0d2549388003d995d511e48827242fbe7fc4774f4d3dab3613e7cafa7b079fa124a33a6fc90ca96baa69704c20009b1ce3a049e2a0e045f4ec298cc3262ea73c7515994b51f15a26ab6c361ab56d9dd9e1130e034003d67fe05321c5405ab8bbe1c5e2e3b1e546636910d34eb91b232b31e21ba0b3b2162e599de997a00201200171017202012001730174009b1ce3a049e2a1ec2052d7644362e8bd0e31e214bb7535679c66d82428fd99688c2c39ba08528003d42e6c6de1e6cfb2578a99c369561d684eb320a8f13ef320143899fc9850c38e74e95b0eaf40e0009b1ce3a049e298edce91709ec0b91d798bb27199aab13b36b0face9e22abfc2c72a8db3ab9c64003ccbefceb9f85fb6d3b4430cdbe843e76d179865e48f49a36bb16867897d45dd53b004067be3e60009b1ce3a049e29f9052846159e927dd019994e476575ce9a1a979dc4d617eb3bd9d99f5ac414e8003c635522485691eb73d6117661e38f086a8631096061f73baa8ca5181082177fe773edeae06cd20009b1ce3a049e29ac4a632ef0a54de1d8e68175a8b2e0a492169e88134028583de33faf3f4d3040003b77d6dafbc5e706d5026994fa04e5b710b4e68c4429a9e705ce1a95c7c0813127b2a8fe381ea2002012001770178020120019501960201200179017a02012001870188020120017b017c02012001810182020120017d017e020120017f0180009b1ce3a049e2b7568b9352dbe49feb448787d3b30758d89528ad44054d3b22b7283723f2c4ec0003ab5299153a13ac196c5b1cb6bc04add46eb9eb075aa93d31826c69b548eff130b118aa1f09d260009b1ce3a049e281a5721f7140ce79f6f27158a5f99c60d676b5d2a2b90a40faef334cb01a778100039da5b58add01df64bdc3ee3effd34f1eb0ebb0fb48e99c40e5b042c18661f7cf2837d3965c3e60009b1ce3a049e282cb43cf9319a908309a78f1c2894d561f8d6e6cff8f96f7adb91ea473ea9565800398476d9e72eee1ea43d67ab725691048a03b4a4b10be18c03fc4447238864ebfbe528e9afafa60009b1ce3a049e2993f2a86f030cf87da084003ad81fc882fa29a132ad42f9702e2e4379534f39540037935d54a8187a4bf04f4e4bc1f57ed53926a829ac7687196fac601487c228d65acece629cf61e00201200183018402012001850186009b1ce3a049e2af6e0ac99b21176207c3236efd50ebced15402bc4926bf43b6b8a88ce2eff74400037764d07292590c243e0ab84c6ce8324939e1888aea6363bc3b081d6ad18eca492fb89a8125c9a0009b1ce3a049e28721876054a3ca9bd344a7499d2b1b5c5101f80ad4f8d5de9b8b8c990e8d0e0500036659b79f26c77d5f13b8eb2fb2811f8f2fd2248f8897e151bd652c93f307b1e0d0c71dbdbd10a0009b1ce3a049e296098476e7ec916c5a1c0f16766644148fea29dec096b92d4153ee078e075f4a800360fd2355c831ff09a1ca5182f7a1832d9964fdae6786d148544642138d9c1d91c3660a3bca58e0009b1ce3a049e2b1027b547fbd1129ca79c4d87142c431d51805e87420ea8e0bf6f5a8c2046f1040035d87634092e5a9d32e6213ac7ee6541c7691835955b5c383bf1e277aca1dba4825d8b8e5b09e200201200189018a020120018f0190020120018b018c020120018d018e009b1ce3a049e28cb249c97233946719546417ca8a2982cc0a2859d7ad46711baa847972921d7e800344f0a01dd9fc324c43b5243ee6b2f766a6f24f55b171fa37a3a125b9c72e6a7abeefbc3620ee60009b1ce3a049e28a85b9fae42650650359da1d3aa39566e92458defa7015cce7b0948f3404c5a5c00332968537deaa69ea2d14b979198992f73ff458a40d76fe3157ee74c5a780e1d0cc1e93f3260520009b1ce3a049e2b3b690ed2e32efad64ce9695bf60a59997515ad4d79a79162e948e2b7e8f3d6a80032d16e217a8ba7a48075ecd741d50fee154318dc3c16bda368046babcf4d0ae90619e10a3b27be0009b1ce3a049e2901a4fbad5f37c7ded74d8262107e9a1e7be89b5042a4aa9e9bae0a1069a0eff00031c78cc5218aefb88705d8a1a927b941511fa4dc9dc5d50d0da4cf7fbb48496bf1a962df4ce1d200201200191019202012001930194009b1ce3a049e2a2b4f22aa8a6c38aab44dc1ff5be2208b6af254f7f965f56e1052a57f4a7bf6ec00319759426809d4725dc51d03947604a3cdfcc79fbe3c5b0581d8621adb33624b0014c36934f2be0009b1ce3a049e2b299a7d4d46e361e22908273195f8a3788d31cf81949d021a7fd064e736800a98003112e23d58390f85c1cfdc020bd8aa220810902f1bb066557e3927968850f219267da0bed3d52e0009b1ce3a049e293198d0acb8aeac12d9b3f90d4f591ec89a72a3f3ca1486c2737a030e15f76cb80031128a135aab90dbc32e7f98f5f18ddf0847960f69dc56903cb7924ff0bd4232512ea170108e660009b1ce3a049e281252a1041d3e9fcff30f73a377492a2c7af3eb08d3d05861f2e045f52dbf93d0002fad2ffbbb4bf86dee48b7d754cb10756ee56e24b1f947b72bb5d6c4dd820300e1a254e716ddb600201200197019802012001a501a60201200199019a020120019f01a0020120019b019c020120019d019e009b1ce3a049e2a58f782b756b003a0565fdbd517df018366704f15ca7b3b84f01ba0ef582ffaec002f8d871e340ab33de3900acaa1c1d147728ab1a4274054f1e3e7870d5a30dbe53d31bf2e559e7e0009b1ce3a049e28372a0d19e349250afaba9f33a968bc27367051d055fb571983219464c15e00dc002f32d2a8a6321fe11c57246e6770c27b5507791009d09e3912f7c16e08bda5e5ef9506c4694e560009b1ce3a049e2ae1b8ce38afa16ff28a6395196854d7995a4240e2457960a5e03e6fa5c2b06a9c002ede9f16caf0018324d3181966a141c514523c202e2a22d8aed2506b06ebd09b6abe0dfff3ffd60009b1ce3a049e2a1ea03332dcc24db2fa57915aa3f0a1c6a76eb5b8dde77c34acea190c176fa388002ecca7231f42bf5d219533d6a9d383f0a19caf6dd415e9c444edf0a7739081733c5669a72c94ea002012001a101a202012001a301a4009b1ce3a049e2ae92a6426f1d10f33d470bd95f7037ea7d9e4d6316e8031ed74a49e39950c26e8002eb4bc9f8b0b81fe968e6748584d4833998ab0f2118fc101699e06d3b0659322cef4c666802ebe0009b1ce3a049e2b333c4558f9ad15b8cdd204eb7ea8cae1bdc3e2329604d5c6e55ed03daf43723c002e5d8b824e37da29141b26bd203d751782e5ec505807ca9574e9c73296495de83d5b39b51523fa0009b1ce3a049e2b757b63831e4b023587d196f50515cfcd53e8723f5be3482782740bd2c446af48002deb72f65f81cd571b3ab859148402488b98e9dda1fd151968863eb72d61528d989d9f3d96b1660009b1ce3a049e2afbece0cf21b947480c9b1c3a18612314280a758d565f6a50c87b80eb8b103b3c002ddc5adb71e59256d776e804f4c2763599d0bf0b586833ba8e36c474f43238da2169b074615762002012001a701a802012001ad01ae02012001a901aa02012001ab01ac009b1ce3a049e28c48e87701435bb77506bf5ed116875cb454105376614ac03d3887e1b4191a17c002da45c0edb9b249e744c630804d331bc19d8ea9526071fb66743a527259298eb9b175e2c4a49de0009b1ce3a049e28526ebf63b5a83c317b814dbc8d82244b08dc9a9ceba520915bf202e03b96d6f0002d83f2e7dcef6b3be7af211d13b1637d8ac7086c5f4ee0faa764f3d951943ee00ef5468c76617a0009b1ce3a049e2af085f12d98c40a822e344c3a80cfb3ad77406c19ac7ae87bf999505cd5db13d0002d7b40a5aa820ccb07efad3a6a6b2b17df9688981b3b75ceacc5bc448fd9e5dcf567933d474eda0009b1ce3a049e29621c7301cd24aa2f5452419d1e09b0405958b8346679d82fffdf073cc75e16c8002d6a84246bbd89a24819b16ef4e614fff38afa70fa7d6f7a68b75728272b882e324f5680cb623a002012001af01b002012001b101b2009b1ce3a049e2ab067ad97ac29f6aeb60484cbe2b292035ddb282d9b0f4f0b2df7c19baaa9c848002d4e2d477475b62146cf7c9dd9e666392a3c3f6b4d3032b13332abc5b3f83e047c4a556a8a380e0009b1ce3a049e2b7247055f2727df912accac56e2203c0f1d993d5b94abd80e899af4ad53ae26fc002c7f540966573fb1f366ec8202d0d1dd0f7428a8f2368678939775dfd43322e3caafd2f9a69ac60009b1ce3a049e2a76ef9d47cb6b07419a8c0c60b4e92283c64482e9f1c4a902bceffbd2f7f26220002c2f46f738a6422bae4ce9ca3b27c4b57c5bfd4c91ed11f604df3803cf0beddb4437b63c7ccfb60009b1ce3a049e2bc6fd85624ae21b9544cbe274357159b0ddad947995b1655c698205fb7c44e7ec002ba0d5cacb00cd67339f65d1a206965adb6c3f41c0332f0408ab3b37eb1a1e5030776b0cbef34e002012001b501b602012001d301d402012001b701b802012001c501c602012001b901ba02012001bf01c002012001bb01bc02012001bd01be009b1ce3a049e2ae623b72a0ed895a068900d93576cd12d98f45ee2d2fef92fae5ea79d63369d38002b664d99671335a17d1d73ddd00cba98a4cf38b3ac649bb9e6ce7064d651c825b650ef7e5e005a0009b1ce3a049e28647cc05938b6e0e0bad26f46c5453a6ca949b78afc9c9520e1e4f0c4b3566f84002b34bcbf7ede2ac55aa14232e9228032dbb019fd765435ed319f633cbef102114ccaf1609f64420009b1ce3a049e28f0394d53584be6bd25c343b520ae803a482eca84092e906831639cbdb445ea7c002abf0d125a6915ee9c4e215c1203ad0f95cd8dc58bfbc667801c1ec68886d16573346915867b620009b1ce3a049e2a31262f802b4bb2a0afef0d236dad8d676a5075ef5d8148f3f9a6c3fb345da5ac002a9c7546b9bb992ba92761425bbcb6844ea868c56d0429e313ee963d1288a446edcd9725135076002012001c101c202012001c301c4009b1ce3a049e29aa1cd7136882d3511abc41d7f1b43a1248298f87d91f3cee28bb467edc06d138002a6a876f0df365a023d9beb6ee16304988b5dc61e3ebc7d0911b35becc2bdf617c284de350d93e0009b1ce3a049e286b8f1083d6f1af9ae36d94dbebd11fb126b8134d1cf7d5d47e9722984535b480002a6a02c236dcef5302e6519d43cdfff5af212c987ba369df8c801054a5e11436f41e09cdf9b3660009b1ce3a049e2a2ce202a9214bed45234508d7b146a41142b01cb471cbbfc470d9bd8d9ac1b99c002a3dd87135816ff0d9d05277ea1c26ab95ec012c57d5a12090749eb1ad9f3149bc6b670786cdd20009b1ce3a049e2b5b5f02742ac44d50970ea64186b112e08a5a344d916b24c94e9bb66cd16c5068002a198a15df3bf55805a66889fc09b433eb1cac810c5975500818e12c8e0ae0e3bdc0974768e9ea002012001c701c802012001cd01ce02012001c901ca02012001cb01cc009b1ce3a049e2a6933d83c3f628ee9359ef0ff28da7d9811e4d1da1b20a547d8df4d23ec9a488c002a12cb195a5b35660031191e56dde5e0ca9fac0a7adb0422ea50b5a77769ce6754124760a0c9320009b1ce3a049e2bc280789c00d4d1a9e76e609bad98b9dcbbba37395b16512d116fb83943cfd9e40029d41acf6a247ad2dca6096524a35a32e685ba71cca426b0e3cf91c3269cd6eeb73671b7134e960009b1ce3a049e2a0c319464400e8980aa7d89093baa2fb7860cd40a0812804de7ffccaeb6d1421c00292d84da3a5f8d87f135d6440bd6a79964873da81d2c0b7b376a26f07254059187ce262d485c0a0009b1ce3a049e29945b49e250bc6f5d0c933bf04cd90ef3ee1bf8a2e8dfe20905431160e3fc1d240028f4e0bfa31e971fd43f1e6c98cb9c0d8c3b59274e1026378fdc0dbdb50eb1d801cab3747f5ffa002012001cf01d002012001d101d2009b1ce3a049e2b5323aa7cab5dbf92000bb2678d199ca15f860e6c47c7bdec2babc3a89d001d30002895856b3e3aa97a22a2bbc6f1a3b88e34d3ec3226408f6df3caff6d30785d07bd1501961a0d4a0009b1ce3a049e284823394c32571c36d0963bed0ebab08462dc9744277c8d3dd46c685073b3587000286562575b0ae6758a1cf665f267e2c057047cd643bcdbbddfa2d43aa470886dd9898f9fefb6d20009b1ce3a049e2b495abc5f9c8ba651d2391079e3cd72c128fa2733790f216b17e3b8f79d3f24b4002862f84d36db30d20fb1dc5900e90d35582a9c256d35751c5c6220757f784bbb0bd4989a922cee0009b1ce3a049e2b0c278b65411dc9b081553954ceba78d0797b709b85d09fce7410b5bff10785940027f91083a2e9d0cb8a8fbb84820193b4d204821beac23c58cb8ec2ac314ff35ed535aee0078fae002012001d501d602012001e301e402012001d701d802012001dd01de02012001d901da02012001db01dc009b1ce3a049e2991c6d2bd48e80c3e846f2140329d76474ee632708c9e3c2e47ad109d402d17d00027efb6dbe87fa1d1dac2c9fa11b7233fb8fed809b60b2242e804da5c370c791909130c6f635d1a0009b1ce3a049e298d4607fa4f3ba27aae9ebbaaef828d7f48534ea56a05538dc36da46dcb368cc40026c8035ace3a238e30bccbc20b0da660bcdc106ceb249da6953cbd33d6713e6a4d16a42100e2620009b1ce3a049e2b2dbffcc465e76ec940bdc88f80d6dd54ba791d756e90d8d4d6a4daa1b48132f00026c8035ace249e4435e1b49423dd16a326044b7c0af9dc8d51fb43bfc21a6e0edcf011820843820009b1ce3a049e28f43901b2d90b481719febabb474ed64239d0746ed4b652c0b3adc6622fead7380026c8035accab82df18ff6b9ec3586138047fde2a25860445693fda2306c2e05c14512b598f232e002012001df01e002012001e101e2009b1ce3a049e28c950991d8f6baf4b7a5952c5e7e5cc8a0efa9375ae96e21368110b73dbe358f00026c8035acc95ff3d42bc06e3a77fba211c4e8ffbfba78655fd20a3624c29e42cb03a94459242960009b1ce3a049e2a56d5c6483d688979a517c5b699ff672093ae396fe9d182918d3edde4ec149b640026c8035acbf451a547d83c93830cbde24bf104cd2a3ae9610c458ec80c1a30a2a0dcc48367724a0009b1ce3a049e2be7ff6a60d5b10f74d22946e1094c6180e04da2740d8f91ba232630ecaf1a8fc40026c8035acadc54452f31ee76d4c83a5ebdc65266998b956d7c77e963593e84acc384cf8b48689e0009b1ce3a049e2bf3aaec64abc45575ada715c37ffc2534d0a8a67e757eb20446357885e5752a880026c8035ac998fb8286f75181e77418494c8b18c5b3d9056703d5650263c2aa0f45774f662862ca002012001e501e602012001eb01ec02012001e701e802012001e901ea009b1ce3a049e2a7a2af11401484d79209a8414d6e415cf4bdbe010ceb93e25a8b302210b9424180026c8035ac93814c356490435d8b26734a3e8523ddf06685aa2b3f48031952beb28e88b19587c420009b1ce3a049e294b4c58a43b022e281dbd0e8489fc7dfa5daa073413233edf1c87fa2174b248600026c8035ac917c25424030284a2643df3e9a3dc27a4e92418f7d2863b8c4d44413bf747d8eb6b4a0009b1ce3a049e29dddbd8304108cb09cb3187899999a73fe2520becabc07da763acdf5754fcdb480026c8035ac89685b3489fe5453dbfe5e2c00d9a58d5920865ea58c8da8731fe37a74989b56dc3e60009b1ce3a049e2bd6eeacafb504ec4a7459182133d8c6e03219031667b2786f5962dd9347e1006c0026c8035ac75349b28de42ca52a505d1c22619285238fff02d7b6fb8c96e62f7b7a465ef7b44446002012001ed01ee02012001ef01f0009b1ce3a049e2b5637be9766be93b9339467cacbd3a7ecb28f9e4f44fac573c8455ed6f8f310780026c80359b3c2b47d88a02253d6d6538c80a6d2083fe31c60f28bbde53e3aa1afbb68ebe8645db20009b1ce3a049e2a76f65f8bd1804d2dde6533479e3437b5ae016dd4dde93742ac82e4a2dfcfce60002669a41a8b4e5061ea29453572e3376d806c49c80fc3f1bf871f69227bdf8413c4479036033d5a0009b1ce3a049e2ac3631ed74eb120ee1f09d830736f45c9dd82188126b2dec34cc50360ca4294a400266914c10095c187ee340235f5a8975b70d9330b6dbae735efc3c36109bb53143abc134da125ea0009b1ce3a049e293c504ad6ffe889a94648b0a2d4a77da015dbbc1e406ad0cb3bbc67c73a73e53c00264e27d16868e01894d7dd51f484773b9a020f2a4731cc0bea996959772f0026844aed6d0b459a0e6a644f6242995449afb050059000000eb44de429f3bdaa70f697a81b1bead3423099a062597414874c0f980192a3734405806e308742bc86ca68fe192471b1b3f6ebf03129dc699ba14ea4854f95525f7e2fe131e3cdf696150fc5c9cb3616ede6c06b0483e5de7a4208f7bf6fdc95800000000307fd8ac841bd291d5b6aa2ccdd4bd276e69eadeb9390296c912dd94823e888f40533fb537e2ca1145d8d391705b027dd857c418937e1466258ccaf24818fc6d4fd70f0e4ea7867a429244286723ac8a00c39a0be98911e47d98bae21d6a118b01000000bbecb466f73a3f27830ba7d10f2a5e06384b7fe4eddc7381623c9075ddef73894096358ea40c4c34444a400a696a21a6ea552a0a207aa90d5ef3613304331bb19fd2d8e4bf726193b2270e5093b36cad7d8bf4721965a030a8c4e61b36f270330400000054300e8d5c515d79aaad08e932afff0969406229d263a74959c6b40af597386e40e11db509e3389269b48ddaff0d0ec042aa97e5f5f29cbc764db219192d336563d0e63b48d99b94db4c11b195d67db46ea0549f7662ce8dbd434cb6f095edae0d000000bb63f3f16b7c868ea200c98d5395e74b5c5c52dd6d1a646126eb388b903202f540c196d283b4828d46b2efd28780263d88607b363c6e5256f957842ad78e5ea5e34edff5adc7e5e6f682cc1a2a42a0ed3597b3b6c9edf44e471ff8cf9a95a94807000000de7d6c2f67704bdb0ae4f9b65002e615199cf736dfa60562cc89057ba0c6304340eb47ed0377244165cfdaff60c5e963f6d4745dc5bfc9a32d676e79422a6dd988bd87cc19187892bac004d58095f8327b90e37bb9e242fa7b6d1c959457340008000000b1a92666e0704d1aa17ba4d80d1bb194fce21a939097b4c09fc9cb072878dba8400884c36152f8c22370e77ad2151013a655d19b7a53435792612cde2421a23ed8d287ac4e8c5c3481f64d52b2363cf48e3b4f38f03ce7cb9cc4a648b952d5d909000000cafc0d0f0c0031a9fd7c3ef8c3561db31616934d513dcfefd0f1ea9e47e4f2ec40a27c9ca3d0ad2759a7d0781430ead0f54d27bdafc2d368dce1653303447f75e4dce1e4d49be138192c8bdf13178bbaca0a7b1a402c755cfa27206b26454cc8080000002d2dc6ec6c35ac0af4ad281932eb8f4866cac42c499bca4449948c6e2b21e9ff407179c4333fa3de970b72cd907274bd7056ead3813822b4ccaca03e61bb3767fc2acc4caa105e5f40dd18cc7c72d5b64cedd1f5bf9cf59c3a615095139273140000000037f3dbddc21a18324b4cf457f4e4bcb52c9014c71df34a227c9ee718616731de404b4a15b51b9238227037a210b9c3323d03a54a6f09c781303b6f5cd2a96361bbe33a448c23b3c8f62f2df93d3e6fbaed83a6070610783916550c7c603db22a0600000049cb6a0b5d930a76d40bfd96f572ff5306967363fcc97ee3848d5a9d23fb460e40f1d1a6ba0e7797a5b211f9e79d335631aed6dff99081125bb0514d879bbc107792b9b6b0a254634d97d0f6934d3a66c1d13fa2d7f02a2947f70ecdfbc4b70f0a0000008ace3f76910ac14a91c406fc0223c95285cd35ace12f41f992e371557ff8d16d4066346fd2164c6bc90c0281769164730b612e8e47e90de1068d8f0724c1ada2a2d8919a4b45a7ba22e9abfc4cdf672ae972d94b8c3127407acd76cac7c34e4d0000000041268ab589fab3e910c3b1240b168c1d6dab3010035a3c9b5c7fc6dc0c76758f403763f526cf2fc4c82992db297aecaa31218562af3e2823b9a3164eb297c06d62ec0876dee2f12457a0d56250df5309f2f51840a3dd5aa3cefa00b41f65848a0e00000052f9e1a0be669c295003666d5742012c32549de75067426f4b96e759d0750bb640c863b8dcb3c37e57c938686d50446f075a84bf5652c1ef7380f4c8bf71fdfc08b423c1881b73dc11170d557d348aa2bf6cd0a87e5ae12400d346ffa7c093e901000000793e1fc462be4df8d5902b27b81917c2c88a41cc196d99a46cd34c834ec05d394005793201bc9275ba32f0224073047750821bc2204c95b8a0f70b01985ea0b4b9e3c1b9f8eafaf8c1a0a3b8c1522a5d5ff736e96591dc9c454bf968db50e95803000000c6b11b62c4fe7203c4182329c9e7cc23d71ffcb143ed8b9aae340c70c33f164b4070c7246aefd58e905ed8c7d976ff757fae69975a448e99090efb60ffd7092053e6299deb12e0b4a6d644fd7784dbcc52ba37db12c5606cfe17f6d0e9bb6ec505000000a615b9e08ac55a2d8c9d284b41713dae9faef25b4e0e83cfa75259bb9d3af6924058a6a885f190b8c88141258879e8a5e7736fb50e7e3dc5fda7b38406895e2141dab1238533424f216f2f21a6a0fb204bf22e4ea6f2b751e189bf5b7db733e20200000031ed60597d5a22819c1cd5dc8a4d800a59d4cbd0e0b8da75043089c54129fa63406e6c816d9936447a454f51476eef46f71e4381a2df99bc0b46ca8615982eb92cbb48f5d30ac9ada331f15227ebf7185039ab2ffac5a73ffd2b065bbc28ba0108000000a364acb081ec7d732153867fc5446b184160efbd4c6475e6138b6d33edf803064061623c7c02a85943c50aa24f4a4bf626094ac600958813352e62d41b1d580f4ee8ddcc55514cd4b252013b72f566724bbecef1edf46b69fa1b90efaafa9afa000000007dedcef763a6cec0c334a3d8f6c0be9f39b6f07ce7943416ae55df47bb8b25dc4049625d3eb481f06031a473fa372a0feb81fa7d0f820b106c0d4e4e802a919849d3db927a562f7af9486a7b468a9e7b1bee598e4ee96276d8ce34164831447f050000009994220c489eca0a6d1801d219b3aa32186f0938a970affb9237eed7d8343efe4055d97ead021fd355b26d2093cf744f7186f83517e0b7817b142c8bf6285d9e6ac42874483c70023d44f20094be7c1d3a07b888efe8373b0f4ae66453b7b7cd04000000c99d5624065525391bbc38956dd1c17c1791a33383f97562a7562017c7fb3b99404051ba4a9f30ba7b8fc3ce80f8bf6a417c37fdda57acd3843065168cd2868e28523e6eedb51bc4dc567e01cdf24f237946ca1334ebec5be6be3b3774f1c523000000005715b6ee27d5f61ecbc124c9b8d8718ef23d10c74cba417126cfa77dd82107c140f717e4cc9875597fb6fa21bece08fa7c94bfebfca22e4a44767c5f7cb2dcb25ad271ebf6d3f333330771a941638e2e9498e77d04f6e7d51553f231f155f01100000000fb1b163e87ea744a2ca4b9cede6103fe5f43e5e070b0985ab991d6dd8080764240ce2f7a0810be6540bafa2e7cd656db3e0f6a2e5a74e9990cfb69934e32b23e2b9a1f66390791c6c601ce3c7c9c43050cd2c9574c0231370903916599d47eec02000000c8ff5e25d87abc015f315f39c40375de14a2ebd3e9ad1ab9250c4afb278cc74c40e56a415a5c13b5c2fd434b0c2089d8dc080478c81c37bea3c815bfecb851c8eaafe8f1b817e4dac711afc2d8272bd9e2cc0eaa4733f7d6e06da02fef24fb810200000042412b18d1ec6c02734cd5d5fc4bed35dac9fb0d148d9dab9fc2f925e2eb85ff40eea3444241d76646268495faab1407ca1d69193a3280511865c316057292dede8030d8c0914d03f9535c6ed159470ed388b936b4b08a3e32662adc38d352710e00000049b3020baa04816198d2de96f91bcbcac3b6adb424d01ce1066a385e1fb84696404f3b121b3055e8b53100bb65a95b8887fbf8a25417a64b732c107ee01aef1f510d04272ee8c0d99d053fde1ccf1a4ac8a8c7ab8e0504dae924ce3a7739a1f406000000e3160f229f14b31055313981ad84537d267b731649a0f34dbc05dd0a3dc0d99540e77fc53a2858ae61f080979399d2b18a547d0d45e6bc1fa86986d47fc021dd06fac2df6b29a8337d981c14b6040b52225b11e341d1ff33b766be161ced07de020000005a5457c8adb35e9f0d2eb6608bcbbbc2a04f180cf09ef2af34104d724886ea5340662dcb4c321e93b8555b906c942f3a0e674aed4b35bd353ef19a9b71064ba1e2ca73563c684f87eacdf63b01747778b349059817728f82b194487cab27ba770e00000099a96daceda7ec862e9ec745f93c6f3d3e0326acb85d679790a56a26eb1a945f40981a6d8c2b30f0d08e4062fe0e5e961197c3ead7c71922d48d96f585a034c3ec499b41d3bde92fd1e6c2d10c7a0f06589215ca9ca2e0dc3cec815a931b61340a000000686ff48c04b0730d014aff829d182bdb478275a2c4b38ef32e899332186afc6340fa31c7684db962b0f2361b9b0f5ec33713cdd1091ec7abe311c42e82a6189dd87ab502fe68bff01af132378c4baca582099b791327c1a8cfc988fdef10b9530f00000050f95e0c5e2c0495505d0abcad7311936037929caaa396831718704a2a139e0440acd22337677ef4a03f27242db9d5ddc97bc52a1e809adfe464eddb245f8a8f2ce84176849fd02a26bc0440372d9ff42b0df4f5e4e1bb3f8ced01e04a0f1c190c00000074fab8d2ef6b24751b598aef13692cb06f976d5db93ecbaa9ef35741992d935f408fdac9cb7e2afc497382e0595069330df4f50c0d683b4e322ac55f499dddfd80da0c61b8b3ad41c536fe6ce6ada6f5918280570ba9b6fef71a0e8c1b59e3c50a000000ec59ace4fd77f05ce1a5e2190f347ead42138b5fc5822c4e09bd7ca90ec780e54031cb8b33082d9bcab21770a5f497fd5cc6d56cff283a4b355e19e4975b8c7e84a106cc842e7e6990dd9a1df53030569ac366461cdcb995972e66bf7d6a91c60a0000000fae929bb335a26bb1ee954545793a98da2e3b9bd5bb456b9239ef169729555240c1e14ab73b581bc671cbe3e46dc29ba59e1eb185b49d1cd9752e44c55858353fdf59a4336585fa33bf068b55e6686a38149583a828e6d477d220c28bfe785d0300000097a90f069f548d72f938b0b0cce64bbad2335ad76fe8920470a680d48c1b6f0540a5833d3d8bf7eb2059518778665fb3d6f7a6bca68dd9c862233b71510398a394b185885647c519dc5c705ac115d35d88f288f8f1fb01ce6e98d2a799e85e39000000000d004a1ff0c9c365f062df33eaa1f29b0d96171221867d07be1937d5d2b844cc40268f118c8388fbc92c0677148fdf9ad63760a17a4ba92517d16158a050f7942bd06941dd1041b198dfbd7a59b90c10c6a1db16b04a3a70fc9daa0b5ca0e126040000008c98a7d58a326a8412a522afbfd41c2c29206294df89ec737309aba12e88dd214082c46b82cd5127aa5312c46386c23a2aa378bddaaff54f36cd19a9d36881ba8d6bf81e1e27cf36742458492f2939c6de4393675bee9f263fb07e5dfeff7eef0b000000a24e264733b5b3d62a1639430a222582771c3a9b0e700aef9057b9d8d8c3989840e88417fc3dc364f1dd3631dd4e01f6e2958f1f3d6b2b6f8ecea5746903631e5234be5e2e7858feb14d09a946c0e8a2b93a9fcd11a5678dfc4a37d72f2ecf1a0900000080d381ee631cbdc066365f60c378b8a8935a66e92145e02957873f0a6bbef082400a8c2ba7e11998066d2442bd855242b22acd1f9e69e2d8f8fee5c10cf688624817d20c47a0115cb415068fb58203ca5e754718e3bdf141b64ac9eaf8171e3c0c000000ddff0e00157e813f7005dbb421e9ee7c4577ab108b749c2b764542f34fdeecc4409e55f8e8b356be4105c80cd4febb7a33a03a6fd14d2f54360e2a8407e345ff9146f044323b4102545344820567e089867e45710b3a33da31a0358b6748944a0f0000006d894d59c07238d4a5a8cda307f31147bee42f27cdfc20b559cf63930f70cca140815c933b2db79b8a512fe62934943264109a9201623203a66265455ef5d94267cee120946a30e3397f0882b208915d13a1a4d8e484f39155a398fb5b7a4f800c00000029ed8f58dfb7497cf3b3f4392f0a70eb38326aa6f1eefa3358a4c70b0443c937406a3b09fb91ff597885a37632da0ab7ff3fc5896f361588022e6da4ba97162a1e89620f16e1ea5b21247013eceedfc36bcf2d2088342526fc8f2989d548385b00000000834f222e117a4e1b27daebbc9619498fa94eabad7ade873e22b56e4cb11e0b3940948619c5c29caa830f99cb14fd7fb4b8c5801636274aadbafa547d1c96989f3875fc4469cdafa1816ba54632d9d9cf71a8b31844659552c420d06927367751090000004f962cdfe480057007304beb83709d65744525da47a926b870cc6af5858dcd2940f70f06753263ec954fab77bc6ecbe19c99ccc541582c5675b8a084ab3786c52409a7bc9a1b086215086d09f9525ecd481e099194f6ff64a3c1d95c9ecd2d0d0800000019fde35bd8a31fa068e1eec050f53b087ccb8988bb8e9f1646668f5e7bc70dab40b9f71bfb1b45de23fbda0d5f3b57d5311f9d9e72f4afb9d09f4a7f2472a3c1b8d2aa5455e93853f2b907531267fe8ea12cf370bdf5e5a911840a286375531f0f000000817c601ed27f73037e96a44d6c5b51a0403cee5e4cd888c27102d53f4b5d6eaf409d7f238682a833cf3462547cca637a2aa79f30be2141a119ed456a45100debd4235b4a8b805a6b6211bc43f9d7b55033bdb8b848e4cf27a7f4d55c5ffe537d060000004d23e8c8bffff6f38ec45307c31ad26918395a425a0d3c54313cbb4f66965cd1407c18994c50e0ecd0940030f6dc0877a46a4094844d6230eebb2456bba6f35b433dc8b501b8c3dca7bf174fc0510bc0cfe8a545892870f87fcadb0d95b42fd300000000f72b2d20beb82ff007e665c0ef9086464e7d380fc73fba1ae7aa67aff26c1e5b4054f9613d72b82a87f4e01b6ccad0cc1f07d6aa3db0b00a3ddbe332c509d8770e54e056e2caf1243349972431bdf02785fdfe9b07c68219d4f647127fea12ec08000000bf77c6d78c0e7a757ab6cbbd6963c45a3a2a36428312d3e1e9108ca030670f5840bf88b2444f113d093e41953e0853fe23739e761221b24d8790db9f756bce9a0e6c7adb65c6b78cb8b42108ecdd0453d4ab23c21bef46b18c5a7eddefd14ca4010000003db17cf961dc6e8288d1ceb420023912010af61e22d046f9140a318f2475992a40a425ce1b916793197e75e2b193ac0d9510eeec74923e7d501e4986ee3abb2f910a36cfa70894df425c4b3acca32bbd9ef34c123b24827e4c2b9b818f6527c3030000002bfeeed8722dfa82086ee51cfcb20cce2b4911315a8f204392011806efad124f4059cd0f68f469ecabed2bf899523180cb9e9e924d23ba796bd349dd9fc52cca666e0f6ec7c6f6b45e68bcab988c4cb8dd628c51ddb03d0d2c79cdd676e0673b01000000eff50724a3881346edb78d0443c83b5175ce630d061c07420722493c239ff3bc407720ce4c19ca79b03b743d08b967da02e9fbca24446301e8f1f1028d746096521247e859ff7b6c5f589013456fee01eaa8c738763a4deed66138df643cd39e040000004629a37cb66c62fbb1b541f8dcf01eb7eeabcb3f031471a6557136159afdcf3b40cca5817af3f8b44013122f03c9c1658fe01f235860ef3010f8175898f38ae2749648378e7059a02e505f9dfc25ca615aaec6ba47979a68b167b733f936ba290e000000e42ea1c99b6e5ab2e773b6b68851f89fd77821a6e4bf3a0b274a5d2b5a3079a0403110247eae7f2f082e10f75d95c4738576f2476599be7a46f0a3e53a6ef5c750a6e1b7d5ccbe7333f0f0c2821db4b6a62a88b1ad4bc53409fe48fec7735af50e0000007db6ad5a057e61b649cfce513f1ee5f9e769ec6d5cba1d3b2becfe20daeb01ce406e2f4b02fb41fc3dd5e13211ee07aabb982ac3b089fe67c07477c6bb97d494b52308f9664fcc4be434580dd2d95a8ad602fb65a99dae76e64d651889b4e9ad0300000056684f661ea68184ea3c06fc31eda5d0d6e4e30fa13651597c83742596253d8140d50f2cc8e08c376222d22ee9f797d2c4fee0e682070f176d17d0a4f8c396e554f30192347a295de7dbcacaddccb27e44be5bbdbe1d1d5c6ec5e7e43a50e20b0800000050077fa88a5194e36d93dfa61ce1cca27d5663ec2fc8e19f0c4943fd987a4bd9404c86ebaa87f6613751d5a82dd3ea2faa4427ab9a477df17605fcad724de6b81150f5449ed8707b98c273121dd3ef76ad1a548c93ae064eae34fb6d6d19c5d70600000020e8ae4ad19ade3e7dce798cea0d5e7d3de22917d2c044a508f9881643102af940ad7ddc0e863cba8befcd9f8b76e1c7996343fe9fec1acdea8e66c000e49dc649c072dd696bc1230367fb9f5882982e87db4bafb19d23d08711960531a2285000000000e74d4fe98f99e81cfb593d0e6fb85bb9c8639b696baa9d26b015dc1e13634c4540adb43e0ff4094fff7fa70122dfa03c406c6a1978d4b2a4b6b61294654d3ddf619b1de996a05b11021f8b812ab612d21ca15174004d77337c8a2189f74831dd05000000adb48a16207ff3aee67f7a6f642f6ddc1fc061160f4250c58ab87255dc2404ba40d977c409cde4c18ca7a5dd7537b3ecf92694cacb4a2145b32115846926df4bfb2dd12d418dabfde6ff4f7ccfda75723e8968e3bc27e9046e365ef5608200100f0000006d69ad563f9e78327deda1fb3235f37929d1528c5b2aa9e2ddf524ef326ce96740c96e151aec349cd0095aa84e3c96f5bc69868b2b04242c8feeb3337cead11d33fee1c275666d26c5376e304c7e3704e1902f458f64faa51612b9823717a3de090000001ed3e02887307c608b75ae40b1341553018febb18657b88e52b8f79af91272724048b52c3e8d5ccecc521574f5cc7053be7ecac798d3154871015e8f3755c4d318afe7fad7f1086a0f99b27ccd9e1b7f4b2c2dd54c7035993e52d8ab1adb039e0f00000058918916b68b7210806a1fca995d06994c3eee043e819e426688beca82bc7bfa400cc47666ed18557c243c5e9cbbf9865f21cf992d8436231cebab8cf5972d09b4a61727bd58600e4136b76aa4479ef58bc281e33657a18d3526af6e038d48040c000000b1681fe901e4628cb614b5cb49b641c99c042fd54abed06577f68a6494b1bf7640e4841d1b9870122cb7dcbbbaabc81513a5201e5fb41c5624e26d6fa1e3e350cd9b1c344541f118ce10d8869a7c2ff2df1c7b213a0e8b67553df0fcc7779c0f090000004c03368d1eab2c7b4859b4912a2c351b1017c41d317c31bb63215e49d6445961403829e9238ecdb2118ac5c00d89773e8147b294c3dec9d7597d8894daa580d58c0cc453e8d24f7b7611b44abc50232fb8c54d558aea43d6ba07a36e61ddd76003000000ac74c804dec98e2ccb42ffa5d502b51edded0de9b7690db0fe8165a20561171140990e8db4a8b7fde8bd020fe644d323ccaafcecb70619843564691dc9007aebafdd99aa489077a7bc62fca0311c21232a0f0a9be9995bbb41f6b0272c5467490b00000002f64b20e479d0305aa4844d9bbe6ac629df853c05b3f729d96175945c35408c40ed68ed71374526d6fafe9749dbfb5d95997f9fdbf0b1be245fc84d6aeae463e261d91516cc1a2f7a7317893cc89fca830bef85573fd185b1b897bb60840df50a0000008912983a1c2f6c10a1748e26a184a7f7cda99bbdce1bc1ce0b3306c1dd4924db407a9b5fbafbb8b5d37038a7e0dde041f02dd367f4d6cc5efeaf014ff2e9b6232f9b761c3d21f236d354e6201dbb5a2e940f908f7b06b9afd0f782a307b97bd10f0000008d5c433d63665069d72792dd677da53594222481eeb15e09a809558aadb7c912404f63ac2b7fefa0ca085f436c0c58db2351be522464ff40b011325cf581189e10ba9221353fadf1ad997503eb7b6f3670fa600c6b1882f3477a47ae735144ae060000005f4f56106215ff9c03d3534a9f6c992aecfc7b98caba9102c5779ac1be98f6344004d0fc9faa24d81026119e77c0e1b4a561553ad0d228b21b0ae50622f756a1534bb8ae84db0b4489c1982bb9af25488569f8a79b9ab7289daf0e8e09ad9c050f000000211081f0137fa080c1b2053016a8f6173c08f6df8235c4a7af0d260c3919f382403b45ff74d25af9d772399b9b77966d8e5aa5301a1a2509b91a29973102c091898aa2d904a95cf5a023fdf0db047740e17e8b762f62ef893bddf6756f5290d20d000000b63ffa979b101701c1a9be656d7116fb6d0e63daf210b78f4eda56192c344f10403cb1ef42d3d6404753638bb3debf847a3845fc2c7e0f2b0495dc34973d6367d5601a317ab24266e30ba9476cb1fac2928143ca156b9d083f7d845839c72bf00200000016bfc556a4b583468e0b069973a82cd31f41b75bfa03095f04dbb6d0db7e783f407c525a28386c537968b80a52598172621cffed65beb6b01878582143b271174b6f383850844edeeb4d0d30aaae5aab93527aab284f31f2a8a4dba7d9968c7f0f0000006419108f9bb3f8345f3a471650289089500b56e971ed8fa5da226dd417071ef0409c03f48506bcd4d74c08f9be8e1c7ab16c8b546a956d09e9c89d12a2872a69932eff3585cf8ef78a84ce5c24f3ecd0c31a784e414c99d30898804c6540e906010000009c8fd7f788958813dfa57db9c0e281449856fe0224c01b841884b755461bd309408868388788330bfdfa63cd6dd2fa2f550a91de2aaf027eb2b7a8cf1daf2a52e7a546bd42a2dac38938e839f6ff9263c75b5f28a8e7ab6080fec446721dfb050b000000a18062d84391d4d03aad3b34d2f94749589431ed179a3c28d47ec00ee92c735d4050b715db84d4352745fa185b1cc261f0217d0702deedd7dfe3fbe395cf4079859309067861eee60d44fe61264eddbaaea5fdaf37e310e8bad76f8ecea631df0800000012316aed2697ab1c8d186325166555dfd9825d3690373f4f5451f1c66affb2354015b2d7c08c90fd698c0e724e349611513933886fdcf4e9ba2cd6a5c2aa1aa4cae82c7e61e8c850846c93e84b451a7c114b3594f732fca7b9c4fea066eb35370d000000e72be9eb1d42b83668d5a37f6cc4cc7987010f89687d4a9dbe8edce5a65d4abe408b0ea5fb161bad9150269a81bf321fdefe2caf66d8164e7b9eb8c5ba5e6799319f647b757c9ac087510b58a391b59fb217a6b5a4d074706c7cfe4d439183b10b0000008fff676e4b541777e3a081dc2ca794385454bee74d579021eb3c393d2ba0b27d405db0855292c7bff5c610c8a251bc204adcc87e6d3eb1512c466fd77187874bdc1c2007705a190d521f22dc69fb63fe3f2eac869fa930919579999617c81a4802000000acf555155bea9b7c4d000244aaaac54d32c79fc93321e6e0ef527661d284c7c840db5a814b68a9348d1c49226731c77452042cff2764aad3a640d99359c5af202b4357a41c668f9cf6f9e4aabb715ba95fdde6fe34f2d034f1afad9afb547f510d00000005d222d34819bc0bf85331f500324790fa754498ef2f94ee9f3b19ad2618e05f402add76760729022f1dcccd664136d883d172ba11323131dbbb6245b855dfea0b3ba85d5764127d5dd399e242cfbece342a9c788212f36c70b9059bbc279f870e00000050ddab66ede6efd9557f28ed79f6a35331a7303d048e2735b4559f3ab4d2530c40ff01c3b24f84175fb13ebfb99f44f59e297312ecd7b70854b130b8e0908630feb94c5995583386771c691092844d57fe85d3efbe7a8f3c113fc4bf9d7d64d1050000006154246fa16b410913fda5009a718b5c9b9324b98c3397c1c62d76daded32e7440e5e0fc229b67fffe2b77eb6d8ebd75d7a1d3fd9c238219ee34f356bc76611f9c6652d245d8de49c29a0cbabdbff0e15915f4e3c57f208396f7f1dc14dcb1770d00000060591caae75558ff4d6eba71b5f3f12412130b1086d1082d494353c7e7041c0e404a89d4b965635e8d7a145bedda05c50f751b2c7e5a6e81463c95f504702f6365522440bb2cfeadf77b9acd7e451580c8cb33439befb65729531b6d8b23ab290b0000009df1a3c4e0f7f3650ed4c375f536b62a4280fd9e162eaf4cd82ca8130c57a9c1406c44bdc9d95093bbde06d35b8130792855e7e774ec1a2d529f5d4c5d2af403ba305c1ef23bbda602b6f783df004178b9bba88ca1e1c8ff5ae5116c53e3150d0e000000a9699e4bb69f5787afe4e86dcffbdc1660d49cbd13997483d69eb9c990e9301140ef2c36e2f31bd3bf90bdbd3a9b1a0765e1b5d31b0ddc98468011344c2ffd8f15c3ad854b65b1cdb715be45340afa3f9e560b94986fe3e67d12fe30598f21180f0000005e9cb1a198737c1356e30b62e6d08ec07b3efe2e9fe18937bcc749da33c45992400615c0c513041defd9eb324cda11232cf46a1d5f84fb958f16b7bcd053177089c38ded3d2d08fa869c792b0aa41d2ba6edf452137224e3c229cb175e5e470f0b000000c2a78dc01fb397167bda93c9f0c49a99d1db265d1e8862b4c38350050f2be7414029f20b11a25857dc8b9deea8fa668ed4ddee9efcf78495f42ccaf50c58114b32eed048d9e413e890c1c38cabc52ab98046da25733df160b1cb0e9628d9856e090000001cce0f52b5757299ffffffff0000000000000080a027920193de0ae79c8b712a31c5c58556a8ad9c74a159108fc702c031c583905572ebfec01aff8f3a56b7509a5850e4a08ae4de9561505148507cdb2de33516156ce9deffffffff00000000000000804266920144358ebfd0c3c7c10f10fb83ac6291b7ce8cc024da8aa6babafa359f1a3ad1bd1fde9e6f7c13e96d22bac2b47e1020eef7c49a1e89ea7fc8d778c5f70ecc8932fe530100b5ee9c72010207010001470009460344358ebfd0c3c7c10f10fb83ac6291b7ce8cc024da8aa6babafa359f1a3ad1bd002201241011ef55aaffffff110203040501a09bc7a987000000000601019266420000000100ffffffff000000000000000063b8da1400001f2b3fd553c000001f2b3fd553c77048cee60005fc810192663f019227a0c400000003000000000000002e0628480101043d59c8a2ccc82c8b4395fc0c6ca9d9bf10ee96a5d8e0b6bd9c0dc71dda4ca10003284801019b5f2bf657b41fd8befeee8a2bc296f1b38872f9f7b008a68a10d5767865aba100212848010175f387dac95d2889813d6d443a137547a406b65c4488fda8f292a9082bcc0ac00014009800001f2b3fc61184019266412a3a7b813b22462ad36e0a2aaf4ee2e3a4093ef530a8aebf069829bdfef135dcc7b80de5a83a645574ffe38ee1878f0f04f07bdd48ec0df338497272eedcf9d700fe9a5100b5ee9c72020201eb00010000518a000009460393de0ae79c8b712a31c5c58556a8ad9c74a159108fc702c031c583905572ebfe00190001241011ef55aaffffff11000200030004000501a09bc7a987000000000601019227a00000000100ffffffff000000000000000063b7fa1500001f273129ab4000001f273129ab44449529240005fb9a0192279d01921e8ac400000003000000000000002e0006284801019ef2fed1d40eafef1cc6df6d077c96957dab4fa74c12da688d606908c6bdb384000328480101387ab96a2af64bb32ecdb12539dc39318ab43e19a3ba1dad40867f33135ad35f001824894a33f6fd350c29c6a81fce46dbc72dc779483180ae142401fc23bab6da1a3b8af462fdf69ad31c6986b8bef4a93cecdaa1b73ce687df9b885f56d1a395014bba0e8ced0bc0000700080009000a009800001f27311a69040192279fdeb6796762b40f42205d72b489489dd068e453006baccc1e465d3b5b668a6d70ac87138a5fac029d9bdac14a5e2f24fb32c85351b520fc045c53b4d386fb507928480101aca50433c32009262253e14654f51d335f3921f23d988783637ca1855f2b5028000400010228480101ca1ee39e68b7a4cae56ebe22be989cf7cbacbd05091556763cab2cadf8a2522e00072457cca5e87a98007e43b9aca002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac000b000c000d000e284801017d565085227138ec505a763a7646398da5e6a73417c64a8eca6480ec728687460002003fb000000000400000000000000021ea6001f90ee6b280087a98007e43b9aca004210150000f2201200010001128480101d4976d93c264d442c6d6b8108f70b69d00465e8cb1aa66018af72cfcb4225e8a00032202d8001200132848010124d21cf7ae96b1c55a1230e823db0317ce24ec33e3bf2585c79605684304faf200072201200014001528480101fd78695ffd58402e209cb0b060c95b1a8a83dae389c7eac9554a3c086e52b8980007220120001600172201ce002100222848010114265b804cdb772e1c9a48d1dd67ad6e9315495151d6f49bf5f203b2b883ae7c000c2201200018001928480101ff9fb607464434b8240b30817c4e6c358ad723c3ddeed45b2b82d45b9fb0f6210004220120001a001b2848010135495972e4dffc56ffc325d2abeaa6db04e07d832cc8b8847ae195158fd724d20002220120001c001d220120001e001f28480101ab446ae5250a0e5acbf42540f12f69bc49e22d74782881442954471a01c67d6c0005010120002028480101e1e66c22df500de6499c055de17ff3d1216fe5f15247186dde0708e01c52526300010024c201000000fa000000fa000003e800000017284801014caa02ab638c8cdd0200f6ea265772718e20a37d62addc71a7120a47225d021c000a0101480023012b1263b7fa1363b8fa1300e400640fffffffffffff95c000240202c80025002602012000270028020120002d002e0201200029002a020120002b002c0201200039003a0201200077007802012000b500b602012000f300f4020120002f00300201200031003202012001310132020120016f017002012001ad01ae0201ce003300340201200035003602012000370038009b1ce3a049e29ee5cfbffd3079acbd42c4ed8dc399767a324d5c047375c37ff09e6a050ffd3040025ff8d51ed4c86abaafe477aaec7b83921ba90cf18dd33ff4f03e2f7b35bc4a4e9c582722763860009b1ce3a049e2b52b13244d8b2b0352b8bec33ba7e0bcbd96aceb70d10772bacb15e38cdb302f0002587ac65f0232d04ceefb39cc1209d689bc4c761581b3f27d9cc7c1fd281b36c58013fe7f1d1d20009b1ce3a049e2adf4932efea970aa8f53b77fac8b37ea9113b39d9cb709ff8a2fa2d8d37375f580024f60da3135aaaf7222a228ac5c6afc0ce82e4f2b06c03fcc2ccc11f18f74102de79e527e3db320009b1ce3a049e2b569d69e8e0c8d8d49e40f458f13b517b5e105cc4369cda139a6955a3d3f072e800248666e2d7cff6183e3467b8107ade8d739831136c871851b1714017416f7471676f8f45bad8920020120003b003c0201200059005a020120003d003e020120004b004c020120003f0040020120004500460201200041004202012000430044009b1ce3a049e282e21cafba40977a97eab88fd2f5e34daaa44f41d45e7a04a5499990d881a94b4006d9334a8876fdfba04c54d49d0c2a248697f32eaba92097fd5d726fa4e91f749e61f55e1b37d460009b1ce3a049e280f9c9c79ca346c1efb4160a76b953d3ba4f8a5deecdada5edec4056dff8a66dc006d9334a8876fdc34c8f378c65a7a2f837c86a9c061d6afb43bb893755048ae64876e99d2b0c2da0009b1ce3a049e29733a6de931e765a9bafb8e604f2f394f6c78bb5ec708a77748a9facc8b4c1928006d715b44281b1bc27cd80b3fd0e46b373e778d9de40a15bdd34327d709724c56d12e679830b3c60009b1ce3a049e2ae7807450756662683c28db7164c07f24d95bbd6073d24f73f33c1d5b186f8804006cf2fba19534b258127502a6c4d42b201970a44a30069fa999390d4df8425368c992461161f4760020120004700480201200049004a009b1ce3a049e285f1011ef76d762ada3f52d1bdc4a6712e39f88295f52b760da5503fb6ef748d0006cf1d1eb8d0780116118ca6141513385bce13e34d6854fac170cba9d216efc5f71c1423d3ca8e60009b1ce3a049e2b2f87d869c67e74516089a9f724b16dff81d08f7e8f04d51cae0768979c83ae0c006cf14a091f8156427283ea0bd92891d48b32f4464f1489fae9684ef47e15bc33d865089bc8da720009b1ce3a049e2bc95aaa88d23d205bcdbabf4c9f416ed0c2608345cc57b72ff3ce9d8edff099bc006cddbcba681ac1ffa7efe55a1b9a55e20d9a0d5b34ddda9cc8fb15cd3810480f41b5fabcb599a20009b1ce3a049e2b6e4a76b73a1b7937a5fd78259235eb32d20518f554d3380a28d6545f870bc278006cd432e465b7cc7a104cc175cff079e7ddc767de7c18945406ae521e14ab5093ddc4ed618175e20020120004d004e02012000530054020120004f005002012000510052009b1ce3a049e2b16ab6c36e723c9f315684ed0ec3dee67e0b1b5add034be0fc52332f270ace57c006b19bed58a130118743ced0ce2f84909844c1b90f000a3ec96c66896d5a2ef71c3cfab5f2125fa0009b1ce3a049e2ad260fba0e5a5fce6dd3a6e87e4428f3fe9fff1ebf81f9688e2c58f581d67ee140068e55cf540e2af4a6303ed5565e9878c5b727902d93cdac1a9c9c3531c56a42db05aaabb7a25220009b1ce3a049e2b7ed53221e9e6fe44cf5740c91baf0ffee10df0c1cc1dc8ab50fb8789bc417a8c0068e52b0dc243fe325a469419b77eb341c7cb49b14545c1ee06df4301a0ac566bdda425e82e883a0009b1ce3a049e2a4a12abdd6fe44949871a0f0cc5d20cf0d7d8c075c5f73f80dbd5ef9d50873f880068e525942adb5c83b4199504264abb17d1db2b27514b626c70d308431230755e346d1aa0a9022200201200055005602012000570058009b1ce3a049e2bb23a911d3f57131fd390f372a2033337f9fff5f7a7e4129d82d343dc599db0cc0068dc3d4b74cfc2b820f19876b593dcd332fd692fb7ce62f133d69afd1538ddaed2d10df2ed32720009b1ce3a049e28a37d8ca8c26b5a7d088bc96a11d7b3cf79ed734c884e2de397f65f9f76a89c6c0068dc3d4b6169d752accf8f07d56050efd8fb3e0ac9ada86b58d4526bf3694237f3d4f77bd27a860009b1ce3a049e28942bcfb1fba1a1f43c0934f113735bc933433bb1f11a439b5e6c0878988aa31000647587d384ad7718e28452aad9bd641f98e55d7744039595724c1ae5286a6a26ac2917414715c20009b1ce3a049e29dcbb2251c08c55832789994bdae0cd92039bb8752748d94fad5c9b5c5a25d7b8006472ac2ac75e545e0cfa335d13c8bdc2cb6c84c534419d6a4a0d1d2427f5f7c6b3d52e5377ffae0020120005b005c0201200069006a020120005d005e02012000630064020120005f006002012000610062009b1ce3a049e298f99107c60e0c7bf96ebe3be172dc00de1c686a5645d1d599ba8cf836bbf66b4006471a7b138a8dfe141a8cd5031943574478d98f63ac3454492ad47adb30c1b3531c8cc349a7ad20009b1ce3a049e2b0f387ae32dc1aa431bf2b88cc6ab2f90e334f615de786cee4fa3b8f897a749ac006461bb19d95954a73ab24af4170e8a646f6faf62520a9e70ae02f66a8faa8d739ef087bfc7e5ea0009b1ce3a049e28434054c5b113b3645871933c378db1d83dc8c83e405e3f71157e1e85ef98d5a4006461bb1735f81427b0096de4bc955d34d0aec0615701d8a028e921f17a53bb9348a002f13d86fe0009b1ce3a049e2b6c6049c8bd41e5653dd8bb0deda43162c3081b2fcd7ca942e93eb13cb27f7c0c0064615ef4c0fea8bbd302453127d952ee1de2b6eb1b4d3effa98ee8a6a66d2d1cf34f60a8adf4ee00201200065006602012000670068009b1ce3a049e2b68ae8e951a4322485ef168f296678f87f4406ed27ae83266e95acad5e250343c0064592355a9f11cdcdb94b5329e0ff38fb4327c57407542d0bcf751c201644c0ec7eb9dfc76c84a0009b1ce3a049e2a50b94a3275128aaca715871d40456e4345d3f84320f0df12c793c821007367e800645910f763608e78b4f2d833b5dfc6c48d222ade39fa4a96bc874e62b16ade02c50ac553929e920009b1ce3a049e28381d81242f5453dadb9b69ee6dfba18f82e43799de73cf351f2aa7bca498783000645910f6fd986c8491234782701a48ea4a5a886cf15f978781699d77e4c3f6bf2ea201b3ebab5a0009b1ce3a049e28a20236eeed02b76321961f4eb5490d377bce69a715337796cb7b1d533ddbedd80064588d5ce9dac58a899164b1822d2e39dac978d93383eb78d0354004ae047083bd1275fa5323b60020120006b006c02012000710072020120006d006e020120006f0070009b1ce3a049e28433247c67758ab3f5192e5858b09ad05419fb671098849c907734d137c1617900064588d5bfb965a354621106c08ebc3e44c338088f0c135efbbc18605d7ddfab414ab0b88c4806e0009b1ce3a049e2bc1c538661eed61922a1b352e4809b46d2147a24dbba797cae40dc57ef3c4c06c00645824d776ebba4ccb3c8c877acf99513bd653d35def60e18fae62414b0b3be77073c36abc72760009b1ce3a049e2b9aca7992e1e3681407f665b6c22f3a2374cc36a39335a2bbafc1b8b3d2fa6c5c006289a57c861202778e76b5162b3acd0d538d0ce14f1f870abc0d7b4516106d364582e1e4bb31060009b1ce3a049e2a0684558edbc0dbe038db1038abbcb6570fa13334ef290124c22c66f32614dd2000628973d04abc94df8da74fd965e4d1bb896131555669d612c644f8e8e2d51b91521ccc12a575d200201200073007402012000750076009b1ce3a049e28c02c744d8a5b608ee6d63ee1de469b3eba49b70594ef6044615d404c8c445bf4006269b99cd0a1d07d38e728dd85d6c10021deded0962c65c77f742201cf5e27d2382e3cd525f31a0009b1ce3a049e28cfbbc9518f1ca5d1f4eec2ae7175fe8c12da779ec91665085cd871d7dc0512140062054ea9a7a28ec585c80807a816a6d3ac84a149a069ede2c4aebb370439d8419e8e05c7dddfae0009b1ce3a049e2b87f607ac1a89812563b50ca2a71c5714b8adaec4dd7ea1c642f7c241d706c3980060fe84163adc0e53e530f138dc23034ab3a93aa105beba7f3adfc8fac6756c6a41d3b17ec8c0520009b1ce3a049e2b8c684b81593f8a0e53ab91f2dd16c079a890965197d8e678ca0e8bc08563c9e40060660e740f728fc8f78839e5db3ad4221bd66f6d6180cf1184d5d96583bf2ed103649493e1168200201200079007a02012000970098020120007b007c0201200089008a020120007d007e02012000830084020120007f008002012000810082009b1ce3a049e2b0b63414edf923e079b82146b7fd86b28ea297663c9ac2c87d9e21e6860f654a4006012b0d5463c3a4b8c2ebccf36bbbb976ebbcbeb7953d5946c815783d21c88131d32e40692dd220009b1ce3a049e2a414d2869c949dc0788633e0bbabf2b001161ba78f72d726d845469f911137db800600641e495045f07c0bf6f11a135ee1c6c851d45a7348cb431f9172132ee32466b138b1525fa660009b1ce3a049e2879721bb8618294e99c9f4bd2fe9f23eab4415620713c63ddc40c45b037c81164005fffbd1606bdb27a33cc15c7eb18478d558617106c49971e53fb44cefdcfd01def54676324c8aa0009b1ce3a049e2a2eb3509a45888b38a4c36ce027551a187a6253b5c05f896dfab9c98de9bc5ad4005fd8d7933d52e9d6c2dc87c6cfb33d88ffd3b1f2f220f90092ee20f25a0cf94490b56b50cfee2200201200085008602012000870088009b1ce3a049e29acae9137f7d68632017c7611aa894a068cc2d5443ac3773a0604c6d292cf9700005fd41461e9388b14cb33c7d6fe094c752529ee15ce9a43482d7e9cf6f76583ef338760706c84e20009b1ce3a049e2b7e4bd3a4f5dd41f4d47ab899fc567ab9e18b6cfe5b4a6ecfb45a8658bafa6e78005fcd8907ff9aee7ecc28b733ac93e707cf11ab01189010d43e05211703894bac9a0f9f6b7e9d9e0009b1ce3a049e28b8ff26db4ee9021a8a01996c4763cc337fd2d63b9549ee59db81299d9406d4a0005fb8a677376389a3325d669b08511eda154caf8e2a894674119b58682a68c27e24f20ccdeb07660009b1ce3a049e28a36edb510d252538901596bdeb024c8a3cf8d5899f42a38b4a825d139177b1e4005f9722f7958e693fc4158940c46108797153c2e535b84c6d4fdf70f945f866d2bb19774a38d57e0020120008b008c02012000910092020120008d008e020120008f0090009b1ce3a049e2b5fa90fd34b6314268960d1e689ac752ec3b3a9fac18b4e4e44efd8c795715b20005f6adf885acf3c18dfd4152ff370f50ab0a7de08ede0cd56d266a28868d87b6099a40a45353c6e0009b1ce3a049e2a98fe2582c1c11d5e10a396f6847dedaa76024016fcf43d74f1e74570c2604900005dd69cb8eb39a288373683b06a1fcb1f2e01f2e650b9cd6f64e5df8e5826b646f4a4e8028df2ce0009b1ce3a049e29ae3df9a5e55bb415ee5bd70438506a267673b73b74c79d300580373e755c7dc0005dd5dea063562d3cb7269341296477bfe73faa48d3b782a9d242932658b1fbc0dd9da4dd8eaf6a0009b1ce3a049e2b308505a5d7abfa3023d41ee7e92bafdf6b3dcdb54e9231d18ec21ddd902aa3c0005d4fa672c7c8004c02af186d0d951f649d9091d98f7646afa8e1336f3c97523262947a2f7f662600201200093009402012000950096009b1ce3a049e2a873d09dd5416f23b3237f28b42f5a633d30ecc2275ced3ae53bd317764e98408005d2833fdfe8772cb7250bf2fc6c9bc6f91dfb5151f1354900de181ddc4e471069af8c40c7d2c3a0009b1ce3a049e2a3b0d613c6337f4641ef5873e4ec1acd028ee22bb9b0b192cfadb3545fdab8cb4005d157a1c746606b0650a4773c4cb96e0d7674437b0084f8dbcdde8a5a06da4f55381027ee840760009b1ce3a049e28d81f5a48d7c97a9621805f4cdd0c6089abb6f755980e7126eebd2c50fb72e90c005ccfc95d6959636b90d0b43e4f4e2004fa75686da2228a063f2c36015dae01b3aba01233956c960009b1ce3a049e2b06ea327239d961f1713837a2c87f20560c991831fc7867f7f3e7a274e39725fc005cb1c7d20ded6dee4b71ea37c53a39d78c22a7d5444337bcab1ea092bffc9f7bb7550d0fa929fe00201200099009a02012000a700a8020120009b009c02012000a100a2020120009d009e020120009f00a0009b1ce3a049e2a84fe81393a9a2dca7ce5e00c4ee9369aacf25aa93817c803ed4a75beafd30ed8005c50072c852f4f6f9bd85d5b0016f6d5dfa99d23eb5ac4b1575af05db1dedd6a9a39f171313fc60009b1ce3a049e29c0ec9a616ab41f5dee2ae42b1432b6ec9beae2bc54fece68c45d11cbb9a11fec005c3257f548e11cb2b2f620d8add53a175a14d651ce70897b905fa513c6c747fd62077c0ac132ae0009b1ce3a049e29260e296746fe6b62ef51bb076d63403d9dd28bb8a2cd1af951687d9807a1bc3c005c32281ef1d03b96ff9b8ad8c438eafc451fd474a77e974b1bfa3e3a53a5d549c84f365471a24e0009b1ce3a049e29f4179b0a794a9ab7de008f205290d0cd61b451355798388890dfe7c3a39c64f0005c2a85e8706ef2e4e016f51815d3338ab8c29e0bd03890feab9e861f0fcb68ed8353d02b6b0246002012000a300a402012000a500a6009b1ce3a049e281e3cc13b8fbb8e3ec8d70636c992bcee80d1b337057f0b41427c4427b18552d0005ace364e601377f95778029be79b4a96dfd0a7896c2f1b2303e461971d9ebea30943f4cbcbe40a0009b1ce3a049e2b4e14ccf65e60d36c57ede823110bd7562c0f8c0f049ba8defdf5d5b4cc3053c0005ac885622df922b045d350f2fc365eba43228e9c2f627dcd81169daab5f647006d9446a31d92760009b1ce3a049e2ba91e59a87bf672e95923cb10e43b86ebbabb4f4a2fb01fa585483f6ff74bf3e40059161bf58a22528cfae9a113091b84c87afe09d9300d3b4a590b6e84e8bbfa27c08ca0ddebb6720009b1ce3a049e2ad52067112e45a036b9df08697daac8e24177a46782f0157d14f2b648f82793d000575e6ba23864eb2b91def8b3e3c77a66db288991637f705e981aef30a18455d634d26513930cce002012000a900aa02012000af00b002012000ab00ac02012000ad00ae009b1ce3a049e2ad1efb0e0ca9965cfbbf0395992a2eade83565e98b98300222436acf0a2be72f000573a6e14b2c331cedd6eb17b65e5f17f4dc0adaa102c83f8c64aa3000dc42d836bff6ded8e1a160009b1ce3a049e28f9e35afde071227ab5f3caab5eb0daa4350e66da0e3d7a194ca2d991d3a2ee100055d2a2fd528fbf8b972b6a9871b613e1a8d863525ba82f6631e7b71e5abe6256e0bee0f2d99ae60009b1ce3a049e2b4d334505dcd39a6bb4f792ed13890391701ae5026959815961059a285c0cbe940055d2a2fd528fbde07ef68daa54c13e081ad58d7d53812e9544b3ebfdde0940e36ee1414531ba6a0009b1ce3a049e28eb84e6935c7b856525dfa8b0381f62310e7dab2020471304de2b1c3e43101d880055c9f1cd837914c243e0ab84c6ce8324939e1888aea6363bc3b081d6ad18eca492fb89a8125c9a002012000b100b202012000b300b4009b1ce3a049e2ae36f1801c7ae3a1bdcd366144def89eac79d0c69eaef506224c7f5048149b824005586c21fb593499867e1d8c71f6175a5ea27ba5cfc9e1d27e6234e65fd7306a363e0a1de3c51120009b1ce3a049e280805aea895da401bb87e27134e64515b16ab91038cd1f8479f38107a762497a80052d397252289276802d2ba64eec84cad5b03ab06554b3f0e1e57ac20967e14ebc37106f31153ae0009b1ce3a049e299949aa617a046fa49318214c75541cf2fbcbf9dddc6e407291b7e05a4fca2f040052a6608a0ec5b506a492cb59bef4c9ab52def25e140442bbe9f26e63e71ae787a9a7fbfa1aa8860009b1ce3a049e2b2885cdd3edda6c3fd1a98520d747531e925d4cfc31d4ff6f2cce42047ab990b80052563991afc14baf9675e686c90fe2a02290d434d32e987beb21ecda88dc46dbbec0f2537f5e0e002012000b700b802012000d500d602012000b900ba02012000c700c802012000bb00bc02012000c100c202012000bd00be02012000bf00c0009b1ce3a049e2934106f5c89c8f5676ca4cc9fdc53c2ea207a3f60d9b320557f179d7be8d29a2800515bc6083b949e158086f70a6e1366c4ddf33f82641fe760fed5c84a92fe68da8a3967be66b7760009b1ce3a049e288f68d901c2a2895879e7d8b7d2bfef663ffc9caf5b80517b62b95fd556c532fc00515bc6083b949e2a10b37bcb1ec1baed930bf99ce1842d6380c306b80fcb5ff2971f5fbaf3cd3e0009b1ce3a049e28620d25ebb580379b7e49381499f0c1c50051e1442fadb4f28f1610a3b835181000515bc6083b949c940fa67fc37c020ba8a5ce7e7a9e40073034f2005e95432538a8f9d72a496b0e0009b1ce3a049e290c083e755545232d61de019032bf69ea91faff1bc2c54ae3f2a014aa900e1f8000515bc6083b949d8ada53fbe1b8204016a111b642c5c10b6efb15a9157ee01f73d1fc76ce6f42b2002012000c300c402012000c500c6009b1ce3a049e288c8179ab5fef072dde7e569a22dd6ceae6a983769a7e5ba3cef90c46a8a1c93400515bc6083b949eb823314e26d653a3dce059977a0c83c970a98befcf5e75c937aa9db29d67feaa0009b1ce3a049e2a13dba1974462fe77771d70d9e73a6684052b316bce2b155ffed9e4c7f8bfbffc00515bc6083b949f0e08c7ddf1bfc3c18fc59d5a8c49b262d4a98de685d888117d87e80e3688c12e0009b1ce3a049e2853ce006446b7930b638963142e0b7a664493391074da0f511e62861240f6943400515bc6083b949c264b4a58989a560db1e2b784ec64a2cd7f1e31f707785189844a455aa2f019da0009b1ce3a049e284aa38353350913b9abd5522774703e9ef720c1ed322d60726840e81afbcf34e000515bc6083b949c9b866bb0a015a1b9cb4a04259e75c2854e14017f653f3e42e34e3e2f87ebeb1e002012000c900ca02012000cf00d002012000cb00cc02012000cd00ce009b1ce3a049e2b8fff0305bfd5a60a236c6070b5c9dc8e204bb6c7e2e1fd66519a4af004920d3000515bc6083b949c200da27d131557afb6ca1c7542ed43c867320507d68f6595dd01e0bb32c471ae0009b1ce3a049e299d7dd0a011da5b207b7e444a61707ec6c8891c20a56cc9653cb32b49529df85800515bc6083b949e22d3e8b9e0208c7324c00eaf69b7ea62df5ba4fa59714f465dee6a87953d8c420009b1ce3a049e29e6d6690a413c143e5d2e3a5353c22c8f9fd09b9e0623dc741bc66da2a42fa7e000515bc6083b949ffec45c828ddfd9fc9b3f6fcc0b358d37753667ccb44a8a5af094e0c9c6ec36060009b1ce3a049e296de9cbbce1f221af91595203da104cd00009450d6e55abaee19dc2efba7f106000515bc6083b949ebc819c25d36ea49ec9b99cfdd3cfaf91d642ba9dc94ff8273ef4a7b4fd169022002012000d100d202012000d300d4009b1ce3a049e29a6a7efeb5ff0185ce0ebf3702f6540f42f7980d9fb58ce4a0571531b80c5157800515bc6083b949cc9ba8487cda2ccc88d92c89a7c1459c7585459e44f942bb38fcf192199fbfba20009b1ce3a049e29f4a78690b22e9bfccbcebcde339e134371cbbb781de9782764d826655b5430fc00515bc6083b949d6680c6a2a94f3515ee812cc8865a8cfb40ae24128c0f68230d7f03c9055c1dae0009b1ce3a049e2898e55c43c2a74afbbaf559933989a7af47632522b8ca8fb4aecbb7ee5c133d0800515bc6083b949c82336dc9226ff3651616ad7d83224c1c7bfdfc647001283ccfeabb8a38e526120009b1ce3a049e294ec81723b594635a9c03e652d689e1975f493d2dab3b31a2beea2b4eb2ea762400515bc6083b949dba3eccda1a1a67603cc4de6a8b3de4f6f42c68b481bb25667ad0f2a4882697e2002012000d700d802012000e500e602012000d900da02012000df00e002012000db00dc02012000dd00de009b1ce3a049e28e80c043511ff071c78f8467d50941177867f99fb837eaedb83c85abaaee0da6000515bc6083b949cc9c22d344f11ca4eb99dd0fbb543fc11dfb1e86e3206669bb76df787e1f02bbe0009b1ce3a049e28a1311d267351803d08dc653314281c7d23465255743de1eede19f87b3d5485ac00515bc6083b949f32f2c478c701e91245aa3d88dd55817e44c73d0c42da9f2e84161d79c27c223a0009b1ce3a049e29a22eeae87a48c056afadfa3763d535989d1f610a9acb2938de015b9b6f0526ac00515bc6083b949d2e07107e20b6685a7c898dec3007a9785808ed41d747c0d75078d63b7c76d0e60009b1ce3a049e2bc8c86631c6ce4c89358d7c179b3f9256b6b316534f8701c4e82d345b25c8ef0c00515bc6083b949c51e74a504d562876807e239c6cb607461d858c47336791a1bbfa84f396435396002012000e100e202012000e300e4009b1ce3a049e286fd14340a404f7412f77270138661f31b0ccd599b83eaa04d6e6cb9824611ce400511af95cded3af909342cba491b08507f8a25ba54c409ba6d10cf7b9cb58a3eaf5e464fd7bfe5e0009b1ce3a049e281926e2d5cb713f31d989bc4b506db2540507aa0be16e1c7a9ab1da979c40255000511af95cdea860bf783a061684fbe1608e701ea2c6f13371cf276862016b349ebc1150977c05360009b1ce3a049e2ba1c2615be2dfbb2b030c9ef5edc8339e922ffae9cd0b7904f21b5372a9f0cd2c00511af95cde062c1bed0b68ff4bf4108f22687b94f94b3a45c56a98c5a293986b062a2c72c4da460009b1ce3a049e2a81aee9a2e7843391398024000a940a6a5b2c25466fad7251071f7970140667e400511af95cddfb7060dd58645d6b8d97fe4ba07286e084488fabb602c0872b5e57c6705ed9de6402002012000e700e802012000ed00ee02012000e900ea02012000eb00ec009b1ce3a049e2b526b6fd9b15aab6fc99562f6511df171ef2dd89c9d5d063f22426c01c52def9400511af95bbc77d28ea011dc72f54b87e8b43c94a59c6d499c19394fa56f6d0df127a393d11b77da0009b1ce3a049e2ac5c873e7d78772d2525c1c52ba5e6a3f639b085e8725b50b46089d8fc90eace400511a517634aa74a9cd2bf686dbe7ba6d440aaaf67f9be34e0b3d990749e7e700949d420578a8a60009b1ce3a049e2810a8484799b7a174f63c131de10f2848bbc3592d05316aabb2179772832ad8c00050dc888cc5c42024f830979f1ba394187d506e3dd3568fed7c2f320e5760c540b5393b590983f20009b1ce3a049e29e824da0f4ba7ae9cb5ce23a748e389f5f83ebff68cf794b9a9db608b2c8346900050d0bc20779adc23fef9cf49149b2e2a3fd7dec7dda3a1f0d120cdd262f6ced9b72be999785cb6002012000ef00f002012000f100f2009b1ce3a049e290c4621a9adfbb2761d9eee5d1319e4c230c465800d69f073efd903e932bd5f0c0050a38f74cdeb8064170278680894f6ea68ca69ed38d7c8004d9acc66269c52dcba495130bf58960009b1ce3a049e28bc34eaf1b8054264a170670b23136ab6e4bd2857242ead88cdbe54ab93dc7d1000506a50cc5380d8424f5e283adc3e8da52c90a2dcbd07e311c826dbc4b63dd81990fb6cb7309bc60009b1ce3a049e2bb2dbf8b6e184bea19c868a3aa6be1d0447bdd3c24d30735605efdae640c344b000503d609dea1fb6c0b948f616efdbdce362a389bdc2ff7c1596075ae4b69a6092b2a7535ff8c2360009b1ce3a049e2970a1dd062e310ab4c31f8d875c55ded540bef7629239e6154434eb463523365c005012938b3530eadcc150c16fe0897241e80f4413339d2e0415efaa02a2c352173263a0a0b3e276002012000f500f60201200113011402012000f700f80201200105010602012000f900fa02012000ff010002012000fb00fc02012000fd00fe009b1ce3a049e2ab6f35c9c6634d4a03c3b28f230c43b7b0d1797d6bdd522cc8554cb4feb07238c00500662b2b091b560b8a7b21c57d27f0931e8e6cfdb7ddd6b4e5f2799f7d8ccab31d578cc667e420009b1ce3a049e2afb116a3f3edf4d49ab1f0c0b47602248ccb3dc06efa3bd108306be79b33426b0005001180e310a49559766f814cee12945ec3c4a16cd5fe28b8aa917aabc059569c0591e5ab8eee60009b1ce3a049e2a3f84b08823c25f177ebb5fe9f997ee372fa5cfd12154c667d2eabf59791255d4004eee1784e4c0129fe01ee4c98aa31c42d62389794ddae1692e08d60154e0b6a8674d7a46cfd6160009b1ce3a049e281bcad54a7de2fa529cae98bcec521e0538ed2afbe227e95a7f6f810f376942e8004ebf3c38fd920ea3ea0c15b74bf9ca563a8cecb1faec9acdb620557a084a7c862e19df048f83ea00201200101010202012001030104009b1ce3a049e28b189adb95dcb8dca35b0d1ca2582c6b68f81b42f518c19a0d6719bf532ff6888004e34e6468c8b3ac7839a36d9c3a50549fe17f50cbb02e554a4b2c1d257004b4c9f707134a7c6e20009b1ce3a049e29412003884f54875a9c8b540f04884b16408ef64fd2d36cbc3dc42a15394b1c28004e1aa958b479e5e6d4bd93473ad1dc6b84176e07c834f1a1e10e2595739841ad9724a93503e1560009b1ce3a049e28cd461096d0b32c88872b8e6dd30ace21c78542f290117b2f8673c306792e9a7c004dbc68295258e45fa55f0aa07f8a913949529f844a6d4575c26fe919a23051ac8ba288dadf10e20009b1ce3a049e2974e7f00868d7bb1c607697a0f52dabab387401e4e3abd376bdfc73718d72d6b8004db011b2e447a5528e1f2a08f6c977deb5e1ba1eabecda6ce4b2ee114eb8f678ca2918f77b615e002012001070108020120010d010e0201200109010a020120010b010c009b1ce3a049e2b521d19d812fa288301c117a541e5c9f54fd04d2e7679335b89d1e6448aca8744004dafd621909e26495ebb678b36f86245c959728e2166f3600d364b3843284667a297061efb9b060009b1ce3a049e2afdf301472e381b89259fc98864d66ca3e13d0ea6c5794e48480053bb89561b24004dad45792bc37e923f7fbb1c77f24be5deabda8e6b8930675d0751aa2d8335dc8d710cb929842e0009b1ce3a049e28c78e9e3ba9b19a197eb12fa00684d49e373a6b586527bb8386349b493416d56c004dac75fe6e924295ae334a41002a3acb6bd81cee5ef4258f7c1003c7d2f7f4c3b9b385c711968e0009b1ce3a049e2a9947bbb6b4eeeb85dec5be9af24d3343096e22f33bb11bf6df717392c9e8c234004d5a53017c8de3ce1db1c705c494511a33bffd387a79d10f195d0ba82653325f88a7d52b8ee7260020120010f011002012001110112009b1ce3a049e2abb0b0b98982e3802762568e2f9526cb3fcd0335f5c9a064e20c2eb4a3bda98f0004d560a73cdf6468b43081357b4885f7d6a67a762a88101e31026031cf6ec6bc1fe92976035cd8a0009b1ce3a049e2b87a430387e3925c24dfef85cd091b34b0dd2a275b68348bc33c46a58cb9dc318004d3262619ec8c0d3a5c152504a1ce49bbd0c5f022169be07c1f530da7255c17855a8bd810dde7e0009b1ce3a049e29c89575bf1b6c1bff6eabc5a6eca15afaae0037a63c0e96ab50bde9fa7f7ddebc004cc8ac41869c359a28a87acfaff5de1c222cf4af07dc11e8e3fa4aadef5dab7ce01c114e5b9f6a0009b1ce3a049e297de58d8819d57d8befb0a517ce58f252d65bdc7b70a945fe9cb775dff3e2323c004c45da2a208caae53147ee1c9a4d4900c0c292df9fee569b02e0554c91ea3774f861af81fc3c960020120011501160201200123012402012001170118020120011d011e0201200119011a020120011b011c009b1ce3a049e28748231b57efaf55fcef49d45b611e89b6611fd51ac04f0d4c3c1e2ad49bbd37c004c45da2a1c505d25ea341585947baa0194b1406662fccc2693dd8932211203a1326a59f50ce64a0009b1ce3a049e2a95d643380e268fc1ca88214981347e891eeff8b60bb2b593e2a370ebfbe51260004c45da29e17962d16d52d1d34af75b70c1a1c7363abfc373cf7fbf3229cc8be80276825670bff20009b1ce3a049e2ad21327aed2f8aadcadb583d75cedf0a4a0ac104dd8a24ba9487a756c5578d928004c45da29941b6398c7b95f42a89c2a5ed53d6ae8dc665a1ae424ef1e961bac85be227ae5dfce5e0009b1ce3a049e2a9db6c5b372c5f03c4e7a0905185029760d27159730e377e1dfe60ff683b12940004c3f78196155b723623fe37a6a77b0547345396708c9363518d18af94528b92014a6d7950fe9b20020120011f012002012001210122009b1ce3a049e293f4b465c54ac0da9ecadff3e2630b44844fa5a01488f3e8cede03484caa7c2d4004c3f781417628a8dec11592e433234901611fce32fadd47e24f7536ac942b81c5ef7c26d979dae0009b1ce3a049e29ad7780a2a8b2c96f9455c172d5754f113aafbe541dd0454214084205cc3a7a58004bef496f50e9bbb08339ae393d96b9a5c519258e1c62c12c65bd32222ad5c45d8f201fa7c8d29e0009b1ce3a049e2959a9025a33a313ed50c0dcd87eeb018127fd89a0f049038919df1a1d4f9e4db4004bef496f50e9bbd9b69681f6a2d635073aeaad83c2107fde9639331762bbdc489662d80881fa460009b1ce3a049e29e90c1889611fb14d1f8cf316d00481d082828e5b9b7b3022d583da0850e7826c004bb62ee642c499d1dac2c9fa11b7233fb8fed809b60b2242e804da5c370c791909130c6f635d1a002012001250126020120012b012c020120012701280201200129012a009b1ce3a049e2a47f628bf7440cac37fac218363a01419c0335d4222cb357adb830e4fe8650640004a9d6781818665a13f11ff3180a7b3dd16e833c3a411c9cd17c8859c0c288098c80fa80b47b67a0009b1ce3a049e287e763cc3fba028129ab87775aa72c9c62f4df1d2c4c86faa03645e760e38b368004a8ab63d296914848cc771bbc8361d86f381187db7bb35f83fe8ad8241d33b8c2c9acaf59723b60009b1ce3a049e29f3765c787c66f3742b79614c841b3aadefeb61bc6d2ab907c2b8dddfc77279e0004a4531f1887aaca82e510b4d9f501503c4769c8f05cc7f25236f156f00aacdee9b7e06eb07ed820009b1ce3a049e2a6dda12b23623aa21b2b957a0739f094f5613609048d59563d9220bb3521ed2e8004a32ed52df26a2b3ff15b5771e8aa82e713e2ff3943969629e0f64e0ddb68165d190c2557ce5b60020120012d012e020120012f0130009b1ce3a049e2bf842884b02e9845ec43f1d935c0f2fad126dca0f410159ff1341411ddf9423140049cc101397b9722bae4ce9ca3b27c4b57c5bfd4c91ed11f604df3803cf0beddb4437b63c7ccfb60009b1ce3a049e296786ffdd72d9ffd047d93d8143d3300b3748229f861bf633ed7e8ce21538244c00498e6a142cdb646095072f6eb127007e98b0c2c855151bac6b94c20700df1f544969a2a7f853460009b1ce3a049e298b1d10724ffbe0313630d7626ebb44e6bcf81f29f77f9621503e62cddc5562b80049090fcca3b3bbb41318996d6e8ce34927a5ab553a01ea365fc17998486465516d4fd420aa885a0009b1ce3a049e2977d369ee5c0b1131dbb363bea211b2102514a2affe2875488b516ff21fb3b920004861e52c2b1ffa220f165e4717e1f52cecafc84e487107c80ec6b4b65d993b9262347297dd74ae00201200133013402012001510152020120013501360201200143014402012001370138020120013d013e0201200139013a020120013b013c009b1ce3a049e2a95dfcfe01805714d8ecad192cac71443d29d87b58eca9e9fb6c0f96bbd9ed7580047b4e4a333dbc83943525f8161f8aec2fb535335fc2bbb1ab0b47681903cb447cca69824f1b9ce0009b1ce3a049e289527b7ee1ad838af7cef042fafee7dd58197b7cae3aed081df473802d49e071000479cd33b7edaec0be1e2bdb47318045ffe1bb6e79f6bdbd0bb5413fa37fc222bfbcdfee2e857a20009b1ce3a049e2ad0951ef49283f7388a9a2b1842308bd48323c711218b646809378f5d159972700046ba29c165db505d2496398d7959f433a2c366c5656ef64a8b1e04f32f4b49c4156665ec1a258a0009b1ce3a049e29ac631d04cf2724792b7797532a7902f9ee7eb16087053264661a59ff88d7ea4c0046a6b94ca987ec3536dae1af1fc09513176aff7c79d638ee99ae975fd964bf942db7d0fb91b77a0020120013f014002012001410142009b1ce3a049e2878ab24358d879e4d6e641ca126e70c9b3e7b5a50894a6fdc2101ab3eb7cfad78004689f4250372e448921455da5b253bf0a0373e940dab1f62c33db1b6c38e2c2509e90b18d6d8b60009b1ce3a049e2ac3e48bf1ec491862521ac2872cacac03599ce29e7186fabe8b8e2a2cf0bb4cb80045141bd09ab79a3a49af7f589fe5c368507b67a2fbbdf28486af9372c42a64f913017cd699bfa20009b1ce3a049e2aa9633537f4e29700d1a50d8b11c706e521cd3cd3092037db7da8a173d1207870004492f2ca7f814963dd94a980935e004b618f63008b1227557d464cc7cf26e705a8a109108c4efe0009b1ce3a049e281e747be72e7562f35d80e9a75664b76817eb9d5241bdf78d45846aad315b89f800448eddbc393c93a152ab83b747d20af6cae343449237c3b902628861aff74ba65a90133c0e489e002012001450146020120014b014c020120014701480201200149014a009b1ce3a049e29e3ec9b2cc05d44ba1bb3fde8c1964e619ab3ee6b3816c7373c22ea05556ac9a40043f7764092ed8c3c44edb7d681a9eefb9ee72b66ec874c2dcdbbefef4f9cd0ec9131c6e32ba0420009b1ce3a049e2be3b39cdc97c1a422f546ef0efc79de3a2e54fc265e29847ecd2b21b3596a4c8c0043419f0f9ccb7faaa83f00bd051fbb5536517bb5a916537bcc03e27a87a7ec0af1943fa239f3420009b1ce3a049e2884e09fb23fbc1ace538207222743f5b11e0e908f4d1fd123f5b1907d9309adf40042841db966a5cf81055db64e196e3396ede7bea28437c1d49f6db06acff8689eb73b13ea3f53420009b1ce3a049e29769599834364fb33712eeb88a4f454ee9dea9cd0f06a2669b9e9acdf34dcd350004263754734801a763a6c36379ecbe3bd2c9d80028a02c67b03e5e663eb0a06339ab1fb7caecfa60020120014d014e020120014f0150009b1ce3a049e2b3c3afe8a2d94cd9de66c3ca72131ba6bc842e2786abc3625381f5baae66e21840041f4ffb268f8a7e6fb39fa18008021f69cf749ebd9830bafe10e67757265e392706ee3c38acd6e0009b1ce3a049e2b63115ad5520dacb7b4ac767b55c2e930c3c5ab485105490515030965b7c9c6780041f4ffb148b9569944ac68574578f8ed0bddfca72d4ff96126182d0aba84e1eec9c49d3719eaba0009b1ce3a049e298f81fe177a2920408491280f104f8c85bf7b63b91bdd6f5fe231eebbdd3ad58c00416506940e7710feac07f0e4bc11320a8da8b1b3a66462b53c494a4e14e76c238f26664fffe24e0009b1ce3a049e2b5f55e8ffc0121c18277f95b0090dca5fdafe1558ef3939de796ce72aad432d20004155dcf1529c6a30b8e5463bb6f4bae077e1956a261234d3f1df5317559c2c0cd5f4b8057f475e0020120015301540201200161016202012001550156020120015b015c020120015701580201200159015a009b1ce3a049e2986a2a52ff06e106a78c719a96140baaf3e7d76a39ff42e86dab833c83d9dd59c00411241d4dfc335d347c45cc9b3c30a240a3994be6e75f39126d0d63cf6a853769ef998ca6d590a0009b1ce3a049e2a3569a4148cc45574c2e675d1c791f45f20b22706f44368bd238f0d49f55f12f400401c479922ba309a0aba445a362a7aa7b5be60b52a9885315a3c192b5313e881d68322578e79a60009b1ce3a049e2a96bee34dc47fe7e23f5fb7851c517969ed68339947978b1b03bc950ebbdbcdec004000826015b0c26ba35a67d878b9ce8cd176458a2afbf5b8d642531b3f489a9fde93f24a1ec7120009b1ce3a049e282ba42820e1bec8a7a092dbbe3e066a0fd587f54974282d2e39537815d2d9fffc003f8f0a173b0bc87a27dbb19ba353b571991f65bffe5aed1f4760ec1b5e2ffb23dc9430e3a0be220020120015d015e020120015f0160009b1ce3a049e28ef19099331281f50d09e2360fcc9d4c80ecfe068ef6bc37ed233c79315d37c0c003f728c07314118e5b6248ae957819c53195463dd7a29277835a5b27323db64cea1c0b8712907ae0009b1ce3a049e2a2f345b6dfa23fc8938c959480a99b6b84a5f91e1ba322ddaea3102fae8e7bdd8003f514e49d07f4963653295d7a0ab3ffe70a8e39b431046c93e5a51976ec30f17c81151a28b62420009b1ce3a049e2ab5716f0a7f481d64f7f2860add8d178989c8a6476113a0e8f4acc73febb1ba44003f3fe4ce3c4a88303963b55830d2d2853361134b7618ab43528bbdaf687a69d26867141792ffca0009b1ce3a049e2a8dc0e126529b80eb5b28370a7af4a526c7177b27ac633dbf7438051808894f18003ea29a2ad7d39e648a634deee5132ed07cc454c7e774e25efa5b427d89aa80656253524aa9f8de0020120016301640201200169016a0201200165016602012001670168009b1ce3a049e290a7037c20274e69b5fb1a9b163f0b5bbd2791c63972f1a07ac8c56a8cfd72ea0003d6594ff9c08851f36a9b75b9687f793dec216c606e3f7c6bd8abbe1afa40a288e30de2950ef1e0009b1ce3a049e2ac92f6d70c904f5c1c11042d9d9b81d2869319b4738fe5c46d57457ac703b3c14003d2e6c5cd6acddeb73d6117661e38f086a8631096061f73baa8ca5181082177fe773edeae06cd20009b1ce3a049e28b2963f4eb140570dfea9faa36c25aea82ffd499c01d73a45e19f2f5442308298003cd16d94526b227242fbe7fc4774f4d3dab3613e7cafa7b079fa124a33a6fc90ca96baa69704c20009b1ce3a049e2b5b5d111d57ad05d091ae18092a2bb913d754ea84e9677bb8a86502b6c26202fc003c1ee5da5aeb5b751d7dee28e7a37b1e3572a62abd33af2ca3f86d1858a0cce6ff60bda6e3459e0020120016b016c020120016d016e009b1ce3a049e28dfda087c559068f933a7789290649b53ec0053032f300e1aff8eace5a3cd1a48003ba9ba01ad641f06d5026994fa04e5b710b4e68c4429a9e705ce1a95c7c0813127b2a8fe381ea20009b1ce3a049e287bda17ee58c71debd313b2139af703aa728a5b2ecd434af1754703c467c4a13c003b12a23c1758b81894d7dd51f484773b9a020f2a4731cc0bea996959772f0026844aed6d0b459a0009b1ce3a049e28b5f940fdfd8db04a3186b50fab30c8af097064746a94fd7f2614edf314c264b40039b4b714b064d61ea43d67ab725691048a03b4a4b10be18c03fc4447238864ebfbe528e9afafa60009b1ce3a049e2a7e1848a0880dadcf8136a77a0535d1c77d17065703f641ece05e0e15da952ec8003966bc620edbc43117a1436555507b67b126b413f84b55c58482661f7a5e81105ba616ba26df72002012001710172020120018f0190020120017301740201200181018202012001750176020120017b017c020120017701780201200179017a009b1ce3a049e292de15cb879f76b6d608f8cf7cc7b20de83b6dbd18cd1e9c191cce4980d18afd00038d8d95b4def21a023d9beb6ee16304988b5dc61e3ebc7d0911b35becc2bdf617c284de350d93e0009b1ce3a049e2992260d1a02e51d5afb129ad03f7f20aae2a00a25d20a62d1c9246fa9bc6d22d800377baa69107013d812c697eae700ac388711e6f6732690f3232914d4ed8050d0c4a89e7aa035960009b1ce3a049e297a87dbc065cabbdd1cb6b836c9bf51e22492dcfa1000e8865a7bc506823b1b640037359fb497daf4932130f044374de6c5cbd9e723044aec3af3f77b18de54c9b9f7cf43290db89e0009b1ce3a049e2987799adf2c47a15cda46aa010ff66ed63c2e557812ba1e5300114672835c79980036c93ca6d72129660031191e56dde5e0ca9fac0a7adb0422ea50b5a77769ce6754124760a0c9320020120017d017e020120017f0180009b1ce3a049e289f0959617dc1fa903c755806fc1a9dd9841abf432e19d614888845bd1861caac003668a519a0cbd96d40d6f38e60cb6b302febdb408fcaa67fff8c3271a40929b1ea0274b2e730260009b1ce3a049e2af13f9ef67e8a824bb6ee72b3e6d614c8a1dadd0f9985294c983fbd7eb6d9c4ec00363d2c5180609bf09a1ca5182f7a1832d9964fdae6786d148544642138d9c1d91c3660a3bca58e0009b1ce3a049e2889301ee64265b22edd01b07853fb76fc8a2194d5f4b902bf25f0b9f603c18c80003605a1df664dc29d32e6213ac7ee6541c7691835955b5c383bf1e277aca1dba4825d8b8e5b09e20009b1ce3a049e2a31a238a6caf4820e9c37f7725ec8c4e97f84ccd28b8bab8d5aee1560c1e0a1340034cf9366441b92c196c5b1cb6bc04add46eb9eb075aa93d31826c69b548eff130b118aa1f09d260020120018301840201200189018a0201200185018602012001870188009b1ce3a049e2842c917bf8a5a1c76ae5279adaa564180d18daa3d3519e22875a4920b2224e0180032fc0fa1f945e3a48075ecd741d50fee154318dc3c16bda368046babcf4d0ae90619e10a3b27be0009b1ce3a049e2ac5fa82d2695672447c0c12bc3e91048badf42c8eae99f2fd5957cf97adfd4e10003271f95d60e5b2517e02c8ac346b58789397d3a6037f74656cd72e1ec4b6567992d58e07d98d9a0009b1ce3a049e2b87fa86dfbbe09e0aca0479f68306c63d3210b7e693eebab96f1f718572dcd4ac00314063e5fea5b4dbc32e7f98f5f18ddf0847960f69dc56903cb7924ff0bd4232512ea170108e660009b1ce3a049e28e0c3a00bd0201489f95975d5f8c8fb7add34eed8d60f64394bb4c1ca4c14c1b4003139169e8c3c7b85c1cfdc020bd8aa220810902f1bb066557e3927968850f219267da0bed3d52e0020120018b018c020120018d018e009b1ce3a049e2b9a82c3748a76295dfcd8fcc3e5a98e5d5c340ee25049754989624b9ec21139ac0030ba80a86e328a9ea2d14b979198992f73ff458a40d76fe3157ee74c5a780e1d0cc1e93f3260520009b1ce3a049e28240695e73550a161b9d5f945c736822c941c44cc310561e3023b3d29c7b8f63400303934b8c6eaf256d776e804f4c2763599d0bf0b586833ba8e36c474f43238da2169b0746157620009b1ce3a049e2b6b8bd3ae6de2696dc380103889de39cb79dce8c5bf3206e200b5392084d030d0002fedb7c9ee18cf5d219533d6a9d383f0a19caf6dd415e9c444edf0a7739081733c5669a72c94ea0009b1ce3a049e2be51221d79f42f363ace53f8d82381a5d99536a56921a526bf3902922ad78515c002fd3850f7ddd1fe6f8d83ea8942b09d61d60366fc0fcdedb5415ac13f4d2cd690136d3d02d26ae002012001910192020120019f01a0020120019301940201200199019a0201200195019602012001970198009b1ce3a049e29f4bfb8e663830c51ca0854be2037dac1418d225f41033b15e79dd01dcc5f7a44002f2b1bd1248f7d7a22a2bbc6f1a3b88e34d3ec3226408f6df3caff6d30785d07bd1501961a0d4a0009b1ce3a049e28fa7a6d397c4e48c65c0ccb3be5c3f19e4bab8ff0aad7e2d388d86ed99b1a9ef0002f237ad524b0e5ee9c4e215c1203ad0f95cd8dc58bfbc667801c1ec68886d16573346915867b620009b1ce3a049e29a826db7f501d39612b1f9033b02ded0522e3a31d047ce7e7eb7b466832a51564002e9096b7398db55805a66889fc09b433eb1cac810c5975500818e12c8e0ae0e3bdc0974768e9ea0009b1ce3a049e2bae45c68814f44670a5821012ed8587dc497cd0d0a2445ffda8a6808097774be4002e7a967ac773775302e6519d43cdfff5af212c987ba369df8c801054a5e11436f41e09cdf9b3660020120019b019c020120019d019e009b1ce3a049e2a596791ec5dda98c1ea183f3c54e6cd76fb2dce64737f387b567983d9ac6ed144002e2abddc255b0ad2dca6096524a35a32e685ba71cca426b0e3cf91c3269cd6eeb73671b7134e960009b1ce3a049e2905b1d047930a894a31e293f722a4406903792ccd82c4e2a266d11d1f16aa5a98002dc55cb0e9384229141b26bd203d751782e5ec505807ca9574e9c73296495de83d5b39b51523fa0009b1ce3a049e2bb402ff304ec05a4522842eada9241b1eb0b2f942e8ac77ac8061bd96503f0904002dad2fe81faa773be7af211d13b1637d8ac7086c5f4ee0faa764f3d951943ee00ef5468c76617a0009b1ce3a049e2958dfc2ce3b3570d3f3b5261ab7557dca11b9e1f7a0f926e7cdd82f8d7882f460002d166e59d4b7809e744c630804d331bc19d8ea9526071fb66743a527259298eb9b175e2c4a49de002012001a101a202012001a701a802012001a301a402012001a501a6009b1ce3a049e2ad9f1a0b127105f7574acc9a6ceb7e9e9cc2139e77274b5349571307ab3e3c47c002cceaa45b20f8ff0d9d05277ea1c26ab95ec012c57d5a12090749eb1ad9f3149bc6b670786cdd20009b1ce3a049e2acf3899227b850ee35948f1971bcb12f2da13391d5bf604e052faea14a694ac44002c28901c2dc93587f135d6440bd6a79964873da81d2c0b7b376a26f07254059187ce262d485c0a0009b1ce3a049e2af185472ce0a748448c0efffb1e0f9dfafb29bc145a5459286bd0bd3bfb897dd8002bdad04a0045d9a17d1d73ddd00cba98a4cf38b3ac649bb9e6ce7064d651c825b650ef7e5e005a0009b1ce3a049e2be1939b3c6cdaa7cc9319a5ebed73df41fe94e08fc7c4a390c8d1aa95dc3fa9a4002bc096e7d9c5a167339f65d1a206965adb6c3f41c0332f0408ab3b37eb1a1e5030776b0cbef34e002012001a901aa02012001ab01ac009b1ce3a049e2b7593dc7aa6b124851cf5c8fee26d7246c51ce2287734c94b5967de9678a9a1b8002b6fef36cfca23b1f366ec8202d0d1dd0f7428a8f2368678939775dfd43322e3caafd2f9a69ac60009b1ce3a049e2aeaa2b9c8474598717946afef8773c35006c8f4e53484a0baf3da1b07f40be5b8002b5b66f905fab25424030284a2643df3e9a3dc27a4e92418f7d2863b8c4d44413bf747d8eb6b4a0009b1ce3a049e2b66854a24d2295d86886173eada78ba063034333e146173e4fee070c34120a124002b5b66f905eff6df18ff6b9ec3586138047fde2a25860445693fda2306c2e05c14512b598f232e0009b1ce3a049e291b54e3ba32abb096ca814055211c59cd773f80b30e24dd31798706e2226aade8002b5b66f905da438286f75181e77418494c8b18c5b3d9056703d5650263c2aa0f45774f662862ca002012001af01b002012001cd01ce02012001b101b202012001bf01c002012001b301b402012001b901ba02012001b501b602012001b701b8009b1ce3a049e2a188a3ca29d34ea82ae4cb323a1575c15b08bc9e783a21000b07b5d945f7f7adc002b5b66f905da40c356490435d8b26734a3e8523ddf06685aa2b3f48031952beb28e88b19587c420009b1ce3a049e2bb3355d32b3ec322d787d4cbd2102607d800f662e2c484731bd2634df85a224f4002b5b66f905b9d3808b604c0ce8b366048d6d932d77b0dc270dd59287dd9cae58c5c599887fb83e0009b1ce3a049e28fd758f22a1b9e2ca1a4833a73b692603f7207c4376bb3ff37258646b5ccc5f04002b5b66f905b9d3d67baa0a2ec93ba4a924e50bf0815259cad58a0e0e8a47d0a7feb3f19bb256be0009b1ce3a049e2898a39886659f6d537ef1feef5a6be1ae23d9fb18c2f6bb1eaa47edfc4ce870b4002b5b66f9036759b3489fe5453dbfe5e2c00d9a58d5920865ea58c8da8731fe37a74989b56dc3e6002012001bb01bc02012001bd01be009b1ce3a049e2b02ada1a6c6265a49962d0820d9523c0e4443e8503c5a9f16e59d7a9d3a66f28c002b5b66f903675b713e6329c1e0f7355ae0667f209856d13e7efc9fe21d87c8016e2e0c83aadc7a0009b1ce3a049e29b0a047adcfe61f92269024f8bc59ff0a9744a1941282f7d93b871729cd40a2f4002b5b66f902dada4435e1b49423dd16a326044b7c0af9dc8d51fb43bfc21a6e0edcf011820843820009b1ce3a049e2a022dbd0d3cc251b623792e55120883774c3c4ec891aed6bf2491465dcff63a68002b5b66f902cffda547d83c93830cbde24bf104cd2a3ae9610c458ec80c1a30a2a0dcc48367724a0009b1ce3a049e2931c5d8f11186fce1da5f8510602912a1e552037347e626fe5ea21267ad860de4002b5b66f90238c38e30bccbc20b0da660bcdc106ceb249da6953cbd33d6713e6a4d16a42100e262002012001c101c202012001c701c802012001c301c402012001c501c6009b1ce3a049e2a705b514b248177e73a850dea46768988bfa2ccd018f5861d25f684a537622e18002b5b66f901e24b3d42bc06e3a77fba211c4e8ffbfba78655fd20a3624c29e42cb03a94459242960009b1ce3a049e2853319b49b49e9e8e908e9f57c3d70b16ecdef24e30ba7a716267d539cea7f480002b5b66f901b6fd7d57ae37657359404c1e94e5ae5d51fea8bfdd72801c75fff533c325915f25d20009b1ce3a049e28ede4fb91577b4ca41cec9000469c690499441c901b92ddca003085d93054ff28002b5b66f901968c79ea4eacc9d314d9f1aae3a9dde43bda77e6bd4d95eaa76a20c8e004ea9f00ea0009b1ce3a049e2b68e1b89b31e200ccf2abf51eabbc24d47aaf157d83ce060270000e95c839ff2c002b5b66f9018bd0452f31ee76d4c83a5ebdc65266998b956d7c77e963593e84acc384cf8b48689e002012001c901ca02012001cb01cc009b1ce3a049e28ee0bf7bc4287ee5986ba8f9fc75e45173c81f347401e9d36d479d3087160d858002b5b66f8fd27a9b28de42ca52a505d1c22619285238fff02d7b6fb8c96e62f7b7a465ef7b444460009b1ce3a049e29b6531631731360c1edabe7602c6fb1b8d7305e56c74f7c50f111c01600b3e568002b5b66f7e420987d88a02253d6d6538c80a6d2083fe31c60f28bbde53e3aa1afbb68ebe8645db20009b1ce3a049e2bcf9cab8637b9dbc37e50eaa19e71e9539710feff431f5607953a410c3ed8c960002afe38da90c790cb07efad3a6a6b2b17df9688981b3b75ceacc5bc448fd9e5dcf567933d474eda0009b1ce3a049e29842c595f71bf08c7ee5e6d5224bc54b6d4b2da2e087b263ecd46727f181ff3c0002ae0457a11964fb88705d8a1a927b941511fa4dc9dc5d50d0da4cf7fbb48496bf1a962df4ce1d2002012001cf01d002012001dd01de02012001d101d202012001d701d802012001d301d402012001d501d6009b1ce3a049e2b8d040e16b633291abe064d7b242ba06646791d2a9f6e6d013da8878bb6cbf0fc002aa3447ae909112ba92761425bbcb6844ea868c56d0429e313ee963d1288a446edcd97251350760009b1ce3a049e29d7928b30b0549ebdf90c83b44af8b635ed6c5b95d4e98283381e1a55a253d508002a5c97e35a6d45fe968e6748584d4833998ab0f2118fc101699e06d3b0659322cef4c666802ebe0009b1ce3a049e283f2bee78122fff36e855918c29b8fedc3a3c671d8bac1fdccbac87a295aab7b4002a098d597bf843e11c57246e6770c27b5507791009d09e3912f7c16e08bda5e5ef9506c4694e560009b1ce3a049e29ee341dee5ca29341e3900fcaeddf526b1f96b706707f22918346b6b535c5a6ec002a04ab543c78998324d3181966a141c514523c202e2a22d8aed2506b06ebd09b6abe0dfff3ffd6002012001d901da02012001db01dc009b1ce3a049e2be3274d2706996bc1187cebdf95cdf17fa6826bb12ecef8b6803c868ac2c76b040029d5216047cf546dee48b7d754cb10756ee56e24b1f947b72bb5d6c4dd820300e1a254e716ddb60009b1ce3a049e287335ad06b666988a118a0b724922510c7eb17355f5acc11c93c1b791c1c4962c0029cc7b727ca8f5a24819b16ef4e614fff38afa70fa7d6f7a68b75728272b882e324f5680cb623a0009b1ce3a049e2a92b7b1fd1b5e2b465c60cbf534fb8ad0102d0908914896ffea9df3b20072ab2c002958b1f13310eb3de3900acaa1c1d147728ab1a4274054f1e3e7870d5a30dbe53d31bf2e559e7e0009b1ce3a049e2be25f1917118ae4834b86a9dc84ceeac015060088f65495b401c2c905e5fd27d00028f7605f4006131fd43f1e6c98cb9c0d8c3b59274e1026378fdc0dbdb50eb1d801cab3747f5ffa002012001df01e002012001e501e602012001e101e202012001e301e4009b1ce3a049e2a0237b7c7b77dc9cff1f524c80f9d317cb1cc0ab38e21dac4e352ee680635f2740028f563c4762b1358225a84ba60e141b1a49f40e964bf444a9135d940fab32e8a3cc9ae2836eb7a0009b1ce3a049e2a68ed1ea15a976b3683b32259260cd7eab14ebc3eeb11807d380e4d47651374680028967d7eee53a405ab8bbe1c5e2e3b1e546636910d34eb91b232b31e21ba0b3b2162e599de997a0009b1ce3a049e28c904c2e3837ae3de44b7c2f2b5fdad3ad447454355e20ab0d811e7dc15739c5000288745a4466a22758a1cf665f267e2c057047cd643bcdbbddfa2d43aa470886dd9898f9fefb6d20009b1ce3a049e2a2b41794a73abc6bd842f35f1983e68049019f7724f702fb5dff3cc41ff21576400282f80c5da6d94cb8a8fbb84820193b4d204821beac23c58cb8ec2ac314ff35ed535aee0078fae002012001e701e802012001e901ea009b1ce3a049e2bc763d74aa8e2bb1f02a60a8e47ed6eb86c1859e2b587fea4c859012984f7bfcc00277c9847cdfa260d011e830eeaf39b99ed78f7c7e91e0914678ca4a7c6edec4be7ab6a18ffaea20009b1ce3a049e2ac576a23a54d2c3ac938db7d5566ce7fe6fefaf861f8bdc39d5b0f612381a5960002728176a3a75162146cf7c9dd9e666392a3c3f6b4d3032b13332abc5b3f83e047c4a556a8a380e0009b1ce3a049e2a2b7c343a9c72357c1750a222394d9a08ff092f4946f431a5afd8edc176928e24002689a6fc955c0061ea29453572e3376d806c49c80fc3f1bf871f69227bdf8413c4479036033d5a0009b1ce3a049e2833ea0d86c76f578fe66e0c90f1383000085510bee766e65d2327a30a4efe7948002689a27dc6869d87ee340235f5a8975b70d9330b6dbae735efc3c36109bb53143abc134da125ea00000e6a644f6e6ce487081fc05005e0000004e1023470dab0e0bdae342e8e82ef6b4a30a9d6d6853e97544c776ed058319d140dbef0547a5e146d795e98122f841ed85a3d80a653094b7d1c19a17d559d49418e32fbb8bfe165f94986cdea26a9544dea354b6b382ae3c1ec6202a3ddcc2010c000000a80bb22e6aa566631001b928ea9423e19ff4bfb78af22c95cc521892e2ecf46740cf5e723f92e5c80460a7bf209cfa062a618f3d79186bb63aff2c27867d452aa20c6a8e6cd473a4ca2f36fbbb49e6fa05c97ba4eba70647828c255e23dfc77c04000000b8d67085f4e408b886df79c1cc2dc5b32e24d6529360aa13db048987f73836f8402882120d320ed7b3691c435dc3dd8a3352dd588edc1498f042bd18b9bc05598e5dc35cb1138187db57c4f2429da5a01e63625c095b8e0d1ecea213053bd2160300000030d95e320dc002ad40d9588351beaad7c46315da587e29b2b8fe4397fa869fe040af4b6c45cbbf99f1f9583719698053c0016f0932038e1bb242a334894338d1fccff81933efae3b865608325e8f5204b03a5f3f2480009a813bb084d155282a08000000a0ace49ee84706037e0bf0e48d3833bb0c7e87c177201b9f6ee0534fd502ac3740c90fe3571cd43879c480dea6013632d795171dafd68db9075b4a0824088b707e730ff11165f48fdbb94784afde7e83250edca0e7b2ac892ece4a31c43b6b3500000000462df7a31fe827377fad55aab48d44b8636e70e0fd4d629daa6d1ea292e8913440bc755e8f835a0781074f0e8eec734f8314b1d838e80eb3b0d748d71d9b97d10e1cbd0a8ee1556e8fee97794b5267658499f1f2576ffb67dcef283579f47668050000009c2b3ba2e7101530442ba3cf186cc1967af6be2829f97cb7950cf60f3e61c0cc4087725fc6e9bf50b33aea314cf4249c6fe96a70bd17618ae45d736a712daf6f869d65396a9372b3bc0f010ebc50d6b0b26c84ec94b523a03538f039f2a239080a000000c52fa4d648ad74e994ff1d8aae290a83d047c7f8d4a21054ce98be542fd1381c40e98060cbcc88da94332e133660241cfe5821493f3fda61681074306334a04c1437dbf1f8a4e2796d398a231a3aae1f38a0cecc88d6ae40de95e642b9f2ff9f00000000bda0c9bb1e70f12abe98b482992156682bfacb8531e2ff4317055f38b802e9354000bac6037d38adb082c03a5649288ac26617aa0cb332f494a15cb996385003880b9f6b75c10b1c37dbdc37789e461ed6bc3562be3b16b702992de0c6de8c3a010000006b94802d51844ba482b80b91779c9f89dbd382aaf90ea6683ed67486fbab2d78407a8adc8d1fb02833b0b0a457326df43502bd563faa529dede7607c0ce2659a0c253d3d6b952881c333f72dee22af6571cfb400a7859138b05d3ecd8a4480e006000000b212beefaa4feeb3b622cfcf250b41710bcc1240a4c9baf35cb2ee8a93cf3a6c40ddf82b2a5348b92e9a926857168aa22bfc21ecac42814f75a78d2d5cec28d38c0f2d62646e8f5688e4fe98227b12c4367f79cc13b288368840b3807622ac4805000000fa3145f25271dbc9ec47be68a1f8a0aec544e00047fbda3e137c891c5b33ff5b4070608712a1ef70948d77ae1424ba9edad5f9bb6472548c39eb641f4455dddb42174674fa5693425429851849f29321c07cc5886b370e01d7278465241167180f000000e9ca4cbab039ca2bae4eaa73bf16a058b305b477d733c830a5d8113b6c1d6b73408f971594f24820d5aa72de45854359f421a27015f0e3e4a208c955ee7526a210c1e5d8dae001cabd065ab3d664629b01b91f02c5044f66899c235df6bf8d7202000000c3bebb2d53a14864c2572c13c2577591d0d3a11301a0dafc262188ec8d767c8240959bf2ca933ff5ec180d9841f6f14a100840c5ac72964385e32cefe1959179dee90abaac45426794a48a0316615c3a9080abb77d2c049bd9cacead2772f25e01000000a7381aa3f4f1bc13f90e703af5d4c92603068b2f8ec0752067cb429edc834a3640d05b6fca154f4e76b5799a7341bf47453260fdd429f82b2bd894d72e97af41f005f25152a2c61ea5c74729245bea09f129af160b07ffd2e84ae0de4d77b1340700000034dd499d75dae5fd62afdaf567962290fa08bcda80e38950b27e293f61e9eb1e409047e6429954c2de23486c3930f0850c333a438d4663eb019c42fc48a6c05f53dbcf303fcd054e6c39e6df9acc3c94c04cfaebd58d004b949c854da699c1c5050000004f7f8dadcd7cc31c1e88b7d419c78d4b5097d17e5e9d74c2b3b32c4f61c53671406a8db44e7fc34cec26433e91e2dcdb1d27c8cfefe6d3a118f17dc8de1165ef383dcc5e2e4e1a88841fece461c08d15eb9963add29658de98e4a6b97769891b09000000fa523e38c6135bbc1cdb9e2cdff33876dd946d0897cbc23e9a89ae508cc33ae740cc840728200f28efa5d940e3871257dc3627034b62c266c76fd18dc34a423a94d329da1fbf31a3053ffa11a252e36cf87e09a8dc64d1bc0c16ec5e2dfb383603000000182d99dc8b59fae398bb3ec458a033fe4739b4d3fc06da37386ec84f668831ce403350f466a93ed7509dc17278d13a5f3cc1216de8bd8e4f9fb7a765dc202005dda239a4d7d7a86c20f47f393c75d9b783ff784e56152762b01d3c0760b7c56702000000500ae89bdeebec2347c477441f54b15e69e6c5ca95241d1d1f021a29103ed94c4051cddc7baf5a8b3c91bef04de7a22861b08df8cc64c0f8278ea3178ceff4a4c9ab21b0b483fa8b9b55d0a725e512d3e0f5d1017df4f0b1e2192f460045b2ba030000008fd9371ffe01e4ce3763c84a5ce8a8a4cad233b3fe28cb604f34a7fc112fd796402202d6063b4efe2e8450889e78e75d87548cb5ba69fa24ae1f6b7c54beb9f1224cfed871066c8bc7439da4076d8faaea97abf9acb82e7125e594a8423603690e000000fa720117377e548e8b3d95b8c7df16a8ae2a2c89f7466656b451b1a68f6f766140af9f8524f02693706943b38b8798dad450faca2e79ccb81829200a72d5039ca6c10e87cd606facf44f42313a6a20d31a0ac55be6341b1bc094795242b18ae601000000a4fd5fa73f21b18c861f6ba14dc142364121f5d2109dd9e0099df0fae0c89f8d400cf833ae7157b4a6f13d40a5cfe006830e34d25f5dd301d3e489f666342559b3e0bb5721102937151e76e192e6e19c4e0c3ab9baea347de1c110d4d664b62a0200000018a2901b86bd7253be1ac4e6103421613e8c6537694d7532b11518b72106da8040d4b6983344db7d56a6e6a7460629ccec745f66788705ddc72d8e32a56e11ae505f4a816a8605d46beff7f2b5c23cae8d0bc3e69d9f1d9c82dc604212640758020000004a0b0678d0bededfe09afb1e9fe58fce610d219847ca863ff37c5410d5ec0caa4051444949d085c34eb1e00aeaee6b19c16728052a675605b5c0b04e945f4d2c0ac5d9f86f08b0ccc9d0d0dc99071fa3e0a79f0526d65fe25bc16694862f979b0c000000630a2df460469a48f433726be2813fac0d02439cdc63e32ae8bcbe5c53f930be4024d052e315e8d980138b123be54f28ea561c67ff6be8a82002b7d9eed5a4c72b7ac09d2e4444f4a15c1954af99636297fed6a40c38ae473f23b76d69eb803e0f000000374b20422d0367cd04a2b3eb8851b51ee6c0d808950436b1ccaa9a0ed52b1e36404c65b69c9f9e98b3fa31adf74cb98a7295dad5cbef75a9936ccb709cdd9ea4a2e4d3928b21c11d991ba77fb436905f43997b85a76978a70fc625de463c0b830f0000003542bc271640e0d3b01f06114cb2b02f724c465ca204cb1cb4d2411099f6148c40c33fc6891789ada6c935cbd72e963d2ed51a4d8f4c6c69820b98a62d0f29cce5741077b1c6570ed4dbe02e48982eaa3db5a80d2158bc97ff854828fd09b4fa02000000701ade6950ce26fc3ab6daceed6c206c94c4d7b2de0e46e3d303243cee39507740d78cc104f83a84c64c2d5d481a849b658a5f694e9955adbdcd9d99107502b358f0387f4a9135e8e1837fcab4c2c69a3133655d82c299becdb478e59e438abd09000000527ed5189d82e1a71cf10db3d95bb1c862a14e98933d9199da4d6da152cbc114400de0c339e4dd0063c5874e8fbb8e4c33eb0f01ee940be448746d68e04f4a333ffdb6ba332824267f97692c731329f8d18b1cedd7a840056e53c4a96f695e7900000000e566ca9a3efbd378c65135e4ed2c5ddc5d3f22b1bf892cdaf160c184d67231e6401df210a8c2979dcea0b5d41c267dec37ba67ced131bf2d7a0f6227c2fe9a031f24a0745ebc8f21dfe646c283b39b563249796a5bda0f8a7be66a370b53585700000000f2ac934d99f52090585e72772fde467efd5be228d1095dee10c22e937b67c4ee406c255c161e6bff0d229c61bf9c136c728cb6ebdc68781c62b58a7ee28b8e3567b54bc8c06757a217d4bed98693d7a8b103ee04da73f798e86e530165b5c4cb0700000024203cf446b5deaf108b3e96a234ed10455be8b0f1c5f7bf61c65e694d195865402ec368e3b11bf1d66ee52a25881efa100a5b87179453536a20161dc36c4acc7a28be3270dcb0627d6db8a43ae16532da855117258570285a63d52f0ae40e900d0000006f648a66ecf9a5befca79ddbdff3b576b2d6fb82b8bc7246b20bcb6bd11c636a40eab6fa7067ebc6042bac45aa6909bdc8712a16fce993d7a9966dcebff29d34f9c1ae912c3dcb116be1ef81b142d0f5c46a6349e12550ef0aea58a55eec9a8a040000002bdf0c8ee3efc21888c8cd5698c586a840949ca104885fe13a1561984b264a9b40d7f7248842851264f8c0eccd35884624e4012f2b56ab7233c5490a821c9c80a489cf71b76c0aacd6d94c72c3842b866e2987fe9b607946b5ce73759323d81b0d000000cec0bfd8bde9c4fef4b78caa853a3b56cde1a650d9841c9b1a10b6f35cd89c59406304d118a225b9ebd43902807ebbdc1e4cbb9080fe0816824447fb47e91e9ad36c0a1af621f732a0d7a662b807f41a15af355353c13b5246d8be7720ee9560060000002da7cae031a102616d90a7142d22aeb99be0d63fab7a62f8fde4e04e0a27f4b54014ca1de23558e61e07b9cb8df6f122aeef06f661b67e97ff96cc9c5eb0cc4621fbcb7f132985ec91d023741788725cb6bac8f45e60caf8181e423c320b64bf0f00000041537ac578be5561db8211c9bc5562c3694e3cee7333076c561afedb4db78159408e9462d3b1ee32107ddb3e575140dee509f2121632bb37e268b9ba108b4ad652b74b767a73d04212a49461dd74b13e9deb5243ff46788363cc983ef32f409605000000063c57e2b1aa9bab0a28150e0e2a9b6f97970d6b69623dfb8073da5c4b5fddc0408407c4d01e81f30dc33ffd0cb754a7b8862432da202c5f5c9404ad913e169b980c5ab2668bb81edabe49de705b5b122a25c4a84a88e1c3c0e47dc64a7f016e050000002ed5af012d8cb9f2ffd3f6272abd50897a2bb08317bddc067a969386c38a42294086bad68d8c687db80dbb8b6054a911243110716c411a0849bee63895bd3f86259fdcb5001fb92d00e9c1f3567449c29c8d791168a1cd5ec47d84c285fa360706000000f90ca26ae6a033fa52f6a7b01a7d8bb658ab3b47800e350a8916e0e4093b1d7740c13619273bb1c1aa6ad96c09a3c888fe4bb4f259fd36ed87597ec0ac30e47692ece0e1f20be3682b2caf12171f508450e37fb2520679d295ce70da00912b5706000000e1ab094bb6434414a2431e844131db531f1f876148172afcc789dc0266eb049a40385779e35d56898979d519a77bdbcdeea9a2eec9f36c98ee5734d2c9266deacc3da1f6b5dd33b1c026be0a7ed71f6ce5680d6a662158b45d860b2f6764081f08000000b8530b2c1a8b826ce48ada2532cce4ba28724d24737ef345805eb4a1710b7d8940357484c8683b4255ac9c39344296184c7618245b57029478daba7c3cb406ad0ee4fec9eca870ff7b627aed79a2e4e6aed7eb01101c0540a12d706d5627e9bc0f000000aeda1b7c9043e0732f0ba8989cd876286c4ca7e25e3ea1763c51fb12293e094940ea50c7552e120ebaffb365a71aa2c246dabbca992a7811a64b290b3cc930deb9ae39b834f36c03d44ac74341e4b4cad839a73e99651245296ac22d97dbdd2c07000000a5303445e2a8350579b0fda1e4404a5cc6669c04f91d9cc8dff72cf1b866fd3d40c5eb0080d53a7c063122de96f762c42894d7acdc78f9bb1173b3c655590b1391eeb285752d5fabbb5855ab0629d09683039a2ac39f4c9384cbfdc5d868a213070000003b66b147b9b7182eee74b3bbd9032038cd321719a382afef6f2819efc42708d940745ae7ff56cbdeb1bbce4855bc80b76a7ceddc6a127bc09d49503d539b681739c44eb619ae9edda1286898e27283ad2b75baa60671d05bb97c134dd45cb0e2050000003ac92797787c6c84e941cf9013483430b5c7bbfb3b2e6f8e8ae4c94929bc55de40e43d9116eaf5ef152b0d4d2b7ca3f5eda05768908f0769b1b7b323b9eaad6374133dce04ec1aa180331b7f54bf1ea4baa94eca2f2d13dd738eef636af470a604000000d068c079a7538ca5c1fae2cdca0bde75b1d2cf204f5247c9cca71e6d99dce7544080429c492b8d16e130148e35b9af4178d4331acd2d25be1aed70091f0907230376fab20c161a449783121e6b438d16b6610a7d4ca79d99a0e9ad31838562a70a000000b80643bcfca717b57e40df04ceb842f61cc5db398cfa15df1500a2eb20e406444082e887ee46060d5daac432366a28160d9e21c9cdce3cbe71e1b3e5be6a70d72bae64a350e2005abf533235dd48e920e4ffd2b92af12659e4f26bcccea043210b000000779e0cec36c3a4a9638cdb38cb70c32eb48de18efae134b6ad8d6e4ce99ebc4a40caab36dbb49be30478734a58c99bc14ee59f73b27a458eca04ef091d8bf1f035f1bc42e3d3f0ca47db5115230043ad2d2a04df0b2b99e468d411c8382750e2070000002ab732efdf4747b7d60c2f60985de1d8c120d7a7d2466df2a07b1dae466b90a640f1c6faaa26d1e8a71c4f1daba53e4776d24038833c14a97e9a2513287bb19dd60933667c7fac1248a14891b58e3bf683bb0b92ac73df55d6f0521f4b53a3430e000000b1f3ab9ce8a35dcfff2bd411cbb72485535f249ba2f681494ac4e20a6bfd38af40acce32a4b034c3df7b514d3181571dffe828218b1bc043f1a484248e2e272f113539b707b2fcd377729739d1cbc40a8c408e8ce94a6a11f0c3f2e76affd5f40700000008865ed58ab14d786ee026a4539a2fbd43335b43f6822383754952e5279fb90d40a0f5272e9e58a79b421ed0982eaa2a3731b859c01e124f4d77e4b7f53a2e5ff7c90a3c794baa3f9b4e370bb4d88ec799623858bd41dafcfac1d2a15be5a8dc0a0000003e87b6d46552cf298e15081e807d238cfb4ec875cf6276d1b9edca3d8d926d3f4091623f15293d4b328f4b5e7e6f486387f7e5f8efbc22c4c186ab9bfb31f1d8929e39f64cf1bc578fad0bbf1f9a03a10ff0ec9bc8add61bb788c2113d819f9b070000008500a81b0947472646bc7b50418e8114c4f3ca2c1ea44623a30072a187346f25409148de4f7f50f45f0ae6da9ca9857ac371e2a184ddd860c9cb9a9967c37b95ccea1f9f1ad0b27fee76086c0683eae336a3e37ab5c796f4f245f15f74a8f62909000000f85773d5c89e6da6e444ed89f53b3254a75e01bdc305edb3bd6bfa79851484e0401436c5524d3a6ca5777303d3d901a33045b2c273d0f42537702a8138198e8369a44f49b23d1a3d21e0a03cd2fa2295d867fe3e36e55ef131e224435645142e0c000000fcd9d01e3a203de1152b6fcf2ac11a35a8ab78a8544714cb9aa7183edcb4a3a6404dacfe06145134631c5d047700c0fb118dad259b60e015efc89251c16e57ef107512db6533ff2a925f00ba76640793926bdc1a28771a8413b29c1af7e3c35d0c00000044d75ed226ee97d5312d85c0bdabb7797bfc69857b33cdb36d60fd2580648d7b4028dd188efda54fb95fa12483ce79aed85b3c6974e2d9c838b932ff18042e36529d515bef82aabee846a7a45ef231712bfc8e615391027b16e22dca1c5cd2030b000000e776ea32cdf5879647a6ab820b10a57574fbac09305dcba527851c42e53ba060408e85553c3dd912cf39020551d4130bff41b1a5f181fc818284fc9202a3608a19f467640a1fa05183b9902fbe1af3b643ae36780b0308c02dcd28435250f7b90d000000689b7ce808d9809c1e27af0e9dbe7993361f54ee682c278c43afaa7ee6b91c9940995b6ed05196e5e655122584a5b1e1a8879058d13eb353bf1248f2c2870570f945c66f8316593b4884f7daab0c333b6b3d8392f41a9ddc2601a9ed000cf05f0d000000da560e7206302b43d1a981751e526148c99e590f6b580a7058ac48e4cf07c9c740e5cb99dee7479cd41de7250c8843c637fa49797f3a69c509035eb6e4260513618a1fc21c7ff46f54ec42b9087d32c7b517e08bbf8f63c2fb79627044abd28701000000f752366bb55158beb9922ef52f556367e04ce50e65d049fdd959ce9022a575c04090385e7cacfe83d9baf2dcf1eeb1646f4491541b947e596fd42bc9dd98a51889d9a9e9cb7366d0ab2497d93647dd962214d69a7e610c4f485aa1665a83c0c20000000026a28e7f47ead75eed0319e5f8e27196c05efc36a05c4ba71d02c3412447b842408d6dcaadd96ca0166edb3e353f2c79b037a6cbe4cd4f71b6c462fd6513c1ef258e0b838584b202a1dcdd2fe1b90a71b3b6363964e2de94c8d3b69a65ebde5b0f000000c8d0e3d8a0b7c9ebea5c791ab22c2bc52a81de35d5e616fe72cffb1939f24d5b40d4c00d26087a89a7e02a4bb95baa2e9a8d38480ad3861d77fc3edb8b5226b302349a040f6d38051ee1bcab846b11ccf0e65a56d483e0305e5b4acef618dacb09000000a32fe43007b3d8dd8cac1890ce5b840000e565e2cc7538fcbab9df60015a7fa540d0e81f5a3c3e603906867f8358ebe2afbd61294053d1910f8a59ba2623c786f730984decdb25b6e1604da542c6d7b64771e30300464fc9e2c2ec7c84bad39d02000000c1eb31547b87f37ac931942667a33e35ae3b2039ccb36f8ca770a2d7e0c2a6e04023d3c1a936ae8d6219e4a5a3feea19554c2bfe26cbbed955f52d0e1a0e1c5d50655fe14e081109057980ebb0b93b0c50d4244548d1ed9d4014bff36d316a1006000000330aa2759045867ab82df3df4dbc3b0cffb461416296ba56d58f3b369d129c9e4069a9845c76d190527bb7e9a1cf231530fcbac27919746ac13db6c78effc56bee3e3eac0882141b03da36905c31813e6f167d8b42ec6532dec9c0456460613a09000000374caa91c4f8ef7b3afa730224053086b306700bac7e860a756f4b29a2601ed640564bef8d16cf3e22640b25b8c34927c4a90d564fc98a882577c0b2490ace021679553fc125a69156ef64bf02c058bfbeb9005b67a315c3235cda116f9853b303000000a93e2d8b048f76b4491e3ed398ebbf661f56d483833391663e1144ae74b3fcf340b9f786d434999648c1ae7cf7c68b0e1a1e0e9f10e3d47cbf6628c52178e1700b7a986ff6e8eafdb54237e76788c262a2dfca423cc723539fe0354211370fe70f0000000a9f950f43612b4b2046c9f47de5d2dd9ed09a2fe7461f2a9bec5916372cd0604036a83b572e736b1096f331c076a0664e83d77aa7300daa33d5f9862e01146bcd8601e20ef9cd1dfcae5853882959208d35966b5dcc7ad4fd4b830dfe390aa6060000005ea91d155a6b895bcb571622bfd2b6e83da564636062c036e42fdf33c33b1cb440b05168f53e7d57e3ea80b6edce68e3838474d1c64582c998ea87e18613602f075252a4a79a325424c279717b70fe71c6125c0eca3c48d784e7f278c9f073000e00000027136bfba45a6b691795fac29222cc373baac0f6284f4de4668cabb3075b34af4059469736b7e200d645ce499dc841bac2a97a587f176724f3bb26538bcfccd282235e0c2640ea89f2962d88da08de35c56174e6ffaa8b4816d5ed4c914840c502000000e57b9ebecbdf4e496efd18daea9d18853e7b5ddfd0b2952e13ad04f90b132180403bf949f7e61c17c7bce723b45c94b8fdca8fff70480b20bc4e6350cbd93d086e8eec90f3cb699b635fca7f504de05f3fa37fceebe1193363e7e64d990c107908000000fbc6bc76b3459f1d95d72d7c4bc9635a225293946ccc41bbcd5a50dd27f5596740c7e5d8d3ce02c00fa4fe85af8f1163a04659c877313295e53e730b3c09e3f9db2143816b3ff6e7f92c5a046914009718deba9fab5b43759d92b60d1752eec804000000280a9d5f898a4fb73bf8fcadf95836d4f884e17998da05e1723ba5493947060340568b2b9302189f41e5d865a217a8baa943c82b1ebc760d179cbcb218671055496588a9b262fc7adfad00829baedbaed30a226b967679d6846abf6659bc1ae30e000000b22408836b178f327aa0018dd572ef6775826fd27eb7536833b0153c5425c2a940b5463761bc6bf6bed80b0c539c797ced0b2a9dae6fa4f89079f2190b69acb256003ab90bf799f1594a6a83e1ed03624dbd11798a9bb470e65f02a80fd95b980d00000051d28550491d3f5a8b857a75b739830bb726e28d90017af6410f83627ffd853e40cd263def7521ed4d09576a3618bb1e4f47ee12f6423ca17d4f8fcffb71820b69cd83b3358c88625b665c7c9cfeb1331026c539c363decbaf5e9385d56f24110b000000366a2424b37e81343c0e3e2186f32e07f40fbb83f5307fb958f6dcd7d055b89540f1e95825e0bea192b7ba106d3c0c17d1c1d80be10001a8f46fc8a1a2fbb7d022b7feb93c2f1f5aa16af2ea43d25f10f4df7a7a9a9b74b1dfa7e72c3bea41900b000000a179a89f80cb2349182cd407697436168d4571a1f4ccaf92b166d99d8762622140f253934a494631ac8380555158b3508960533fe59c92ed5c75a888dd1ecca987efff37071879b5068fea081954ef14c9cdec13291f27488783957b42b332d302000000c78f54080f416629d300282ba2f6a7a6c365d8fd201edfe3b5a908ad94be81e94091303760d614104f33a795888acd350c8b34fe21fac3ad02346945a7ec09775bca5698aa6957b94835b9a89987eb56f85b436a6766087800730895b08400620900000035dc9777b316d5f357b38f5adba51db5cc4b028fd74c59345974738bfe33d2d24096bb896c8df4d34674776702aa2afa216641647e3cf7be3f71e118c60dd99a01804f5a2a7014c161d965f2af984ed367ccea28dc8d05645bcd2290b4886ac8050000009b21c793199c2e34cdeef9d3e264bbb48a1409191b13e4abab5f6373b67de33a40eef82c7b46d227546ef594bbf79f5c5e62e19ba3dc79d275717a62ff4bd6ba0ac9ef54c9463216ee829cca855479b7d36cf405b39abce1198ea37ff9e5909004000000e171b478655ed1b99ef2f227a3b3ec04a5aa7a5eb60ac7ff1d2d230a4ee51e6e4080aa4b24b732aa8a2708f7b0fc2372c43dae70fd7d602acd2dc6544a90eee8b49e672f30186c00b1f64b1a7f5f9e98f7f8985fbae24b328c68c1c95402ba180b000000893c5d05930f2b6da1f96fc6c9a0afce090bf48c04f239233fa2091b0041094d402919ce924efedb840f1aa9f9fda21ee55ac856be32d21dd79d8d410e31badd3b1391179a47a4d927c56b10c0adbd04a12dcb52007f4c9ad1b2be5861763f8a0c00000089235fe245cc8944de8d21af4d807b19178fbc22f7d420cdd50a68532c6d799640d57bea41d73979fad215ea014b8e4f505e69e35dd5b849b5c9819943410bf98e62975d882a336c4767c82995832c1648109efbacdda8802d56d71fc952a3b90d000000f69d1445a018b00848c7bb4cfc9b37ef5ed5b4aaa9de7c2db1089b0b711795b4403cc63977b197768e161c140152683033e9d58e7c5b0d16c2d68fa66de9e8e51b97870aee7102f82c49e45d472de4a6ac112b87000cf4f5103e919008fbb53b0700000059c87e83cfc03f1ec790b07f6298f2c77e3ad5ea5df0e6e88184ece49131caad40d5a5f62bc8b1dd742f0e6b6481b74f7070e308e9bc554b32e719b1cd15a236b777258cd6c1919d126e61b5c2f4eb391628ec51baf55497bc4242c8e9de77070a000000e79e3ae90f729de577c37dd35d4c2078c51a1ebe538b916b72706fc0f02a8abd40b8ee4dc84615376ca2864f05ad81945115391321989b3e1c2297d92276eb89df6e8c9555674f9d3e4f361996f41eabbfb86490934b37a09c5b31bba711d88c0000000023a99a20a9a8b82a6399841ad441836a73e7582ceb27a46525cd3cf41e955f8840ff862095b666ceccbe71df3f138d4f61fe5f1cfa36469dc1044456d9b234e1a9d35ce8173c72be01574e52ffce51c06f528c5a6bcbdfbb2acaf913203b2e71020000001d404ea6f90b443578cc3644005e712dad99703f2bab4021ca46f6bd8b298a02407b3bb1635364041c6e6edb5f652fbe6c8859295eb14f5ac87da78cf5a15f45a09a467f7b82d8093793516a2c75f2a47c8abbc84e8e94a036baf1b44ee7094605000000af7cc2792ee114b8322bdbb974e9a5e539988b5ca3ec615e8a225e714df4688c406fafe53c5b3eea9737863c03f0a3613df9ded80a703dd741a2c0a4407eefa138a973dfd417453faff9445b3b5083e064ba3b790c53913c537a4768eed2a35b040000002df1f46dc3c20382c615ef118eb7aaa5ea8ab075f2b5fd6b5a7586f3705c2baf40a60e6186675b89ccaec7733a2667d0770db123060bad803e667ec6f72646ff248bfc9a113188665b5184a2e7c5d3fc66ef29b0f0c8bd7232c1d99e268a90010c0000006d63321db557194f26cdf886f16a77c8e7afc48ac4499e34a58fd2f2365501b040fa6def6e7e0ae228ccc98c52528894513aac04ce792772e94a66d3e6f9aa7959aacf8d68a6492cbc7ced26cb4c6cd6d419abc815481e3d870c2687a236f0a004000000eb4a509cd1f1a051faa9017107d59e1ecd08e8bebb9d83a8e01b529c36ed597d406dea301c0ee220d00a1d1e8d7e5b1c515e9bf5e0bbb7cc193873dc1bee331b9ed93e1feafd3dc00482cb0d29bb57155d66ed9058bc8ad1b00c205c40d311080b0000001cce0f52b5757299ffffffff00000000000000804266920144358ebfd0c3c7c10f10fb83ac6291b7ce8cc024da8aa6babafa359f1a3ad1bd1fde9e6f7c13e96d22bac2b47e1020eef7c49a1e89ea7fc8d778c5f70ecc8932ffffffff0000000000000080176f9201799dde1d8b96c087b0a56623a4757499852343fbc0195b57350863e7c7fff3cbec09fc04a5ba8c4f98b06bb1227c1f4378c34d5ada3871fec929e90d62d36028fe530100b5ee9c720102070100014700094603799dde1d8b96c087b0a56623a4757499852343fbc0195b57350863e7c7fff3cb001901241011ef55aaffffff110203040501a09bc7a98700000000060101926f170000000100ffffffff000000000000000063b8fa1500001f2bd2e0c28000001f2bd2e0c28426ffecea0005fca301926f1301926642c400000003000000000000002e0628480101b45973a8cdc224bdeb6933ee882eb3fc9d4d4a76f928c782759801639b59d9aa000328480101e3af9b08bbfd16971364ce47e5f9c7e3a30cfcb6f5bd06f3a79d3fb53c1d78480018284801012e7593236b785f007b9a97b063f64758f20b9e12b0979f69d8b7c4780d8a9af00012009800001f2bd2d1804401926f16a5398547c023747a5e50022fb617de24a9e3b86b4026e4f1b894f7032176ea0f7818416b5950b64736cb2bc71c9aec3244f165b2d8f84eaceb5cbe099d60314d00feea5100b5ee9c72020201ed0001000051da000009460344358ebfd0c3c7c10f10fb83ac6291b7ce8cc024da8aa6babafa359f1a3ad1bd00220001241011ef55aaffffff11000200030004000501a09bc7a987000000000601019266420000000100ffffffff000000000000000063b8da1400001f2b3fd553c000001f2b3fd553c77048cee60005fc810192663f019227a0c400000003000000000000002e000628480101043d59c8a2ccc82c8b4395fc0c6ca9d9bf10ee96a5d8e0b6bd9c0dc71dda4ca10003284801019b5f2bf657b41fd8befeee8a2bc296f1b38872f9f7b008a68a10d5767865aba1002124894a33f6fdd604fa7faa351d9818531675f05bd59d1bc3cd8214f17420b81a288b86fb7d1a0649b8b572dc4fcc76626f12d41b6c950141ea82f85b871ea6ac76a5e7100954c0000700080009000a009800001f2b3fc61184019266412a3a7b813b22462ad36e0a2aaf4ee2e3a4093ef530a8aebf069829bdfef135dcc7b80de5a83a645574ffe38ee1878f0f04f07bdd48ec0df338497272eedcf9d728480101b1caa607c0481a6f74492804ed059bb5dd9a4da8ec09342897b3c33d148000e7000f2848010135c814e3ff2c08e34be2f25e45346a2c7a2f08af0a7171509f2e9a8bc69a117d00102848010153b627b0e5e33a2602c3cfa15ac14fbf9555c39eca81cae5bc8ec1313fa5260100132457cca5e87735940043b9aca002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac000b000c000d000e284801019373980c6565d1c0057fa3d4f2b6bc09dc5f88b1d73a445c68bd43d4f67c1c820002003fb000000000400000000000000021dcd650010ee6b280087735940043b9aca004210150000f22012000100011284801012282f45e5c8c7d91ab2f5ac8fe5d9ef4332e1504f89177a854a99b3f8ea4f0ef00032202d8001200132848010124d21cf7ae96b1c55a1230e823db0317ce24ec33e3bf2585c79605684304faf200072201200014001528480101fd78695ffd58402e209cb0b060c95b1a8a83dae389c7eac9554a3c086e52b898000722012000160017220162002100222848010114265b804cdb772e1c9a48d1dd67ad6e9315495151d6f49bf5f203b2b883ae7c000c2201200018001928480101ff9fb607464434b8240b30817c4e6c358ad723c3ddeed45b2b82d45b9fb0f6210004220120001a001b2848010135495972e4dffc56ffc325d2abeaa6db04e07d832cc8b8847ae195158fd724d20002220120001c001d220120001e001f28480101ab446ae5250a0e5acbf42540f12f69bc49e22d74782881442954471a01c67d6c0005010120002028480101e1e66c22df500de6499c055de17ff3d1216fe5f15247186dde0708e01c52526300010024c201000000fa000000fa000003e80000001722012000230024284801019ec131be53aaf61282321662e58316673c0e817b455f152638e0bdbde332bfcf000a284801014caa02ab638c8cdd0200f6ea265772718e20a37d62addc71a7120a47225d021c000a0101480025012b1263b7fa1363b8fa1300e400640fffffffffffff95c000260202c8002700280201200029002a020120002f0030020120002b002c020120002d002e020120003b003c0201200079007a02012000b700b802012000f500f60201200031003202012000330034020120013301340201200171017202012001af01b00201ce00350036020120003700380201200039003a009b1ce3a049e29ee5cfbffd3079acbd42c4ed8dc399767a324d5c047375c37ff09e6a050ffd3040025ff8d51ed4c86abaafe477aaec7b83921ba90cf18dd33ff4f03e2f7b35bc4a4e9c582722763860009b1ce3a049e2b52b13244d8b2b0352b8bec33ba7e0bcbd96aceb70d10772bacb15e38cdb302f0002587ac65f0232d04ceefb39cc1209d689bc4c761581b3f27d9cc7c1fd281b36c58013fe7f1d1d20009b1ce3a049e2adf4932efea970aa8f53b77fac8b37ea9113b39d9cb709ff8a2fa2d8d37375f580024f60da3135aaaf7222a228ac5c6afc0ce82e4f2b06c03fcc2ccc11f18f74102de79e527e3db320009b1ce3a049e2b569d69e8e0c8d8d49e40f458f13b517b5e105cc4369cda139a6955a3d3f072e800248666e2d7cff6183e3467b8107ade8d739831136c871851b1714017416f7471676f8f45bad8920020120003d003e020120005b005c020120003f0040020120004d004e02012000410042020120004700480201200043004402012000450046009b1ce3a049e282e21cafba40977a97eab88fd2f5e34daaa44f41d45e7a04a5499990d881a94b4006d9334a8876fdfba04c54d49d0c2a248697f32eaba92097fd5d726fa4e91f749e61f55e1b37d460009b1ce3a049e280f9c9c79ca346c1efb4160a76b953d3ba4f8a5deecdada5edec4056dff8a66dc006d9334a8876fdc34c8f378c65a7a2f837c86a9c061d6afb43bb893755048ae64876e99d2b0c2da0009b1ce3a049e29733a6de931e765a9bafb8e604f2f394f6c78bb5ec708a77748a9facc8b4c1928006d715b44281b1bc27cd80b3fd0e46b373e778d9de40a15bdd34327d709724c56d12e679830b3c60009b1ce3a049e2ae7807450756662683c28db7164c07f24d95bbd6073d24f73f33c1d5b186f8804006cf2fba19534b258127502a6c4d42b201970a44a30069fa999390d4df8425368c992461161f47600201200049004a020120004b004c009b1ce3a049e285f1011ef76d762ada3f52d1bdc4a6712e39f88295f52b760da5503fb6ef748d0006cf1d1eb8d0780116118ca6141513385bce13e34d6854fac170cba9d216efc5f71c1423d3ca8e60009b1ce3a049e2b2f87d869c67e74516089a9f724b16dff81d08f7e8f04d51cae0768979c83ae0c006cf14a091f8156427283ea0bd92891d48b32f4464f1489fae9684ef47e15bc33d865089bc8da720009b1ce3a049e2bc95aaa88d23d205bcdbabf4c9f416ed0c2608345cc57b72ff3ce9d8edff099bc006cddbcba681ac1ffa7efe55a1b9a55e20d9a0d5b34ddda9cc8fb15cd3810480f41b5fabcb599a20009b1ce3a049e2b6e4a76b73a1b7937a5fd78259235eb32d20518f554d3380a28d6545f870bc278006cd432e465b7cc7a104cc175cff079e7ddc767de7c18945406ae521e14ab5093ddc4ed618175e20020120004f0050020120005500560201200051005202012000530054009b1ce3a049e2b16ab6c36e723c9f315684ed0ec3dee67e0b1b5add034be0fc52332f270ace57c006b19bed58a130118743ced0ce2f84909844c1b90f000a3ec96c66896d5a2ef71c3cfab5f2125fa0009b1ce3a049e2ad260fba0e5a5fce6dd3a6e87e4428f3fe9fff1ebf81f9688e2c58f581d67ee140068e55cf540e2af4a6303ed5565e9878c5b727902d93cdac1a9c9c3531c56a42db05aaabb7a25220009b1ce3a049e2b7ed53221e9e6fe44cf5740c91baf0ffee10df0c1cc1dc8ab50fb8789bc417a8c0068e52b0dc243fe325a469419b77eb341c7cb49b14545c1ee06df4301a0ac566bdda425e82e883a0009b1ce3a049e2a4a12abdd6fe44949871a0f0cc5d20cf0d7d8c075c5f73f80dbd5ef9d50873f880068e525942adb5c83b4199504264abb17d1db2b27514b626c70d308431230755e346d1aa0a902220020120005700580201200059005a009b1ce3a049e2bb23a911d3f57131fd390f372a2033337f9fff5f7a7e4129d82d343dc599db0cc0068dc3d4b74cfc2b820f19876b593dcd332fd692fb7ce62f133d69afd1538ddaed2d10df2ed32720009b1ce3a049e28a37d8ca8c26b5a7d088bc96a11d7b3cf79ed734c884e2de397f65f9f76a89c6c0068dc3d4b6169d752accf8f07d56050efd8fb3e0ac9ada86b58d4526bf3694237f3d4f77bd27a860009b1ce3a049e28942bcfb1fba1a1f43c0934f113735bc933433bb1f11a439b5e6c0878988aa31000647587d384ad7718e28452aad9bd641f98e55d7744039595724c1ae5286a6a26ac2917414715c20009b1ce3a049e29dcbb2251c08c55832789994bdae0cd92039bb8752748d94fad5c9b5c5a25d7b8006472ac2ac75e545e0cfa335d13c8bdc2cb6c84c534419d6a4a0d1d2427f5f7c6b3d52e5377ffae0020120005d005e020120006b006c020120005f0060020120006500660201200061006202012000630064009b1ce3a049e298f99107c60e0c7bf96ebe3be172dc00de1c686a5645d1d599ba8cf836bbf66b4006471a7b138a8dfe141a8cd5031943574478d98f63ac3454492ad47adb30c1b3531c8cc349a7ad20009b1ce3a049e2b0f387ae32dc1aa431bf2b88cc6ab2f90e334f615de786cee4fa3b8f897a749ac006461bb19d95954a73ab24af4170e8a646f6faf62520a9e70ae02f66a8faa8d739ef087bfc7e5ea0009b1ce3a049e28434054c5b113b3645871933c378db1d83dc8c83e405e3f71157e1e85ef98d5a4006461bb1735f81427b0096de4bc955d34d0aec0615701d8a028e921f17a53bb9348a002f13d86fe0009b1ce3a049e2b6c6049c8bd41e5653dd8bb0deda43162c3081b2fcd7ca942e93eb13cb27f7c0c0064615ef4c0fea8bbd302453127d952ee1de2b6eb1b4d3effa98ee8a6a66d2d1cf34f60a8adf4ee0020120006700680201200069006a009b1ce3a049e2b68ae8e951a4322485ef168f296678f87f4406ed27ae83266e95acad5e250343c0064592355a9f11cdcdb94b5329e0ff38fb4327c57407542d0bcf751c201644c0ec7eb9dfc76c84a0009b1ce3a049e2a50b94a3275128aaca715871d40456e4345d3f84320f0df12c793c821007367e800645910f763608e78b4f2d833b5dfc6c48d222ade39fa4a96bc874e62b16ade02c50ac553929e920009b1ce3a049e28381d81242f5453dadb9b69ee6dfba18f82e43799de73cf351f2aa7bca498783000645910f6fd986c8491234782701a48ea4a5a886cf15f978781699d77e4c3f6bf2ea201b3ebab5a0009b1ce3a049e28a20236eeed02b76321961f4eb5490d377bce69a715337796cb7b1d533ddbedd80064588d5ce9dac58a899164b1822d2e39dac978d93383eb78d0354004ae047083bd1275fa5323b60020120006d006e02012000730074020120006f007002012000710072009b1ce3a049e28433247c67758ab3f5192e5858b09ad05419fb671098849c907734d137c1617900064588d5bfb965a354621106c08ebc3e44c338088f0c135efbbc18605d7ddfab414ab0b88c4806e0009b1ce3a049e2bc1c538661eed61922a1b352e4809b46d2147a24dbba797cae40dc57ef3c4c06c00645824d776ebba4ccb3c8c877acf99513bd653d35def60e18fae62414b0b3be77073c36abc72760009b1ce3a049e2b9aca7992e1e3681407f665b6c22f3a2374cc36a39335a2bbafc1b8b3d2fa6c5c006289a57c861202778e76b5162b3acd0d538d0ce14f1f870abc0d7b4516106d364582e1e4bb31060009b1ce3a049e2a0684558edbc0dbe038db1038abbcb6570fa13334ef290124c22c66f32614dd2000628973d04abc94df8da74fd965e4d1bb896131555669d612c644f8e8e2d51b91521ccc12a575d200201200075007602012000770078009b1ce3a049e28c02c744d8a5b608ee6d63ee1de469b3eba49b70594ef6044615d404c8c445bf4006269b99cd0a1d07d38e728dd85d6c10021deded0962c65c77f742201cf5e27d2382e3cd525f31a0009b1ce3a049e28cfbbc9518f1ca5d1f4eec2ae7175fe8c12da779ec91665085cd871d7dc0512140062054ea9a7a28ec585c80807a816a6d3ac84a149a069ede2c4aebb370439d8419e8e05c7dddfae0009b1ce3a049e2b87f607ac1a89812563b50ca2a71c5714b8adaec4dd7ea1c642f7c241d706c3980060fe84163adc0e53e530f138dc23034ab3a93aa105beba7f3adfc8fac6756c6a41d3b17ec8c0520009b1ce3a049e2b8c684b81593f8a0e53ab91f2dd16c079a890965197d8e678ca0e8bc08563c9e40060660e740f728fc8f78839e5db3ad4221bd66f6d6180cf1184d5d96583bf2ed103649493e116820020120007b007c0201200099009a020120007d007e020120008b008c020120007f0080020120008500860201200081008202012000830084009b1ce3a049e2b0b63414edf923e079b82146b7fd86b28ea297663c9ac2c87d9e21e6860f654a4006012b0d5463c3a4b8c2ebccf36bbbb976ebbcbeb7953d5946c815783d21c88131d32e40692dd220009b1ce3a049e2a414d2869c949dc0788633e0bbabf2b001161ba78f72d726d845469f911137db800600641e495045f07c0bf6f11a135ee1c6c851d45a7348cb431f9172132ee32466b138b1525fa660009b1ce3a049e2879721bb8618294e99c9f4bd2fe9f23eab4415620713c63ddc40c45b037c81164005fffbd1606bdb27a33cc15c7eb18478d558617106c49971e53fb44cefdcfd01def54676324c8aa0009b1ce3a049e2a2eb3509a45888b38a4c36ce027551a187a6253b5c05f896dfab9c98de9bc5ad4005fd8d7933d52e9d6c2dc87c6cfb33d88ffd3b1f2f220f90092ee20f25a0cf94490b56b50cfee220020120008700880201200089008a009b1ce3a049e29acae9137f7d68632017c7611aa894a068cc2d5443ac3773a0604c6d292cf9700005fd41461e9388b14cb33c7d6fe094c752529ee15ce9a43482d7e9cf6f76583ef338760706c84e20009b1ce3a049e2b7e4bd3a4f5dd41f4d47ab899fc567ab9e18b6cfe5b4a6ecfb45a8658bafa6e78005fcd8907ff9aee7ecc28b733ac93e707cf11ab01189010d43e05211703894bac9a0f9f6b7e9d9e0009b1ce3a049e28b8ff26db4ee9021a8a01996c4763cc337fd2d63b9549ee59db81299d9406d4a0005fb8a677376389a3325d669b08511eda154caf8e2a894674119b58682a68c27e24f20ccdeb07660009b1ce3a049e28a36edb510d252538901596bdeb024c8a3cf8d5899f42a38b4a825d139177b1e4005f9722f7958e693fc4158940c46108797153c2e535b84c6d4fdf70f945f866d2bb19774a38d57e0020120008d008e02012000930094020120008f009002012000910092009b1ce3a049e2b5fa90fd34b6314268960d1e689ac752ec3b3a9fac18b4e4e44efd8c795715b20005f6adf885acf3c18dfd4152ff370f50ab0a7de08ede0cd56d266a28868d87b6099a40a45353c6e0009b1ce3a049e2a98fe2582c1c11d5e10a396f6847dedaa76024016fcf43d74f1e74570c2604900005dd69cb8eb39a288373683b06a1fcb1f2e01f2e650b9cd6f64e5df8e5826b646f4a4e8028df2ce0009b1ce3a049e29ae3df9a5e55bb415ee5bd70438506a267673b73b74c79d300580373e755c7dc0005dd5dea063562d3cb7269341296477bfe73faa48d3b782a9d242932658b1fbc0dd9da4dd8eaf6a0009b1ce3a049e2b308505a5d7abfa3023d41ee7e92bafdf6b3dcdb54e9231d18ec21ddd902aa3c0005d4fa672c7c8004c02af186d0d951f649d9091d98f7646afa8e1336f3c97523262947a2f7f662600201200095009602012000970098009b1ce3a049e2a873d09dd5416f23b3237f28b42f5a633d30ecc2275ced3ae53bd317764e98408005d2833fdfe8772cb7250bf2fc6c9bc6f91dfb5151f1354900de181ddc4e471069af8c40c7d2c3a0009b1ce3a049e2a3b0d613c6337f4641ef5873e4ec1acd028ee22bb9b0b192cfadb3545fdab8cb4005d157a1c746606b0650a4773c4cb96e0d7674437b0084f8dbcdde8a5a06da4f55381027ee840760009b1ce3a049e28d81f5a48d7c97a9621805f4cdd0c6089abb6f755980e7126eebd2c50fb72e90c005ccfc95d6959636b90d0b43e4f4e2004fa75686da2228a063f2c36015dae01b3aba01233956c960009b1ce3a049e2b06ea327239d961f1713837a2c87f20560c991831fc7867f7f3e7a274e39725fc005cb1c7d20ded6dee4b71ea37c53a39d78c22a7d5444337bcab1ea092bffc9f7bb7550d0fa929fe0020120009b009c02012000a900aa020120009d009e02012000a300a4020120009f00a002012000a100a2009b1ce3a049e2a84fe81393a9a2dca7ce5e00c4ee9369aacf25aa93817c803ed4a75beafd30ed8005c50072c852f4f6f9bd85d5b0016f6d5dfa99d23eb5ac4b1575af05db1dedd6a9a39f171313fc60009b1ce3a049e29c0ec9a616ab41f5dee2ae42b1432b6ec9beae2bc54fece68c45d11cbb9a11fec005c3257f548e11cb2b2f620d8add53a175a14d651ce70897b905fa513c6c747fd62077c0ac132ae0009b1ce3a049e29260e296746fe6b62ef51bb076d63403d9dd28bb8a2cd1af951687d9807a1bc3c005c32281ef1d03b96ff9b8ad8c438eafc451fd474a77e974b1bfa3e3a53a5d549c84f365471a24e0009b1ce3a049e29f4179b0a794a9ab7de008f205290d0cd61b451355798388890dfe7c3a39c64f0005c2a85e8706ef2e4e016f51815d3338ab8c29e0bd03890feab9e861f0fcb68ed8353d02b6b0246002012000a500a602012000a700a8009b1ce3a049e281e3cc13b8fbb8e3ec8d70636c992bcee80d1b337057f0b41427c4427b18552d0005ace364e601377f95778029be79b4a96dfd0a7896c2f1b2303e461971d9ebea30943f4cbcbe40a0009b1ce3a049e2b4e14ccf65e60d36c57ede823110bd7562c0f8c0f049ba8defdf5d5b4cc3053c0005ac885622df922b045d350f2fc365eba43228e9c2f627dcd81169daab5f647006d9446a31d92760009b1ce3a049e2ba91e59a87bf672e95923cb10e43b86ebbabb4f4a2fb01fa585483f6ff74bf3e40059161bf58a22528cfae9a113091b84c87afe09d9300d3b4a590b6e84e8bbfa27c08ca0ddebb6720009b1ce3a049e2ad52067112e45a036b9df08697daac8e24177a46782f0157d14f2b648f82793d000575e6ba23864eb2b91def8b3e3c77a66db288991637f705e981aef30a18455d634d26513930cce002012000ab00ac02012000b100b202012000ad00ae02012000af00b0009b1ce3a049e2ad1efb0e0ca9965cfbbf0395992a2eade83565e98b98300222436acf0a2be72f000573a6e14b2c331cedd6eb17b65e5f17f4dc0adaa102c83f8c64aa3000dc42d836bff6ded8e1a160009b1ce3a049e28f9e35afde071227ab5f3caab5eb0daa4350e66da0e3d7a194ca2d991d3a2ee100055d2a2fd528fbf8b972b6a9871b613e1a8d863525ba82f6631e7b71e5abe6256e0bee0f2d99ae60009b1ce3a049e2b4d334505dcd39a6bb4f792ed13890391701ae5026959815961059a285c0cbe940055d2a2fd528fbde07ef68daa54c13e081ad58d7d53812e9544b3ebfdde0940e36ee1414531ba6a0009b1ce3a049e28eb84e6935c7b856525dfa8b0381f62310e7dab2020471304de2b1c3e43101d880055c9f1cd837914c243e0ab84c6ce8324939e1888aea6363bc3b081d6ad18eca492fb89a8125c9a002012000b300b402012000b500b6009b1ce3a049e2ae36f1801c7ae3a1bdcd366144def89eac79d0c69eaef506224c7f5048149b824005586c21fb593499867e1d8c71f6175a5ea27ba5cfc9e1d27e6234e65fd7306a363e0a1de3c51120009b1ce3a049e280805aea895da401bb87e27134e64515b16ab91038cd1f8479f38107a762497a80052d397252289276802d2ba64eec84cad5b03ab06554b3f0e1e57ac20967e14ebc37106f31153ae0009b1ce3a049e299949aa617a046fa49318214c75541cf2fbcbf9dddc6e407291b7e05a4fca2f040052a6608a0ec5b506a492cb59bef4c9ab52def25e140442bbe9f26e63e71ae787a9a7fbfa1aa8860009b1ce3a049e2b2885cdd3edda6c3fd1a98520d747531e925d4cfc31d4ff6f2cce42047ab990b80052563991afc14baf9675e686c90fe2a02290d434d32e987beb21ecda88dc46dbbec0f2537f5e0e002012000b900ba02012000d700d802012000bb00bc02012000c900ca02012000bd00be02012000c300c402012000bf00c002012000c100c2009b1ce3a049e2934106f5c89c8f5676ca4cc9fdc53c2ea207a3f60d9b320557f179d7be8d29a2800515bc6083b949e158086f70a6e1366c4ddf33f82641fe760fed5c84a92fe68da8a3967be66b7760009b1ce3a049e288f68d901c2a2895879e7d8b7d2bfef663ffc9caf5b80517b62b95fd556c532fc00515bc6083b949e2a10b37bcb1ec1baed930bf99ce1842d6380c306b80fcb5ff2971f5fbaf3cd3e0009b1ce3a049e28620d25ebb580379b7e49381499f0c1c50051e1442fadb4f28f1610a3b835181000515bc6083b949c940fa67fc37c020ba8a5ce7e7a9e40073034f2005e95432538a8f9d72a496b0e0009b1ce3a049e290c083e755545232d61de019032bf69ea91faff1bc2c54ae3f2a014aa900e1f8000515bc6083b949d8ada53fbe1b8204016a111b642c5c10b6efb15a9157ee01f73d1fc76ce6f42b2002012000c500c602012000c700c8009b1ce3a049e288c8179ab5fef072dde7e569a22dd6ceae6a983769a7e5ba3cef90c46a8a1c93400515bc6083b949eb823314e26d653a3dce059977a0c83c970a98befcf5e75c937aa9db29d67feaa0009b1ce3a049e2a13dba1974462fe77771d70d9e73a6684052b316bce2b155ffed9e4c7f8bfbffc00515bc6083b949f0e08c7ddf1bfc3c18fc59d5a8c49b262d4a98de685d888117d87e80e3688c12e0009b1ce3a049e2853ce006446b7930b638963142e0b7a664493391074da0f511e62861240f6943400515bc6083b949c264b4a58989a560db1e2b784ec64a2cd7f1e31f707785189844a455aa2f019da0009b1ce3a049e284aa38353350913b9abd5522774703e9ef720c1ed322d60726840e81afbcf34e000515bc6083b949c9b866bb0a015a1b9cb4a04259e75c2854e14017f653f3e42e34e3e2f87ebeb1e002012000cb00cc02012000d100d202012000cd00ce02012000cf00d0009b1ce3a049e2b8fff0305bfd5a60a236c6070b5c9dc8e204bb6c7e2e1fd66519a4af004920d3000515bc6083b949c200da27d131557afb6ca1c7542ed43c867320507d68f6595dd01e0bb32c471ae0009b1ce3a049e299d7dd0a011da5b207b7e444a61707ec6c8891c20a56cc9653cb32b49529df85800515bc6083b949e22d3e8b9e0208c7324c00eaf69b7ea62df5ba4fa59714f465dee6a87953d8c420009b1ce3a049e29e6d6690a413c143e5d2e3a5353c22c8f9fd09b9e0623dc741bc66da2a42fa7e000515bc6083b949ffec45c828ddfd9fc9b3f6fcc0b358d37753667ccb44a8a5af094e0c9c6ec36060009b1ce3a049e296de9cbbce1f221af91595203da104cd00009450d6e55abaee19dc2efba7f106000515bc6083b949ebc819c25d36ea49ec9b99cfdd3cfaf91d642ba9dc94ff8273ef4a7b4fd169022002012000d300d402012000d500d6009b1ce3a049e29a6a7efeb5ff0185ce0ebf3702f6540f42f7980d9fb58ce4a0571531b80c5157800515bc6083b949cc9ba8487cda2ccc88d92c89a7c1459c7585459e44f942bb38fcf192199fbfba20009b1ce3a049e29f4a78690b22e9bfccbcebcde339e134371cbbb781de9782764d826655b5430fc00515bc6083b949d6680c6a2a94f3515ee812cc8865a8cfb40ae24128c0f68230d7f03c9055c1dae0009b1ce3a049e2898e55c43c2a74afbbaf559933989a7af47632522b8ca8fb4aecbb7ee5c133d0800515bc6083b949c82336dc9226ff3651616ad7d83224c1c7bfdfc647001283ccfeabb8a38e526120009b1ce3a049e294ec81723b594635a9c03e652d689e1975f493d2dab3b31a2beea2b4eb2ea762400515bc6083b949dba3eccda1a1a67603cc4de6a8b3de4f6f42c68b481bb25667ad0f2a4882697e2002012000d900da02012000e700e802012000db00dc02012000e100e202012000dd00de02012000df00e0009b1ce3a049e28e80c043511ff071c78f8467d50941177867f99fb837eaedb83c85abaaee0da6000515bc6083b949cc9c22d344f11ca4eb99dd0fbb543fc11dfb1e86e3206669bb76df787e1f02bbe0009b1ce3a049e28a1311d267351803d08dc653314281c7d23465255743de1eede19f87b3d5485ac00515bc6083b949f32f2c478c701e91245aa3d88dd55817e44c73d0c42da9f2e84161d79c27c223a0009b1ce3a049e29a22eeae87a48c056afadfa3763d535989d1f610a9acb2938de015b9b6f0526ac00515bc6083b949d2e07107e20b6685a7c898dec3007a9785808ed41d747c0d75078d63b7c76d0e60009b1ce3a049e2bc8c86631c6ce4c89358d7c179b3f9256b6b316534f8701c4e82d345b25c8ef0c00515bc6083b949c51e74a504d562876807e239c6cb607461d858c47336791a1bbfa84f396435396002012000e300e402012000e500e6009b1ce3a049e286fd14340a404f7412f77270138661f31b0ccd599b83eaa04d6e6cb9824611ce400511af95cded3af909342cba491b08507f8a25ba54c409ba6d10cf7b9cb58a3eaf5e464fd7bfe5e0009b1ce3a049e281926e2d5cb713f31d989bc4b506db2540507aa0be16e1c7a9ab1da979c40255000511af95cdea860bf783a061684fbe1608e701ea2c6f13371cf276862016b349ebc1150977c05360009b1ce3a049e2ba1c2615be2dfbb2b030c9ef5edc8339e922ffae9cd0b7904f21b5372a9f0cd2c00511af95cde062c1bed0b68ff4bf4108f22687b94f94b3a45c56a98c5a293986b062a2c72c4da460009b1ce3a049e2a81aee9a2e7843391398024000a940a6a5b2c25466fad7251071f7970140667e400511af95cddfb7060dd58645d6b8d97fe4ba07286e084488fabb602c0872b5e57c6705ed9de6402002012000e900ea02012000ef00f002012000eb00ec02012000ed00ee009b1ce3a049e2b526b6fd9b15aab6fc99562f6511df171ef2dd89c9d5d063f22426c01c52def9400511af95bbc77d28ea011dc72f54b87e8b43c94a59c6d499c19394fa56f6d0df127a393d11b77da0009b1ce3a049e2ac5c873e7d78772d2525c1c52ba5e6a3f639b085e8725b50b46089d8fc90eace400511a517634aa74a9cd2bf686dbe7ba6d440aaaf67f9be34e0b3d990749e7e700949d420578a8a60009b1ce3a049e2810a8484799b7a174f63c131de10f2848bbc3592d05316aabb2179772832ad8c00050dc888cc5c42024f830979f1ba394187d506e3dd3568fed7c2f320e5760c540b5393b590983f20009b1ce3a049e29e824da0f4ba7ae9cb5ce23a748e389f5f83ebff68cf794b9a9db608b2c8346900050d0bc20779adc23fef9cf49149b2e2a3fd7dec7dda3a1f0d120cdd262f6ced9b72be999785cb6002012000f100f202012000f300f4009b1ce3a049e290c4621a9adfbb2761d9eee5d1319e4c230c465800d69f073efd903e932bd5f0c0050a38f74cdeb8064170278680894f6ea68ca69ed38d7c8004d9acc66269c52dcba495130bf58960009b1ce3a049e28bc34eaf1b8054264a170670b23136ab6e4bd2857242ead88cdbe54ab93dc7d1000506a50cc5380d8424f5e283adc3e8da52c90a2dcbd07e311c826dbc4b63dd81990fb6cb7309bc60009b1ce3a049e2bb2dbf8b6e184bea19c868a3aa6be1d0447bdd3c24d30735605efdae640c344b000503d609dea1fb6c0b948f616efdbdce362a389bdc2ff7c1596075ae4b69a6092b2a7535ff8c2360009b1ce3a049e2970a1dd062e310ab4c31f8d875c55ded540bef7629239e6154434eb463523365c005012938b3530eadcc150c16fe0897241e80f4413339d2e0415efaa02a2c352173263a0a0b3e276002012000f700f80201200115011602012000f900fa0201200107010802012000fb00fc0201200101010202012000fd00fe02012000ff0100009b1ce3a049e2ab6f35c9c6634d4a03c3b28f230c43b7b0d1797d6bdd522cc8554cb4feb07238c00500662b2b091b560b8a7b21c57d27f0931e8e6cfdb7ddd6b4e5f2799f7d8ccab31d578cc667e420009b1ce3a049e2afb116a3f3edf4d49ab1f0c0b47602248ccb3dc06efa3bd108306be79b33426b0005001180e310a49559766f814cee12945ec3c4a16cd5fe28b8aa917aabc059569c0591e5ab8eee60009b1ce3a049e2a3f84b08823c25f177ebb5fe9f997ee372fa5cfd12154c667d2eabf59791255d4004eee1784e4c0129fe01ee4c98aa31c42d62389794ddae1692e08d60154e0b6a8674d7a46cfd6160009b1ce3a049e281bcad54a7de2fa529cae98bcec521e0538ed2afbe227e95a7f6f810f376942e8004ebf3c38fd920ea3ea0c15b74bf9ca563a8cecb1faec9acdb620557a084a7c862e19df048f83ea00201200103010402012001050106009b1ce3a049e28b189adb95dcb8dca35b0d1ca2582c6b68f81b42f518c19a0d6719bf532ff6888004e34e6468c8b3ac7839a36d9c3a50549fe17f50cbb02e554a4b2c1d257004b4c9f707134a7c6e20009b1ce3a049e29412003884f54875a9c8b540f04884b16408ef64fd2d36cbc3dc42a15394b1c28004e1aa958b479e5e6d4bd93473ad1dc6b84176e07c834f1a1e10e2595739841ad9724a93503e1560009b1ce3a049e28cd461096d0b32c88872b8e6dd30ace21c78542f290117b2f8673c306792e9a7c004dbc68295258e45fa55f0aa07f8a913949529f844a6d4575c26fe919a23051ac8ba288dadf10e20009b1ce3a049e2974e7f00868d7bb1c607697a0f52dabab387401e4e3abd376bdfc73718d72d6b8004db011b2e447a5528e1f2a08f6c977deb5e1ba1eabecda6ce4b2ee114eb8f678ca2918f77b615e00201200109010a020120010f0110020120010b010c020120010d010e009b1ce3a049e2b521d19d812fa288301c117a541e5c9f54fd04d2e7679335b89d1e6448aca8744004dafd621909e26495ebb678b36f86245c959728e2166f3600d364b3843284667a297061efb9b060009b1ce3a049e2afdf301472e381b89259fc98864d66ca3e13d0ea6c5794e48480053bb89561b24004dad45792bc37e923f7fbb1c77f24be5deabda8e6b8930675d0751aa2d8335dc8d710cb929842e0009b1ce3a049e28c78e9e3ba9b19a197eb12fa00684d49e373a6b586527bb8386349b493416d56c004dac75fe6e924295ae334a41002a3acb6bd81cee5ef4258f7c1003c7d2f7f4c3b9b385c711968e0009b1ce3a049e2a9947bbb6b4eeeb85dec5be9af24d3343096e22f33bb11bf6df717392c9e8c234004d5a53017c8de3ce1db1c705c494511a33bffd387a79d10f195d0ba82653325f88a7d52b8ee72600201200111011202012001130114009b1ce3a049e2abb0b0b98982e3802762568e2f9526cb3fcd0335f5c9a064e20c2eb4a3bda98f0004d560a73cdf6468b43081357b4885f7d6a67a762a88101e31026031cf6ec6bc1fe92976035cd8a0009b1ce3a049e2b87a430387e3925c24dfef85cd091b34b0dd2a275b68348bc33c46a58cb9dc318004d3262619ec8c0d3a5c152504a1ce49bbd0c5f022169be07c1f530da7255c17855a8bd810dde7e0009b1ce3a049e29c89575bf1b6c1bff6eabc5a6eca15afaae0037a63c0e96ab50bde9fa7f7ddebc004cc8ac41869c359a28a87acfaff5de1c222cf4af07dc11e8e3fa4aadef5dab7ce01c114e5b9f6a0009b1ce3a049e297de58d8819d57d8befb0a517ce58f252d65bdc7b70a945fe9cb775dff3e2323c004c45da2a208caae53147ee1c9a4d4900c0c292df9fee569b02e0554c91ea3774f861af81fc3c96002012001170118020120012501260201200119011a020120011f0120020120011b011c020120011d011e009b1ce3a049e28748231b57efaf55fcef49d45b611e89b6611fd51ac04f0d4c3c1e2ad49bbd37c004c45da2a1c505d25ea341585947baa0194b1406662fccc2693dd8932211203a1326a59f50ce64a0009b1ce3a049e2a95d643380e268fc1ca88214981347e891eeff8b60bb2b593e2a370ebfbe51260004c45da29e17962d16d52d1d34af75b70c1a1c7363abfc373cf7fbf3229cc8be80276825670bff20009b1ce3a049e2ad21327aed2f8aadcadb583d75cedf0a4a0ac104dd8a24ba9487a756c5578d928004c45da29941b6398c7b95f42a89c2a5ed53d6ae8dc665a1ae424ef1e961bac85be227ae5dfce5e0009b1ce3a049e2a9db6c5b372c5f03c4e7a0905185029760d27159730e377e1dfe60ff683b12940004c3f78196155b723623fe37a6a77b0547345396708c9363518d18af94528b92014a6d7950fe9b200201200121012202012001230124009b1ce3a049e293f4b465c54ac0da9ecadff3e2630b44844fa5a01488f3e8cede03484caa7c2d4004c3f781417628a8dec11592e433234901611fce32fadd47e24f7536ac942b81c5ef7c26d979dae0009b1ce3a049e29ad7780a2a8b2c96f9455c172d5754f113aafbe541dd0454214084205cc3a7a58004bef496f50e9bbb08339ae393d96b9a5c519258e1c62c12c65bd32222ad5c45d8f201fa7c8d29e0009b1ce3a049e2959a9025a33a313ed50c0dcd87eeb018127fd89a0f049038919df1a1d4f9e4db4004bef496f50e9bbd9b69681f6a2d635073aeaad83c2107fde9639331762bbdc489662d80881fa460009b1ce3a049e29e90c1889611fb14d1f8cf316d00481d082828e5b9b7b3022d583da0850e7826c004bb62ee642c499d1dac2c9fa11b7233fb8fed809b60b2242e804da5c370c791909130c6f635d1a002012001270128020120012d012e0201200129012a020120012b012c009b1ce3a049e2a47f628bf7440cac37fac218363a01419c0335d4222cb357adb830e4fe8650640004a9d6781818665a13f11ff3180a7b3dd16e833c3a411c9cd17c8859c0c288098c80fa80b47b67a0009b1ce3a049e287e763cc3fba028129ab87775aa72c9c62f4df1d2c4c86faa03645e760e38b368004a8ab63d296914848cc771bbc8361d86f381187db7bb35f83fe8ad8241d33b8c2c9acaf59723b60009b1ce3a049e29f3765c787c66f3742b79614c841b3aadefeb61bc6d2ab907c2b8dddfc77279e0004a4531f1887aaca82e510b4d9f501503c4769c8f05cc7f25236f156f00aacdee9b7e06eb07ed820009b1ce3a049e2a6dda12b23623aa21b2b957a0739f094f5613609048d59563d9220bb3521ed2e8004a32ed52df26a2b3ff15b5771e8aa82e713e2ff3943969629e0f64e0ddb68165d190c2557ce5b60020120012f013002012001310132009b1ce3a049e2bf842884b02e9845ec43f1d935c0f2fad126dca0f410159ff1341411ddf9423140049cc101397b9722bae4ce9ca3b27c4b57c5bfd4c91ed11f604df3803cf0beddb4437b63c7ccfb60009b1ce3a049e296786ffdd72d9ffd047d93d8143d3300b3748229f861bf633ed7e8ce21538244c00498e6a142cdb646095072f6eb127007e98b0c2c855151bac6b94c20700df1f544969a2a7f853460009b1ce3a049e298b1d10724ffbe0313630d7626ebb44e6bcf81f29f77f9621503e62cddc5562b80049090fcca3b3bbb41318996d6e8ce34927a5ab553a01ea365fc17998486465516d4fd420aa885a0009b1ce3a049e2977d369ee5c0b1131dbb363bea211b2102514a2affe2875488b516ff21fb3b920004861e52c2b1ffa220f165e4717e1f52cecafc84e487107c80ec6b4b65d993b9262347297dd74ae0020120013501360201200153015402012001370138020120014501460201200139013a020120013f0140020120013b013c020120013d013e009b1ce3a049e2a95dfcfe01805714d8ecad192cac71443d29d87b58eca9e9fb6c0f96bbd9ed7580047b4e4a333dbc83943525f8161f8aec2fb535335fc2bbb1ab0b47681903cb447cca69824f1b9ce0009b1ce3a049e289527b7ee1ad838af7cef042fafee7dd58197b7cae3aed081df473802d49e071000479cd33b7edaec0be1e2bdb47318045ffe1bb6e79f6bdbd0bb5413fa37fc222bfbcdfee2e857a20009b1ce3a049e2ad0951ef49283f7388a9a2b1842308bd48323c711218b646809378f5d159972700046ba29c165db505d2496398d7959f433a2c366c5656ef64a8b1e04f32f4b49c4156665ec1a258a0009b1ce3a049e29ac631d04cf2724792b7797532a7902f9ee7eb16087053264661a59ff88d7ea4c0046a6b94ca987ec3536dae1af1fc09513176aff7c79d638ee99ae975fd964bf942db7d0fb91b77a00201200141014202012001430144009b1ce3a049e2878ab24358d879e4d6e641ca126e70c9b3e7b5a50894a6fdc2101ab3eb7cfad78004689f4250372e448921455da5b253bf0a0373e940dab1f62c33db1b6c38e2c2509e90b18d6d8b60009b1ce3a049e2ac3e48bf1ec491862521ac2872cacac03599ce29e7186fabe8b8e2a2cf0bb4cb80045141bd09ab79a3a49af7f589fe5c368507b67a2fbbdf28486af9372c42a64f913017cd699bfa20009b1ce3a049e2aa9633537f4e29700d1a50d8b11c706e521cd3cd3092037db7da8a173d1207870004492f2ca7f814963dd94a980935e004b618f63008b1227557d464cc7cf26e705a8a109108c4efe0009b1ce3a049e281e747be72e7562f35d80e9a75664b76817eb9d5241bdf78d45846aad315b89f800448eddbc393c93a152ab83b747d20af6cae343449237c3b902628861aff74ba65a90133c0e489e002012001470148020120014d014e0201200149014a020120014b014c009b1ce3a049e29e3ec9b2cc05d44ba1bb3fde8c1964e619ab3ee6b3816c7373c22ea05556ac9a40043f7764092ed8c3c44edb7d681a9eefb9ee72b66ec874c2dcdbbefef4f9cd0ec9131c6e32ba0420009b1ce3a049e2be3b39cdc97c1a422f546ef0efc79de3a2e54fc265e29847ecd2b21b3596a4c8c0043419f0f9ccb7faaa83f00bd051fbb5536517bb5a916537bcc03e27a87a7ec0af1943fa239f3420009b1ce3a049e2884e09fb23fbc1ace538207222743f5b11e0e908f4d1fd123f5b1907d9309adf40042841db966a5cf81055db64e196e3396ede7bea28437c1d49f6db06acff8689eb73b13ea3f53420009b1ce3a049e29769599834364fb33712eeb88a4f454ee9dea9cd0f06a2669b9e9acdf34dcd350004263754734801a763a6c36379ecbe3bd2c9d80028a02c67b03e5e663eb0a06339ab1fb7caecfa60020120014f015002012001510152009b1ce3a049e2b3c3afe8a2d94cd9de66c3ca72131ba6bc842e2786abc3625381f5baae66e21840041f4ffb268f8a7e6fb39fa18008021f69cf749ebd9830bafe10e67757265e392706ee3c38acd6e0009b1ce3a049e2b63115ad5520dacb7b4ac767b55c2e930c3c5ab485105490515030965b7c9c6780041f4ffb148b9569944ac68574578f8ed0bddfca72d4ff96126182d0aba84e1eec9c49d3719eaba0009b1ce3a049e298f81fe177a2920408491280f104f8c85bf7b63b91bdd6f5fe231eebbdd3ad58c00416506940e7710feac07f0e4bc11320a8da8b1b3a66462b53c494a4e14e76c238f26664fffe24e0009b1ce3a049e2b5f55e8ffc0121c18277f95b0090dca5fdafe1558ef3939de796ce72aad432d20004155dcf1529c6a30b8e5463bb6f4bae077e1956a261234d3f1df5317559c2c0cd5f4b8057f475e0020120015501560201200163016402012001570158020120015d015e0201200159015a020120015b015c009b1ce3a049e2986a2a52ff06e106a78c719a96140baaf3e7d76a39ff42e86dab833c83d9dd59c00411241d4dfc335d347c45cc9b3c30a240a3994be6e75f39126d0d63cf6a853769ef998ca6d590a0009b1ce3a049e2a3569a4148cc45574c2e675d1c791f45f20b22706f44368bd238f0d49f55f12f400401c479922ba309a0aba445a362a7aa7b5be60b52a9885315a3c192b5313e881d68322578e79a60009b1ce3a049e2a96bee34dc47fe7e23f5fb7851c517969ed68339947978b1b03bc950ebbdbcdec004000826015b0c26ba35a67d878b9ce8cd176458a2afbf5b8d642531b3f489a9fde93f24a1ec7120009b1ce3a049e282ba42820e1bec8a7a092dbbe3e066a0fd587f54974282d2e39537815d2d9fffc003f8f0a173b0bc87a27dbb19ba353b571991f65bffe5aed1f4760ec1b5e2ffb23dc9430e3a0be220020120015f016002012001610162009b1ce3a049e28ef19099331281f50d09e2360fcc9d4c80ecfe068ef6bc37ed233c79315d37c0c003f728c07314118e5b6248ae957819c53195463dd7a29277835a5b27323db64cea1c0b8712907ae0009b1ce3a049e2a2f345b6dfa23fc8938c959480a99b6b84a5f91e1ba322ddaea3102fae8e7bdd8003f514e49d07f4963653295d7a0ab3ffe70a8e39b431046c93e5a51976ec30f17c81151a28b62420009b1ce3a049e2ab5716f0a7f481d64f7f2860add8d178989c8a6476113a0e8f4acc73febb1ba44003f3fe4ce3c4a88303963b55830d2d2853361134b7618ab43528bbdaf687a69d26867141792ffca0009b1ce3a049e2a8dc0e126529b80eb5b28370a7af4a526c7177b27ac633dbf7438051808894f18003ea29a2ad7d39e648a634deee5132ed07cc454c7e774e25efa5b427d89aa80656253524aa9f8de002012001650166020120016b016c020120016701680201200169016a009b1ce3a049e290a7037c20274e69b5fb1a9b163f0b5bbd2791c63972f1a07ac8c56a8cfd72ea0003d6594ff9c08851f36a9b75b9687f793dec216c606e3f7c6bd8abbe1afa40a288e30de2950ef1e0009b1ce3a049e2ac92f6d70c904f5c1c11042d9d9b81d2869319b4738fe5c46d57457ac703b3c14003d2e6c5cd6acddeb73d6117661e38f086a8631096061f73baa8ca5181082177fe773edeae06cd20009b1ce3a049e28b2963f4eb140570dfea9faa36c25aea82ffd499c01d73a45e19f2f5442308298003cd16d94526b227242fbe7fc4774f4d3dab3613e7cafa7b079fa124a33a6fc90ca96baa69704c20009b1ce3a049e2b5b5d111d57ad05d091ae18092a2bb913d754ea84e9677bb8a86502b6c26202fc003c1ee5da5aeb5b751d7dee28e7a37b1e3572a62abd33af2ca3f86d1858a0cce6ff60bda6e3459e0020120016d016e020120016f0170009b1ce3a049e28dfda087c559068f933a7789290649b53ec0053032f300e1aff8eace5a3cd1a48003ba9ba01ad641f06d5026994fa04e5b710b4e68c4429a9e705ce1a95c7c0813127b2a8fe381ea20009b1ce3a049e287bda17ee58c71debd313b2139af703aa728a5b2ecd434af1754703c467c4a13c003b12a23c1758b81894d7dd51f484773b9a020f2a4731cc0bea996959772f0026844aed6d0b459a0009b1ce3a049e28b5f940fdfd8db04a3186b50fab30c8af097064746a94fd7f2614edf314c264b40039b4b714b064d61ea43d67ab725691048a03b4a4b10be18c03fc4447238864ebfbe528e9afafa60009b1ce3a049e2a7e1848a0880dadcf8136a77a0535d1c77d17065703f641ece05e0e15da952ec8003966bc620edbc43117a1436555507b67b126b413f84b55c58482661f7a5e81105ba616ba26df7200201200173017402012001910192020120017501760201200183018402012001770178020120017d017e0201200179017a020120017b017c009b1ce3a049e292de15cb879f76b6d608f8cf7cc7b20de83b6dbd18cd1e9c191cce4980d18afd00038d8d95b4def21a023d9beb6ee16304988b5dc61e3ebc7d0911b35becc2bdf617c284de350d93e0009b1ce3a049e2992260d1a02e51d5afb129ad03f7f20aae2a00a25d20a62d1c9246fa9bc6d22d800377baa69107013d812c697eae700ac388711e6f6732690f3232914d4ed8050d0c4a89e7aa035960009b1ce3a049e297a87dbc065cabbdd1cb6b836c9bf51e22492dcfa1000e8865a7bc506823b1b640037359fb497daf4932130f044374de6c5cbd9e723044aec3af3f77b18de54c9b9f7cf43290db89e0009b1ce3a049e2987799adf2c47a15cda46aa010ff66ed63c2e557812ba1e5300114672835c79980036c93ca6d72129660031191e56dde5e0ca9fac0a7adb0422ea50b5a77769ce6754124760a0c9320020120017f018002012001810182009b1ce3a049e289f0959617dc1fa903c755806fc1a9dd9841abf432e19d614888845bd1861caac003668a519a0cbd96d40d6f38e60cb6b302febdb408fcaa67fff8c3271a40929b1ea0274b2e730260009b1ce3a049e2af13f9ef67e8a824bb6ee72b3e6d614c8a1dadd0f9985294c983fbd7eb6d9c4ec00363d2c5180609bf09a1ca5182f7a1832d9964fdae6786d148544642138d9c1d91c3660a3bca58e0009b1ce3a049e2889301ee64265b22edd01b07853fb76fc8a2194d5f4b902bf25f0b9f603c18c80003605a1df664dc29d32e6213ac7ee6541c7691835955b5c383bf1e277aca1dba4825d8b8e5b09e20009b1ce3a049e2a31a238a6caf4820e9c37f7725ec8c4e97f84ccd28b8bab8d5aee1560c1e0a1340034cf9366441b92c196c5b1cb6bc04add46eb9eb075aa93d31826c69b548eff130b118aa1f09d26002012001850186020120018b018c020120018701880201200189018a009b1ce3a049e2842c917bf8a5a1c76ae5279adaa564180d18daa3d3519e22875a4920b2224e0180032fc0fa1f945e3a48075ecd741d50fee154318dc3c16bda368046babcf4d0ae90619e10a3b27be0009b1ce3a049e2ac5fa82d2695672447c0c12bc3e91048badf42c8eae99f2fd5957cf97adfd4e10003271f95d60e5b2517e02c8ac346b58789397d3a6037f74656cd72e1ec4b6567992d58e07d98d9a0009b1ce3a049e2b87fa86dfbbe09e0aca0479f68306c63d3210b7e693eebab96f1f718572dcd4ac00314063e5fea5b4dbc32e7f98f5f18ddf0847960f69dc56903cb7924ff0bd4232512ea170108e660009b1ce3a049e28e0c3a00bd0201489f95975d5f8c8fb7add34eed8d60f64394bb4c1ca4c14c1b4003139169e8c3c7b85c1cfdc020bd8aa220810902f1bb066557e3927968850f219267da0bed3d52e0020120018d018e020120018f0190009b1ce3a049e2b9a82c3748a76295dfcd8fcc3e5a98e5d5c340ee25049754989624b9ec21139ac0030ba80a86e328a9ea2d14b979198992f73ff458a40d76fe3157ee74c5a780e1d0cc1e93f3260520009b1ce3a049e28240695e73550a161b9d5f945c736822c941c44cc310561e3023b3d29c7b8f63400303934b8c6eaf256d776e804f4c2763599d0bf0b586833ba8e36c474f43238da2169b0746157620009b1ce3a049e2b6b8bd3ae6de2696dc380103889de39cb79dce8c5bf3206e200b5392084d030d0002fedb7c9ee18cf5d219533d6a9d383f0a19caf6dd415e9c444edf0a7739081733c5669a72c94ea0009b1ce3a049e2be51221d79f42f363ace53f8d82381a5d99536a56921a526bf3902922ad78515c002fd3850f7ddd1fe6f8d83ea8942b09d61d60366fc0fcdedb5415ac13f4d2cd690136d3d02d26ae00201200193019402012001a101a202012001950196020120019b019c020120019701980201200199019a009b1ce3a049e29f4bfb8e663830c51ca0854be2037dac1418d225f41033b15e79dd01dcc5f7a44002f2b1bd1248f7d7a22a2bbc6f1a3b88e34d3ec3226408f6df3caff6d30785d07bd1501961a0d4a0009b1ce3a049e28fa7a6d397c4e48c65c0ccb3be5c3f19e4bab8ff0aad7e2d388d86ed99b1a9ef0002f237ad524b0e5ee9c4e215c1203ad0f95cd8dc58bfbc667801c1ec68886d16573346915867b620009b1ce3a049e29a826db7f501d39612b1f9033b02ded0522e3a31d047ce7e7eb7b466832a51564002e9096b7398db55805a66889fc09b433eb1cac810c5975500818e12c8e0ae0e3bdc0974768e9ea0009b1ce3a049e2bae45c68814f44670a5821012ed8587dc497cd0d0a2445ffda8a6808097774be4002e7a967ac773775302e6519d43cdfff5af212c987ba369df8c801054a5e11436f41e09cdf9b3660020120019d019e020120019f01a0009b1ce3a049e2a596791ec5dda98c1ea183f3c54e6cd76fb2dce64737f387b567983d9ac6ed144002e2abddc255b0ad2dca6096524a35a32e685ba71cca426b0e3cf91c3269cd6eeb73671b7134e960009b1ce3a049e2905b1d047930a894a31e293f722a4406903792ccd82c4e2a266d11d1f16aa5a98002dc55cb0e9384229141b26bd203d751782e5ec505807ca9574e9c73296495de83d5b39b51523fa0009b1ce3a049e2bb402ff304ec05a4522842eada9241b1eb0b2f942e8ac77ac8061bd96503f0904002dad2fe81faa773be7af211d13b1637d8ac7086c5f4ee0faa764f3d951943ee00ef5468c76617a0009b1ce3a049e2958dfc2ce3b3570d3f3b5261ab7557dca11b9e1f7a0f926e7cdd82f8d7882f460002d166e59d4b7809e744c630804d331bc19d8ea9526071fb66743a527259298eb9b175e2c4a49de002012001a301a402012001a901aa02012001a501a602012001a701a8009b1ce3a049e2ad9f1a0b127105f7574acc9a6ceb7e9e9cc2139e77274b5349571307ab3e3c47c002cceaa45b20f8ff0d9d05277ea1c26ab95ec012c57d5a12090749eb1ad9f3149bc6b670786cdd20009b1ce3a049e2acf3899227b850ee35948f1971bcb12f2da13391d5bf604e052faea14a694ac44002c28901c2dc93587f135d6440bd6a79964873da81d2c0b7b376a26f07254059187ce262d485c0a0009b1ce3a049e2af185472ce0a748448c0efffb1e0f9dfafb29bc145a5459286bd0bd3bfb897dd8002bdad04a0045d9a17d1d73ddd00cba98a4cf38b3ac649bb9e6ce7064d651c825b650ef7e5e005a0009b1ce3a049e2be1939b3c6cdaa7cc9319a5ebed73df41fe94e08fc7c4a390c8d1aa95dc3fa9a4002bc096e7d9c5a167339f65d1a206965adb6c3f41c0332f0408ab3b37eb1a1e5030776b0cbef34e002012001ab01ac02012001ad01ae009b1ce3a049e2b7593dc7aa6b124851cf5c8fee26d7246c51ce2287734c94b5967de9678a9a1b8002b6fef36cfca23b1f366ec8202d0d1dd0f7428a8f2368678939775dfd43322e3caafd2f9a69ac60009b1ce3a049e2aeaa2b9c8474598717946afef8773c35006c8f4e53484a0baf3da1b07f40be5b8002b5b66f905fab25424030284a2643df3e9a3dc27a4e92418f7d2863b8c4d44413bf747d8eb6b4a0009b1ce3a049e2b66854a24d2295d86886173eada78ba063034333e146173e4fee070c34120a124002b5b66f905eff6df18ff6b9ec3586138047fde2a25860445693fda2306c2e05c14512b598f232e0009b1ce3a049e291b54e3ba32abb096ca814055211c59cd773f80b30e24dd31798706e2226aade8002b5b66f905da438286f75181e77418494c8b18c5b3d9056703d5650263c2aa0f45774f662862ca002012001b101b202012001cf01d002012001b301b402012001c101c202012001b501b602012001bb01bc02012001b701b802012001b901ba009b1ce3a049e2a188a3ca29d34ea82ae4cb323a1575c15b08bc9e783a21000b07b5d945f7f7adc002b5b66f905da40c356490435d8b26734a3e8523ddf06685aa2b3f48031952beb28e88b19587c420009b1ce3a049e2bb3355d32b3ec322d787d4cbd2102607d800f662e2c484731bd2634df85a224f4002b5b66f905b9d3808b604c0ce8b366048d6d932d77b0dc270dd59287dd9cae58c5c599887fb83e0009b1ce3a049e28fd758f22a1b9e2ca1a4833a73b692603f7207c4376bb3ff37258646b5ccc5f04002b5b66f905b9d3d67baa0a2ec93ba4a924e50bf0815259cad58a0e0e8a47d0a7feb3f19bb256be0009b1ce3a049e2898a39886659f6d537ef1feef5a6be1ae23d9fb18c2f6bb1eaa47edfc4ce870b4002b5b66f9036759b3489fe5453dbfe5e2c00d9a58d5920865ea58c8da8731fe37a74989b56dc3e6002012001bd01be02012001bf01c0009b1ce3a049e2b02ada1a6c6265a49962d0820d9523c0e4443e8503c5a9f16e59d7a9d3a66f28c002b5b66f903675b713e6329c1e0f7355ae0667f209856d13e7efc9fe21d87c8016e2e0c83aadc7a0009b1ce3a049e29b0a047adcfe61f92269024f8bc59ff0a9744a1941282f7d93b871729cd40a2f4002b5b66f902dada4435e1b49423dd16a326044b7c0af9dc8d51fb43bfc21a6e0edcf011820843820009b1ce3a049e2a022dbd0d3cc251b623792e55120883774c3c4ec891aed6bf2491465dcff63a68002b5b66f902cffda547d83c93830cbde24bf104cd2a3ae9610c458ec80c1a30a2a0dcc48367724a0009b1ce3a049e2931c5d8f11186fce1da5f8510602912a1e552037347e626fe5ea21267ad860de4002b5b66f90238c38e30bccbc20b0da660bcdc106ceb249da6953cbd33d6713e6a4d16a42100e262002012001c301c402012001c901ca02012001c501c602012001c701c8009b1ce3a049e2a705b514b248177e73a850dea46768988bfa2ccd018f5861d25f684a537622e18002b5b66f901e24b3d42bc06e3a77fba211c4e8ffbfba78655fd20a3624c29e42cb03a94459242960009b1ce3a049e2853319b49b49e9e8e908e9f57c3d70b16ecdef24e30ba7a716267d539cea7f480002b5b66f901b6fd7d57ae37657359404c1e94e5ae5d51fea8bfdd72801c75fff533c325915f25d20009b1ce3a049e28ede4fb91577b4ca41cec9000469c690499441c901b92ddca003085d93054ff28002b5b66f901968c79ea4eacc9d314d9f1aae3a9dde43bda77e6bd4d95eaa76a20c8e004ea9f00ea0009b1ce3a049e2b68e1b89b31e200ccf2abf51eabbc24d47aaf157d83ce060270000e95c839ff2c002b5b66f9018bd0452f31ee76d4c83a5ebdc65266998b956d7c77e963593e84acc384cf8b48689e002012001cb01cc02012001cd01ce009b1ce3a049e28ee0bf7bc4287ee5986ba8f9fc75e45173c81f347401e9d36d479d3087160d858002b5b66f8fd27a9b28de42ca52a505d1c22619285238fff02d7b6fb8c96e62f7b7a465ef7b444460009b1ce3a049e29b6531631731360c1edabe7602c6fb1b8d7305e56c74f7c50f111c01600b3e568002b5b66f7e420987d88a02253d6d6538c80a6d2083fe31c60f28bbde53e3aa1afbb68ebe8645db20009b1ce3a049e2bcf9cab8637b9dbc37e50eaa19e71e9539710feff431f5607953a410c3ed8c960002afe38da90c790cb07efad3a6a6b2b17df9688981b3b75ceacc5bc448fd9e5dcf567933d474eda0009b1ce3a049e29842c595f71bf08c7ee5e6d5224bc54b6d4b2da2e087b263ecd46727f181ff3c0002ae0457a11964fb88705d8a1a927b941511fa4dc9dc5d50d0da4cf7fbb48496bf1a962df4ce1d2002012001d101d202012001df01e002012001d301d402012001d901da02012001d501d602012001d701d8009b1ce3a049e2b8d040e16b633291abe064d7b242ba06646791d2a9f6e6d013da8878bb6cbf0fc002aa3447ae909112ba92761425bbcb6844ea868c56d0429e313ee963d1288a446edcd97251350760009b1ce3a049e29d7928b30b0549ebdf90c83b44af8b635ed6c5b95d4e98283381e1a55a253d508002a5c97e35a6d45fe968e6748584d4833998ab0f2118fc101699e06d3b0659322cef4c666802ebe0009b1ce3a049e283f2bee78122fff36e855918c29b8fedc3a3c671d8bac1fdccbac87a295aab7b4002a098d597bf843e11c57246e6770c27b5507791009d09e3912f7c16e08bda5e5ef9506c4694e560009b1ce3a049e29ee341dee5ca29341e3900fcaeddf526b1f96b706707f22918346b6b535c5a6ec002a04ab543c78998324d3181966a141c514523c202e2a22d8aed2506b06ebd09b6abe0dfff3ffd6002012001db01dc02012001dd01de009b1ce3a049e2be3274d2706996bc1187cebdf95cdf17fa6826bb12ecef8b6803c868ac2c76b040029d5216047cf546dee48b7d754cb10756ee56e24b1f947b72bb5d6c4dd820300e1a254e716ddb60009b1ce3a049e287335ad06b666988a118a0b724922510c7eb17355f5acc11c93c1b791c1c4962c0029cc7b727ca8f5a24819b16ef4e614fff38afa70fa7d6f7a68b75728272b882e324f5680cb623a0009b1ce3a049e2a92b7b1fd1b5e2b465c60cbf534fb8ad0102d0908914896ffea9df3b20072ab2c002958b1f13310eb3de3900acaa1c1d147728ab1a4274054f1e3e7870d5a30dbe53d31bf2e559e7e0009b1ce3a049e2be25f1917118ae4834b86a9dc84ceeac015060088f65495b401c2c905e5fd27d00028f7605f4006131fd43f1e6c98cb9c0d8c3b59274e1026378fdc0dbdb50eb1d801cab3747f5ffa002012001e101e202012001e701e802012001e301e402012001e501e6009b1ce3a049e2a0237b7c7b77dc9cff1f524c80f9d317cb1cc0ab38e21dac4e352ee680635f2740028f563c4762b1358225a84ba60e141b1a49f40e964bf444a9135d940fab32e8a3cc9ae2836eb7a0009b1ce3a049e2a68ed1ea15a976b3683b32259260cd7eab14ebc3eeb11807d380e4d47651374680028967d7eee53a405ab8bbe1c5e2e3b1e546636910d34eb91b232b31e21ba0b3b2162e599de997a0009b1ce3a049e28c904c2e3837ae3de44b7c2f2b5fdad3ad447454355e20ab0d811e7dc15739c5000288745a4466a22758a1cf665f267e2c057047cd643bcdbbddfa2d43aa470886dd9898f9fefb6d20009b1ce3a049e2a2b41794a73abc6bd842f35f1983e68049019f7724f702fb5dff3cc41ff21576400282f80c5da6d94cb8a8fbb84820193b4d204821beac23c58cb8ec2ac314ff35ed535aee0078fae002012001e901ea02012001eb01ec009b1ce3a049e2bc763d74aa8e2bb1f02a60a8e47ed6eb86c1859e2b587fea4c859012984f7bfcc00277c9847cdfa260d011e830eeaf39b99ed78f7c7e91e0914678ca4a7c6edec4be7ab6a18ffaea20009b1ce3a049e2ac576a23a54d2c3ac938db7d5566ce7fe6fefaf861f8bdc39d5b0f612381a5960002728176a3a75162146cf7c9dd9e666392a3c3f6b4d3032b13332abc5b3f83e047c4a556a8a380e0009b1ce3a049e2a2b7c343a9c72357c1750a222394d9a08ff092f4946f431a5afd8edc176928e24002689a6fc955c0061ea29453572e3376d806c49c80fc3f1bf871f69227bdf8413c4479036033d5a0009b1ce3a049e2833ea0d86c76f578fe66e0c90f1383000085510bee766e65d2327a30a4efe7948002689a27dc6869d87ee340235f5a8975b70d9330b6dbae735efc3c36109bb53143abc134da125ea00000e6a644f6eaecff26a3fc05005c000000c8d0e3d8a0b7c9ebea5c791ab22c2bc52a81de35d5e616fe72cffb1939f24d5b404a1637dd28a35f737439be7702fd0ea742deabd80c242076d30bae1c1a170fa2c0b05241e18635030820e12b0a49a4238a3e6f5079733b75a6a5a0fed734780b000000e1ab094bb6434414a2431e844131db531f1f876148172afcc789dc0266eb049a40f780562f262d6098cdbd8dc57e94753a2a1f57eeb680f87b5e551b4b612ef36bb6f0f118a83629a1764d0ecb7ee086d76a519d09628bb0d42c6ccd5fbee22d04000000b80643bcfca717b57e40df04ceb842f61cc5db398cfa15df1500a2eb20e40644409a26951c60af855ba4f36f87b1f672bb8a48bcc736c43ad4856a9ee69fc6cc3f04f97225d525537e3a1ef4b5e3f055a54de301d83c99de8743b90b053f55770e00000024203cf446b5deaf108b3e96a234ed10455be8b0f1c5f7bf61c65e694d195865405907a6d5f71e69a33d87cd46a8f1b8a8bb021c28926ee3af86362e36fcab240ca07006b73cf03e87ec41d4117c046a2e62085ba0b8d96e8dcedad004462e4902000000893c5d05930f2b6da1f96fc6c9a0afce090bf48c04f239233fa2091b0041094d40ac76eb1dce42cc2a2a015c6bed69db50ceab96e0976b7289cba0ca7f13f0a3427c811e4e686120f9ab3f97444cfb2f29ade5c17672e27a73c39f26f2fe688c0b0000005ea91d155a6b895bcb571622bfd2b6e83da564636062c036e42fdf33c33b1cb44013dc054f6d18b4e9fef44ce96a023cf08473e0d5b9af4b849610dd27cfc7194afee6c9ee68271ace05d4f1425847b405682f14a21fc0c8b83a83f08c255cc10f0000001d404ea6f90b443578cc3644005e712dad99703f2bab4021ca46f6bd8b298a02408170f3ccba8f666a8f7db9408c796d577b2e12028200deeca06c084fd1a889dc8f9ab74c16331a2aca654d3c0c36a17281dd1d393967dac1e4efa64cbf51f400000000f90ca26ae6a033fa52f6a7b01a7d8bb658ab3b47800e350a8916e0e4093b1d774003b19d2eaf125ad22917f844a51f9383ddf8b6d0deae13ae85ae14e0faecec90f3aa9a0175cc88ac004f348bec6f93fff555d315ff4114dd8601313f3a76080e000000a5303445e2a8350579b0fda1e4404a5cc6669c04f91d9cc8dff72cf1b866fd3d40a1c170c3dbf3eb24451e072bbddb874c0f5efd121e8166c6b28753c5ba2e800a55ece74c06f55e5024622a021eb5df7e59ec22f8895d2f1b4c17da50d11213030000004f7f8dadcd7cc31c1e88b7d419c78d4b5097d17e5e9d74c2b3b32c4f61c53671403e91e970526e009c7697e70a39b8f2af0f2abe94f9d9c5e3842b0af8395cd294d80fc362b1e905dbb2ec72fac25da169c280c907c0b525f356df5d60209f520200000023a99a20a9a8b82a6399841ad441836a73e7582ceb27a46525cd3cf41e955f88402b3d3cd7bb35ba16d055dce053faedf526ee47b1dcb0adc6b58eee7f93a3ce2e05093c3d2d2b91818da07c6af3b93f9c54924f58e84a58e3acc862eb1b2366080000006d63321db557194f26cdf886f16a77c8e7afc48ac4499e34a58fd2f2365501b040210cf7658c71dafa876d8d5546593d468aa72eea6b2b85d9dc2bbefe69d0f20cad6280a47f92f56ad6a14b45e96df9402b7e853a67faf7e8f3c8091cad573205000000caf2dd3e21e6a3902c49f083af2565f22396d2fcdd81c4c713f5ae0f4900dede40a9ea4dd727036d0a80423c2751e13212b37deb79cf27d94557f4732075eefe5dc230d52af6f5f90a8fab841b7b93d9da5a8df132252f02903732f8ad11ad100e000000f85773d5c89e6da6e444ed89f53b3254a75e01bdc305edb3bd6bfa79851484e040f930ebc20a981e4c8c15c107ee2db71207c3490247c9f037789d25125e1c3ec5830d7595f44eda2d6997f4d671d37fe2c8b62614a7534ad30189e8ca30a80c0d000000eb4a509cd1f1a051faa9017107d59e1ecd08e8bebb9d83a8e01b529c36ed597d40b47a3571e2ffefff596a0f0b0453867100638b38e483d3693c259077590cb0ac30341da8b76cf2d82e5d9695f7098b3027aae8d2e2d480dd22df160d77a4360a000000e9ca4cbab039ca2bae4eaa73bf16a058b305b477d733c830a5d8113b6c1d6b7340507beb487d5a624b4a6ee035cea7353e9bfdde6f12bc021624df1f3ecfee129059265d026c5742160407a301edd5ef63da5481bb49d4d65a1731cbf699eb91010000003542bc271640e0d3b01f06114cb2b02f724c465ca204cb1cb4d2411099f6148c40b90bb3ce4ab2478d241b93954f75145939567b73df26fafbbc1a088d814bb47a32bec478a09f8eca6862ea323e30ee44042aeecf9fe2c57d2c4d51dbb812de060000004a0b0678d0bededfe09afb1e9fe58fce610d219847ca863ff37c5410d5ec0caa40bd819b42cbae10ce212224f691bb62c0c1d4c796fb84180aa0e4356640a472c5ba6860fa768774f30a3649c8f8d06bb46de89d438c905cfccc72b9a04e369808000000255a8a876b816c2083e49fa75a261c3c011cda35bafbeab3f9c3869ad165df694058030c57722749bcef346c668e489695018e31e90c2f235585cd69d3b5c8279747bf0fc7c8c982998be2f701de27ded4411403ad43818e9bcd56f87a6b298607000000e79e3ae90f729de577c37dd35d4c2078c51a1ebe538b916b72706fc0f02a8abd40011f34188dac2a63f96574af35ddeb5df79c3a0519ede6d1e7f8020c53f0fbde35a49c1fdafed953907ed50ec75837019e459dabeca51f3d05cfbe304c0f8401000000af7cc2792ee114b8322bdbb974e9a5e539988b5ca3ec615e8a225e714df4688c40dfc2cbaac54fde9e3cf49b0b33de36d4c6debf5e272a81c460f5d908594af7217d4f60693d844a01242bd186200719ee9f68c43cf5402e93947194415346900f000000e776ea32cdf5879647a6ab820b10a57574fbac09305dcba527851c42e53ba060402f9b26d5838c33d3ad0f84396647da88054434a1f8d5f768484a64de46c960df782b3a092a62f5029dda0c7c644b83e6c56c86f12c8cf69f06e9828911dd800f000000f2ac934d99f52090585e72772fde467efd5be228d1095dee10c22e937b67c4ee4091936c76285647806e480ceeb276560e8598d56c139c1ec29975aa1df30094a24e790ea4ef16ec93b864c04a3d65e40d4d78c9b0d4c8475f5c5f65fa16f7c50c00000027136bfba45a6b691795fac29222cc373baac0f6284f4de4668cabb3075b34af400508e3dce8c0e1d6471343f857f2d79bfedb05104d606ac615f73f15d1af4ee55b1f7b629abc225be01073d403a8cb099e32d3fbc4006230058f2a59ae812109000000374b20422d0367cd04a2b3eb8851b51ee6c0d808950436b1ccaa9a0ed52b1e364097d4ef245dda0f314f9626e31ab0a3b3add388afd5f8d8520e4eeaa86329831bb417ebfc99d9bfdb4a6bc54d70a096e4dae8e33d22b07416aff897e230ff1204000000a32fe43007b3d8dd8cac1890ce5b840000e565e2cc7538fcbab9df60015a7fa54022993448a6a2674ef1c30de1c868564925eb4b740b07314ef5630c1c1598d8bb1ea677f05d2e7ff21f6c0ac665e0c959fc57512d6ead3a8a2ddd9ce899271d000000006f648a66ecf9a5befca79ddbdff3b576b2d6fb82b8bc7246b20bcb6bd11c636a40298847d5fb0f00c3167653aa47dec111b05c56d281e68a70ea4455778b35bac5f1ad281c9c66a9a4cd29211b38fdcc4e5b290f5e8845a701d7f492ee070b260c000000a4fd5fa73f21b18c861f6ba14dc142364121f5d2109dd9e0099df0fae0c89f8d40efd5f00260cec1ea92efe49bbf2b2ab5becf07766cba34e568ee84eddddd04cfed244a2155755f692490098c309c19fecaa0b9a198355b8f51ac1ccc9ed5160f000000a0ace49ee84706037e0bf0e48d3833bb0c7e87c177201b9f6ee0534fd502ac3740f5d25e562e2908f34857c691fa16980d3c7169fd10c3ad389219a7980b49bf4c8e932ec13255971163c80703cb778481b88b8692a81f67dc6b0b86355a7dd4080000002da7cae031a102616d90a7142d22aeb99be0d63fab7a62f8fde4e04e0a27f4b5400c4dd5ecd613c4e5475fe87ccab4479b9a0e516187b1bc5c2dbcfa832941a2c5a1ea6c838d8b7c86eb1c75875cfee3e921155d616b60716731f089d6b665e20e0000008fd9371ffe01e4ce3763c84a5ce8a8a4cad233b3fe28cb604f34a7fc112fd79640d05b8024b0e22dbafc071af4692ae701f18c136233fdf941c90445a840d581edab9e146d6b943720f062c984b633eb5088ef22cb3325b931c9c8ad78fcbc1a0b00000026a28e7f47ead75eed0319e5f8e27196c05efc36a05c4ba71d02c3412447b84240e7ff5ae99f44c89edaebb11a340616c100dad4c64ce4817e0e1540b01c25388d248f2427918a747e8cadb31899399bbb5c9e690e11221f1881a4669c3634d301000000fbc6bc76b3459f1d95d72d7c4bc9635a225293946ccc41bbcd5a50dd27f55967408209d1850cd3b76114ebbef9b1e1742b44107323d740e738617ad98b783e036725cf318dee5fac6a7a37bdbaaf158d5196183b52ca86aab8c41473d04bbcc10300000051d28550491d3f5a8b857a75b739830bb726e28d90017af6410f83627ffd853e40c0a90165146ac70a401e5adc684a53d97a3cac7573415a78247075abd1d9eb0d6f477f3fcb46dc49f1307094742123f9f9f7bfaeb05fb0a6ee193e1d764e690c000000aeda1b7c9043e0732f0ba8989cd876286c4ca7e25e3ea1763c51fb12293e0949409a374c693cf4e150ae580a86dbea6a109ef66edfa4922de1d462e93ff4710c2bf09aab03b12a932356798497dab49c615b2cdbf2f9c4b2f94c63dcad23e56d0c00000041537ac578be5561db8211c9bc5562c3694e3cee7333076c561afedb4db78159409d1e7f9d446b9ea52b3606e4672f431d719881a5c0d9878d251dd3074e6aebaa2b8cc27754799f3f6b5e5eb2a48cfcb68f6c8d57c2fed940f5bc51815787d702000000a80bb22e6aa566631001b928ea9423e19ff4bfb78af22c95cc521892e2ecf467407aba8e41dbadb47c0a6c372dc384135b2bee7816578d2c3d38241d7fb293094c1db0d7adc890051735ec5bcb4f470445a09e3ee36e14048a6afa9e895080fb090000000a9f950f43612b4b2046c9f47de5d2dd9ed09a2fe7461f2a9bec5916372cd060404cb77d344ca2d02bbffd97fa6cb490f21256b05aa7b099eda5166458033ca4f008c6ee7b716485e9045f47b6c58fa43962b0c6ecc1debaf4a946e8468b8fb40f0000003e87b6d46552cf298e15081e807d238cfb4ec875cf6276d1b9edca3d8d926d3f40d844c38a1c7ee5542148418c9c176a3f769f49a8c4c2fe5c64ba0aacde401e68740c8930675a2ae0bd506e52bec7ae2344ff6d2be7f06e9b2e92b2abf8f9090d0000009c2b3ba2e7101530442ba3cf186cc1967af6be2829f97cb7950cf60f3e61c0cc407845647b21a1b35946bf169caa215bc2a01cb70b156e3391431407aed84950750f11a3c8b39ecc4afd5965e854d28ad79b2da7ceff90965669ebfeef138a9d000000002ab732efdf4747b7d60c2f60985de1d8c120d7a7d2466df2a07b1dae466b90a6406d34b206757c9f36924c8b817e78bad8913fb4b93b4db07102ff4691577cc3dc46c0b404cf67560e60cd06f20efe588c9024fcecf5aec1518981d7df84b1ba09000000a7381aa3f4f1bc13f90e703af5d4c92603068b2f8ec0752067cb429edc834a364036266af00a2d8882dc760bbe7c1d53a23d7b00527f00204a5ecb95b126189b5ba2a89005838068530416242d322011819a15bb76d45a2fccc4ecd956a89b8b0f000000b8d67085f4e408b886df79c1cc2dc5b32e24d6529360aa13db048987f73836f840734b40abe0266b6ece35645a2e11955dab14ad14d161dc8e014d952c69aeca3e46e2b07a7bf2370072045d7e4fcd2feb09e850cb17d0a8ec074720700e18b906000000374caa91c4f8ef7b3afa730224053086b306700bac7e860a756f4b29a2601ed640bf3b443b56f7f2839d459cffa940188e8887e2cf5811fa8ddd36c5faac0b5f2a56162ae63d2ebfab4aa8d39eddaeeda643873c174172748cfb2b87717cf53209000000f69d1445a018b00848c7bb4cfc9b37ef5ed5b4aaa9de7c2db1089b0b711795b440948204f4f08d9301710cf62b950b850d4248f4bfcdacff47b858439822ae81e905b1e3518e4602e4a407861632ebf127b22716b99f08dd5c5ad6a297de0e5a06000000e171b478655ed1b99ef2f227a3b3ec04a5aa7a5eb60ac7ff1d2d230a4ee51e6e40fc5316de4c348a3fe68185838d90d24d068e2d02c8b2ffdfc4d89c108454c22eb26f7f43ce71bab811137479b081deb3920862a2b0f59cbc3a4b1ebad5644b0a0000003ac92797787c6c84e941cf9013483430b5c7bbfb3b2e6f8e8ae4c94929bc55de40ce384ed1d659127d946c96d605a8dd4650900ec9fa01de270c533ea0e4f7e78e8c48c318b385943db4e0f69b7e4e5b45897eecccdf9a585c5edbc2d07869e508000000b1f3ab9ce8a35dcfff2bd411cbb72485535f249ba2f681494ac4e20a6bfd38af40a3bed5552d65fa8530d928eda04618cb5337342a47af200700e5330eaedb82d13230f899cbce28136e3ebc97f020603c61aae0bbf39c212e5178353e0bbe3305000000e566ca9a3efbd378c65135e4ed2c5ddc5d3f22b1bf892cdaf160c184d67231e6400efb8d10cbf4fe6cc81edaf1a269fcb379f68842f0cdb3d1acd456c0ea3ffd8624d535e4e79fa0a84343be52207110e73978755fb96155bbdc0eb07803aeed07000000e57b9ebecbdf4e496efd18daea9d18853e7b5ddfd0b2952e13ad04f90b13218040e9681469c52ceda5e719a37e7d51c7c57b246ce456cd2040123e87336543c696ea52a64f96c9465bc487935b67b30acbdbc322126b7d7c124bb1e35b296f62090000002ed5af012d8cb9f2ffd3f6272abd50897a2bb08317bddc067a969386c38a422940ad87e73ff9e6cb595296dec8f3cbed50d4372338ffc46eb9122bcd8938a0e8e89fd4a4f853dea7c59ed108943a33ff660ef0c33c1ddd6ea75ba0b6f4deaf1a0100000059c87e83cfc03f1ec790b07f6298f2c77e3ad5ea5df0e6e88184ece49131caad40bc97d282f44c34d5d088c32b76d55e2f7bf67757c86a253b566799d5fa14f5a7b6db5ba9b7e50d68472bfacbe3d2185e06bb7bd8d40c95bea0483b23580ffa0c000000b8530b2c1a8b826ce48ada2532cce4ba28724d24737ef345805eb4a1710b7d89401dcde317085058b2d0bc3e4210cd4334aa3cda0a8d156bb0b7947b5f5419d4d728dab8dd4e3e76495dce0b06af4325d0368704da118824518e09f04a41d83806000000cec0bfd8bde9c4fef4b78caa853a3b56cde1a650d9841c9b1a10b6f35cd89c59409d1c00761513e6f058bd3193c0db5589ead937ee640d1eb21a58df9f273d408c0a10f651dbbaa5a9e38dc5ce571d621d449bd7bf2fb5fdc715fcef34a826f70c000000f752366bb55158beb9922ef52f556367e04ce50e65d049fdd959ce9022a575c040f1407d43f952f6fab8157fb4c4916e27dd3a377b41a7a4eeaaf5ded77a7f0358ac3c92f2bffe0bd0d02d0f7333a726ba245fca6eb6e32d03132fbc6ac33b7300000000fa523e38c6135bbc1cdb9e2cdff33876dd946d0897cbc23e9a89ae508cc33ae7400bea8f755ea13fa04fa4b15341b81f5e5b7d6f4290e6088402c6bcefea8c6839375563b8c0bd16f894268fd6bcb0fe4577d56ccaa61b036aef4fa58d804c570c00000034dd499d75dae5fd62afdaf567962290fa08bcda80e38950b27e293f61e9eb1e40131113866055ccc032ca53d5765ac4177e9d00af366de5dc7d8f99a8182bc7937602f5fcbd715490de05650d4df22946b9c7c8f5a34e2799f9f8dc011354c30200000035dc9777b316d5f357b38f5adba51db5cc4b028fd74c59345974738bfe33d2d2407d54b22d6f82ce829bc1bb183f47b2e653a95245f5ed8f343acdb8045b093a95ae24c2a18cf86af71052b81f44455a7c4ce67c572690cbdf16f383fa8f1b950e0000002bdf0c8ee3efc21888c8cd5698c586a840949ca104885fe13a1561984b264a9b40ac4063c20b725d4552bf1062ca50de999b33eff7ea74814b307079eecfeb0bf3490cbe6198b30c43b305cbe38da23ed97be193af2d02e2d934dbe8ede3012b0f000000c52fa4d648ad74e994ff1d8aae290a83d047c7f8d4a21054ce98be542fd1381c406a985a9f9e8b6e26c8ab6dca82a6ea29f08987f425496064b8ed1f5188b346982ac55455de41f16b109414041b0e921bdf83b69e0def6e5244830da60ca39509000000d068c079a7538ca5c1fae2cdca0bde75b1d2cf204f5247c9cca71e6d99dce7544013a3fe875465ee3ede708e6a4a10feb859ff9768f7e9e406fb4552a268ed197dfd865e42e17b75a69d072fb9743b6a2d1669e4d4207a361deda08b9c3cfa4f0e000000da560e7206302b43d1a981751e526148c99e590f6b580a7058ac48e4cf07c9c740a03ccce5e2d430ac8a6a56dfbbd684a1db030981f96564606823eb3f1b815d95fd617da76bcf8da03c843c0a8eaa01a72e2c8602aabf17a5d4a3799f9a0fbc07000000701ade6950ce26fc3ab6daceed6c206c94c4d7b2de0e46e3d303243cee395077403c1463a0900657d19528594be6bf6cf11e66f4446a5f18ad892bc593ec0c7a696c841f89a87a38b7ed0e4899554b1e09cd0fd0eaf436010db71726fba55dd70a000000c78f54080f416629d300282ba2f6a7a6c365d8fd201edfe3b5a908ad94be81e9406b426b818cf7573a34b5490c5052dc98b8ba44efe3b3f7013b50719e1f2c2de41534cddea4423aa04e535b924719d0f9a1cbf03ee103cd6778889c7922ef030e000000fa720117377e548e8b3d95b8c7df16a8ae2a2c89f7466656b451b1a68f6f7661404f4db2d20f5546f7491c90429253d845c3ef9463ed1aa499cec65dadb42bb72e96d8bf2d438f944340525a4cd746be949e6bd55bb6db76114fad4f6a7900fa04000000b22408836b178f327aa0018dd572ef6775826fd27eb7536833b0153c5425c2a94080fc67c314e6fbf6ba496233a36942a3a7b77090caf5ea966717f271a9668dcbeede952b06975844df56125005e1131f5bf1807daef24f3ff3dfba28e1c085000000006b94802d51844ba482b80b91779c9f89dbd382aaf90ea6683ed67486fbab2d7840464db49afc1d9e0f211f5ca4987e2682d2932b6432ea988e54ca9cab3a23b4beb1ff04baf9fd6ff0fa907354680f33d121137c55b02f7dfe2cdb3f525ec93800000000c3bebb2d53a14864c2572c13c2577591d0d3a11301a0dafc262188ec8d767c82408cf70dc1e769d51b5c240585084fe82b09c7d513db1953a9a852baee11a5dd028e98c1757182b2ddc5e89c900d21b72b6173bbf57479b3dcc6cbdabab74c7b0d00000044d75ed226ee97d5312d85c0bdabb7797bfc69857b33cdb36d60fd2580648d7b40ebcbf372e65922cd877e1acc8d23f4e90f0bd21d7bd03d91e1c6c363951dca950547d5179f1de61d92fc09e29abc184f63ef1b33a2a56b02f32bc0f64ab89603000000527ed5189d82e1a71cf10db3d95bb1c862a14e98933d9199da4d6da152cbc11440963d50fe67ec9e103454a5a1c5fe3c08ce18cca84ed9682366fbb9d52fab240ddd7e9930837ac6525ce6d2df38055aa67247cc97b72e6d41d77ca314182ccc0a000000a93e2d8b048f76b4491e3ed398ebbf661f56d483833391663e1144ae74b3fcf3408d47611d7436ee85ea7de36fa708124710fde3b6a490377f7369ba6ab8cd0ce921d9bb9d3694400e63d22883cf31ecac839011686a3a242308989d7778b38806000000bda0c9bb1e70f12abe98b482992156682bfacb8531e2ff4317055f38b802e93540941ae220cb8dfe39ef4337d67469717697470c3a3512835f5b54973d4293ca456fa979850636e241ff478e1129690f292fa56578737037cca7cf3a092c56f40c000000063c57e2b1aa9bab0a28150e0e2a9b6f97970d6b69623dfb8073da5c4b5fddc0400869d7e72f48cd9cada1b8ea251dd07c828f3b2cfb7cf8be89952ac1d3da4d684b82380511d66a785073aa3969b2b72e4c73f9f723de6fa82ef209f0ae034c0e00000089235fe245cc8944de8d21af4d807b19178fbc22f7d420cdd50a68532c6d799640613d7b49e4cb5ef0b392d400dc84f7f4d7cdf0132c39c9a22d72ef8c36f9546240596462219a35028386122af173974e29794366e6143d9aac422f02190d710b0000009b21c793199c2e34cdeef9d3e264bbb48a1409191b13e4abab5f6373b67de33a40efa971ca0d326fd0c331ad56900c0ada7b73e826946123bffd70a9065c8a2534e121c49c87f45e985828f81e0ce772eaad1121d404d8f17ffc00fc7ec6ae5b00000000a179a89f80cb2349182cd407697436168d4571a1f4ccaf92b166d99d87626221401eaf780d3eb495d4bd2ba6fc8c3420b9ebdbbd4e4ae31171f4415f5f1c06018b49f1df3fa4bc7d574fe7c03ab283893af368e91aa0eeb75fb070a524062e4d00000000779e0cec36c3a4a9638cdb38cb70c32eb48de18efae134b6ad8d6e4ce99ebc4a4095f2a2bbd39b48da56b60fcb44f51769a6beb6576426ba666bb9d8e0e18864607deadec0c199e9ca5c4288cd853a9b40082f3fa9cbcde93288bcfbd0cd007f09000000462df7a31fe827377fad55aab48d44b8636e70e0fd4d629daa6d1ea292e8913440b1975885f48c5d339a48bf24778c5f54ea1f43dcc44dbf48498805d03e9295eaec0d049a60a82ba305ddcceb249ef961d7963dec81abc76432299d1f2cf5500c00000018a2901b86bd7253be1ac4e6103421613e8c6537694d7532b11518b72106da8040af2a5d5d806cdb03032de241ecb8220cd43cdba39794064792ce41184993ec75ef2305dace534a6388c0553e63c401dcf981af01032215639176f005e1a001000000003b66b147b9b7182eee74b3bbd9032038cd321719a382afef6f2819efc42708d940f191087635b473be0990581515b7ed8cf5a0168817905a1dbad0b1db19a484d2e5a14825a5fd9c9dcfee3579c8659a7a7d86db5566b665c23ce40692885ae10400000008865ed58ab14d786ee026a4539a2fbd43335b43f6822383754952e5279fb90d4058e3b4b749c0e34b9690a203e00dd48e2177f64c1ad18a53f6873f07e1930871276fd266c0423f1a6726f2958548577b21793be19e1e4f04d5eea99b6e62f2030000002df1f46dc3c20382c615ef118eb7aaa5ea8ab075f2b5fd6b5a7586f3705c2baf40214d7ed7fff4c63732295c7149dc24ce77bc25cb2c39313b57316613fe1f4fc6f22168310514c44d0f08fe3f33eb1e318cd458a6f9b58a0a7083d8f735484b010000004e1023470dab0e0bdae342e8e82ef6b4a30a9d6d6853e97544c776ed058319d1400b82e7b3be27da524f64dff8b1bae350bd260b1bb1480e6f7689469e5452b3800f4628af8b555163ac03cf58113746c4302794dbf69b1f080da24aaa0dd3a703000000500ae89bdeebec2347c477441f54b15e69e6c5ca95241d1d1f021a29103ed94c409d0021f1218c9c276b703e1d74b6ee2fd438430c6500e93cf96be55b0e94de9a9acedf1a4188478e87724f360c9e8e45384e87c1e36168e085399a66c900c801000000630a2df460469a48f433726be2813fac0d02439cdc63e32ae8bcbe5c53f930be40063ed65a944a6db0b53f21910009acfd4860782f68d2d08e91a322cb543972f104bd6a71fa6400f9b8daf0692529c21115a0556d5cf182168a0b8fd5e525920b000000330aa2759045867ab82df3df4dbc3b0cffb461416296ba56d58f3b369d129c9e40eb95de0f2d39cec625533e4acdd65e21e52b5cfeb7525ae485459c4fdc7cf7148750d358d1bc389e60e2249735050af81056ea88e227371735364acbbb83380700000030d95e320dc002ad40d9588351beaad7c46315da587e29b2b8fe4397fa869fe040eeb1198a1785d2befc6c72355b257f7fcb13a79e7fa673d9632c9103488b37eb1ee3a59bbb543dca70071c9afea4419286530d9309f98adc133542271e1bc103000000fa3145f25271dbc9ec47be68a1f8a0aec544e00047fbda3e137c891c5b33ff5b40f8a22f4bb2e236dcb6e7d68966021f7b9d1c0ce4865748221721fb954087fb1e01e1f2160569da8e438375db52e7df1fb08858e3143fa59c12a0a0e2d8f7f503000000689b7ce808d9809c1e27af0e9dbe7993361f54ee682c278c43afaa7ee6b91c994056fb53ef8a0472177e32829904427ddd697e9411da4de59449e1a1e92843fd04b219e283f0877015353706ee4894b77438012db4bbda4e4c0fcf755524fd5608000000c1eb31547b87f37ac931942667a33e35ae3b2039ccb36f8ca770a2d7e0c2a6e04084346580b75550f4e9c7b85a41419949c490d0e2451c8cf06734121a7085da21aa81911b474522542ca7f76080477ce52bc20a2f0c1e45db033bfd035e08a905000000366a2424b37e81343c0e3e2186f32e07f40fbb83f5307fb958f6dcd7d055b895404b3ba5e6d58038515c4f37ac4e91a2f0a35c3c6be99076df75f41a51014731231787e306a763fd36166567a93de9de902717bd76cee204e9e8c7a676f06e0706000000b212beefaa4feeb3b622cfcf250b41710bcc1240a4c9baf35cb2ee8a93cf3a6c40e18647d81a139642377a885e9cb5f5b983a62a170cfce0e7c8d6ffb6c8885f8232877cfe9f21587e98a564fa8889b94f0e444ecec5d630a12b14350f2431ee0e0000001cce0f52b5757299ffffffff0000000000000080176f9201799dde1d8b96c087b0a56623a4757499852343fbc0195b57350863e7c7fff3cbec09fc04a5ba8c4f98b06bb1227c1f4378c34d5ada3871fec929e90d62d36028ffffffff0000000000000080c1ae9201b7ca9066de2d4041be339bfacd06b23f75a15cec132fa95b446332e3b923578e826f82be560a515ce8b2e051411c04f7260bd5f8b8a1311f90a18aacf0e6dc6bfe530100b5ee9c720102070100014700094603b7ca9066de2d4041be339bfacd06b23f75a15cec132fa95b446332e3b923578e002101241011ef55aaffffff110203040501a09bc7a9870000000006010192aec10000000100ffffffff000000000000000063b9da1500001f2fdc3e62c000001f2fdc3e62c7a217a7fd0005fd890192aebf01926f17c400000003000000000000002e062848010183fd3d8a5425702757e60b2bfe97ecb7fc1bf4d2099b5dcbdc579b9a616d593000032848010102cb0b910841582d7e101d20aeafecb3e54a163bdca9ad39e61407a43f87d8580020284801012c8ecf1fa6a4ceda8d1b091ea271b0e77b7ec0a4afc7d645ee5c2ae186d587220014009800001f2fdc2f20840192aec0805d48c51361a58ee4f84b5f390453d28a1e8fd01958ea719099727a6dd3f0397c36d2e0d262b4d23d6d0c02aca82ea3ba88b26eeefcea11cdffc1f95393b11c00fef65200b5ee9c72020201f30001000052e60000094603799dde1d8b96c087b0a56623a4757499852343fbc0195b57350863e7c7fff3cb00190001241011ef55aaffffff11000200030004000501a09bc7a98700000000060101926f170000000100ffffffff000000000000000063b8fa1500001f2bd2e0c28000001f2bd2e0c28426ffecea0005fca301926f1301926642c400000003000000000000002e000628480101b45973a8cdc224bdeb6933ee882eb3fc9d4d4a76f928c782759801639b59d9aa000328480101e3af9b08bbfd16971364ce47e5f9c7e3a30cfcb6f5bd06f3a79d3fb53c1d7848001824894a33f6fda4d083586361f32d02ca3098685952b49a058fc2c8632103398b743c33f98bf266526a985e811be924c608531d55073cbef2fe77771b901ca46df81693f28bc1c0000700080009000a009800001f2bd2d1804401926f16a5398547c023747a5e50022fb617de24a9e3b86b4026e4f1b894f7032176ea0f7818416b5950b64736cb2bc71c9aec3244f165b2d8f84eaceb5cbe099d60314d28480101dabf8afffa61d338974cbeb65d66554265e247cd66fbe43d4e951890243f69a10004000102284801015aba126ec5fed43635d70f3e1f3d805da727f46dd7e4bc996da9b7a5a186202800072457cca5e87735940043b9aca002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac000b000c000d000e2848010186e49dffade555c32997979a598d53db253a61cf80a7c901d8895d76bee6f2000002003fb000000000400000000000000021dcd650010ee6b280087735940043b9aca004210150000f22012000100011284801012ab71a6b260702d83c636732debcb3012e5971387d4164367a1d77c646e5438400032202d8001200132848010124d21cf7ae96b1c55a1230e823db0317ce24ec33e3bf2585c79605684304faf200072201200014001528480101fd78695ffd58402e209cb0b060c95b1a8a83dae389c7eac9554a3c086e52b8980007220120001600172201ce002100222848010114265b804cdb772e1c9a48d1dd67ad6e9315495151d6f49bf5f203b2b883ae7c000c2201200018001928480101ff9fb607464434b8240b30817c4e6c358ad723c3ddeed45b2b82d45b9fb0f6210004220120001a001b2848010135495972e4dffc56ffc325d2abeaa6db04e07d832cc8b8847ae195158fd724d20002220120001c001d220120001e001f28480101ab446ae5250a0e5acbf42540f12f69bc49e22d74782881442954471a01c67d6c0005010120002028480101e1e66c22df500de6499c055de17ff3d1216fe5f15247186dde0708e01c52526300010024c201000000fa000000fa000003e8000000172848010172ec134de3b5c911646d3fb1cc1e2e0b5d164a892c6aa695915524a9f8058fea000a0101480023012b1263b8fa1363b9fa1300e800640fffffffffffff80c000240202c80025002602012000270028020120002d002e0201200029002a020120002b002c02012000410042020120007f008002012000bd00be02012000fb00fc020120002f0030020120003100320201200139013a0201200177017802012001b501b60201620033003402012000350036020120003b003c020120003700380201200039003a009b1ce3a049e2aa6864fb501ee9340ad67a114088f51a7714fdfa7a64f57de94c9cc99a53de5fc0025e54535e12d7987ee340235f5a8975b70d9330b6dbae735efc3c36109bb53143abc134da125ea0009b1ce3a049e2a7c881b7da8f67f68d34850b46be08b8c68df273cb28de2290452dfc177a7e7980025ca8a982a95301894d7dd51f484773b9a020f2a4731cc0bea996959772f0026844aed6d0b459a0009b1ce3a049e294ad8fbe2834efc3ef7911431bfe9dd0e146e967441d83387705bb4b04b1224a8002552b682c07220ce67a68d27ba3c67fe1590ab9df0a8837b33e5873aec114dc432e30a986bfe8a0009b1ce3a049e294e727cdaf1662923908ae33c146050b860870be9536dfdc182748b732c94f0b80024bc5267750ad3c107ef3afcbeb159ee00deb0da381cf8eaf7ee3c54258ecb9fe354cfb3d9f8d20020120003d003e020120003f0040009b1ce3a049e29f4457a36d1a1fe20269af4ea4cf30942c9939971145dfa7231b517d6f44028840023ea609c2222de183e3467b8107ade8d739831136c871851b1714017416f7471676f8f45bad8920009b1ce3a049e284f2ecadd3247cd2ebb152bd0d6491357944fb6aea67560cdb32795430f1b55700022516298c569b17eec3f9b0e8ec4f7252197b59249072ed20a89cb36c7864d28212ee858d6ed9a0009b1ce3a049e29c1ce89793fe221168ae8215ecfea7aa0349ef7d5dc74661752a0d458fea7d7080022316e961bf7946d31d2170d3bb67765785fe00cab6380beb648993790c6b62f6d6f9aa8653d660009b1ce3a049e283cf18fc7672b01db23ae9744327c5ee2e0d7883ad2221fa8968d0cbcbbba2d440021973d292b0bfa5fe10377345d60992f0c173a8ee2383d821c494cc3c9c95f069d8b51855d473e00201200043004402012000610062020120004500460201200053005402012000470048020120004d004e0201200049004a020120004b004c009b1ce3a049e29ab695b62de0973f7af7870c24ca70dac52ff49fdb730c03638cf8e167addee100064c5b77b8123ebba04c54d49d0c2a248697f32eaba92097fd5d726fa4e91f749e61f55e1b37d460009b1ce3a049e283b993cfa6fe6ee06eeb5db431143b770e1051edc941e3deef5bdcb9f6371c6c40064c5b77b8123eb18e28452aad9bd641f98e55d7744039595724c1ae5286a6a26ac2917414715c20009b1ce3a049e28d1e13f47076c9cb310019310276e727ba96c5cdcd43aa37f18d4e25860753ac40064c5b77b8123e85e0cfa335d13c8bdc2cb6c84c534419d6a4a0d1d2427f5f7c6b3d52e5377ffae0009b1ce3a049e2b7507947f1bed143e63a59e0c968d3f04ad871b0c8b63d8168f7436405ca403b80064c5b77b8123ebe141a8cd5031943574478d98f63ac3454492ad47adb30c1b3531c8cc349a7ad20020120004f005002012000510052009b1ce3a049e283b920aa83e1a3e0f9748e17dd6e12e188209a839287771d74365a364b4c8feb40064c5b77b8123e8a73ab24af4170e8a646f6faf62520a9e70ae02f66a8faa8d739ef087bfc7e5ea0009b1ce3a049e2ae7f835cb1d51e70d5871b8ab3e7761e935925a7234f39bc71f137820df6440b80064c5b77b8123e827b0096de4bc955d34d0aec0615701d8a028e921f17a53bb9348a002f13d86fe0009b1ce3a049e283c47fd9d42ecdebea2f06c5c8a929df367bee9a6420b13ad0d3a27214b9c6b700064c5b77b8123e8dcdb94b5329e0ff38fb4327c57407542d0bcf751c201644c0ec7eb9dfc76c84a0009b1ce3a049e2b730edaba4e320071398eadf54ac89ef07c1a6820b2b6768abc62f1ade48813d40064c5b77b8123e88491234782701a48ea4a5a886cf15f978781699d77e4c3f6bf2ea201b3ebab5a002012000550056020120005b005c020120005700580201200059005a009b1ce3a049e2b2efcd0cb3c1661344b2cf61129b0927483ce6d32004343b8f1d85ed09f7ae3340064c5b77b8123ea78b4f2d833b5dfc6c48d222ade39fa4a96bc874e62b16ade02c50ac553929e920009b1ce3a049e2a952e3f1c44b4d7c602512787ca408aa838114edae68b89bf52547886a273a2a80064c5b77b8123ea4ccb3c8c877acf99513bd653d35def60e18fae62414b0b3be77073c36abc72760009b1ce3a049e2ad63015eb74dad892d0aba3cb7232eae0569b4863f65b72d806c2149351b483a00064c5b77b8123e98a899164b1822d2e39dac978d93383eb78d0354004ae047083bd1275fa5323b60009b1ce3a049e2851c03304bf14950c181f2ff05b9bcac5339dd0cf9fb1a8a7e6acefdd76cd3d140064c5b77b8123ea354621106c08ebc3e44c338088f0c135efbbc18605d7ddfab414ab0b88c4806e0020120005d005e020120005f0060009b1ce3a049e2803ec426cb5b462947025b568680c3e2e6647d907e0c9c43cf1fe3754f48a49a80064c5b77b8123e8bbd302453127d952ee1de2b6eb1b4d3effa98ee8a6a66d2d1cf34f60a8adf4ee0009b1ce3a049e2a60c2d897b7c7cee81e4c4adab3c91457df52e78d2c17642be0f68b7c27fbe80c0064a5aadab37f8a648a634deee5132ed07cc454c7e774e25efa5b427d89aa80656253524aa9f8de0009b1ce3a049e284ac8082b4f5144f6c18d90504f18f627021db8aecf8c4eb7cfe2cf9ff17ad3140064605ac60526443a56d9506bfcfbd827253f276be3cb979c389b9d639d29c1a651a5bad05cd45e0009b1ce3a049e2b65b0751532b7d7b07c8b319dbeb805f235a05566905164880da3aa9fda4f51d40063dec30017ec6c34c8f378c65a7a2f837c86a9c061d6afb43bb893755048ae64876e99d2b0c2da0020120006300640201200071007202012000650066020120006b006c020120006700680201200069006a009b1ce3a049e2b39dff197e37186c3bae86290cd7a136319ea62ad1ab00d32893e2927a5e08a580063c26daa28400e53e530f138dc23034ab3a93aa105beba7f3adfc8fac6756c6a41d3b17ec8c0520009b1ce3a049e2b8376b96b0387db3704c44fcf5d333088f8c713d568dd9d5501f4ceb80c82699c0063bd28dcea189918743ced0ce2f84909844c1b90f000a3ec96c66896d5a2ef71c3cfab5f2125fa0009b1ce3a049e2b6f490534e7b433b6c58a8a09f6e86d91d4ef5e26b50fd2acdf80495bf6aea6e80063803df75c8b3688373683b06a1fcb1f2e01f2e650b9cd6f64e5df8e5826b646f4a4e8028df2ce0009b1ce3a049e280e686be80a206d9bf61df9b1a40a24b3bcef83c263e6c4dc85a793852d5e1e50006301f0e86e12caa8515f6674aabf8a62957c6ae2a152b3503cb3fe2e55597c82b36b99373df36a0020120006d006e020120006f0070009b1ce3a049e29c5e5de187a132130a2be7db863d15bc1c022e2a9b262f603b978b783c02d7da80062e19fb2efc0487a104cc175cff079e7ddc767de7c18945406ae521e14ab5093ddc4ed618175e20009b1ce3a049e2a2c8c769097e367311fa64cfc3a199e6984a82bfed96512f7a15f500799ef0f640062c450f1238114116118ca6141513385bce13e34d6854fac170cba9d216efc5f71c1423d3ca8e60009b1ce3a049e28919995d571136925184fdd9daa88c28eb89aa9c65cfb3ffb3f474aa524f936b40062c4327859771e427283ea0bd92891d48b32f4464f1489fae9684ef47e15bc33d865089bc8da720009b1ce3a049e28db4a0d09c84509acbca05d368b575b327121116ee49478f4556ee8378344df1c0062c40377e7ea4258127502a6c4d42b201970a44a30069fa999390d4df8425368c992461161f4760020120007300740201200079007a0201200075007602012000770078009b1ce3a049e28dda0a4b5600ec8fcc2b6d1f7b9880a2f8edade864cc8f364ba7c7bc851d8b0880062c07a07348861ffa7efe55a1b9a55e20d9a0d5b34ddda9cc8fb15cd3810480f41b5fabcb599a20009b1ce3a049e283fc22fa76fc208fbd50e51c619d2d3034006eb046e2d2e0ec0e825e068f557f00062b00e1fd586e2325a469419b77eb341c7cb49b14545c1ee06df4301a0ac566bdda425e82e883a0009b1ce3a049e2807b8aeccad506c5b04272b7f9c94441c8b6d9d42cf8d154262146ade38b0a5cc0062afd077f82bfc83b4199504264abb17d1db2b27514b626c70d308431230755e346d1aa0a902220009b1ce3a049e2bd763d9348019af3ed5722877030de42bc8614ea28a77177954be4361a678babc0062acbf429939a6b820f19876b593dcd332fd692fb7ce62f133d69afd1538ddaed2d10df2ed32720020120007b007c020120007d007e009b1ce3a049e2b8c5c35bf2c30370b073d35993baeb81b6080648c42acb1e732f8b5aeb66c4b580062ac78b9613ea752accf8f07d56050efd8fb3e0ac9ada86b58d4526bf3694237f3d4f77bd27a860009b1ce3a049e2b51bb4564a9884d7d9f4ebfd699ccce9410827f875fda4119d06cbd2d64beba080062a63b1d53297b4a6303ed5565e9878c5b727902d93cdac1a9c9c3531c56a42db05aaabb7a25220009b1ce3a049e28ef33a8c2b115816b54c45b52a8f0af1a3f73e408a7b0ec1c4fdfe283740e6db00062461f184fe15bc27cd80b3fd0e46b373e778d9de40a15bdd34327d709724c56d12e679830b3c60009b1ce3a049e287de949700e621087fe6fdfe24ffa879c6cd7388a1a1404b27a3c2313c6d80ff40060eaaf4ca1e7fdee4b71ea37c53a39d78c22a7d5444337bcab1ea092bffc9f7bb7550d0fa929fe002012000810082020120009f00a0020120008300840201200091009202012000850086020120008b008c020120008700880201200089008a009b1ce3a049e2bf79a615fedc4b34cc17de8e2af067a7aeef87505c0cc32f71010d06b8884a16c005f75a3f197ab007d38e728dd85d6c10021deded0962c65c77f742201cf5e27d2382e3cd525f31a0009b1ce3a049e285200e9a5fa7ad78b5e01fd4b51c1513f955bf2f36850d33a422edb36c2625704005ec976c7cc5cbc18dfd4152ff370f50ab0a7de08ede0cd56d266a28868d87b6099a40a45353c6e0009b1ce3a049e2955f2c952f6e8cd9f44dc6e06d8ebeca1ad1c73201bdc66cbb8fc5cf7d0111274005e7b0183ec7e03c8f78839e5db3ad4221bd66f6d6180cf1184d5d96583bf2ed103649493e116820009b1ce3a049e2a08dba2637f216f965597491e9ca5f811b3dc64ba987df68495c2d115b56ad084005e6947226b605b14cb33c7d6fe094c752529ee15ce9a43482d7e9cf6f76583ef338760706c84e20020120008d008e020120008f0090009b1ce3a049e2b7a9c536d35ffb55e51634c4abbcb35a7998fcc31990ed1704128027342d83758005e50a681adc7edd6c2dc87c6cfb33d88ffd3b1f2f220f90092ee20f25a0cf94490b56b50cfee220009b1ce3a049e2a10c1a3f530057079a4d12bf4eae592f3c589c5415f73a440517fff664d577950005e4f366801f03a7ecc28b733ac93e707cf11ab01189010d43e05211703894bac9a0f9f6b7e9d9e0009b1ce3a049e28d89980aef2858e0af8d60d804ae14c982bac9714067a98512422c3e7ef19d928005e4e3dad35029a4b8c2ebccf36bbbb976ebbcbeb7953d5946c815783d21c88131d32e40692dd220009b1ce3a049e2a6a282149157290718a1744e82e52bd9f4c74d1a832f821508ca7f10527ab8ab8005e4d53d9c9e8c9a3325d669b08511eda154caf8e2a894674119b58682a68c27e24f20ccdeb07660020120009300940201200099009a0201200095009602012000970098009b1ce3a049e2b733d0a888b1a1053e7183ef4b07edba11986aa5e27b0c9bcd434be8ce7249a6c005e4cbe0e9d33c2b0650a4773c4cb96e0d7674437b0084f8dbcdde8a5a06da4f55381027ee840760009b1ce3a049e2b3ddc5e3b992c078f8d3bad7397e53c78c04c1f28706e71f331448058bf2a4a5c005e449deb5a8a3a7a33cc15c7eb18478d558617106c49971e53fb44cefdcfd01def54676324c8aa0009b1ce3a049e2a8a8813e5378a48ba4aab85331dc991e76b6f35d2cae8c60e4b7c3233438577fc005e41cb7e7a1ef707c0bf6f11a135ee1c6c851d45a7348cb431f9172132ee32466b138b1525fa660009b1ce3a049e2821a63423f7cce75ab1d84a51b6397dbb05db0a301ea0b900f2079d56805e5188005e3407d3a0e7413fc4158940c46108797153c2e535b84c6d4fdf70f945f866d2bb19774a38d57e0020120009b009c020120009d009e009b1ce3a049e2996436dc6fb8327b642b703a923dd97d00201ea2cb941ffb5bfe352083c1cb698005c467f3e4021c8df8da74fd965e4d1bb896131555669d612c644f8e8e2d51b91521ccc12a575d20009b1ce3a049e28fe1a7a35f1edf7ae7cd525c7b9c903aff48c965d8b1c1e33e0800dfc52f4d3d4005c10b6017a9a3f58225a84ba60e141b1a49f40e964bf444a9135d940fab32e8a3cc9ae2836eb7a0009b1ce3a049e2ba3723bdc3530c6945f2c32f58f14dd856272da54597c19993d5604e8fbda7d78005bb2fa36c82a384c02af186d0d951f649d9091d98f7646afa8e1336f3c97523262947a2f7f66260009b1ce3a049e28103017f6afbf932d604a5df163661128d1ba9323c6da825886bbee8dfb114b48005ba2c41c6637e6cb7250bf2fc6c9bc6f91dfb5151f1354900de181ddc4e471069af8c40c7d2c3a002012000a100a202012000af00b002012000a300a402012000a900aa02012000a500a602012000a700a8009b1ce3a049e28e9be0eaf5c009d4292b7011044162d0f8e25af6c234b4e5300f8aad7171c9718005b7e4e7c8f664b6b90d0b43e4f4e2004fa75686da2228a063f2c36015dae01b3aba01233956c960009b1ce3a049e2b689ab5ac5610fd9d03325867b8960a22882a24f96e919e85eb5ae350d973e5c8005a09eb355292e7f95778029be79b4a96dfd0a7896c2f1b2303e461971d9ebea30943f4cbcbe40a0009b1ce3a049e29a6823b74af63c5dd8acea83b499e935c09791af6c216ef272f8ec1490d5f58f40059faa64be2db06778e76b5162b3acd0d538d0ce14f1f870abc0d7b4516106d364582e1e4bb31060009b1ce3a049e295804c354e82c62c471490af97af1d0c638218657baa47c4fa0fd313c72186d9c0059c1d16089831b96ff9b8ad8c438eafc451fd474a77e974b1bfa3e3a53a5d549c84f365471a24e002012000ab00ac02012000ad00ae009b1ce3a049e2bfb96578aa0f551f10e9556f74111279715efdafcce835b6db21cb4a67f26f7e40059c1b64edcb2a0b2b2f620d8add53a175a14d651ce70897b905fa513c6c747fd62077c0ac132ae0009b1ce3a049e28811d6eb6fdd44eeddf3f79ab89db8deb6b8a01a4be3e0be20a41479e9163e0780059b722d7799a199867e1d8c71f6175a5ea27ba5cfc9e1d27e6234e65fd7306a363e0a1de3c51120009b1ce3a049e2b7aed66c2c6f2b00c4a8afbc943ddfab8f399554fc46db28f0a026c5431905914005945439e84ae86b045d350f2fc365eba43228e9c2f627dcd81169daab5f647006d9446a31d92760009b1ce3a049e2b91478714956fff9bcdd07f6b895c90e0cddd9f03fba124ea9f37f0b81188078c00582fd4bde994f2c0b948f616efdbdce362a389bdc2ff7c1596075ae4b69a6092b2a7535ff8c236002012000b100b202012000b700b802012000b300b402012000b500b6009b1ce3a049e296f62a6c9b3f08b1d94265cafa032d43f4743c42ab9057d62b1a31f48685eb22000576f9df0585d136802d2ba64eec84cad5b03ab06554b3f0e1e57ac20967e14ebc37106f31153ae0009b1ce3a049e291e27ff714e9e3df802df92f86ba348431dd93810c56ad086090f15d3074e2850005732c453c0ea4e8cfae9a113091b84c87afe09d9300d3b4a590b6e84e8bbfa27c08ca0ddebb6720009b1ce3a049e293b41450ed6801fad2bac570594e77f3d49982cefaa4be92c74309f68be5108a40055d44c8d50427b2b91def8b3e3c77a66db288991637f705e981aef30a18455d634d26513930cce0009b1ce3a049e282b32975a04ce278b29f23640afbfef2988d62ec1de958b94b3b360da506981380055bede7e3f8f6dcedd6eb17b65e5f17f4dc0adaa102c83f8c64aa3000dc42d836bff6ded8e1a16002012000b900ba02012000bb00bc009b1ce3a049e28c421a362d4336e515d04662b67083d0cf9dc717118715a2ca99472f23853a8400054729c1ef1501fd80efb75ceadab7558f7439deef102082c17590bbf61765112f2e10f9a417e960009b1ce3a049e2b8d06d3094e62bb5c85482646fc83042d36730fee96027496cb3d9abba11263640053a8448b26f5853cb7269341296477bfe73faa48d3b782a9d242932658b1fbc0dd9da4dd8eaf6a0009b1ce3a049e2b0afa2aa751eb81c302e8e015d27995366838b6cf421c2c7f045a1e4e1f80a3f80053a1556fc691d9f1a05718efec1bb5711b25424a30d9442544672ad626341f092d9efc66a3b4ea0009b1ce3a049e2a1c84452fe18f70bc77c033c1f4d75b53d6beb7ab1e7041034fed1c8b531062e800523a106a4adf5e9fe01ee4c98aa31c42d62389794ddae1692e08d60154e0b6a8674d7a46cfd616002012000bf00c002012000dd00de02012000c100c202012000cf00d002012000c300c402012000c900ca02012000c500c602012000c700c8009b1ce3a049e288df3f1655c0be0e432b16a7a213e73e4fe8b090fd73bb96a0a90a12cfdce024000520bf9183c2f17ce1db1c705c494511a33bffd387a79d10f195d0ba82653325f88a7d52b8ee7260009b1ce3a049e28ba339d3635a5f3d2ad93ab2be80f29ae00a75c059389dc6934206515dbb128f80051c3724106bf5506a492cb59bef4c9ab52def25e140442bbe9f26e63e71ae787a9a7fbfa1aa8860009b1ce3a049e29a9ba29f24bb06671cae1ed41b22be50df902fc1ea09d6a4ec77ae081f976368000517b87ce8d0b32517e02c8ac346b58789397d3a6037f74656cd72e1ec4b6567992d58e07d98d9a0009b1ce3a049e2b5f1280c8b3ddb2f786fb63dc934f3de59164c7e299326880ebfb83ed5d92568c00512e0025d6381ca9cd2bf686dbe7ba6d440aaaf67f9be34e0b3d990749e7e700949d420578a8a6002012000cb00cc02012000cd00ce009b1ce3a049e2b6afed8463ca0cf473690f2316eeb693edd787c8983cdc9a78c0cdbc18cefe0d800512c12028bf381559766f814cee12945ec3c4a16cd5fe28b8aa917aabc059569c0591e5ab8eee60009b1ce3a049e2924d83b8cc8c85a12d3171618c96d169bb7ff6ccc89043d29420f12584902f6280050efccbdfc238faf9675e686c90fe2a02290d434d32e987beb21ecda88dc46dbbec0f2537f5e0e0009b1ce3a049e2888ab265289d4d42d39871097826c9a2eb41cead2b187fb8b46d56c48e5a015d8004ffa6a82906f662a10b37bcb1ec1baed930bf99ce1842d6380c306b80fcb5ff2971f5fbaf3cd3e0009b1ce3a049e28e444a691089f19729b2b619ab9ce9fa6bbc6761dabb0b5f41d9f5ae3b3c58e80004ffa6a82906f64940fa67fc37c020ba8a5ce7e7a9e40073034f2005e95432538a8f9d72a496b0e002012000d100d202012000d700d802012000d300d402012000d500d6009b1ce3a049e2abba9c125c594d6ab10cdd271233fc51dc987c6de515d98922a7cab6bf0694044004ffa6a82906f658ada53fbe1b8204016a111b642c5c10b6efb15a9157ee01f73d1fc76ce6f42b20009b1ce3a049e284cad92f31dbf62c714d1e6413b13f1ae534cd857b9269089e2dc02ef9ed98eb0004ffa6a82906f66b823314e26d653a3dce059977a0c83c970a98befcf5e75c937aa9db29d67feaa0009b1ce3a049e29ffbba0e627a051bef35bef244d71509e21a3d194ba29277f61b511cb53a0362c004ffa6a82906f670e08c7ddf1bfc3c18fc59d5a8c49b262d4a98de685d888117d87e80e3688c12e0009b1ce3a049e28e983578a468a1c58924562a0fbb87c5066685ffcbf72e4a8449178ccd428df50004ffa6a82906f64264b4a58989a560db1e2b784ec64a2cd7f1e31f707785189844a455aa2f019da002012000d900da02012000db00dc009b1ce3a049e287c06dda6f205c836731ce52e69a41d404d5a24a9a71fda68255c42305fa3599c004ffa6a82906f649b866bb0a015a1b9cb4a04259e75c2854e14017f653f3e42e34e3e2f87ebeb1e0009b1ce3a049e288fcb18143f16a9991df1bf88905c818313d9f915ad0498ed9de9b538405a56e8004ffa6a82906f64200da27d131557afb6ca1c7542ed43c867320507d68f6595dd01e0bb32c471ae0009b1ce3a049e280555456306c9dba3565b5f9c526a5eb05007a820d6edcc39fee9113754728f84004ffa6a82906f6622d3e8b9e0208c7324c00eaf69b7ea62df5ba4fa59714f465dee6a87953d8c420009b1ce3a049e28b2a2d40168824775facf1ec56c964adac09d473140969df3044513cffbaec598004ffa6a82906f66bc819c25d36ea49ec9b99cfdd3cfaf91d642ba9dc94ff8273ef4a7b4fd169022002012000df00e002012000ed00ee02012000e100e202012000e700e802012000e300e402012000e500e6009b1ce3a049e28da658ce4ba116f80e1d5b43acfc4469c456589afb1db8fe05c4f02c027e66a48004ffa6a82906f67fec45c828ddfd9fc9b3f6fcc0b358d37753667ccb44a8a5af094e0c9c6ec36060009b1ce3a049e2b43cfd56faa19e4e16ef2d8c5c263d54ddabefc17479e087cff04bc0a45b5b908004ffa6a82906f64c9ba8487cda2ccc88d92c89a7c1459c7585459e44f942bb38fcf192199fbfba20009b1ce3a049e2be613673b8333c8108e931b910f6e3bc5b567f31975c477e102ed8c45fa7637b0004ffa6a82906f656680c6a2a94f3515ee812cc8865a8cfb40ae24128c0f68230d7f03c9055c1dae0009b1ce3a049e2963a9ea06c1ba9939bf7b4a6005b769e5ec681ef3e23c81f994eabd35f758fe7c004ffa6a82906f6482336dc9226ff3651616ad7d83224c1c7bfdfc647001283ccfeabb8a38e52612002012000e900ea02012000eb00ec009b1ce3a049e29461caa5051d3c05fc6a3c74458c4a8b41e39575656b87ab3f0a0caeaf8ace000004ffa6a82906f65ba3eccda1a1a67603cc4de6a8b3de4f6f42c68b481bb25667ad0f2a4882697e20009b1ce3a049e29e7e5977f1cffbd140e63805c0452eb1a31050a9d24c1bfd1318745c4f591d328004ffa6a82906f64c9c22d344f11ca4eb99dd0fbb543fc11dfb1e86e3206669bb76df787e1f02bbe0009b1ce3a049e2814d29571cfa0ff60b0cf7f6dfeb6a8a92f9dda45251ff12c67f5a0909fbc6458004ffa6a82906f6732f2c478c701e91245aa3d88dd55817e44c73d0c42da9f2e84161d79c27c223a0009b1ce3a049e2b4a112bc547497dad10301e159611d7bf8506bbf2780bb7105c8e917a530b227c004ffa6a82906f652e07107e20b6685a7c898dec3007a9785808ed41d747c0d75078d63b7c76d0e6002012000ef00f002012000f500f602012000f100f202012000f300f4009b1ce3a049e284f2cee73dba610e14364442ff45dfe51676bc64b8b661cd8e77d6f31c1535fb8004ffa6a82906f6451e74a504d562876807e239c6cb607461d858c47336791a1bbfa84f3964353960009b1ce3a049e28879e8964995a42f133de622f24848eb176b5b08903019ede5adbb797bc29e654004ffa6a82906f66158086f70a6e1366c4ddf33f82641fe760fed5c84a92fe68da8a3967be66b7760009b1ce3a049e283f022e4df0bff1264349b673628b3cdfccef1317d6c9f25b14c9a0620d72eacc004fb409aa812fcf6f9bd85d5b0016f6d5dfa99d23eb5ac4b1575af05db1dedd6a9a39f171313fc60009b1ce3a049e288bdc4cc15adb72c60a097c193e30d961f76b0bc94224a5d1c443d5df07e00af4004f71a193a515c6dcc150c16fe0897241e80f4413339d2e0415efaa02a2c352173263a0a0b3e276002012000f700f802012000f900fa009b1ce3a049e29ea75854952537e4221030c2f3e570de58f7be7a13e833dd56ef72ecbb6dedc10004f5f2b6b70f39e0d011e830eeaf39b99ed78f7c7e91e0914678ca4a7c6edec4be7ab6a18ffaea20009b1ce3a049e289761b88befc952ed96dd25e2b8c1b9ec49e0d4113e5dfe5f04ef6f42ece569b0004efcfefdfb30bee4e016f51815d3338ab8c29e0bd03890feab9e861f0fcb68ed8353d02b6b02460009b1ce3a049e29465c4c848ff31367f0b5b98a6e539ae0759d3390c9015b817eff085cd8ee226c004ef790783f802460dd58645d6b8d97fe4ba07286e084488fabb602c0872b5e57c6705ed9de64020009b1ce3a049e2aca8c446145c88971f0c527c67187c63ecacee213e8a9707787f89e0e4d9ccc40004ef790783e56ccbf783a061684fbe1608e701ea2c6f13371cf276862016b349ebc1150977c0536002012000fd00fe020120011b011c02012000ff0100020120010d010e02012001010102020120010701080201200103010402012001050106009b1ce3a049e28bba0847d8a9ff362c19c035f30ae4097fa9075f4d8f3f7b19bf1f2d3b36d8050004ef790783e36eb909342cba491b08507f8a25ba54c409ba6d10cf7b9cb58a3eaf5e464fd7bfe5e0009b1ce3a049e2b5af3a469ca6e630d43477531d3704e036822397bad3efe347e00553766d8e7c4004ef790783e36cc1bed0b68ff4bf4108f22687b94f94b3a45c56a98c5a293986b062a2c72c4da460009b1ce3a049e29abbfedbd5fbce3a8830a73a3778d93c00b98f243f5b5cf417dfba5522c5782f4004ef790772330668ea011dc72f54b87e8b43c94a59c6d499c19394fa56f6d0df127a393d11b77da0009b1ce3a049e2831fcbcc8bf2a180957fe89b8c17c7e699eaa036491b177f3f9e6ca13e990983c004ebbe6dcf9717824f830979f1ba394187d506e3dd3568fed7c2f320e5760c540b5393b590983f200201200109010a020120010b010c009b1ce3a049e2974ed0d027a6330e1f47b90838c480f8c757e75b91ed4d1e66f359c72f131ffe8004ebab369dec34423fef9cf49149b2e2a3fd7dec7dda3a1f0d120cdd262f6ced9b72be999785cb60009b1ce3a049e2a0cb13101224dec0fd43fde61d336f39cc39946b332d911aae858b3bd7e4d0844004da06ae07e63486095072f6eb127007e98b0c2c855151bac6b94c20700df1f544969a2a7f853460009b1ce3a049e29db61aaf62b2ba05d43ea25a4864668b4c107077580676e368e9ef3d2107288cc004cf0f91ac9ffa9cd9245931ddfc6d508b411ab4018995c5f62752e054803c9f82d15485be001fa0009b1ce3a049e28c7dd0621cec9849e5dd8e133ce1aa80c8c7a20ee59cb28377dbba361f1ddc3a4004ce4eb83032630fd203e334de61abfcf85b23a17c6f87853d99aa68eec646047abda2fc837ae860020120010f0110020120011501160201200111011202012001130114009b1ce3a049e2865815f3f7c0914ef557872bc38d578b740e538ad1d8696a978b6abadd25efae0004cc77035c73c69e6d4bd93473ad1dc6b84176e07c834f1a1e10e2595739841ad9724a93503e1560009b1ce3a049e2b1ec96837c67719120b0c9164d44dbac784bb9f872c1e2e8a5d0de58b2bf12358004cafd180b0c11c932130f044374de6c5cbd9e723044aec3af3f77b18de54c9b9f7cf43290db89e0009b1ce3a049e2a6a0d314e3b8c40005c4f2bcb3d2e40c7559b5095d35f2846f7a01d7af2e6117c004c9e2589717fed6d40d6f38e60cb6b302febdb408fcaa67fff8c3271a40929b1ea0274b2e730260009b1ce3a049e2846e721f01b0d8136a8011c53ed261a690d48e3206723208e35b6ad1fa1c8d604004c69952fb6da6e220f165e4717e1f52cecafc84e487107c80ec6b4b65d993b9262347297dd74ae0020120011701180201200119011a009b1ce3a049e2ba354409e52e292e8d2a0456f664ef02e798d2bc241771ccd5738c0cc71873aa0004c639d68c1cb36923f7fbb1c77f24be5deabda8e6b8930675d0751aa2d8335dc8d710cb929842e0009b1ce3a049e28361e146b8d0e48b8664f1a86657f9c039a5e5c6ca854d079f8ced8413821f138004c63729c75693e95ae334a41002a3acb6bd81cee5ef4258f7c1003c7d2f7f4c3b9b385c711968e0009b1ce3a049e28941ec14ae0c5c604ec4b061d0198671ca619f1443368b7e1bb69a5fbd0269d88004c60fbffc6fa82495ebb678b36f86245c959728e2166f3600d364b3843284667a297061efb9b060009b1ce3a049e28e02c060d00e8d19aa141e101ce7df1d45e136b102e94153298d69d7d34fa6278004c60bbc388b799528e1f2a08f6c977deb5e1ba1eabecda6ce4b2ee114eb8f678ca2918f77b615e0020120011d011e020120012b012c020120011f0120020120012501260201200121012202012001230124009b1ce3a049e28ecb9c4f8cda5bd64d5e44b2225956d6feec42253518d656456a29bdf112ed0b8004c0d76fae1a0028b43081357b4885f7d6a67a762a88101e31026031cf6ec6bc1fe92976035cd8a0009b1ce3a049e29c4616c4d6855f742a97a54d7449a2267f38da5eecc386c18a4a3278dc41e33a0004bdc824ca623fec7839a36d9c3a50549fe17f50cbb02e554a4b2c1d257004b4c9f707134a7c6e20009b1ce3a049e29a20f8567c8c3b4ac1ebaea2c3d9f95885e6d2e96940e73313642dd404f751f0c004bd215ae374c3aa3ea0c15b74bf9ca563a8cecb1faec9acdb620557a084a7c862e19df048f83ea0009b1ce3a049e294f1899c06071b508c22768b6ef4c8a232a211930e7007587804ee52380faea0c004bb5fa547637c160b8a7b21c57d27f0931e8e6cfdb7ddd6b4e5f2799f7d8ccab31d578cc667e420020120012701280201200129012a009b1ce3a049e2ac4509070c1d2a81439c0cd49a03fca11cf7ba70511513d07ce3062b5adf2d85c004b8b57cefd7ea4848cc771bbc8361d86f381187db7bb35f83fe8ad8241d33b8c2c9acaf59723b60009b1ce3a049e2aa3326ec2e16f925e3861a0e5d27118ee523f0c1cd2dd95cabfae8a150e170f4c004b79f94e2c9d319a28a87acfaff5de1c222cf4af07dc11e8e3fa4aadef5dab7ce01c114e5b9f6a0009b1ce3a049e296153ae05072edfa27f731835ed599cb7492c9f16bfb0510f5cb0dfd3fd659104004af9fcd17a1f56e53147ee1c9a4d4900c0c292df9fee569b02e0554c91ea3774f861af81fc3c960009b1ce3a049e2bcb841d998e2231f7cc60f10fdb47382c32b052cb26aa0b86adbad31ce633d934004af9fcd17325a125ea341585947baa0194b1406662fccc2693dd8932211203a1326a59f50ce64a0020120012d012e02012001330134020120012f013002012001310132009b1ce3a049e2aedd576645abd3bb91bcffa7ab7d7cfed86f04637c95387d5209592d13c871f5c004af9fcd0f1911398c7b95f42a89c2a5ed53d6ae8dc665a1ae424ef1e961bac85be227ae5dfce5e0009b1ce3a049e2ac40d1fc1525aa90637f78ef2d18ec150023b02464f2d080abdcb332894515fe4004af9fcd06c80d6d16d52d1d34af75b70c1a1c7363abfc373cf7fbf3229cc8be80276825670bff20009b1ce3a049e2aebc8e5aed8b2fc348b52a996f24ca3745e5a8a7edd18ba2875b0b9cf59d82264004af3bf05044cc723623fe37a6a77b0547345396708c9363518d18af94528b92014a6d7950fe9b20009b1ce3a049e29cc9bdaf9650ef792179a780d1f71e9cfe555301a8f2cfeb905b66a65e7cfab5c004af3beffd8deb68dec11592e433234901611fce32fadd47e24f7536ac942b81c5ef7c26d979dae00201200135013602012001370138009b1ce3a049e2a7fac614c1cf37e70cc15a61db118d0b74c93e8a089c7c65e53f3bd0ec747f4cc004aa57c691a42f3b08339ae393d96b9a5c519258e1c62c12c65bd32222ad5c45d8f201fa7c8d29e0009b1ce3a049e29e70d72614ec227fbf85e4bd826a9dacfb5aa2e1cc61c6dedcdb1eeb9d9f434a0004aa57c691a42f3d9b69681f6a2d635073aeaad83c2107fde9639331762bbdc489662d80881fa460009b1ce3a049e2895b5aced175485ddd8ab8ae26ece9a998cec5f4fa8a572a6bab3be76a3007c44004a688c6bd3e607b41318996d6e8ce34927a5ab553a01ea365fc17998486465516d4fd420aa885a0009b1ce3a049e291103344c1e534dee3a266de6dff1c192cac319a415802a1bfd2f2ef8fda97944004a538e2e1beaa7adf573699dc359e1c159690b32f85c446b8d8f73651aca205b06560f081d11f20020120013b013c0201200159015a020120013d013e020120014b014c020120013f0140020120014501460201200141014202012001430144009b1ce3a049e29ff4375548c9dcfb4c688c2baae6e818700df00c5eaea45e648e26069ac5d8b3400498352f3fc1a68424f5e283adc3e8da52c90a2dcbd07e311c826dbc4b63dd81990fb6cb7309bc60009b1ce3a049e2acdf825a936ea80a2a3dcb619ea1fbaf549d798355dfcd7dba54f9bddcb327fd000493465ea465d2cdf97491a293787166266f3c3ec9e93390f0aaeb74b079e92dc6694e9ec7747fe0009b1ce3a049e2aecfaeb2dc236a32f61e0a71c76214af21904ec575fd837ef335c05c92d7425c00048f0aa4008ff36b3ff15b5771e8aa82e713e2ff3943969629e0f64e0ddb68165d190c2557ce5b60009b1ce3a049e283f297bbc45976b51df2c7ddfda7f7a64160a0360161f86918af0a1dab36b076c00485b725f6a6870a82e510b4d9f501503c4769c8f05cc7f25236f156f00aacdee9b7e06eb07ed820020120014701480201200149014a009b1ce3a049e2845161513520256ae85eae7a6111a87417da18e64dc875859a4b28c28f68f5b6c0045a74d4a3d07680be1e2bdb47318045ffe1bb6e79f6bdbd0bb5413fa37fc222bfbcdfee2e857a20009b1ce3a049e2b2a21d36fdd1fd6548d9dbf567c409e1a4aef7f14f811eca12c70fb2a09e72cfc00450594c3ad659c5d2496398d7959f433a2c366c5656ef64a8b1e04f32f4b49c4156665ec1a258a0009b1ce3a049e2a0b3f8f31d0fd6a84cc0220a2f35fc2059671abb9a246c8065b9922b5befc6204004502b05143456e3a49af7f589fe5c368507b67a2fbbdf28486af9372c42a64f913017cd699bfa20009b1ce3a049e2b0a642c3f0fcd134df8abf4b1196c99245aef9b67db0dbd95472544aaf6830dc80044ee1a8f4cd5a43536dae1af1fc09513176aff7c79d638ee99ae975fd964bf942db7d0fb91b77a0020120014d014e02012001530154020120014f015002012001510152009b1ce3a049e2a15c5d42bf304b1eb90f0bc41dec982615e018b944d09f31ffa905f738a39bae40044e35a262fe265a13f11ff3180a7b3dd16e833c3a411c9cd17c8859c0c288098c80fa80b47b67a0009b1ce3a049e2809f5fb75ea7d206b40dcdafa12aa4c22d75da86aca639aeccc016df38651828c0044b2cf4c81713048921455da5b253bf0a0373e940dab1f62c33db1b6c38e2c2509e90b18d6d8b60009b1ce3a049e298c96d0ab8b5d4a63038e950a2c11a748b4589fc6098eceb94ea4b5d1772f3448004421d8f4740b851f36a9b75b9687f793dec216c606e3f7c6bd8abbe1afa40a288e30de2950ef1e0009b1ce3a049e2afe9b89f8ef316dcd39c1505bd83df97418ce2948f7cb252f3539edc3435b5b140043692bd5477fdd63dd94a980935e004b618f63008b1227557d464cc7cf26e705a8a109108c4efe00201200155015602012001570158009b1ce3a049e286487696f4a6e21873237d5d68f8c6e9b8d9c3b8d26ab29cef3ce0f2a88a495200042c2c16439cc203943525f8161f8aec2fb535335fc2bbb1ab0b47681903cb447cca69824f1b9ce0009b1ce3a049e2a01dc5297209050e52b41101263f8929a74628507831012b29d97dd9494c138240042c149ad4daffe9944ac68574578f8ed0bddfca72d4ff96126182d0aba84e1eec9c49d3719eaba0009b1ce3a049e2b065b71191c9353d83a3ebe96a9781731488f440c538d1f9edb4e01e91ae87eb400421d8335d33d17aaa83f00bd051fbb5536517bb5a916537bcc03e27a87a7ec0af1943fa239f3420009b1ce3a049e295787d4995da912c87171fd9bd29b6f8483ddc707f04c5a26ff93b997b18a88a0004217b2a2e6300c3c44edb7d681a9eefb9ee72b66ec874c2dcdbbefef4f9cd0ec9131c6e32ba0420020120015b015c0201200169016a020120015d015e02012001630164020120015f016002012001610162009b1ce3a049e2be1c8b54b1c366bc8753e0109026bedcaeaf880f98e74da0c650562f538efffd400410de28a7014b5663ebf5b15b05dd8974676487cccb33fed640bc4a68b490626d98f540fc1c7ce0009b1ce3a049e28dd9800a3090074346aadedc2421217e87c29c9dfc502cfe20c187922235ca06c0040985254fca15464170278680894f6ea68ca69ed38d7c8004d9acc66269c52dcba495130bf58960009b1ce3a049e28d718a2e737824a18cbeb0d446178fb630e48feda0c809ee3f5bb2492da7b233c00407aeeda68351381055db64e196e3396ede7bea28437c1d49f6db06acff8689eb73b13ea3f53420009b1ce3a049e2baacbe91c012899b5805bae90de340bf3d1448ff2e3cbf9132c3c9a37dfd383f400404440aad5e490feac07f0e4bc11320a8da8b1b3a66462b53c494a4e14e76c238f26664fffe24e00201200165016602012001670168009b1ce3a049e2a7222579d80509741757223f4d700221e544868db5615a16415f733de82df4cb4004035ddab7bc31e30b8e5463bb6f4bae077e1956a261234d3f1df5317559c2c0cd5f4b8057f475e0009b1ce3a049e295d9d9245df0a4de774965ce9f34a2d2476d6b4f9ae1f064cacc0678aadf06f48003f2191f2b46fd0303963b55830d2d2853361134b7618ab43528bbdaf687a69d26867141792ffca0009b1ce3a049e2a21f0c4b66ff967d16fed60baca3e7d106401c22d18e46160d4ade2a032a0530c003f05d58532e1209a0aba445a362a7aa7b5be60b52a9885315a3c192b5313e881d68322578e79a60009b1ce3a049e2af96f6be234e89d3ea54be03704ab32b3ea9a424d3806912be2232eae837692cc003eea88e90a0a1a6ba35a67d878b9ce8cd176458a2afbf5b8d642531b3f489a9fde93f24a1ec7120020120016b016c02012001710172020120016d016e020120016f0170009b1ce3a049e2aea678cd9c1b92fe65ff6604a92919bde56d803a10ba9ab4ed159378b827cf718003ebe9c3ca0645563653295d7a0ab3ffe70a8e39b431046c93e5a51976ec30f17c81151a28b62420009b1ce3a049e2aa40b5fc44d029d177957baddd3daba388e502e1649152136626671e0c56450f4003db1a8737ca0e4e5b6248ae957819c53195463dd7a29277835a5b27323db64cea1c0b8712907ae0009b1ce3a049e2b9fac3c67be9ba35c279eca0d77413c85b91e48cd7bb38ed37a23f22deae74b68003da01ac65f4be07a27dbb19ba353b571991f65bffe5aed1f4760ec1b5e2ffb23dc9430e3a0be220009b1ce3a049e2980deec23f993595e3a134736d1beb1bbf30dccce5248b720a1387d40ae1b7b08003d7898e2238403751d7dee28e7a37b1e3572a62abd33af2ca3f86d1858a0cce6ff60bda6e3459e00201200173017402012001750176009b1ce3a049e2aecb39bd9d135e6d6effedee2ce627aa8db60c95bacdfd0e4d3f0e23252f85058003cfb4cd9e68948d3a5c152504a1ce49bbd0c5f022169be07c1f530da7255c17855a8bd810dde7e0009b1ce3a049e2bcb05222a44e4abdcc992a91ab614d205514e6275af59ffeb7b095b7024337a98003cc5dd807c07e27242fbe7fc4774f4d3dab3613e7cafa7b079fa124a33a6fc90ca96baa69704c20009b1ce3a049e284ef1d53371af66e23189dba707008ce46b6bb2cdbf493e74adca2a9895a0abd8003c952c2575d9e405ab8bbe1c5e2e3b1e546636910d34eb91b232b31e21ba0b3b2162e599de997a0009b1ce3a049e28410623918f151e9ee9df581a087758e60194b69e402c3b13a715ac6b9f3c2274003c6b5998872800fb2578a99c369561d684eb320a8f13ef320143899fc9850c38e74e95b0eaf40e00201200179017a02012001970198020120017b017c0201200189018a020120017d017e02012001830184020120017f018002012001810182009b1ce3a049e29b85de16bcf2464c0e47767a9e33b6697bfb0193a4b29d4c4f0dca3c33d9bf158003bfb465f41d213b6d3b4430cdbe843e76d179865e48f49a36bb16867897d45dd53b004067be3e60009b1ce3a049e2bda1544897efc4b7e968b935d23b5dfaf97a9f5111ec69d8fa68262ad97842a2c003b9575d62355c9eb73d6117661e38f086a8631096061f73baa8ca5181082177fe773edeae06cd20009b1ce3a049e29c8ea6e91e6e33b9cf8491e4743600374bce5181abb608cb91d62a1e67a56ab0c003aa698e92c43fb06d5026994fa04e5b710b4e68c4429a9e705ce1a95c7c0813127b2a8fe381ea20009b1ce3a049e287e8db53f200fe8065cdadf6930b7f3b632ceecc8041ecb8f2a58ebd596ae6ffc0039eb7b90e9a6f6c196c5b1cb6bc04add46eb9eb075aa93d31826c69b548eff130b118aa1f09d2600201200185018602012001870188009b1ce3a049e2b15fb750d4096dcc50d73414032e27767243e2bfb1efc9e32210b09fdab92962c003913cc1a97ed89f64bdc3ee3effd34f1eb0ebb0fb48e99c40e5b042c18661f7cf2837d3965c3e60009b1ce3a049e2864987cb28b954b70e171269c5c113c623c8eccdff15d5e4215fe135772ec2e100036cfd189ffbf0e4bf04f4e4bc1f57ed53926a829ac7687196fac601487c228d65acece629cf61e0009b1ce3a049e2aed4a77bb13e4c1fed6d1b9d6f2639a7896c906c6bc02652baa9a2251aef6de840036b7e784467768c243e0ab84c6ce8324939e1888aea6363bc3b081d6ad18eca492fb89a8125c9a0009b1ce3a049e291f58162b96a6107c366cf66020f1904183f4b98eaff0cbbda0dbfce59d0de51c0035d2e6854d88ebd5f13b8eb2fb2811f8f2fd2248f8897e151bd652c93f307b1e0d0c71dbdbd10a0020120018b018c02012001910192020120018d018e020120018f0190009b1ce3a049e2a5cdf7ad30a3653f9821a65e645bedbe2c09534691bedc88433ee9f9f5f6223000035519a02ae711ff09a1ca5182f7a1832d9964fdae6786d148544642138d9c1d91c3660a3bca58e0009b1ce3a049e2b39c0c1c00da3e9585a83a97c5ff9408dfc1ff529745e3a9a3c4ad79ab69ab5b800351b00ca5cc30a9d32e6213ac7ee6541c7691835955b5c383bf1e277aca1dba4825d8b8e5b09e20009b1ce3a049e28fb40308e0e92172e25e29a2a2d883858ed2d8eb320b6b4bd96c9ed464cdff13c00339b8413ca9ec724c43b5243ee6b2f766a6f24f55b171fa37a3a125b9c72e6a7abeefbc3620ee60009b1ce3a049e28791fbf3def35c90fa9ec979a132a5dde62f8332513c43b6938f67f2430a459980032f537e7a110f62bae4ce9ca3b27c4b57c5bfd4c91ed11f604df3803cf0beddb4437b63c7ccfb600201200193019402012001950196009b1ce3a049e2a38bdd1eb7590f13d743372e8db33e03bf43703390da5744cef756973e1022afc003279c444087f469ea2d14b979198992f73ff458a40d76fe3157ee74c5a780e1d0cc1e93f3260520009b1ce3a049e2bb04b699d4861f1d254630afaf8f52f1e55daf73dd66ffd2bca1e0e28e423e4f800321e9fb5e53e1fa48075ecd741d50fee154318dc3c16bda368046babcf4d0ae90619e10a3b27be0009b1ce3a049e294566d0adfa4ff4261d473049d61c6a3cf92b6604eb108cc0229b0c4fde6c2a8800311cbc75e3dfb3b88705d8a1a927b941511fa4dc9dc5d50d0da4cf7fbb48496bf1a962df4ce1d20009b1ce3a049e2b7ffb7df8b0136e3ac6268abd8cd3d3d46886c7ea8a7966f5e64e3943dd6c05b80030ed172ffb64c5e98596d5d32a3f7ad03f3c8e76aafaf6d49503ed43f46b8343a329f659634eb600201200199019a02012001a701a8020120019b019c02012001a101a2020120019d019e020120019f01a0009b1ce3a049e2a243c75af4225a6d58730ea5fd83be2597df5dcc5b04d4c7bffccc27ce2de8d2800306a77581604db85c1cfdc020bd8aa220810902f1bb066557e3927968850f219267da0bed3d52e0009b1ce3a049e2918d7d3fe25373d3cb8c7a9e41148535df32417b86fa51bb9a24675275f2f383800306a205d992150dbc32e7f98f5f18ddf0847960f69dc56903cb7924ff0bd4232512ea170108e660009b1ce3a049e2a43a7402400ddda36c65301309f81985beeef8ab5636b4e91c94d0a048d6a5f70002f0989e1dda2406dee48b7d754cb10756ee56e24b1f947b72bb5d6c4dd820300e1a254e716ddb60009b1ce3a049e2b55d2cea6829afeb1b1def73ca3ccd76c37b8ba2c2ea811e4571336c0d7cd8784002eea4db42690073de3900acaa1c1d147728ab1a4274054f1e3e7870d5a30dbe53d31bf2e559e7e002012001a301a402012001a501a6009b1ce3a049e2af4ae6c525caac50b925a840bb3d1b3fac5df621bf428ad4417e3f98813ee4584002e90b4ad82af27e11c57246e6770c27b5507791009d09e3912f7c16e08bda5e5ef9506c4694e560009b1ce3a049e2a10d8928f3fa01da5cd47e56980c4a239a294d4baf3a8b30c7ec95a97de151a10002e3dd3170e218d8324d3181966a141c514523c202e2a22d8aed2506b06ebd09b6abe0dfff3ffd60009b1ce3a049e2be97a1431d51653d85b162d9bec92e9f0be209bfd459ff533d28787e959a09b90002e2c03dba8a6eb5d219533d6a9d383f0a19caf6dd415e9c444edf0a7739081733c5669a72c94ea0009b1ce3a049e2b0936f98ee01bc212e636ec72ce609351e37f72c67c3993b2282e048106f98cec002e146b72870c2dfe968e6748584d4833998ab0f2118fc101699e06d3b0659322cef4c666802ebe002012001a901aa02012001af01b002012001ab01ac02012001ad01ae009b1ce3a049e2a521c4396ee209b36634fe89fee768b63e67c24e242ed1e60f36c2e6c43840758002dbe50b1e6bd4229141b26bd203d751782e5ec505807ca9574e9c73296495de83d5b39b51523fa0009b1ce3a049e2850c474e74033f30e5f107919944cb4732a8ffd3c25d654f367c00b6c315e6990002d4ddb0e6973d5571b3ab859148402488b98e9dda1fd151968863eb72d61528d989d9f3d96b1660009b1ce3a049e29e86c3da8dfbf7477def991091dd32c28f3eba16a7ad1d010332bed9c0e84b9b0002d3f057b3009a656d776e804f4c2763599d0bf0b586833ba8e36c474f43238da2169b0746157620009b1ce3a049e2b138597021d6d9e5e1a155c5b2e7f0f0663834c511f4e58cdd0b46eea5aac2898002d0795fdffa5149e744c630804d331bc19d8ea9526071fb66743a527259298eb9b175e2c4a49de002012001b101b202012001b301b4009b1ce3a049e2a5b05dd431c970e99b3a18fce7b1f6c01c002c8341ad080e70c6af695928da0f0002ce7bf3ae8d8af3be7af211d13b1637d8ac7086c5f4ee0faa764f3d951943ee00ef5468c76617a0009b1ce3a049e2801467c38c4e836c14a072eb3db89e6e05260ad35e147d40c5acfa9abcd9ad620002cdf1caab9f960cb07efad3a6a6b2b17df9688981b3b75ceacc5bc448fd9e5dcf567933d474eda0009b1ce3a049e2bb5c51d32cd95814d67a7b32f6e9578eec256beea1d131844cdb616c3969cf0bc002cce92a100a415a24819b16ef4e614fff38afa70fa7d6f7a68b75728272b882e324f5680cb623a0009b1ce3a049e2be81a8989a2370ba22962d6d5ee738d722ea3b09b001a45ece117eca9414976b8002cb2a40ae5960e2146cf7c9dd9e666392a3c3f6b4d3032b13332abc5b3f83e047c4a556a8a380e002012001b701b802012001d501d602012001b901ba02012001c701c802012001bb01bc02012001c101c202012001bd01be02012001bf01c0009b1ce3a049e281dc6e44cef8f0b4bd7df666e4c3186170915e842c04c211031c7c7c6097c0c68002be689eb00a64fb1f366ec8202d0d1dd0f7428a8f2368678939775dfd43322e3caafd2f9a69ac60009b1ce3a049e29ff1165227a153481e8dd96da6a35b134b5574c0d40527bebb1eabfcdc29b7b14002b0b1ca208657967339f65d1a206965adb6c3f41c0332f0408ab3b37eb1a1e5030776b0cbef34e0009b1ce3a049e2a1245d7db3e0549f8ab651fcc508a1eb70abb761cabdd0f81904aaf829b58d350002ad1483bb6aa2da17d1d73ddd00cba98a4cf38b3ac649bb9e6ce7064d651c825b650ef7e5e005a0009b1ce3a049e2ba246e1aa1f67a252c619a820ffb52f78ea4af453cd17ad6837d4a85800293304002aa0766dfe8686c55aa14232e9228032dbb019fd765435ed319f633cbef102114ccaf1609f6442002012001c301c402012001c501c6009b1ce3a049e281928aff11ac3a5726ea99230851fd5deee26ac9ffef1c10c782306a35bbc1a24002a2c37e6a28191ee9c4e215c1203ad0f95cd8dc58bfbc667801c1ec68886d16573346915867b620009b1ce3a049e2b0a574609d3cdeb3d71e4125679ecab6d90063d089dabc9ffca8e425f178ecfc4002a09d4de1e2e052ba92761425bbcb6844ea868c56d0429e313ee963d1288a446edcd97251350760009b1ce3a049e2a1e4e964bc9308d990e090ed7e0f698648f50b8255d5feb689103b81b7d0656100029d8e9640cf6e1a023d9beb6ee16304988b5dc61e3ebc7d0911b35becc2bdf617c284de350d93e0009b1ce3a049e29de2735144debe916db3ebf1ef8e93c482000b23366084b691ba7a5e7681b04400029d8667eb975d35302e6519d43cdfff5af212c987ba369df8c801054a5e11436f41e09cdf9b366002012001c901ca02012001cf01d002012001cb01cc02012001cd01ce009b1ce3a049e2b084de37bba817d9dcf7cb326b32d20eea5622d9ed694d8610f213a0f58c030bc0029acdac92000fff0d9d05277ea1c26ab95ec012c57d5a12090749eb1ad9f3149bc6b670786cdd20009b1ce3a049e2a4901bb97e175e32797391a4af6b9568f2dd27491b21e36907619aa5fc4b89b8c002989170b43ebd55805a66889fc09b433eb1cac810c5975500818e12c8e0ae0e3bdc0974768e9ea0009b1ce3a049e2b0ae4a29b40eeaad13a97cf933ac3fa45c77755a626db2519432cc010f8517bf40029823e4bdc78dd660031191e56dde5e0ca9fac0a7adb0422ea50b5a77769ce6754124760a0c9320009b1ce3a049e288a9277c181b65ca3e8feaf5ca079a635b26106d877d73b3d72cb109385dec11800294473317deda6d2dca6096524a35a32e685ba71cca426b0e3cf91c3269cd6eeb73671b7134e96002012001d101d202012001d301d4009b1ce3a049e2929214e23fc87fafffa1ce84ca5169bcaf05c6c7d41e738d7f91879f4131586580028a01221cc527d87f135d6440bd6a79964873da81d2c0b7b376a26f07254059187ce262d485c0a0009b1ce3a049e2b51d6300201850d1df0e17f2f033eaca9f4b00293eacb3950fb4db5cd211764440028683776cf62131fd43f1e6c98cb9c0d8c3b59274e1026378fdc0dbdb50eb1d801cab3747f5ffa0009b1ce3a049e29690846bdc4326f6f766f747e6d1ae4ac551366bd471e44d278bc75e1fbc2fd2400280a38753171397a22a2bbc6f1a3b88e34d3ec3226408f6df3caff6d30785d07bd1501961a0d4a0009b1ce3a049e289f71889c14e619e51e51cffbe4c10844d20e9d1a7155c4312f3c0e01ae4868480027de58a1a3c6a6758a1cf665f267e2c057047cd643bcdbbddfa2d43aa470886dd9898f9fefb6d2002012001d701d802012001e501e602012001d901da02012001df01e002012001db01dc02012001dd01de009b1ce3a049e2b15caa205774956d9c4797410d7e58d05afc9aadbd43971e14aeb84311b1747480027d85e90394928d20fb1dc5900e90d35582a9c256d35751c5c6220757f784bbb0bd4989a922cee0009b1ce3a049e2b2fdccf5472eff9ad452690470cd7b73ab1e0cee249164f6c19b678083ae8a48400276fe3d6374fb8cb8a8fbb84820193b4d204821beac23c58cb8ec2ac314ff35ed535aee0078fae0009b1ce3a049e284fcb6f49d1b1b58c887ee555ea1d18d42101bda80f63b1cfa95544e4aca5bb84002766aa47c817b9d1dac2c9fa11b7233fb8fed809b60b2242e804da5c370c791909130c6f635d1a0009b1ce3a049e2a4907b08dbbe6256c6d7488e1372cc81cc48476cd8f3ca11e02d8b5c48053bcdc0026fa0a6ac536f5b28de42ca52a505d1c22619285238fff02d7b6fb8c96e62f7b7a465ef7b44446002012001e101e202012001e301e4009b1ce3a049e2bd77cf94195bd6adfbcb111d0b93aa1dc38a2118190e2d73fd28cee5fdd146a2c0026fa0a6ac4e1d73d42bc06e3a77fba211c4e8ffbfba78655fd20a3624c29e42cb03a94459242960009b1ce3a049e294dadf6b5b5e039c14a73a0260c1170b6163bb2ce8d4f570721695cbc105685280026fa0a6ac4acb8c356490435d8b26734a3e8523ddf06685aa2b3f48031952beb28e88b19587c420009b1ce3a049e295fa6959c82c4b1ddd947e7d76e3754f108e55b6222897151ffcb9d570e4342680026fa0a6ac3987db3489fe5453dbfe5e2c00d9a58d5920865ea58c8da8731fe37a74989b56dc3e60009b1ce3a049e2b04f2a3ce294717bc6bfd615adb2ab156926054579d03f271c15391a8d55fff800026fa0a6ac38325a547d83c93830cbde24bf104cd2a3ae9610c458ec80c1a30a2a0dcc48367724a002012001e701e802012001ed01ee02012001e901ea02012001eb01ec009b1ce3a049e2a5e7bdc2133c5c8c04e30f88229c42427135dffe89cf390a9361f8ea99bcbca900026fa0a6ac3787b8e30bccbc20b0da660bcdc106ceb249da6953cbd33d6713e6a4d16a42100e2620009b1ce3a049e2b9561a812329e0f0cf192887730c5a4cc05bf48c161e1289a1b8ac61d26a6fb400026fa0a6ac0861a5424030284a2643df3e9a3dc27a4e92418f7d2863b8c4d44413bf747d8eb6b4a0009b1ce3a049e2937524c73069b81bbe7a993b3355edc09dccd45f237c1ce85ae71edb1f0b4d0bc0026fa0a6ac070fedf18ff6b9ec3586138047fde2a25860445693fda2306c2e05c14512b598f232e0009b1ce3a049e29add13a50b85699466ed206d84e73c280b46ecd720ecf000d55bcba2ccdc3d3ec0026fa0a6ac050fb8286f75181e77418494c8b18c5b3d9056703d5650263c2aa0f45774f662862ca002012001ef01f002012001f101f2009b1ce3a049e29fea123736d33eba6adf7249ae9d20a9e64030400a04ae013f6c5bc9491ddfe7c0026fa0a6abd9e7c452f31ee76d4c83a5ebdc65266998b956d7c77e963593e84acc384cf8b48689e0009b1ce3a049e2b7f2f872d4148bf1e5af0ad91565ab269c30ed4b2b7ec184d8d19dd58ea7866fc0026fa0a6abbeace4435e1b49423dd16a326044b7c0af9dc8d51fb43bfc21a6e0edcf011820843820009b1ce3a049e292b8d9f04219e1c784e4ae4f333462926b554ec6e52e95a5c71a0eeef0231abc40026fa0a69a83cf47d88a02253d6d6538c80a6d2083fe31c60f28bbde53e3aa1afbb68ebe8645db20009b1ce3a049e2b892be648133e1e3e337d0c52ab0b349eaa1f772a649f16d8961aa4cea7e3e4b40025e5d2a34cae0861ea29453572e3376d806c49c80fc3f1bf871f69227bdf8413c4479036033d5a00000e6a644f6fda717a289fd05005a0000004ab4f21fcbecbc763ce6d8f377ab0719c4decd3a2572c68dbfad522d7dc9f538405577553f7c51318f188bf31a7fd936ce91be6491f281081069c067704908373c72b0cf7a5415f2d0677b59cf96b5e34572ef7d0d8d8d29b03aa30a906a26a30300000045f0d33ec726c3d2e793c7452f56c2951e251084685699c24b7c7f32d574fafa4024788ec2a93b9752f687d9f9f1155b5568a16876850a84423e4d9ee8998d496563a13c47c92f4f0a687c6d6b3795ec9f28b47a37d7838560089ebc4df8f19608000000c0d7b1bd3275ff1826e8c4cbc47df29b8e6f0863d490664b434f81cb7adb586540c06caa316549d78127fcf6393db724cb421929b092797ca12107c2d3c65b0eddc2f054a5a71b6e4e3d6e636aeb5afbcd7fe73caca4074d7ed33a97d5fe7d250600000038302d91b61625958640ee0bb69be2667f25479e078ce4e034bea786ae2d8df540f902632214f8cbd6345699310febb8cf64485137c666be2a3fd17e9552967565dc11bb6b21ceeb7b3df24820aa47d7224ff40ad802ff4b665427b9bda6311504000000a06c27328c3d7914153e87fa27cd6c9457bd9a107941013782339586ddb4ca224081bb684738a3e809baa8f5b548ab77f7566088b332b2454d9e7bde7e4454be7ea951866c78619ff1a0d087e1f9bf82601f86bc29bbbba4aa95c92a65e815ba0d0000002fe5632d9d4a2095ecb2bd082737850de465d160def34452c6221607dece2a0340d97d7fd3b6c20eb7ecad80e20a7e5432e7b2407988ba94d2975b62fb74b288d73674f01a84e11261a0fa6203349de76c950f8497c1d35098591adb86323f11070000001051b280dcfdfb3f999e35c2d9ea8f1cf46e8b7c56c733ce396cdec37399bb2040c17f1038c8401513ebae0cf66f9c540895dcb15776d196aa4f03b7270313477fa43a5ecc5a4244aa5e4d9f8778e6c2c4958e42465257ff88a829ca4b8fe3a905000000d874adb9c5d104f8e069d2724f1159396259cf3aaeca3c8274f07c96ac08b00640671bd0a85539f3128f2712c2f741be96a07831d807f109e592482c73b9569d06770102c304a35b0f997956eb0b81c9df768b94d8708e61389672b3ead017be000000001c76b6c405afed7100d38da8f133aa4fcd63042af1748e1eca7d786098b03437403c2a0d3fa8070883a5d2a80f571181327f4fd426545ad8e2e99a91a08feabfa0634a4292769b17496999dfa0872384b0c5573df2952eb307b5d615755bf03305000000cd5dfa0ed9601c1f396192059d2d91da7ce3513e39d34e95fc0dda682894ca0f400e9ad448192c1507e774259e90aa5e12b7f58e2f71df11ed17b685cfe2f6cdfe09c415855622632b7d2d98d8fb5b1f3cbfb6ec337e8c94f0f5cf2e932ccacd0800000041d714fd98249db2e51fde31554986f42669bdfa9b0fd925336bc45bdc14b9ed4063bebcaecc89d0107a54cf30ec54509c7c27549104ebf693ad0b8b5622b485adf29c9e2a12261ba2a4d336eccefcc4ed863127893e5499fc3cb832acb2dd2c0a00000054326474025fc6d85ab0b9aaf1abd492243664096ab2267fefab968aa67a959a4006c966bf7fa9e8e245741dfbc7b40a6767cfd97c7f3693e678522c3b30d46e56185f2a7b3e877d8fcd50b9a90219b73b51afe9d8f92db1b493f57494a1c5ef0d000000c73d6e781ed5c278f65e7160d2fbf372f007cb7a7f2e26d252a17c8c4c555ff740b5ddeaa144837105fd6a2644c0db56a8ab29cc58de2b57bdc8198da0c05c1f10545e8477b11ebd0cc8aaaac22c52accc712f46f7c21f7e7d25073645d0e38f0600000068a83f545df684b87e3ddafa4ebc3d075a37f0d69902873a38cf3c0069117eaa409ea41fbe40445e50771bb67e79c80b2dd3485ed3ac7cb0fd3576e1e01b78a410cdcf5011380666291585af8c1af1d4c49371625ba1a55f4d6d4fe82155852708000000b4f5bb1556de5f921cf3825f3929dde1c1249ff2fb4e32935cf367d0c3679989406b38a48e21ee73b0ad70980d4100ef854d1c26db86b552616892cbc55a4f68c489a26008518d10182cfdbb783c5d63b1332643ad6a599ee78d3633e550103402000000efd3c111fafc0dc96a09c7b30685edd3de1a07a37d3667497780a9017131b13540a8ec9ded579600ee4ed6429d1818426cdb1015b13d97777c65dfa9d46a3be4980d1eb0d844ea06e0eb521fc158326d085c08969763e45e0a72534343252a2c00000000244d4810e7888bf2758b15b4ddf46304f7897895164e364d1194cbc45d5dfff540786055b75ca408e0d5d04b714e31056cf4a51f81fb40aac77e7fe34613e59a58dbd783b739330d8767f38722a3ac8c4c58e02784a812ecdfcb7cd19754dc190200000074c96d2f9c7b5beba7478e354e4e4360bbc3d4070080997f93f28cbb98f6c63b405bbfd05cba84ac4ccf4f2e57403d2cca825a3d9020e08b0f900174c2c5d26b18e34cc06f6580028315ea537e2ee4c3a85c07175b75b9044f9fa17e57b4c41a03000000f367cc157c1d29231e47c1a388a42af3bcba4641792a83907f2aa6a9429c5a5b4028a1bf3f522037cf61bc2e9eafcef12daac7cf7d82b8ea6851d1194f16b565562981593468d44595c883ad03bf36c8337d31af284e7fc312046d7c3a9c46cb070000008b900282fd5c75c715f4fc5e2b78f58d23089640d3f75048e2804319cd961ab4404a0a291cae6f5c19bfe5864ff634b778c8dd7e24331aee5131c8064085cbf7976748b1e33e6e7497e456f18cf84713a96b91b541b38c1221fc74d8b31b2896020000006c6f4028efa494020484271989922bac0c926aa0da1621c423b88c8679a354874097aebfbe20c9425648ea8dc949ffb78bcd67877f3520359887c7e0daca3fafac04066f288f6897825cb3c2dccf3d77f5730fe84e5645ce180bc8ef6a49159b00000000264272a5f1c46844da520f0318cb234fc9e37dbc3b48029a687c0d65a4379bf8408edf7f0ac21df9c06449aed11feb0f57765f830779251375627741b9d2ac22725a82754e89ec5dc998e70ded942baafa4a44a374da980e04a6b983474b22450b000000b91890ff80e8cd534af2e7b9fe68257c4a6d1cd40f5330ace70e45698f8c6da840fd501a42dfceb56374c232b0959d54c3655c6a8b9e8f8ce10150a26adb14c1688925baeebbe09be12cfd08faf8841bf0ec110bcc9f2abc94ce4ce9089a375a0c000000aa479cfd19b290ba4c82b09d0c49b3cc5627431599e39c2695cfb7e3a3f40b1440ac550e565f3426603cc4a069374648e2b73a497b526fc17807b3b2090e56a3d59940d53a0f79e14179f0e1df91d4bac98b214b0a9beec578d96dada5c176920500000062fe1843ff5e27e4b61179154e81bf813e68090d27445238239b7055c48756d240f57fe7df62a220b104f9b5f6ca5237a9dabcdefab446b619d1ca1c0da7be914d1da4cb2e398c2dadcd51c5c5451cea4809c6ad71262bb0292ad404deee067c08000000fe428d638e381b91167dcece5d32ff2a9ab9b2a9873bd66acf650ba1e8eccad6405871ac1766016d0f1a336469999999a41b7e99ae3123e19dde70eb4d13c2f666bf7919cc5e819bcdaf5f036c1b8f3b69258c350442a9d47465ff99c9b7d2fd0400000033b8210492a15f2efd4f5fbcd5db0d505d3f2d6a40a78de6faa06d441588964b409f7c9f5c29def52c5d1f802e5356f2e2e70e53a4928804ab6056db4b72988ff84806c9b5a6ac6544e254d1631d2514c6214c8a6e04391c903c4be4931375630f0000008cc95301a135280bf6abe5523cc96a8c8ef71c162d367bcac3d66bd1502d02b5407de389a3c1cbce38b5c469df91c77c17c7ba5cc6f7b952d560b65a07a14ed07d0a0ff3674156fc7fb5bd1e1fcbc6041718dafe48c1ddabfee0a1a5c1b0957e090000006549d5389efc02446299f7fbdc672a16641feed0193d8ee09454b2c89c9cfa59400eed3db80f2079348b93d10bb1b9b5c7e957b91d748427c14a339c1e91d3a43f3cb36d9bb3124f46b6311234dc08bbeaae728305c8216d8126fd31d779c17f0e000000acf88d4aa052c248b1c36822bce1be4522e06422b45a5f9a4384300bb5a90c9e40c657920e9d14952c3ae319372eb6fdb19deb3d68c40dbc957c2f71967f06ba96cb8425ba6fa3b30bb0a6364fbe913a9621cc0f9fac26b78247fd7e85693e63040000000e7fcd8693fb4db698b321abdf097de88558a71bff3c0d7d5a9ab31881b12ae240ce10e31ade5ca6aec17d38d5a478a512cb098c83094aae5a71f6f64497e9229cb3229adb595cea33f256255ddd59c31e71ddf55c73511639438c2c709407f10700000081bb8c61b435f0f5e3145913f07dc7726b601836a08ff9d8da9da6ac3e3057e3402cfb508fc50bff874ce5411df301da76157e182de0d02f1527f1de33fc71104985cccaae7869462f31e6f138e311a45ae092cf43832dadf39552bffdcfdce206000000bf7e6e5f013221d47bf2be5cd26e727ac3f903a2d8319eed43fa49d3a48dcb1f401ed9b3280d4086fcf02319ce188a7bf56cf617ab00a49ebf7b6652702863446664fe92275e703cc6dc217e25de9f8823b936eea0aebadb273f4a18e62a32ad0700000078e27e53384ecc7ac6d091745ec2f03a4c5fcaa878df7f8971038719677e474140523f1997b43be1a7b093dc2d7f6a46a64db74cb4b10da149118b3b927e698f24f4134b0bbd7e8f6bc2b07eb1171fbeb97fc5b39327b280a7701b31f77a607003000000bf9b8724750d1f88a683788337fc866a19c7cf2c8be145064bd8a452a95822154004c56b0d92a261403b3267e4750534f6b831494b0dcfb5d7d241b95048562acfbf48361ae88c728ee70ac40fccddba2dde1a8281a4ba1e6366a004a981e23a04000000bf27ad6adc41a8ccfbf5c1667103ffa69d4dd38ee6eeea4139a9d4b3475423514070b675917272bc148bef40b9051427f8429e5142ea528a3bd902569d18167bf7f8bd492d5c9e07214ccf00b84ffbf01dc5e675e08306bf140f124d054a169f05000000476cc27bd2f180000048ccdda679d4424ed98cdad548c7e446ff70ec529f6d82404976ea98fee8501c479bcfe9e062f6872f55df3872528c8a3e0e03ab18c7ad99b5033a62167b8b7a8f6004360961ebe97d3d6eec28cc27e5b659651773892a0a000000eb87b9cce4cc2e6b50a2c147680241bfc864d55aa9ec91da3493281c5d7949b840239fa22cf722c243cbccd3b8339a1caa6ae023d3707e642900c148d4fba8f54d5198cf1fd4003c5f2ae121d3bd51740c3c9627fbf81c018d8550995915f5960000000019b666586ade08dbc76a2a5af6533f8548263c48bfc2a5493172b2e094bdddd740e186372961d09f8e53c7ce43df54c36df887bd9d8185909052d39bb9e7857175c46750d9f625566cf86523aa83e06cd3ceaf22dbaf87a808d8d4f924c7b5fc03000000a64a08cea96dbfe76f0228f29ef5c804286ff9644398902f7583bf443f9feb5740fae5a118a716cad37a724ad58aede04464e700780baf7dfaa924ebb15f84a99e812a99027a87998f79c4c0c90877c88a10463189d12c878b264ada0fa841b40e000000fd97816a1f177ded1a5e7b7fd9a5e02fb5fad8ec2bded71805940bfef1ad96ca403eef4ed6dcafb0f03d4a1aca82891025a49b38395626f7362aad85a87f594e9e961da062be19468bd50340e3fdc5b0ff5489508dc31ad65228b01a5cbf4ef20800000067ebf30852b6c46dd488863685d0b95efad84b99802acce43beeaf4081d0e8cf40c7915023fe51b647822f381538561978dc433a4d23a63bc07ae26252541d4f53a322280db796ea7fef08cda16cd8d062b9e6f0a37bb6e261b7beb9306891eb00000000addfb579deb4dddfa4296a69434d96d2af25bc47c9469e14090b1abe64c2f17240ea5f11bc216c8cca5ab1cf807c9e63fa472284c5b40658dac146780f367344838720ddd146b66f6a13682139067ad1b2a3c8ed047464317b671978dd994b1701000000e6585eba3d3fa6465dc7904b90aceb6d135ce54dfc125bc6b56958835235d43640b165fda0262e2633e4cbd5266ee12ac39088b987b12301241ed267322c3d0e19c6a04f39109c02a8fc02c52e1415c8bc7e6aff8ca1b25e957a7769ae4407c0010000007e0600a5cca3c52b51be3aa5be2b55e01c3bcb42d058b030d206bac007ed9633407b10580b585c4fba0cdbcf3e7895b6b0abdf64d8d736f111702c9be191af4bb878866d596b94acb21ed9039c6e9817d697fd853b928201af2bd0173bf4db6706000000d5f90c92d7d3641223acaa0c25a8f4a32c18a64208df8f2e290b942820549ce940cc2107bdeef9f7e31e400d920ba629ac342497c0fdb84a860a84a7fc296ec1f1b8e660dbf19e92605a720922619f647be10ca90111734bacf0aedb2bc127900c00000030ab9d287d2283abeddf5f3e3daa487e344ceb9db7bcdca03ed0fafeae8799b840ffac6d932dae83e5acafdae523cce8110fd7f07d86e331b0b2bcb2164beed222de4a62d7d0ef5de2dd0580c9c917f379677937a3e12e27b53fdbf50a77c62c0f00000007dc092f52aec83e87ab5d3dbd1cadcd76ef4b13c590f50a93e4b944a15733bf4089d34c3816cde2feff9412ba3a31783e28141352f3956f658da65ea6a82fcda842649ccfb3629286d8291c83639a6419c3569e61b477792adee2d6bd26dada0e000000297a8629b448e84ca60bc9a67e3e8d284ca3faff49e3a6a6a3b346eada269eec40c24f05be7c1e68869fa999a3d35c1e68f1e42c24ba59611613e81ca8f3d823c7ce7f397f92d58fcecf129ce49f541960602f82f1e17b4d3adc90c7f3e0947d0f000000353f79f0e9707570a1d853474d0c4c8e483c5263261c9054346a147e7384172040b48460a06c665f17b23eff1ea6ec7d9e44a2d0d6f9669025b15623f201b13b5f45eb51074550e68164f8f63a13468e4ac1164faade7d3cab22437f4adc65250e000000c004cf33caca4c2ef98568e367f84074d4628b926b1e97fdc82d318fd4daf8ce40faf85d7080337964e1987d4b0fc5a42ecc6fd4ded7bb3741f8ab0ae92a6ae42dbe7580079db88ec1bb487037b558ee3b8a1f1275d5d91d53c55cd00fcf7f8c0c0000005d13f87c0a2499b986a84c3c8a1dd1c6013cb7d336814463fc19fff0ca2f661c401418ca212401c92716694298be6e3b90b343598a8c0507407ab04242e89043c81277d06d253d256f6c3fe780c53f48335e790264acb9000c7d62459eb10f8705000000a1b5dd162d906ec6f886b3700bfe59f3139135651d8a734d77d8ab2f3490cfbe40f0b5f94e43e6d83f6c7503fb9070ec067dfb7b96968757d618ea447a324db503006012c932dc01fdfffef359c14b9c193cb98afbde1edfab9275b00141ee0d0b000000444346db13326ca4a80f40e261c9540426508988d08f1109e30b086d7d29cfae4075c2c9365318c32577923ea345534c531a84ec92fb2483276b11f24d3130f3c3650399441c3c60449c202faec74dfd05518cffc6a9c3cc9243bf6537d33b650f000000de2b38286aabe037ef800bf84ebb4eb63a8f45505d9ace367bf2ca4451c91baf40ecaa5512c0c48bc7a9506abe2b0ceccdb5a837b1121dc9e346d9674e3323409289ba4dd994fbed21a7f4392b33ec5bca8487c9a66e0b8b7f08ba44149ff3c60c0000005f48c83b9c0e425809b8ef0e10204be21f3b6cc5397067dfc0fb502d06f1be3140a44f13b9e8d80ff908d26e182d863ff809ca2aa533f4ac2e222eac262da5cb9ca3f3c414d946aa865af32ec6cff7f75b418afb77936118cdefa4579c302bfa0f000000d970b98af613698630cef324f4b5be23af504779bdb8d5cc494907a69ef92fd840c53d86c833e6b6d0bcd9354686a796e2d911c12503b59b3a3fc70bcbfaac37d604581774c4696b9cd464113ef82abbd2fca8c86c66a8c774b6334b3130ce1d0800000095d29c5e8204ef23c1a34a7fe1f2538684e26d4789f193751d29aebe587498554033020550b57a8a56b74f9c724dd0bfee41bd8d24c6fd5755d282ec24e274836ea86c16befd26feda44bf9ca595a73dea0900319b61aba22305af08777c9d8c0f00000013dab994738513702dde8cc84cd6b9d429ccda01014bf2e40fc91b77e18d7d6240eaf70b1b0e4669e78d75a5857b93492b310ac9b870f692f7f0c5bd494fac2be5f613bfe8e633ed4d8de8d0164318e05822f0512a2a961e494ea69ca36d959b02000000dcd723a3a9d08e086d3a938fbb4c6f6c2495b024e623b4204d7cb7e5b148f2764009cf49577fc7bbdeab0e77b96bc03b9faef2fa34f69654974577f7e3e409cd16389b66a2bc8967b7ccc0be7a5db51d7c9e66053bb204a4c17207c9408fd26f0b000000673c892e7058bc568176ec21721b24fe2d5a7765af70214c57e6bb3fbb8a985f40e05f0e4aac2303666d0ce1c78a74938159b5c713583b5c7c501cad1ada21e5ddc92e4c6d98c2e6e5c349331e4adde9b14c9fc78c0998a1c6da480f08d9178103000000bc9e4cc3b6efe68fa9811a749411958bbb49af291c8e2a77aab207ff65b9b0e2404c271be407dd1b64dad4b60b9507f2215cea98202712896ce3f8240bb6ea61fdc46de2e55a9466942d4885a9005861c0c7306e41af0525b05fba981039d6720d000000d3d144275f21d51abb1ea9c22e78a6d4d53c2ffa52a5297b697bb4da0ba6b9ec401419582f9ec2726f8366bc6ac00cb403bba288ed8bcdaa37faf38056c603b28c77043720db01be64472db71587f25d4f653c4b25b3632972c3fe188086cae105000000c211d37fd657978bf8f01c787356caf7298a1bf1a0d3f82305d532f9a241c79c4027247cc5e48239a9ea65f33cb7f520e4978d37c7df6350e4afd761371741bbeed6b9b9dedb1579cdd1f0f9fb3e8b0c92f97b00855cbc38dcb4ebafd4c8b1cb0e000000588fd129cb31cedf3368e71bb66a5581649b8c369e61004e0b277e869b5970aa40f6261d6894e4d7d3eec6686968b26fcff2b858766b307fc71430164e16fe7b337486c51842d3c98af179237b92220e7eb74f401ad5d91db103e66ea360731801000000905adf65b93e404450c9b9a4fbb717cf6d6d6bb9ad405bef6e9bdee651b36a834072d408e80e720cca9e224d559726ce752dfcd9c54b82fb3d5e590dd93d14f8dcf596e11dabaf858f40d595010cc980c9409183d55f8132b010da0afa3469a0080000003e0c2700ba633e85637c292b02c7b014388af9e585d09520be23cc1f892459c540779db942ec9379a7fcfd69c123da10ff7ae9c26fd923fdd9af0aeb280a1a008a8a4d84be107bae46431af7c7dc9ae8893587601560767b62fbcf46ef0643eb0c000000bc43f3c56afb8c2774abdfd0a3daf73cfd19ce9deff8929bf8e2678d205ad3254098db6138681a1cf610177b8759f93b97dbc7e4eaf7440a85a0fde60f984e3b4cf6170532cff85123deaf36fb742aed537584c78de0662be0a880d8e0fe18c10f000000717c06015685c2be830d53fbc6efe1cc4a5b9782419f153eca0845a85fd40c2d409058e8c68ac504c28df21d73a7ede8c7585b404a0a130e7f6046cc7cd34bfba4afa09ec8a2760c4f5c27546393b38c61b2dafc5c9c47a8943b1bce4cbc5e9c0c000000ca29c53d6702161e4487fdf1264cc3875d068361c163a2891765b8749de055b240e36358ab072e19f927933717fa975168cc3886341d0d06e7cfc913dfd8347a4a06b05db163ea6073fdf96269290babf766ef3eada281038b9fb2acdff690d90b000000626c3929f5b258957140280893c41a930a2bf7b282d437fd86ea58d36e0def8540328a04d73fcc2ad8d60ffc9a7fcba90cfcf42ff17933349789689c3b71c37133827bbb58a4611b55e2d20d6a97e8f07a37ad2a80880c1a00a9db5417422fc6090000009cc8b2c075d1fc098d388cde90848accbf9b5a88358dc509cd7098fe002d3e8e4046166b6a2b420f79c67f63ff19779016177da4fa511dbce087f453be84e39d0295927c830227b80b6817bf851101f991f86e75b2483d4f0aa41eb63395135807000000fa145abd4e6adcf28bfac8aa7e52c3ae1199dd1dd74190fcebd029c0babe546c40b813b869235699d132c53982f32d9096ec456b057e9d32254c499d0236dd0447e20ec8e98c495643d9209c2aaed965344eb1d0832b317df0a5e49e23f332c0090000004d25cc686b17112a428b47ac0679dda0890c7d9e09801f6feb0fe64c0b7c939c40ea3ab53ba1c2bf256d0f317fe854fde4267d3926ef82b2bfffd0872f48ea10277423eada7544b6996df9c68b27f9df6418ce2cfa6b2c87491851dc03176e7608000000d232f80a19b0828a43c6e2b9448d8c5cbae9fcb70f284d952a9b8699106a5c29401af478dd11aacc1bc09c78a7ca2ffe5dc238c652e0e8d5e3c0f2e08bf15593443cdfa726c358e08dd0f649ca06af56e5c318debdab2dcd8d1164825a9710680000000086a8b4f66506ddc5afb3c93a4078d1dbc2becf1cbf9eeb1719f627badcc9eeae40bee9a6fc471a505bd4173ec2114c716b7c00c487e617a57e93494866a6dc070046ee57844f672e77943ae783c82deeed8c489ceb6d84ccc6fa1063836d1269080000001b8e7c80979fb1613a45cf10374f6c321b84e8eac8a50f9a13e9e1bd9f3ad821406d84b6a3e1587e4d7b0108d9a678badc7f909affe1dee8d216ad6cdca13ea0171d2107d5126d365900a85b2e63568a94752aa6e49d92914a2a5ea67350aea607000000bfb17b287618cb3783a204d84c8a3128ab204354e8154392ae9acd31afb2445e40af20be84376e7f4c0ade70487d3ad88735dd6702ef8657acc107e886904c888c1f6f8310d98118e9336c0244808d9856426c3146ccd5fd21bbc7d54165f9da0a0000003aad30bb29d71ee8dcb8ac7b7c1bdef0c0eb4b03daba14912ac0d2af5e9fc0474042a301367f5bed67e89aa7d86ccd42ff04aa3bc4f564da8d7ac9286032921d76fca35cfe8e0425ca4a933684ad3aed104e4c6b540310e0d86002b48ce17bca06000000e9151c991698f78605551287e40680455c8b16f0dc736fbd7e0ef5f3f1be6727408e9160eb2cf13697f486cd48bc65d22ef1152591a4ab2ca4cefa2587a3c832d067833cb8873708b8145bda1419ac341a790ec1738c0ae7adfeb43335d34f220300000061df5fa5ec703ca330972bd7391f1043afd7d38c004ff45adbe7149ff122742240edf1effaa0934e293022da2176bec255affb6cbe91a04eb149d8f3992023bf9285468434422076950a31edeb1dabe203605125037876f3d7a31a45e8a3954d07000000656e238bcc810bbdba83f32240d02d68436fad0531edd40bf612daf503dab671408a9d08ce60f06e12fbe463cf89944790d66d6199faa23015b12ca7b7715a2e7a26a0eb6c049dc3094a1070befba5b5c5db6fedd358d4978384abf7c9febf24000000006c5da84dc54fb2a3d544885efb353e25cea02b136fb9728fa6ed2221385d778b40baed9edb27b6a4db86911e9ecea38e750eafa532106d35852aff336925cc65887d25de143adf2b0ab58c6256992fc07dde7590751b5167567be5f22a8b07ab0c000000677a2aadc337e7a7fff9e7a8778952ec8e3fde545690ddfd9cb7e1ce12766f55404fc883e854f1137017a05d34b28325cf1e68b052e826c838c640a44ee765bbd58734e1ea73a5fa3bfda0eae2732134067c0e45ef7d5cd377b1174f0ef646fa0b00000036298bd97ff839736f25706014c23acee34644cf6264191edac858cb016306c34064cd7d2a171058a1bd1cf49b76e045655e5171a5cc9dbbe9f6aebd28271dfb555778812de334fa35c778be612a26c8808cab7f2248706425f70d48fffa91760600000055ac4cc428c2a68d7516917b9959e36cb8b7791995c9145540372f9aed3bddd640c79b97ff7ffaff171c3696c4b8ffef25ffcf10b852f7871ce91df61f6cda4228b327e320afb5d7aaf92b654ec57744d252f78d5934f34e6e1fa1307f77ba690e0000001a9481577fe0e95a5a4bc6c31036d0588b3a1f848257b8297c41c6b0eebea27d401f195b8b2402210d3a5aa1fe1e1e7400db7bca229cb500502f9f111ffb3f8dc0d3a42a3c5ec939286811d0fb1a0a90269e43ee447f4ff4106c73a0910476380f000000dc4c131a7ea4bbec3eab84cee304650f01daef095c434933552edd970a86c14d405dd432a4f9c03ab4388012ed48eee09d89cf821b16f0bb98bde52381059b0c5457a8d46cd3e2c5ca60937ce239051d79dba1a3e308389e3f5a92843edc9a1405000000472c4add35311b67e9626b299a3f3cb6e87c3a603939b20badfc95413a8e687740a55e3cd3d0824932c336c1b7d1e1bab5c2457cfba5ae37a5ce84768ce9a1b9b189811dd0884740c199b451ce695c24279ab50a7ea4eeed86135ac0ccfa056608000000701bfde0b96ff10030e101af64c841e34ef2238b2b63e26b8bd10aaf5ecf590a405817c7122b461c84b2a488f765cdc1af94b360576493b44c06fb1d93af062998d3d11d1221356bcb56a0644567e96aceb9218bce17164e5caa0244576aa937090000001cce0f52b5757299ffffffff0000000000000080c1ae9201b7ca9066de2d4041be339bfacd06b23f75a15cec132fa95b446332e3b923578e826f82be560a515ce8b2e051411c04f7260bd5f8b8a1311f90a18aacf0e6dc6bffffffff0000000000000080b7b7920194781e4697f23bc62cc52dcbf786807ef4a0da119cc52fb7a2ba166937aa4ddce13df047a1696f95fe8e45287534d10f7454618faa75fd7c54bd2a3c2020fa7bfe530100b5ee9c72010207010001470009460394781e4697f23bc62cc52dcbf786807ef4a0da119cc52fb7a2ba166937aa4ddc001901241011ef55aaffffff110203040501a09bc7a9870000000006010192b7b70000000100ffffffff000000000000000063b9fa1500001f3070b8078000001f3070b807846eed34910005fdab0192b7b40192aec1c400000003000000000000002e062848010171ea7e438453f240f4d75f8f24046db15cf2c30e4778e8079b411864cd94219a0003284801016383381e04c6d63520e3234e07d6427f6fbbe4e2766767836da68be0f41defff001828480101f3882a65560e809a2c69e6fd33a422feccc74cdb3786d1a581511f29a8bd4a900012009800001f3070a8c5440192b7b6d320546cfce535343360a71f960728c74f29046a0084e84f1db8a8d2f0da76d4cb96ad6732dfd04a85cac18954f72aceaf70ad57a1abad04ea9d8479c806995200fe465300b5ee9c72020201f50001000053360000094603b7ca9066de2d4041be339bfacd06b23f75a15cec132fa95b446332e3b923578e00210001241011ef55aaffffff11000200030004000501a09bc7a9870000000006010192aec10000000100ffffffff000000000000000063b9da1500001f2fdc3e62c000001f2fdc3e62c7a217a7fd0005fd890192aebf01926f17c400000003000000000000002e00062848010183fd3d8a5425702757e60b2bfe97ecb7fc1bf4d2099b5dcbdc579b9a616d593000032848010102cb0b910841582d7e101d20aeafecb3e54a163bdca9ad39e61407a43f87d858002024894a33f6fd8c8c7cfcda7557d5e0a613bb1f288e37beee86c2b31315501479929e3955eb229830b625edf1f3ba079312b6acf24515f7d4b9e34b05d90af83da2df09fefa03c0000700080009000a009800001f2fdc2f20840192aec0805d48c51361a58ee4f84b5f390453d28a1e8fd01958ea719099727a6dd3f0397c36d2e0d262b4d23d6d0c02aca82ea3ba88b26eeefcea11cdffc1f95393b11c28480101d8a8b6e42fde93670d5f86b1607cf10351266acfca89c362b64e2467915b13110010284801010aaf6d70e29694dd8e133bc2939aa7102729b974b4765f4ac79472890cb1b470001028480101975cc1abda8a3997d0107e8538dc4e88779f1c77be4114760a756d0bc61aaf1f00132457cca5e877ee18e443b9aca002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac000b000c000d000e28480101dbfe6e450fa764782e3288cd6de472b3050612dace746177067ff2b3d94405360002003fb000000000400000000000000021dfb863910ee6b2800877ee18e443b9aca004210150000f2201200010001128480101d219acee7884b032820f24071acaddaf614bcfdb0c83a0599c331916b0f5dcd200032202d8001200132848010124d21cf7ae96b1c55a1230e823db0317ce24ec33e3bf2585c79605684304faf200072201200014001528480101fd78695ffd58402e209cb0b060c95b1a8a83dae389c7eac9554a3c086e52b898000722012000160017220162002100222848010114265b804cdb772e1c9a48d1dd67ad6e9315495151d6f49bf5f203b2b883ae7c000c2201200018001928480101ff9fb607464434b8240b30817c4e6c358ad723c3ddeed45b2b82d45b9fb0f6210004220120001a001b2848010135495972e4dffc56ffc325d2abeaa6db04e07d832cc8b8847ae195158fd724d20002220120001c001d220120001e001f28480101ab446ae5250a0e5acbf42540f12f69bc49e22d74782881442954471a01c67d6c0005010120002028480101e1e66c22df500de6499c055de17ff3d1216fe5f15247186dde0708e01c52526300010024c201000000fa000000fa000003e8000000172201200023002428480101c2bef6f6fb4ba1028471ea198884cff65e603f1b0be4bbf4c83527276d591613000a2848010172ec134de3b5c911646d3fb1cc1e2e0b5d164a892c6aa695915524a9f8058fea000a0101480025012b1263b8fa1363b9fa1300e800640fffffffffffff80c000260202c8002700280201200029002a020120002f0030020120002b002c020120002d002e020120004300440201200081008202012000bf00c002012000fd00fe0201200031003202012000330034020120013b013c0201200179017a02012001b701b80201620035003602012000370038020120003d003e0201200039003a020120003b003c009b1ce3a049e2aa6864fb501ee9340ad67a114088f51a7714fdfa7a64f57de94c9cc99a53de5fc0025e54535e12d7987ee340235f5a8975b70d9330b6dbae735efc3c36109bb53143abc134da125ea0009b1ce3a049e2a7c881b7da8f67f68d34850b46be08b8c68df273cb28de2290452dfc177a7e7980025ca8a982a95301894d7dd51f484773b9a020f2a4731cc0bea996959772f0026844aed6d0b459a0009b1ce3a049e294ad8fbe2834efc3ef7911431bfe9dd0e146e967441d83387705bb4b04b1224a8002552b682c07220ce67a68d27ba3c67fe1590ab9df0a8837b33e5873aec114dc432e30a986bfe8a0009b1ce3a049e294e727cdaf1662923908ae33c146050b860870be9536dfdc182748b732c94f0b80024bc5267750ad3c107ef3afcbeb159ee00deb0da381cf8eaf7ee3c54258ecb9fe354cfb3d9f8d20020120003f004002012000410042009b1ce3a049e29f4457a36d1a1fe20269af4ea4cf30942c9939971145dfa7231b517d6f44028840023ea609c2222de183e3467b8107ade8d739831136c871851b1714017416f7471676f8f45bad8920009b1ce3a049e284f2ecadd3247cd2ebb152bd0d6491357944fb6aea67560cdb32795430f1b55700022516298c569b17eec3f9b0e8ec4f7252197b59249072ed20a89cb36c7864d28212ee858d6ed9a0009b1ce3a049e29c1ce89793fe221168ae8215ecfea7aa0349ef7d5dc74661752a0d458fea7d7080022316e961bf7946d31d2170d3bb67765785fe00cab6380beb648993790c6b62f6d6f9aa8653d660009b1ce3a049e283cf18fc7672b01db23ae9744327c5ee2e0d7883ad2221fa8968d0cbcbbba2d440021973d292b0bfa5fe10377345d60992f0c173a8ee2383d821c494cc3c9c95f069d8b51855d473e0020120004500460201200063006402012000470048020120005500560201200049004a020120004f0050020120004b004c020120004d004e009b1ce3a049e29ab695b62de0973f7af7870c24ca70dac52ff49fdb730c03638cf8e167addee100064c5b77b8123ebba04c54d49d0c2a248697f32eaba92097fd5d726fa4e91f749e61f55e1b37d460009b1ce3a049e283b993cfa6fe6ee06eeb5db431143b770e1051edc941e3deef5bdcb9f6371c6c40064c5b77b8123eb18e28452aad9bd641f98e55d7744039595724c1ae5286a6a26ac2917414715c20009b1ce3a049e28d1e13f47076c9cb310019310276e727ba96c5cdcd43aa37f18d4e25860753ac40064c5b77b8123e85e0cfa335d13c8bdc2cb6c84c534419d6a4a0d1d2427f5f7c6b3d52e5377ffae0009b1ce3a049e2b7507947f1bed143e63a59e0c968d3f04ad871b0c8b63d8168f7436405ca403b80064c5b77b8123ebe141a8cd5031943574478d98f63ac3454492ad47adb30c1b3531c8cc349a7ad200201200051005202012000530054009b1ce3a049e283b920aa83e1a3e0f9748e17dd6e12e188209a839287771d74365a364b4c8feb40064c5b77b8123e8a73ab24af4170e8a646f6faf62520a9e70ae02f66a8faa8d739ef087bfc7e5ea0009b1ce3a049e2ae7f835cb1d51e70d5871b8ab3e7761e935925a7234f39bc71f137820df6440b80064c5b77b8123e827b0096de4bc955d34d0aec0615701d8a028e921f17a53bb9348a002f13d86fe0009b1ce3a049e283c47fd9d42ecdebea2f06c5c8a929df367bee9a6420b13ad0d3a27214b9c6b700064c5b77b8123e8dcdb94b5329e0ff38fb4327c57407542d0bcf751c201644c0ec7eb9dfc76c84a0009b1ce3a049e2b730edaba4e320071398eadf54ac89ef07c1a6820b2b6768abc62f1ade48813d40064c5b77b8123e88491234782701a48ea4a5a886cf15f978781699d77e4c3f6bf2ea201b3ebab5a002012000570058020120005d005e0201200059005a020120005b005c009b1ce3a049e2b2efcd0cb3c1661344b2cf61129b0927483ce6d32004343b8f1d85ed09f7ae3340064c5b77b8123ea78b4f2d833b5dfc6c48d222ade39fa4a96bc874e62b16ade02c50ac553929e920009b1ce3a049e2a952e3f1c44b4d7c602512787ca408aa838114edae68b89bf52547886a273a2a80064c5b77b8123ea4ccb3c8c877acf99513bd653d35def60e18fae62414b0b3be77073c36abc72760009b1ce3a049e2ad63015eb74dad892d0aba3cb7232eae0569b4863f65b72d806c2149351b483a00064c5b77b8123e98a899164b1822d2e39dac978d93383eb78d0354004ae047083bd1275fa5323b60009b1ce3a049e2851c03304bf14950c181f2ff05b9bcac5339dd0cf9fb1a8a7e6acefdd76cd3d140064c5b77b8123ea354621106c08ebc3e44c338088f0c135efbbc18605d7ddfab414ab0b88c4806e0020120005f006002012000610062009b1ce3a049e2803ec426cb5b462947025b568680c3e2e6647d907e0c9c43cf1fe3754f48a49a80064c5b77b8123e8bbd302453127d952ee1de2b6eb1b4d3effa98ee8a6a66d2d1cf34f60a8adf4ee0009b1ce3a049e2a60c2d897b7c7cee81e4c4adab3c91457df52e78d2c17642be0f68b7c27fbe80c0064a5aadab37f8a648a634deee5132ed07cc454c7e774e25efa5b427d89aa80656253524aa9f8de0009b1ce3a049e284ac8082b4f5144f6c18d90504f18f627021db8aecf8c4eb7cfe2cf9ff17ad3140064605ac60526443a56d9506bfcfbd827253f276be3cb979c389b9d639d29c1a651a5bad05cd45e0009b1ce3a049e2b65b0751532b7d7b07c8b319dbeb805f235a05566905164880da3aa9fda4f51d40063dec30017ec6c34c8f378c65a7a2f837c86a9c061d6afb43bb893755048ae64876e99d2b0c2da0020120006500660201200073007402012000670068020120006d006e0201200069006a020120006b006c009b1ce3a049e2b39dff197e37186c3bae86290cd7a136319ea62ad1ab00d32893e2927a5e08a580063c26daa28400e53e530f138dc23034ab3a93aa105beba7f3adfc8fac6756c6a41d3b17ec8c0520009b1ce3a049e2b8376b96b0387db3704c44fcf5d333088f8c713d568dd9d5501f4ceb80c82699c0063bd28dcea189918743ced0ce2f84909844c1b90f000a3ec96c66896d5a2ef71c3cfab5f2125fa0009b1ce3a049e2b6f490534e7b433b6c58a8a09f6e86d91d4ef5e26b50fd2acdf80495bf6aea6e80063803df75c8b3688373683b06a1fcb1f2e01f2e650b9cd6f64e5df8e5826b646f4a4e8028df2ce0009b1ce3a049e280e686be80a206d9bf61df9b1a40a24b3bcef83c263e6c4dc85a793852d5e1e50006301f0e86e12caa8515f6674aabf8a62957c6ae2a152b3503cb3fe2e55597c82b36b99373df36a0020120006f007002012000710072009b1ce3a049e29c5e5de187a132130a2be7db863d15bc1c022e2a9b262f603b978b783c02d7da80062e19fb2efc0487a104cc175cff079e7ddc767de7c18945406ae521e14ab5093ddc4ed618175e20009b1ce3a049e2a2c8c769097e367311fa64cfc3a199e6984a82bfed96512f7a15f500799ef0f640062c450f1238114116118ca6141513385bce13e34d6854fac170cba9d216efc5f71c1423d3ca8e60009b1ce3a049e28919995d571136925184fdd9daa88c28eb89aa9c65cfb3ffb3f474aa524f936b40062c4327859771e427283ea0bd92891d48b32f4464f1489fae9684ef47e15bc33d865089bc8da720009b1ce3a049e28db4a0d09c84509acbca05d368b575b327121116ee49478f4556ee8378344df1c0062c40377e7ea4258127502a6c4d42b201970a44a30069fa999390d4df8425368c992461161f476002012000750076020120007b007c020120007700780201200079007a009b1ce3a049e28dda0a4b5600ec8fcc2b6d1f7b9880a2f8edade864cc8f364ba7c7bc851d8b0880062c07a07348861ffa7efe55a1b9a55e20d9a0d5b34ddda9cc8fb15cd3810480f41b5fabcb599a20009b1ce3a049e283fc22fa76fc208fbd50e51c619d2d3034006eb046e2d2e0ec0e825e068f557f00062b00e1fd586e2325a469419b77eb341c7cb49b14545c1ee06df4301a0ac566bdda425e82e883a0009b1ce3a049e2807b8aeccad506c5b04272b7f9c94441c8b6d9d42cf8d154262146ade38b0a5cc0062afd077f82bfc83b4199504264abb17d1db2b27514b626c70d308431230755e346d1aa0a902220009b1ce3a049e2bd763d9348019af3ed5722877030de42bc8614ea28a77177954be4361a678babc0062acbf429939a6b820f19876b593dcd332fd692fb7ce62f133d69afd1538ddaed2d10df2ed32720020120007d007e020120007f0080009b1ce3a049e2b8c5c35bf2c30370b073d35993baeb81b6080648c42acb1e732f8b5aeb66c4b580062ac78b9613ea752accf8f07d56050efd8fb3e0ac9ada86b58d4526bf3694237f3d4f77bd27a860009b1ce3a049e2b51bb4564a9884d7d9f4ebfd699ccce9410827f875fda4119d06cbd2d64beba080062a63b1d53297b4a6303ed5565e9878c5b727902d93cdac1a9c9c3531c56a42db05aaabb7a25220009b1ce3a049e28ef33a8c2b115816b54c45b52a8f0af1a3f73e408a7b0ec1c4fdfe283740e6db00062461f184fe15bc27cd80b3fd0e46b373e778d9de40a15bdd34327d709724c56d12e679830b3c60009b1ce3a049e287de949700e621087fe6fdfe24ffa879c6cd7388a1a1404b27a3c2313c6d80ff40060eaaf4ca1e7fdee4b71ea37c53a39d78c22a7d5444337bcab1ea092bffc9f7bb7550d0fa929fe00201200083008402012000a100a2020120008500860201200093009402012000870088020120008d008e0201200089008a020120008b008c009b1ce3a049e2bf79a615fedc4b34cc17de8e2af067a7aeef87505c0cc32f71010d06b8884a16c005f75a3f197ab007d38e728dd85d6c10021deded0962c65c77f742201cf5e27d2382e3cd525f31a0009b1ce3a049e285200e9a5fa7ad78b5e01fd4b51c1513f955bf2f36850d33a422edb36c2625704005ec976c7cc5cbc18dfd4152ff370f50ab0a7de08ede0cd56d266a28868d87b6099a40a45353c6e0009b1ce3a049e2955f2c952f6e8cd9f44dc6e06d8ebeca1ad1c73201bdc66cbb8fc5cf7d0111274005e7b0183ec7e03c8f78839e5db3ad4221bd66f6d6180cf1184d5d96583bf2ed103649493e116820009b1ce3a049e2a08dba2637f216f965597491e9ca5f811b3dc64ba987df68495c2d115b56ad084005e6947226b605b14cb33c7d6fe094c752529ee15ce9a43482d7e9cf6f76583ef338760706c84e20020120008f009002012000910092009b1ce3a049e2b7a9c536d35ffb55e51634c4abbcb35a7998fcc31990ed1704128027342d83758005e50a681adc7edd6c2dc87c6cfb33d88ffd3b1f2f220f90092ee20f25a0cf94490b56b50cfee220009b1ce3a049e2a10c1a3f530057079a4d12bf4eae592f3c589c5415f73a440517fff664d577950005e4f366801f03a7ecc28b733ac93e707cf11ab01189010d43e05211703894bac9a0f9f6b7e9d9e0009b1ce3a049e28d89980aef2858e0af8d60d804ae14c982bac9714067a98512422c3e7ef19d928005e4e3dad35029a4b8c2ebccf36bbbb976ebbcbeb7953d5946c815783d21c88131d32e40692dd220009b1ce3a049e2a6a282149157290718a1744e82e52bd9f4c74d1a832f821508ca7f10527ab8ab8005e4d53d9c9e8c9a3325d669b08511eda154caf8e2a894674119b58682a68c27e24f20ccdeb0766002012000950096020120009b009c020120009700980201200099009a009b1ce3a049e2b733d0a888b1a1053e7183ef4b07edba11986aa5e27b0c9bcd434be8ce7249a6c005e4cbe0e9d33c2b0650a4773c4cb96e0d7674437b0084f8dbcdde8a5a06da4f55381027ee840760009b1ce3a049e2b3ddc5e3b992c078f8d3bad7397e53c78c04c1f28706e71f331448058bf2a4a5c005e449deb5a8a3a7a33cc15c7eb18478d558617106c49971e53fb44cefdcfd01def54676324c8aa0009b1ce3a049e2a8a8813e5378a48ba4aab85331dc991e76b6f35d2cae8c60e4b7c3233438577fc005e41cb7e7a1ef707c0bf6f11a135ee1c6c851d45a7348cb431f9172132ee32466b138b1525fa660009b1ce3a049e2821a63423f7cce75ab1d84a51b6397dbb05db0a301ea0b900f2079d56805e5188005e3407d3a0e7413fc4158940c46108797153c2e535b84c6d4fdf70f945f866d2bb19774a38d57e0020120009d009e020120009f00a0009b1ce3a049e2996436dc6fb8327b642b703a923dd97d00201ea2cb941ffb5bfe352083c1cb698005c467f3e4021c8df8da74fd965e4d1bb896131555669d612c644f8e8e2d51b91521ccc12a575d20009b1ce3a049e28fe1a7a35f1edf7ae7cd525c7b9c903aff48c965d8b1c1e33e0800dfc52f4d3d4005c10b6017a9a3f58225a84ba60e141b1a49f40e964bf444a9135d940fab32e8a3cc9ae2836eb7a0009b1ce3a049e2ba3723bdc3530c6945f2c32f58f14dd856272da54597c19993d5604e8fbda7d78005bb2fa36c82a384c02af186d0d951f649d9091d98f7646afa8e1336f3c97523262947a2f7f66260009b1ce3a049e28103017f6afbf932d604a5df163661128d1ba9323c6da825886bbee8dfb114b48005ba2c41c6637e6cb7250bf2fc6c9bc6f91dfb5151f1354900de181ddc4e471069af8c40c7d2c3a002012000a300a402012000b100b202012000a500a602012000ab00ac02012000a700a802012000a900aa009b1ce3a049e28e9be0eaf5c009d4292b7011044162d0f8e25af6c234b4e5300f8aad7171c9718005b7e4e7c8f664b6b90d0b43e4f4e2004fa75686da2228a063f2c36015dae01b3aba01233956c960009b1ce3a049e2b689ab5ac5610fd9d03325867b8960a22882a24f96e919e85eb5ae350d973e5c8005a09eb355292e7f95778029be79b4a96dfd0a7896c2f1b2303e461971d9ebea30943f4cbcbe40a0009b1ce3a049e29a6823b74af63c5dd8acea83b499e935c09791af6c216ef272f8ec1490d5f58f40059faa64be2db06778e76b5162b3acd0d538d0ce14f1f870abc0d7b4516106d364582e1e4bb31060009b1ce3a049e295804c354e82c62c471490af97af1d0c638218657baa47c4fa0fd313c72186d9c0059c1d16089831b96ff9b8ad8c438eafc451fd474a77e974b1bfa3e3a53a5d549c84f365471a24e002012000ad00ae02012000af00b0009b1ce3a049e2bfb96578aa0f551f10e9556f74111279715efdafcce835b6db21cb4a67f26f7e40059c1b64edcb2a0b2b2f620d8add53a175a14d651ce70897b905fa513c6c747fd62077c0ac132ae0009b1ce3a049e28811d6eb6fdd44eeddf3f79ab89db8deb6b8a01a4be3e0be20a41479e9163e0780059b722d7799a199867e1d8c71f6175a5ea27ba5cfc9e1d27e6234e65fd7306a363e0a1de3c51120009b1ce3a049e2b7aed66c2c6f2b00c4a8afbc943ddfab8f399554fc46db28f0a026c5431905914005945439e84ae86b045d350f2fc365eba43228e9c2f627dcd81169daab5f647006d9446a31d92760009b1ce3a049e2b91478714956fff9bcdd07f6b895c90e0cddd9f03fba124ea9f37f0b81188078c00582fd4bde994f2c0b948f616efdbdce362a389bdc2ff7c1596075ae4b69a6092b2a7535ff8c236002012000b300b402012000b900ba02012000b500b602012000b700b8009b1ce3a049e296f62a6c9b3f08b1d94265cafa032d43f4743c42ab9057d62b1a31f48685eb22000576f9df0585d136802d2ba64eec84cad5b03ab06554b3f0e1e57ac20967e14ebc37106f31153ae0009b1ce3a049e291e27ff714e9e3df802df92f86ba348431dd93810c56ad086090f15d3074e2850005732c453c0ea4e8cfae9a113091b84c87afe09d9300d3b4a590b6e84e8bbfa27c08ca0ddebb6720009b1ce3a049e293b41450ed6801fad2bac570594e77f3d49982cefaa4be92c74309f68be5108a40055d44c8d50427b2b91def8b3e3c77a66db288991637f705e981aef30a18455d634d26513930cce0009b1ce3a049e282b32975a04ce278b29f23640afbfef2988d62ec1de958b94b3b360da506981380055bede7e3f8f6dcedd6eb17b65e5f17f4dc0adaa102c83f8c64aa3000dc42d836bff6ded8e1a16002012000bb00bc02012000bd00be009b1ce3a049e28c421a362d4336e515d04662b67083d0cf9dc717118715a2ca99472f23853a8400054729c1ef1501fd80efb75ceadab7558f7439deef102082c17590bbf61765112f2e10f9a417e960009b1ce3a049e2b8d06d3094e62bb5c85482646fc83042d36730fee96027496cb3d9abba11263640053a8448b26f5853cb7269341296477bfe73faa48d3b782a9d242932658b1fbc0dd9da4dd8eaf6a0009b1ce3a049e2b0afa2aa751eb81c302e8e015d27995366838b6cf421c2c7f045a1e4e1f80a3f80053a1556fc691d9f1a05718efec1bb5711b25424a30d9442544672ad626341f092d9efc66a3b4ea0009b1ce3a049e2a1c84452fe18f70bc77c033c1f4d75b53d6beb7ab1e7041034fed1c8b531062e800523a106a4adf5e9fe01ee4c98aa31c42d62389794ddae1692e08d60154e0b6a8674d7a46cfd616002012000c100c202012000df00e002012000c300c402012000d100d202012000c500c602012000cb00cc02012000c700c802012000c900ca009b1ce3a049e288df3f1655c0be0e432b16a7a213e73e4fe8b090fd73bb96a0a90a12cfdce024000520bf9183c2f17ce1db1c705c494511a33bffd387a79d10f195d0ba82653325f88a7d52b8ee7260009b1ce3a049e28ba339d3635a5f3d2ad93ab2be80f29ae00a75c059389dc6934206515dbb128f80051c3724106bf5506a492cb59bef4c9ab52def25e140442bbe9f26e63e71ae787a9a7fbfa1aa8860009b1ce3a049e29a9ba29f24bb06671cae1ed41b22be50df902fc1ea09d6a4ec77ae081f976368000517b87ce8d0b32517e02c8ac346b58789397d3a6037f74656cd72e1ec4b6567992d58e07d98d9a0009b1ce3a049e2b5f1280c8b3ddb2f786fb63dc934f3de59164c7e299326880ebfb83ed5d92568c00512e0025d6381ca9cd2bf686dbe7ba6d440aaaf67f9be34e0b3d990749e7e700949d420578a8a6002012000cd00ce02012000cf00d0009b1ce3a049e2b6afed8463ca0cf473690f2316eeb693edd787c8983cdc9a78c0cdbc18cefe0d800512c12028bf381559766f814cee12945ec3c4a16cd5fe28b8aa917aabc059569c0591e5ab8eee60009b1ce3a049e2924d83b8cc8c85a12d3171618c96d169bb7ff6ccc89043d29420f12584902f6280050efccbdfc238faf9675e686c90fe2a02290d434d32e987beb21ecda88dc46dbbec0f2537f5e0e0009b1ce3a049e2888ab265289d4d42d39871097826c9a2eb41cead2b187fb8b46d56c48e5a015d8004ffa6a82906f662a10b37bcb1ec1baed930bf99ce1842d6380c306b80fcb5ff2971f5fbaf3cd3e0009b1ce3a049e28e444a691089f19729b2b619ab9ce9fa6bbc6761dabb0b5f41d9f5ae3b3c58e80004ffa6a82906f64940fa67fc37c020ba8a5ce7e7a9e40073034f2005e95432538a8f9d72a496b0e002012000d300d402012000d900da02012000d500d602012000d700d8009b1ce3a049e2abba9c125c594d6ab10cdd271233fc51dc987c6de515d98922a7cab6bf0694044004ffa6a82906f658ada53fbe1b8204016a111b642c5c10b6efb15a9157ee01f73d1fc76ce6f42b20009b1ce3a049e284cad92f31dbf62c714d1e6413b13f1ae534cd857b9269089e2dc02ef9ed98eb0004ffa6a82906f66b823314e26d653a3dce059977a0c83c970a98befcf5e75c937aa9db29d67feaa0009b1ce3a049e29ffbba0e627a051bef35bef244d71509e21a3d194ba29277f61b511cb53a0362c004ffa6a82906f670e08c7ddf1bfc3c18fc59d5a8c49b262d4a98de685d888117d87e80e3688c12e0009b1ce3a049e28e983578a468a1c58924562a0fbb87c5066685ffcbf72e4a8449178ccd428df50004ffa6a82906f64264b4a58989a560db1e2b784ec64a2cd7f1e31f707785189844a455aa2f019da002012000db00dc02012000dd00de009b1ce3a049e287c06dda6f205c836731ce52e69a41d404d5a24a9a71fda68255c42305fa3599c004ffa6a82906f649b866bb0a015a1b9cb4a04259e75c2854e14017f653f3e42e34e3e2f87ebeb1e0009b1ce3a049e288fcb18143f16a9991df1bf88905c818313d9f915ad0498ed9de9b538405a56e8004ffa6a82906f64200da27d131557afb6ca1c7542ed43c867320507d68f6595dd01e0bb32c471ae0009b1ce3a049e280555456306c9dba3565b5f9c526a5eb05007a820d6edcc39fee9113754728f84004ffa6a82906f6622d3e8b9e0208c7324c00eaf69b7ea62df5ba4fa59714f465dee6a87953d8c420009b1ce3a049e28b2a2d40168824775facf1ec56c964adac09d473140969df3044513cffbaec598004ffa6a82906f66bc819c25d36ea49ec9b99cfdd3cfaf91d642ba9dc94ff8273ef4a7b4fd169022002012000e100e202012000ef00f002012000e300e402012000e900ea02012000e500e602012000e700e8009b1ce3a049e28da658ce4ba116f80e1d5b43acfc4469c456589afb1db8fe05c4f02c027e66a48004ffa6a82906f67fec45c828ddfd9fc9b3f6fcc0b358d37753667ccb44a8a5af094e0c9c6ec36060009b1ce3a049e2b43cfd56faa19e4e16ef2d8c5c263d54ddabefc17479e087cff04bc0a45b5b908004ffa6a82906f64c9ba8487cda2ccc88d92c89a7c1459c7585459e44f942bb38fcf192199fbfba20009b1ce3a049e2be613673b8333c8108e931b910f6e3bc5b567f31975c477e102ed8c45fa7637b0004ffa6a82906f656680c6a2a94f3515ee812cc8865a8cfb40ae24128c0f68230d7f03c9055c1dae0009b1ce3a049e2963a9ea06c1ba9939bf7b4a6005b769e5ec681ef3e23c81f994eabd35f758fe7c004ffa6a82906f6482336dc9226ff3651616ad7d83224c1c7bfdfc647001283ccfeabb8a38e52612002012000eb00ec02012000ed00ee009b1ce3a049e29461caa5051d3c05fc6a3c74458c4a8b41e39575656b87ab3f0a0caeaf8ace000004ffa6a82906f65ba3eccda1a1a67603cc4de6a8b3de4f6f42c68b481bb25667ad0f2a4882697e20009b1ce3a049e29e7e5977f1cffbd140e63805c0452eb1a31050a9d24c1bfd1318745c4f591d328004ffa6a82906f64c9c22d344f11ca4eb99dd0fbb543fc11dfb1e86e3206669bb76df787e1f02bbe0009b1ce3a049e2814d29571cfa0ff60b0cf7f6dfeb6a8a92f9dda45251ff12c67f5a0909fbc6458004ffa6a82906f6732f2c478c701e91245aa3d88dd55817e44c73d0c42da9f2e84161d79c27c223a0009b1ce3a049e2b4a112bc547497dad10301e159611d7bf8506bbf2780bb7105c8e917a530b227c004ffa6a82906f652e07107e20b6685a7c898dec3007a9785808ed41d747c0d75078d63b7c76d0e6002012000f100f202012000f700f802012000f300f402012000f500f6009b1ce3a049e284f2cee73dba610e14364442ff45dfe51676bc64b8b661cd8e77d6f31c1535fb8004ffa6a82906f6451e74a504d562876807e239c6cb607461d858c47336791a1bbfa84f3964353960009b1ce3a049e28879e8964995a42f133de622f24848eb176b5b08903019ede5adbb797bc29e654004ffa6a82906f66158086f70a6e1366c4ddf33f82641fe760fed5c84a92fe68da8a3967be66b7760009b1ce3a049e283f022e4df0bff1264349b673628b3cdfccef1317d6c9f25b14c9a0620d72eacc004fb409aa812fcf6f9bd85d5b0016f6d5dfa99d23eb5ac4b1575af05db1dedd6a9a39f171313fc60009b1ce3a049e288bdc4cc15adb72c60a097c193e30d961f76b0bc94224a5d1c443d5df07e00af4004f71a193a515c6dcc150c16fe0897241e80f4413339d2e0415efaa02a2c352173263a0a0b3e276002012000f900fa02012000fb00fc009b1ce3a049e29ea75854952537e4221030c2f3e570de58f7be7a13e833dd56ef72ecbb6dedc10004f5f2b6b70f39e0d011e830eeaf39b99ed78f7c7e91e0914678ca4a7c6edec4be7ab6a18ffaea20009b1ce3a049e289761b88befc952ed96dd25e2b8c1b9ec49e0d4113e5dfe5f04ef6f42ece569b0004efcfefdfb30bee4e016f51815d3338ab8c29e0bd03890feab9e861f0fcb68ed8353d02b6b02460009b1ce3a049e29465c4c848ff31367f0b5b98a6e539ae0759d3390c9015b817eff085cd8ee226c004ef790783f802460dd58645d6b8d97fe4ba07286e084488fabb602c0872b5e57c6705ed9de64020009b1ce3a049e2aca8c446145c88971f0c527c67187c63ecacee213e8a9707787f89e0e4d9ccc40004ef790783e56ccbf783a061684fbe1608e701ea2c6f13371cf276862016b349ebc1150977c0536002012000ff0100020120011d011e02012001010102020120010f0110020120010301040201200109010a0201200105010602012001070108009b1ce3a049e28bba0847d8a9ff362c19c035f30ae4097fa9075f4d8f3f7b19bf1f2d3b36d8050004ef790783e36eb909342cba491b08507f8a25ba54c409ba6d10cf7b9cb58a3eaf5e464fd7bfe5e0009b1ce3a049e2b5af3a469ca6e630d43477531d3704e036822397bad3efe347e00553766d8e7c4004ef790783e36cc1bed0b68ff4bf4108f22687b94f94b3a45c56a98c5a293986b062a2c72c4da460009b1ce3a049e29abbfedbd5fbce3a8830a73a3778d93c00b98f243f5b5cf417dfba5522c5782f4004ef790772330668ea011dc72f54b87e8b43c94a59c6d499c19394fa56f6d0df127a393d11b77da0009b1ce3a049e2831fcbcc8bf2a180957fe89b8c17c7e699eaa036491b177f3f9e6ca13e990983c004ebbe6dcf9717824f830979f1ba394187d506e3dd3568fed7c2f320e5760c540b5393b590983f20020120010b010c020120010d010e009b1ce3a049e2974ed0d027a6330e1f47b90838c480f8c757e75b91ed4d1e66f359c72f131ffe8004ebab369dec34423fef9cf49149b2e2a3fd7dec7dda3a1f0d120cdd262f6ced9b72be999785cb60009b1ce3a049e2a0cb13101224dec0fd43fde61d336f39cc39946b332d911aae858b3bd7e4d0844004da06ae07e63486095072f6eb127007e98b0c2c855151bac6b94c20700df1f544969a2a7f853460009b1ce3a049e29db61aaf62b2ba05d43ea25a4864668b4c107077580676e368e9ef3d2107288cc004cf0f91ac9ffa9cd9245931ddfc6d508b411ab4018995c5f62752e054803c9f82d15485be001fa0009b1ce3a049e28c7dd0621cec9849e5dd8e133ce1aa80c8c7a20ee59cb28377dbba361f1ddc3a4004ce4eb83032630fd203e334de61abfcf85b23a17c6f87853d99aa68eec646047abda2fc837ae86002012001110112020120011701180201200113011402012001150116009b1ce3a049e2865815f3f7c0914ef557872bc38d578b740e538ad1d8696a978b6abadd25efae0004cc77035c73c69e6d4bd93473ad1dc6b84176e07c834f1a1e10e2595739841ad9724a93503e1560009b1ce3a049e2b1ec96837c67719120b0c9164d44dbac784bb9f872c1e2e8a5d0de58b2bf12358004cafd180b0c11c932130f044374de6c5cbd9e723044aec3af3f77b18de54c9b9f7cf43290db89e0009b1ce3a049e2a6a0d314e3b8c40005c4f2bcb3d2e40c7559b5095d35f2846f7a01d7af2e6117c004c9e2589717fed6d40d6f38e60cb6b302febdb408fcaa67fff8c3271a40929b1ea0274b2e730260009b1ce3a049e2846e721f01b0d8136a8011c53ed261a690d48e3206723208e35b6ad1fa1c8d604004c69952fb6da6e220f165e4717e1f52cecafc84e487107c80ec6b4b65d993b9262347297dd74ae00201200119011a020120011b011c009b1ce3a049e2ba354409e52e292e8d2a0456f664ef02e798d2bc241771ccd5738c0cc71873aa0004c639d68c1cb36923f7fbb1c77f24be5deabda8e6b8930675d0751aa2d8335dc8d710cb929842e0009b1ce3a049e28361e146b8d0e48b8664f1a86657f9c039a5e5c6ca854d079f8ced8413821f138004c63729c75693e95ae334a41002a3acb6bd81cee5ef4258f7c1003c7d2f7f4c3b9b385c711968e0009b1ce3a049e28941ec14ae0c5c604ec4b061d0198671ca619f1443368b7e1bb69a5fbd0269d88004c60fbffc6fa82495ebb678b36f86245c959728e2166f3600d364b3843284667a297061efb9b060009b1ce3a049e28e02c060d00e8d19aa141e101ce7df1d45e136b102e94153298d69d7d34fa6278004c60bbc388b799528e1f2a08f6c977deb5e1ba1eabecda6ce4b2ee114eb8f678ca2918f77b615e0020120011f0120020120012d012e02012001210122020120012701280201200123012402012001250126009b1ce3a049e28ecb9c4f8cda5bd64d5e44b2225956d6feec42253518d656456a29bdf112ed0b8004c0d76fae1a0028b43081357b4885f7d6a67a762a88101e31026031cf6ec6bc1fe92976035cd8a0009b1ce3a049e29c4616c4d6855f742a97a54d7449a2267f38da5eecc386c18a4a3278dc41e33a0004bdc824ca623fec7839a36d9c3a50549fe17f50cbb02e554a4b2c1d257004b4c9f707134a7c6e20009b1ce3a049e29a20f8567c8c3b4ac1ebaea2c3d9f95885e6d2e96940e73313642dd404f751f0c004bd215ae374c3aa3ea0c15b74bf9ca563a8cecb1faec9acdb620557a084a7c862e19df048f83ea0009b1ce3a049e294f1899c06071b508c22768b6ef4c8a232a211930e7007587804ee52380faea0c004bb5fa547637c160b8a7b21c57d27f0931e8e6cfdb7ddd6b4e5f2799f7d8ccab31d578cc667e4200201200129012a020120012b012c009b1ce3a049e2ac4509070c1d2a81439c0cd49a03fca11cf7ba70511513d07ce3062b5adf2d85c004b8b57cefd7ea4848cc771bbc8361d86f381187db7bb35f83fe8ad8241d33b8c2c9acaf59723b60009b1ce3a049e2aa3326ec2e16f925e3861a0e5d27118ee523f0c1cd2dd95cabfae8a150e170f4c004b79f94e2c9d319a28a87acfaff5de1c222cf4af07dc11e8e3fa4aadef5dab7ce01c114e5b9f6a0009b1ce3a049e296153ae05072edfa27f731835ed599cb7492c9f16bfb0510f5cb0dfd3fd659104004af9fcd17a1f56e53147ee1c9a4d4900c0c292df9fee569b02e0554c91ea3774f861af81fc3c960009b1ce3a049e2bcb841d998e2231f7cc60f10fdb47382c32b052cb26aa0b86adbad31ce633d934004af9fcd17325a125ea341585947baa0194b1406662fccc2693dd8932211203a1326a59f50ce64a0020120012f0130020120013501360201200131013202012001330134009b1ce3a049e2aedd576645abd3bb91bcffa7ab7d7cfed86f04637c95387d5209592d13c871f5c004af9fcd0f1911398c7b95f42a89c2a5ed53d6ae8dc665a1ae424ef1e961bac85be227ae5dfce5e0009b1ce3a049e2ac40d1fc1525aa90637f78ef2d18ec150023b02464f2d080abdcb332894515fe4004af9fcd06c80d6d16d52d1d34af75b70c1a1c7363abfc373cf7fbf3229cc8be80276825670bff20009b1ce3a049e2aebc8e5aed8b2fc348b52a996f24ca3745e5a8a7edd18ba2875b0b9cf59d82264004af3bf05044cc723623fe37a6a77b0547345396708c9363518d18af94528b92014a6d7950fe9b20009b1ce3a049e29cc9bdaf9650ef792179a780d1f71e9cfe555301a8f2cfeb905b66a65e7cfab5c004af3beffd8deb68dec11592e433234901611fce32fadd47e24f7536ac942b81c5ef7c26d979dae0020120013701380201200139013a009b1ce3a049e2a7fac614c1cf37e70cc15a61db118d0b74c93e8a089c7c65e53f3bd0ec747f4cc004aa57c691a42f3b08339ae393d96b9a5c519258e1c62c12c65bd32222ad5c45d8f201fa7c8d29e0009b1ce3a049e29e70d72614ec227fbf85e4bd826a9dacfb5aa2e1cc61c6dedcdb1eeb9d9f434a0004aa57c691a42f3d9b69681f6a2d635073aeaad83c2107fde9639331762bbdc489662d80881fa460009b1ce3a049e2895b5aced175485ddd8ab8ae26ece9a998cec5f4fa8a572a6bab3be76a3007c44004a688c6bd3e607b41318996d6e8ce34927a5ab553a01ea365fc17998486465516d4fd420aa885a0009b1ce3a049e291103344c1e534dee3a266de6dff1c192cac319a415802a1bfd2f2ef8fda97944004a538e2e1beaa7adf573699dc359e1c159690b32f85c446b8d8f73651aca205b06560f081d11f20020120013d013e020120015b015c020120013f0140020120014d014e02012001410142020120014701480201200143014402012001450146009b1ce3a049e29ff4375548c9dcfb4c688c2baae6e818700df00c5eaea45e648e26069ac5d8b3400498352f3fc1a68424f5e283adc3e8da52c90a2dcbd07e311c826dbc4b63dd81990fb6cb7309bc60009b1ce3a049e2acdf825a936ea80a2a3dcb619ea1fbaf549d798355dfcd7dba54f9bddcb327fd000493465ea465d2cdf97491a293787166266f3c3ec9e93390f0aaeb74b079e92dc6694e9ec7747fe0009b1ce3a049e2aecfaeb2dc236a32f61e0a71c76214af21904ec575fd837ef335c05c92d7425c00048f0aa4008ff36b3ff15b5771e8aa82e713e2ff3943969629e0f64e0ddb68165d190c2557ce5b60009b1ce3a049e283f297bbc45976b51df2c7ddfda7f7a64160a0360161f86918af0a1dab36b076c00485b725f6a6870a82e510b4d9f501503c4769c8f05cc7f25236f156f00aacdee9b7e06eb07ed8200201200149014a020120014b014c009b1ce3a049e2845161513520256ae85eae7a6111a87417da18e64dc875859a4b28c28f68f5b6c0045a74d4a3d07680be1e2bdb47318045ffe1bb6e79f6bdbd0bb5413fa37fc222bfbcdfee2e857a20009b1ce3a049e2b2a21d36fdd1fd6548d9dbf567c409e1a4aef7f14f811eca12c70fb2a09e72cfc00450594c3ad659c5d2496398d7959f433a2c366c5656ef64a8b1e04f32f4b49c4156665ec1a258a0009b1ce3a049e2a0b3f8f31d0fd6a84cc0220a2f35fc2059671abb9a246c8065b9922b5befc6204004502b05143456e3a49af7f589fe5c368507b67a2fbbdf28486af9372c42a64f913017cd699bfa20009b1ce3a049e2b0a642c3f0fcd134df8abf4b1196c99245aef9b67db0dbd95472544aaf6830dc80044ee1a8f4cd5a43536dae1af1fc09513176aff7c79d638ee99ae975fd964bf942db7d0fb91b77a0020120014f0150020120015501560201200151015202012001530154009b1ce3a049e2a15c5d42bf304b1eb90f0bc41dec982615e018b944d09f31ffa905f738a39bae40044e35a262fe265a13f11ff3180a7b3dd16e833c3a411c9cd17c8859c0c288098c80fa80b47b67a0009b1ce3a049e2809f5fb75ea7d206b40dcdafa12aa4c22d75da86aca639aeccc016df38651828c0044b2cf4c81713048921455da5b253bf0a0373e940dab1f62c33db1b6c38e2c2509e90b18d6d8b60009b1ce3a049e298c96d0ab8b5d4a63038e950a2c11a748b4589fc6098eceb94ea4b5d1772f3448004421d8f4740b851f36a9b75b9687f793dec216c606e3f7c6bd8abbe1afa40a288e30de2950ef1e0009b1ce3a049e2afe9b89f8ef316dcd39c1505bd83df97418ce2948f7cb252f3539edc3435b5b140043692bd5477fdd63dd94a980935e004b618f63008b1227557d464cc7cf26e705a8a109108c4efe0020120015701580201200159015a009b1ce3a049e286487696f4a6e21873237d5d68f8c6e9b8d9c3b8d26ab29cef3ce0f2a88a495200042c2c16439cc203943525f8161f8aec2fb535335fc2bbb1ab0b47681903cb447cca69824f1b9ce0009b1ce3a049e2a01dc5297209050e52b41101263f8929a74628507831012b29d97dd9494c138240042c149ad4daffe9944ac68574578f8ed0bddfca72d4ff96126182d0aba84e1eec9c49d3719eaba0009b1ce3a049e2b065b71191c9353d83a3ebe96a9781731488f440c538d1f9edb4e01e91ae87eb400421d8335d33d17aaa83f00bd051fbb5536517bb5a916537bcc03e27a87a7ec0af1943fa239f3420009b1ce3a049e295787d4995da912c87171fd9bd29b6f8483ddc707f04c5a26ff93b997b18a88a0004217b2a2e6300c3c44edb7d681a9eefb9ee72b66ec874c2dcdbbefef4f9cd0ec9131c6e32ba0420020120015d015e020120016b016c020120015f0160020120016501660201200161016202012001630164009b1ce3a049e2be1c8b54b1c366bc8753e0109026bedcaeaf880f98e74da0c650562f538efffd400410de28a7014b5663ebf5b15b05dd8974676487cccb33fed640bc4a68b490626d98f540fc1c7ce0009b1ce3a049e28dd9800a3090074346aadedc2421217e87c29c9dfc502cfe20c187922235ca06c0040985254fca15464170278680894f6ea68ca69ed38d7c8004d9acc66269c52dcba495130bf58960009b1ce3a049e28d718a2e737824a18cbeb0d446178fb630e48feda0c809ee3f5bb2492da7b233c00407aeeda68351381055db64e196e3396ede7bea28437c1d49f6db06acff8689eb73b13ea3f53420009b1ce3a049e2baacbe91c012899b5805bae90de340bf3d1448ff2e3cbf9132c3c9a37dfd383f400404440aad5e490feac07f0e4bc11320a8da8b1b3a66462b53c494a4e14e76c238f26664fffe24e0020120016701680201200169016a009b1ce3a049e2a7222579d80509741757223f4d700221e544868db5615a16415f733de82df4cb4004035ddab7bc31e30b8e5463bb6f4bae077e1956a261234d3f1df5317559c2c0cd5f4b8057f475e0009b1ce3a049e295d9d9245df0a4de774965ce9f34a2d2476d6b4f9ae1f064cacc0678aadf06f48003f2191f2b46fd0303963b55830d2d2853361134b7618ab43528bbdaf687a69d26867141792ffca0009b1ce3a049e2a21f0c4b66ff967d16fed60baca3e7d106401c22d18e46160d4ade2a032a0530c003f05d58532e1209a0aba445a362a7aa7b5be60b52a9885315a3c192b5313e881d68322578e79a60009b1ce3a049e2af96f6be234e89d3ea54be03704ab32b3ea9a424d3806912be2232eae837692cc003eea88e90a0a1a6ba35a67d878b9ce8cd176458a2afbf5b8d642531b3f489a9fde93f24a1ec7120020120016d016e02012001730174020120016f017002012001710172009b1ce3a049e2aea678cd9c1b92fe65ff6604a92919bde56d803a10ba9ab4ed159378b827cf718003ebe9c3ca0645563653295d7a0ab3ffe70a8e39b431046c93e5a51976ec30f17c81151a28b62420009b1ce3a049e2aa40b5fc44d029d177957baddd3daba388e502e1649152136626671e0c56450f4003db1a8737ca0e4e5b6248ae957819c53195463dd7a29277835a5b27323db64cea1c0b8712907ae0009b1ce3a049e2b9fac3c67be9ba35c279eca0d77413c85b91e48cd7bb38ed37a23f22deae74b68003da01ac65f4be07a27dbb19ba353b571991f65bffe5aed1f4760ec1b5e2ffb23dc9430e3a0be220009b1ce3a049e2980deec23f993595e3a134736d1beb1bbf30dccce5248b720a1387d40ae1b7b08003d7898e2238403751d7dee28e7a37b1e3572a62abd33af2ca3f86d1858a0cce6ff60bda6e3459e00201200175017602012001770178009b1ce3a049e2aecb39bd9d135e6d6effedee2ce627aa8db60c95bacdfd0e4d3f0e23252f85058003cfb4cd9e68948d3a5c152504a1ce49bbd0c5f022169be07c1f530da7255c17855a8bd810dde7e0009b1ce3a049e2bcb05222a44e4abdcc992a91ab614d205514e6275af59ffeb7b095b7024337a98003cc5dd807c07e27242fbe7fc4774f4d3dab3613e7cafa7b079fa124a33a6fc90ca96baa69704c20009b1ce3a049e284ef1d53371af66e23189dba707008ce46b6bb2cdbf493e74adca2a9895a0abd8003c952c2575d9e405ab8bbe1c5e2e3b1e546636910d34eb91b232b31e21ba0b3b2162e599de997a0009b1ce3a049e28410623918f151e9ee9df581a087758e60194b69e402c3b13a715ac6b9f3c2274003c6b5998872800fb2578a99c369561d684eb320a8f13ef320143899fc9850c38e74e95b0eaf40e0020120017b017c0201200199019a020120017d017e020120018b018c020120017f0180020120018501860201200181018202012001830184009b1ce3a049e29b85de16bcf2464c0e47767a9e33b6697bfb0193a4b29d4c4f0dca3c33d9bf158003bfb465f41d213b6d3b4430cdbe843e76d179865e48f49a36bb16867897d45dd53b004067be3e60009b1ce3a049e2bda1544897efc4b7e968b935d23b5dfaf97a9f5111ec69d8fa68262ad97842a2c003b9575d62355c9eb73d6117661e38f086a8631096061f73baa8ca5181082177fe773edeae06cd20009b1ce3a049e29c8ea6e91e6e33b9cf8491e4743600374bce5181abb608cb91d62a1e67a56ab0c003aa698e92c43fb06d5026994fa04e5b710b4e68c4429a9e705ce1a95c7c0813127b2a8fe381ea20009b1ce3a049e287e8db53f200fe8065cdadf6930b7f3b632ceecc8041ecb8f2a58ebd596ae6ffc0039eb7b90e9a6f6c196c5b1cb6bc04add46eb9eb075aa93d31826c69b548eff130b118aa1f09d260020120018701880201200189018a009b1ce3a049e2b15fb750d4096dcc50d73414032e27767243e2bfb1efc9e32210b09fdab92962c003913cc1a97ed89f64bdc3ee3effd34f1eb0ebb0fb48e99c40e5b042c18661f7cf2837d3965c3e60009b1ce3a049e2864987cb28b954b70e171269c5c113c623c8eccdff15d5e4215fe135772ec2e100036cfd189ffbf0e4bf04f4e4bc1f57ed53926a829ac7687196fac601487c228d65acece629cf61e0009b1ce3a049e2aed4a77bb13e4c1fed6d1b9d6f2639a7896c906c6bc02652baa9a2251aef6de840036b7e784467768c243e0ab84c6ce8324939e1888aea6363bc3b081d6ad18eca492fb89a8125c9a0009b1ce3a049e291f58162b96a6107c366cf66020f1904183f4b98eaff0cbbda0dbfce59d0de51c0035d2e6854d88ebd5f13b8eb2fb2811f8f2fd2248f8897e151bd652c93f307b1e0d0c71dbdbd10a0020120018d018e02012001930194020120018f019002012001910192009b1ce3a049e2a5cdf7ad30a3653f9821a65e645bedbe2c09534691bedc88433ee9f9f5f6223000035519a02ae711ff09a1ca5182f7a1832d9964fdae6786d148544642138d9c1d91c3660a3bca58e0009b1ce3a049e2b39c0c1c00da3e9585a83a97c5ff9408dfc1ff529745e3a9a3c4ad79ab69ab5b800351b00ca5cc30a9d32e6213ac7ee6541c7691835955b5c383bf1e277aca1dba4825d8b8e5b09e20009b1ce3a049e28fb40308e0e92172e25e29a2a2d883858ed2d8eb320b6b4bd96c9ed464cdff13c00339b8413ca9ec724c43b5243ee6b2f766a6f24f55b171fa37a3a125b9c72e6a7abeefbc3620ee60009b1ce3a049e28791fbf3def35c90fa9ec979a132a5dde62f8332513c43b6938f67f2430a459980032f537e7a110f62bae4ce9ca3b27c4b57c5bfd4c91ed11f604df3803cf0beddb4437b63c7ccfb600201200195019602012001970198009b1ce3a049e2a38bdd1eb7590f13d743372e8db33e03bf43703390da5744cef756973e1022afc003279c444087f469ea2d14b979198992f73ff458a40d76fe3157ee74c5a780e1d0cc1e93f3260520009b1ce3a049e2bb04b699d4861f1d254630afaf8f52f1e55daf73dd66ffd2bca1e0e28e423e4f800321e9fb5e53e1fa48075ecd741d50fee154318dc3c16bda368046babcf4d0ae90619e10a3b27be0009b1ce3a049e294566d0adfa4ff4261d473049d61c6a3cf92b6604eb108cc0229b0c4fde6c2a8800311cbc75e3dfb3b88705d8a1a927b941511fa4dc9dc5d50d0da4cf7fbb48496bf1a962df4ce1d20009b1ce3a049e2b7ffb7df8b0136e3ac6268abd8cd3d3d46886c7ea8a7966f5e64e3943dd6c05b80030ed172ffb64c5e98596d5d32a3f7ad03f3c8e76aafaf6d49503ed43f46b8343a329f659634eb60020120019b019c02012001a901aa020120019d019e02012001a301a4020120019f01a002012001a101a2009b1ce3a049e2a243c75af4225a6d58730ea5fd83be2597df5dcc5b04d4c7bffccc27ce2de8d2800306a77581604db85c1cfdc020bd8aa220810902f1bb066557e3927968850f219267da0bed3d52e0009b1ce3a049e2918d7d3fe25373d3cb8c7a9e41148535df32417b86fa51bb9a24675275f2f383800306a205d992150dbc32e7f98f5f18ddf0847960f69dc56903cb7924ff0bd4232512ea170108e660009b1ce3a049e2a43a7402400ddda36c65301309f81985beeef8ab5636b4e91c94d0a048d6a5f70002f0989e1dda2406dee48b7d754cb10756ee56e24b1f947b72bb5d6c4dd820300e1a254e716ddb60009b1ce3a049e2b55d2cea6829afeb1b1def73ca3ccd76c37b8ba2c2ea811e4571336c0d7cd8784002eea4db42690073de3900acaa1c1d147728ab1a4274054f1e3e7870d5a30dbe53d31bf2e559e7e002012001a501a602012001a701a8009b1ce3a049e2af4ae6c525caac50b925a840bb3d1b3fac5df621bf428ad4417e3f98813ee4584002e90b4ad82af27e11c57246e6770c27b5507791009d09e3912f7c16e08bda5e5ef9506c4694e560009b1ce3a049e2a10d8928f3fa01da5cd47e56980c4a239a294d4baf3a8b30c7ec95a97de151a10002e3dd3170e218d8324d3181966a141c514523c202e2a22d8aed2506b06ebd09b6abe0dfff3ffd60009b1ce3a049e2be97a1431d51653d85b162d9bec92e9f0be209bfd459ff533d28787e959a09b90002e2c03dba8a6eb5d219533d6a9d383f0a19caf6dd415e9c444edf0a7739081733c5669a72c94ea0009b1ce3a049e2b0936f98ee01bc212e636ec72ce609351e37f72c67c3993b2282e048106f98cec002e146b72870c2dfe968e6748584d4833998ab0f2118fc101699e06d3b0659322cef4c666802ebe002012001ab01ac02012001b101b202012001ad01ae02012001af01b0009b1ce3a049e2a521c4396ee209b36634fe89fee768b63e67c24e242ed1e60f36c2e6c43840758002dbe50b1e6bd4229141b26bd203d751782e5ec505807ca9574e9c73296495de83d5b39b51523fa0009b1ce3a049e2850c474e74033f30e5f107919944cb4732a8ffd3c25d654f367c00b6c315e6990002d4ddb0e6973d5571b3ab859148402488b98e9dda1fd151968863eb72d61528d989d9f3d96b1660009b1ce3a049e29e86c3da8dfbf7477def991091dd32c28f3eba16a7ad1d010332bed9c0e84b9b0002d3f057b3009a656d776e804f4c2763599d0bf0b586833ba8e36c474f43238da2169b0746157620009b1ce3a049e2b138597021d6d9e5e1a155c5b2e7f0f0663834c511f4e58cdd0b46eea5aac2898002d0795fdffa5149e744c630804d331bc19d8ea9526071fb66743a527259298eb9b175e2c4a49de002012001b301b402012001b501b6009b1ce3a049e2a5b05dd431c970e99b3a18fce7b1f6c01c002c8341ad080e70c6af695928da0f0002ce7bf3ae8d8af3be7af211d13b1637d8ac7086c5f4ee0faa764f3d951943ee00ef5468c76617a0009b1ce3a049e2801467c38c4e836c14a072eb3db89e6e05260ad35e147d40c5acfa9abcd9ad620002cdf1caab9f960cb07efad3a6a6b2b17df9688981b3b75ceacc5bc448fd9e5dcf567933d474eda0009b1ce3a049e2bb5c51d32cd95814d67a7b32f6e9578eec256beea1d131844cdb616c3969cf0bc002cce92a100a415a24819b16ef4e614fff38afa70fa7d6f7a68b75728272b882e324f5680cb623a0009b1ce3a049e2be81a8989a2370ba22962d6d5ee738d722ea3b09b001a45ece117eca9414976b8002cb2a40ae5960e2146cf7c9dd9e666392a3c3f6b4d3032b13332abc5b3f83e047c4a556a8a380e002012001b901ba02012001d701d802012001bb01bc02012001c901ca02012001bd01be02012001c301c402012001bf01c002012001c101c2009b1ce3a049e281dc6e44cef8f0b4bd7df666e4c3186170915e842c04c211031c7c7c6097c0c68002be689eb00a64fb1f366ec8202d0d1dd0f7428a8f2368678939775dfd43322e3caafd2f9a69ac60009b1ce3a049e29ff1165227a153481e8dd96da6a35b134b5574c0d40527bebb1eabfcdc29b7b14002b0b1ca208657967339f65d1a206965adb6c3f41c0332f0408ab3b37eb1a1e5030776b0cbef34e0009b1ce3a049e2a1245d7db3e0549f8ab651fcc508a1eb70abb761cabdd0f81904aaf829b58d350002ad1483bb6aa2da17d1d73ddd00cba98a4cf38b3ac649bb9e6ce7064d651c825b650ef7e5e005a0009b1ce3a049e2ba246e1aa1f67a252c619a820ffb52f78ea4af453cd17ad6837d4a85800293304002aa0766dfe8686c55aa14232e9228032dbb019fd765435ed319f633cbef102114ccaf1609f6442002012001c501c602012001c701c8009b1ce3a049e281928aff11ac3a5726ea99230851fd5deee26ac9ffef1c10c782306a35bbc1a24002a2c37e6a28191ee9c4e215c1203ad0f95cd8dc58bfbc667801c1ec68886d16573346915867b620009b1ce3a049e2b0a574609d3cdeb3d71e4125679ecab6d90063d089dabc9ffca8e425f178ecfc4002a09d4de1e2e052ba92761425bbcb6844ea868c56d0429e313ee963d1288a446edcd97251350760009b1ce3a049e2a1e4e964bc9308d990e090ed7e0f698648f50b8255d5feb689103b81b7d0656100029d8e9640cf6e1a023d9beb6ee16304988b5dc61e3ebc7d0911b35becc2bdf617c284de350d93e0009b1ce3a049e29de2735144debe916db3ebf1ef8e93c482000b23366084b691ba7a5e7681b04400029d8667eb975d35302e6519d43cdfff5af212c987ba369df8c801054a5e11436f41e09cdf9b366002012001cb01cc02012001d101d202012001cd01ce02012001cf01d0009b1ce3a049e2b084de37bba817d9dcf7cb326b32d20eea5622d9ed694d8610f213a0f58c030bc0029acdac92000fff0d9d05277ea1c26ab95ec012c57d5a12090749eb1ad9f3149bc6b670786cdd20009b1ce3a049e2a4901bb97e175e32797391a4af6b9568f2dd27491b21e36907619aa5fc4b89b8c002989170b43ebd55805a66889fc09b433eb1cac810c5975500818e12c8e0ae0e3bdc0974768e9ea0009b1ce3a049e2b0ae4a29b40eeaad13a97cf933ac3fa45c77755a626db2519432cc010f8517bf40029823e4bdc78dd660031191e56dde5e0ca9fac0a7adb0422ea50b5a77769ce6754124760a0c9320009b1ce3a049e288a9277c181b65ca3e8feaf5ca079a635b26106d877d73b3d72cb109385dec11800294473317deda6d2dca6096524a35a32e685ba71cca426b0e3cf91c3269cd6eeb73671b7134e96002012001d301d402012001d501d6009b1ce3a049e2929214e23fc87fafffa1ce84ca5169bcaf05c6c7d41e738d7f91879f4131586580028a01221cc527d87f135d6440bd6a79964873da81d2c0b7b376a26f07254059187ce262d485c0a0009b1ce3a049e2b51d6300201850d1df0e17f2f033eaca9f4b00293eacb3950fb4db5cd211764440028683776cf62131fd43f1e6c98cb9c0d8c3b59274e1026378fdc0dbdb50eb1d801cab3747f5ffa0009b1ce3a049e29690846bdc4326f6f766f747e6d1ae4ac551366bd471e44d278bc75e1fbc2fd2400280a38753171397a22a2bbc6f1a3b88e34d3ec3226408f6df3caff6d30785d07bd1501961a0d4a0009b1ce3a049e289f71889c14e619e51e51cffbe4c10844d20e9d1a7155c4312f3c0e01ae4868480027de58a1a3c6a6758a1cf665f267e2c057047cd643bcdbbddfa2d43aa470886dd9898f9fefb6d2002012001d901da02012001e701e802012001db01dc02012001e101e202012001dd01de02012001df01e0009b1ce3a049e2b15caa205774956d9c4797410d7e58d05afc9aadbd43971e14aeb84311b1747480027d85e90394928d20fb1dc5900e90d35582a9c256d35751c5c6220757f784bbb0bd4989a922cee0009b1ce3a049e2b2fdccf5472eff9ad452690470cd7b73ab1e0cee249164f6c19b678083ae8a48400276fe3d6374fb8cb8a8fbb84820193b4d204821beac23c58cb8ec2ac314ff35ed535aee0078fae0009b1ce3a049e284fcb6f49d1b1b58c887ee555ea1d18d42101bda80f63b1cfa95544e4aca5bb84002766aa47c817b9d1dac2c9fa11b7233fb8fed809b60b2242e804da5c370c791909130c6f635d1a0009b1ce3a049e2a4907b08dbbe6256c6d7488e1372cc81cc48476cd8f3ca11e02d8b5c48053bcdc0026fa0a6ac536f5b28de42ca52a505d1c22619285238fff02d7b6fb8c96e62f7b7a465ef7b44446002012001e301e402012001e501e6009b1ce3a049e2bd77cf94195bd6adfbcb111d0b93aa1dc38a2118190e2d73fd28cee5fdd146a2c0026fa0a6ac4e1d73d42bc06e3a77fba211c4e8ffbfba78655fd20a3624c29e42cb03a94459242960009b1ce3a049e294dadf6b5b5e039c14a73a0260c1170b6163bb2ce8d4f570721695cbc105685280026fa0a6ac4acb8c356490435d8b26734a3e8523ddf06685aa2b3f48031952beb28e88b19587c420009b1ce3a049e295fa6959c82c4b1ddd947e7d76e3754f108e55b6222897151ffcb9d570e4342680026fa0a6ac3987db3489fe5453dbfe5e2c00d9a58d5920865ea58c8da8731fe37a74989b56dc3e60009b1ce3a049e2b04f2a3ce294717bc6bfd615adb2ab156926054579d03f271c15391a8d55fff800026fa0a6ac38325a547d83c93830cbde24bf104cd2a3ae9610c458ec80c1a30a2a0dcc48367724a002012001e901ea02012001ef01f002012001eb01ec02012001ed01ee009b1ce3a049e2a5e7bdc2133c5c8c04e30f88229c42427135dffe89cf390a9361f8ea99bcbca900026fa0a6ac3787b8e30bccbc20b0da660bcdc106ceb249da6953cbd33d6713e6a4d16a42100e2620009b1ce3a049e2b9561a812329e0f0cf192887730c5a4cc05bf48c161e1289a1b8ac61d26a6fb400026fa0a6ac0861a5424030284a2643df3e9a3dc27a4e92418f7d2863b8c4d44413bf747d8eb6b4a0009b1ce3a049e2937524c73069b81bbe7a993b3355edc09dccd45f237c1ce85ae71edb1f0b4d0bc0026fa0a6ac070fedf18ff6b9ec3586138047fde2a25860445693fda2306c2e05c14512b598f232e0009b1ce3a049e29add13a50b85699466ed206d84e73c280b46ecd720ecf000d55bcba2ccdc3d3ec0026fa0a6ac050fb8286f75181e77418494c8b18c5b3d9056703d5650263c2aa0f45774f662862ca002012001f101f202012001f301f4009b1ce3a049e29fea123736d33eba6adf7249ae9d20a9e64030400a04ae013f6c5bc9491ddfe7c0026fa0a6abd9e7c452f31ee76d4c83a5ebdc65266998b956d7c77e963593e84acc384cf8b48689e0009b1ce3a049e2b7f2f872d4148bf1e5af0ad91565ab269c30ed4b2b7ec184d8d19dd58ea7866fc0026fa0a6abbeace4435e1b49423dd16a326044b7c0af9dc8d51fb43bfc21a6e0edcf011820843820009b1ce3a049e292b8d9f04219e1c784e4ae4f333462926b554ec6e52e95a5c71a0eeef0231abc40026fa0a69a83cf47d88a02253d6d6538c80a6d2083fe31c60f28bbde53e3aa1afbb68ebe8645db20009b1ce3a049e2b892be648133e1e3e337d0c52ab0b349eaa1f772a649f16d8961aa4cea7e3e4b40025e5d2a34cae0861ea29453572e3376d806c49c80fc3f1bf871f69227bdf8413c4479036033d5a00000e6a644f69134ed6eabfd05005c000000b91890ff80e8cd534af2e7b9fe68257c4a6d1cd40f5330ace70e45698f8c6da840d0eb20a93915dceaac708a01c33a971aecc94e1b6f5a1b1a4400576e79c4addac4beb3651853ec4d33f9a1a91458f5e16fee7183b38026d3c7ed43a1b392c9010000009bed53f51f14940639da3c196da25162efd3c96070cf59010b248c1ae16f1fb4409c9208d46119a80d2bceba53984a34a416d1c9fb6d028675c892421cc6e65c49eea766e7a19a611ccc3140d0c0db7bcc141373a32b6622b430b182b43be34f0f000000d232f80a19b0828a43c6e2b9448d8c5cbae9fcb70f284d952a9b8699106a5c2940d83e88d4a5b4fa48fee0673a167d38fd9042510be6988a9ea70c7f7e083dd19a36b104d0662a07f0962ac00e375c04066cb688dd4100de7223711d585911c003000000addfb579deb4dddfa4296a69434d96d2af25bc47c9469e14090b1abe64c2f17240862e4552c2f4056e2549f4d1568bd5be70e9b84161c3676b5dbb5199ab85f62ed1470742f3be6c32ed968880ee9042d2f8888e1f69dc76ead65327131041b706000000acf88d4aa052c248b1c36822bce1be4522e06422b45a5f9a4384300bb5a90c9e40c6110fb858b675445f82fb431586bdf60e09d17b32e1b04779be183bbf4c46f6efb43fe6ff49d284943fd8df6041bcf10c3a3034858de359960e9a2ad29f870b00000074c96d2f9c7b5beba7478e354e4e4360bbc3d4070080997f93f28cbb98f6c63b40bfd68cca73bb6638fc859a956b90f1fffd03047aa74416352bd5c8024e2bc2a38ab1259d08c454a908f95118da14de70614e59d45860132f683394600c507d0400000036298bd97ff839736f25706014c23acee34644cf6264191edac858cb016306c3402df9dbe7551d73c2fc03f965b66dda0c995c8abce2e906eae1ec5a429c0d64cc4483e88509dbe6776d58e87e04aa65f44b688a1b10dc94830f72968e3ff60b0b0000005f48c83b9c0e425809b8ef0e10204be21f3b6cc5397067dfc0fb502d06f1be3140511346c2c666de2fbd0956fcbb2150357a916d48fd632018860ca423fa31259d3e5c4158c22dd55215ad442fdb9b69ef609907e360aa6644e298205426e3f600000000fd97816a1f177ded1a5e7b7fd9a5e02fb5fad8ec2bded71805940bfef1ad96ca40e421c244654e4d9c5412257bbff7861ac4954b2580602866832da03a380887d2368d508c83a4b56aae7981028f0d74e6c1e029af40f3fe7aadf724951987c005000000472c4add35311b67e9626b299a3f3cb6e87c3a603939b20badfc95413a8e6877408ca780d134ec2f44018b3f8c55ad2503a96a41e1cff3ce1b406a648ccabd2e9aba6e955824134313570a13d0ac615cf71a28cb71ec86a802de0e630cd9ba0603000000264272a5f1c46844da520f0318cb234fc9e37dbc3b48029a687c0d65a4379bf8408b2eb4dee435956e2ccce76c66d0e5a0591ee2d744d0c545c3a1e3ff5baf25996bcfdde390678aafe868c592298292a48a6d396dc20d7ad538f7aedf2adb59090000004d25cc686b17112a428b47ac0679dda0890c7d9e09801f6feb0fe64c0b7c939c400beccc808baabe4d68b6f06b096fbeb3448a1573850431d4cdba611b9c5442692b026aafd059ea2436a9af38ce6fafde8b6ca2a1cb979bf26ca872d23aac580f00000019b666586ade08dbc76a2a5af6533f8548263c48bfc2a5493172b2e094bdddd7406fe4a97e30a2be197743fbee9f1482513f5dc11b86efab34c195c0c98fa29a45ee41c5d16f27a70f5404db3d5098ef4275fb26a62d429dd80aa05911ca4eaf020000009886ffb5a8845a7dc66dda3891a85939b621c5481ddf5be9ba66b6d0afdcf5f940a2dfd5467f91f71c062713e4b0bf0a8e8632e38629b27ad4ffa1af44f4554bba7bd9d4aea242e58fbc6790d502eff8ef6862ab225a7738ab990a5bc90453d900000000244d4810e7888bf2758b15b4ddf46304f7897895164e364d1194cbc45d5dfff540891c55dce92cf51982b7babb3f1154d50e180ad50c3592f213cdf49f87709c18ac329a83b5d2eaa81354ff5d7e52da8878411e94154ec6b8d2e5c1fd5502180f000000bc43f3c56afb8c2774abdfd0a3daf73cfd19ce9deff8929bf8e2678d205ad325401a707fb481309e4d3e42d2f3723dcae8205eb5753e7dc91649d814d2e38503b9f1e737f4d1b66aa81425a444afe4b7a4d0ec70f16ac85935a6d13819dc919c00000000905adf65b93e404450c9b9a4fbb717cf6d6d6bb9ad405bef6e9bdee651b36a83404be74c2c9c83e9762db50ce871e471dd3c8497d2d58f67d9df33e8936304be68536a1cae0b8a60c54660a149f73cfebad88c69346bb98e65467444e98194a900000000aa479cfd19b290ba4c82b09d0c49b3cc5627431599e39c2695cfb7e3a3f40b144022e80657d7f3355c22733de8f92a78839155916110cb9dd07dc215c191247b0d9c8ac696e2149df7d40804b8ba86f59e80b5faeeefae07d13a3d4048822cc60900000078e27e53384ecc7ac6d091745ec2f03a4c5fcaa878df7f8971038719677e474140c20f48f55c5874850746e04f4a2770c55adb251557377d929705e01f730b5c5e66d37b0e037516a5a295af978ef8eaf8ceca6d220e52bde3d994686545c92206000000c0d7b1bd3275ff1826e8c4cbc47df29b8e6f0863d490664b434f81cb7adb586540481b7f51c53ce34af7ecfcf06c686cb45e12a3bf5459c4ef819d9aaef3ba48d368d15eff9977f140d1d6fa530a56fd97ca31f0a8e3f4dd2c2fc34563b430060d000000f367cc157c1d29231e47c1a388a42af3bcba4641792a83907f2aa6a9429c5a5b40027fab7851eb945e876a6a5da2c870a5b175dc122be29141d9108996ef998c9943b4f1f47ad04a016bb4a2b0cb4cfbf2f937187c934631f1e42ceb01c174540600000033b8210492a15f2efd4f5fbcd5db0d505d3f2d6a40a78de6faa06d441588964b40757db6ae1267dc093a58603bd611cbdfc270cc74d9b8935cd2c9ee2f2a1d85339a6857616cc053b7b338fe084a72bbd3c91c79dcce506a61c84423593202c503000000bf7e6e5f013221d47bf2be5cd26e727ac3f903a2d8319eed43fa49d3a48dcb1f40f9d8e43225097bb7635adca89c703992b40e693b29c17743ed8162db586572810f8df3644723659192b3038f4ee46305b084ea70db7ec420b4a514b3e0b1e805000000efd3c111fafc0dc96a09c7b30685edd3de1a07a37d3667497780a9017131b1354064e2b88de484a8858a13c4946dec2040c31eb82eb45d8f9d6b35ce5bff6aa28cc9c87528a14c992a36300527deee3aa1ecf135e9c683c0c34bbffb9e74b3500100000030ab9d287d2283abeddf5f3e3daa487e344ceb9db7bcdca03ed0fafeae8799b84069927e7290a050548157b440f41b9693bb26e5f2ad0e4a031d6d10c24d42b3bfc753b2db51441011368f400d50ee89fffec61ddeae118ca37518123af3eff802000000a06c27328c3d7914153e87fa27cd6c9457bd9a107941013782339586ddb4ca224083a08ef94a2ade8fff22a00c8d52618fa2d2b34e0db65a39c2db7aa567cc66eade5fc485716e4bbf2100e9249a4ddd67d8695c44fa6339f42716a7b4e99b030f000000673c892e7058bc568176ec21721b24fe2d5a7765af70214c57e6bb3fbb8a985f40f03afe6fc23d9575b011b0390701f4f2dd06f47bf3cd709cd037168ddaafb5e097fd79f967c6899a2b25e5de4f8dba91aa42fd2eb738e2a2264c0512e6de550b000000476cc27bd2f180000048ccdda679d4424ed98cdad548c7e446ff70ec529f6d8240f649ea1e7524f1c7ab501210c9cdf8518c753be6fe757fb5b4d1948ac8fbb2e7cf56239c788ead7af18f897d428fe16a5e56dc05f9b1cf8f7aca8d5d1cafaa0f0000001c76b6c405afed7100d38da8f133aa4fcd63042af1748e1eca7d786098b0343740dbee3f1583557ef38ab3b8e56e96b73e1fc10386befcc766af5a34ba500e9c497d444b25d32df3a436995a0d35a55d62c3af868027f7aca35c311c0b5c303e0b000000626c3929f5b258957140280893c41a930a2bf7b282d437fd86ea58d36e0def854066dcd77536353f5b0bb9be9a1698533f189d5fe42177cae97b809adf4a5d44117eb376d86684f585f545f8f3bdebaf0414e77a1182ce3501a28b0f724b133b0e000000bf27ad6adc41a8ccfbf5c1667103ffa69d4dd38ee6eeea4139a9d4b34754235140c3b5fe29fe9c807cc6010e41a01a72069f8f60c27b99a078f3fe899b3d62e2add713078dd5ca11e96966b89c5113d3baf3f58b4a76f05cee38e50d5811b795010000006c5da84dc54fb2a3d544885efb353e25cea02b136fb9728fa6ed2221385d778b40e5a816d6e4556b4a90919c72b80ae0d50e7ce759f5429b6ec740839410814a0b86c92c9dc3f0d393c0e341c89625b9a51e515376cabcee9f0116b58b85f788090000005d13f87c0a2499b986a84c3c8a1dd1c6013cb7d336814463fc19fff0ca2f661c40f8726b05b9cf4979f70acf1a791a9921858c310b4490e98c4890362a1a64d91f424c6486eefea7ee8c2dff4c21f654fd6daada1bffd16f44f6a96ac613d37a0a000000656e238bcc810bbdba83f32240d02d68436fad0531edd40bf612daf503dab671408536a0d15d02d41a6f4e563269228598394cbba674be1be27b6c67397d1e666dbac2a39ec3b3821780d7f33c579a520937e16d4fa8f047a454b75d660bcad704000000bf9b8724750d1f88a683788337fc866a19c7cf2c8be145064bd8a452a9582215400a24f2ef697fa68bd546be9d718e4e94e575bdc19f3f6d9b641ecf09a4933bfac77b1105c797d206c4396f77208e5fb6ec2e38422d56582a7ae89c299fe8190a00000062fe1843ff5e27e4b61179154e81bf813e68090d27445238239b7055c48756d240cdb396cd6a30b14adda59d9e15ce4ab086fa88df21eca7a3384c95351e92943fb15ab58553def5670b0b73184e0fa9bef8c36c13f9c3d76f8a9f8acf29971605000000d80ac5bc5350c77054a01feb6b9bcb0c3a2f19a98b739f26bba89ea02cf31eec40981657e7dcb16b6d1367f38d4b9f359e1d7fc7d9daad14a3e13e99e8ed8cbca4b817846316a638719865402591726e42aea4190c3cd264bdbea45a246ae559010000003aad30bb29d71ee8dcb8ac7b7c1bdef0c0eb4b03daba14912ac0d2af5e9fc04740e58e9f32f576747400009ba02cc87fd373e8803ab07e97bcdb880612f47d712ef2f352e5108b51f0091f3f9764a3701325c3aee026a2cb7b97e1e45208c0ca0900000068a83f545df684b87e3ddafa4ebc3d075a37f0d69902873a38cf3c0069117eaa40689aec7c6be7bc19ba4d32bccbcc0ded44b2cb60be8001e313ba67073d62f1555d047a627aaf67e05ef0797a5442d9123fff720f98cb8056b0276a1a302a0605000000dcd723a3a9d08e086d3a938fbb4c6f6c2495b024e623b4204d7cb7e5b148f2764037bfb985630f405763da364d4e5c4ac39c8c2af48fa46dd6e289655d047132c5656b53208f518f77117e1c6e6df785413264e132d8dc32e199264c504bca100b0000009cc8b2c075d1fc098d388cde90848accbf9b5a88358dc509cd7098fe002d3e8e400a3e91796f58d449a35b001c5d872364671487d93eb797c0ff2ed0ceaea0801828b7f56cd33a9ffa37893d4ad506b2565b831c22fda435f33c62e53d8d2d3706000000fe428d638e381b91167dcece5d32ff2a9ab9b2a9873bd66acf650ba1e8eccad6403a76768601e5f3d4ea40589f530c0eb7ab45aa14fbe8df6d6cfc31d5b166d38159004846f259fabeb781255f0f627bc378fcea2b7d5b66c9d6a82555db708e0c000000c211d37fd657978bf8f01c787356caf7298a1bf1a0d3f82305d532f9a241c79c40fa005d06e023e148e9ce0511b8628d3f7cf6a3744bc3665797f3b468699f4f5791135424f317b9c0aeb4d882afe211e2bf34d50cfc90d62e8c81252b68dfb00a000000a1b5dd162d906ec6f886b3700bfe59f3139135651d8a734d77d8ab2f3490cfbe405d8358b25bc907f31933d4e385671fc16ca00fdf37c343165964aac14a61647e4c58fc96df226256016b880f8d98c69081888ee67de9cf186fc9102213ed060a000000d5f90c92d7d3641223acaa0c25a8f4a32c18a64208df8f2e290b942820549ce940e5319cb439ca451716f0f8ef8c10218ecc78f88c6462efa6113782fda078946e928b4d05eda6c1fbf1ccd27360dc6250ff097ad454c56906c73daa8de49feb0d0000004cbe50f35df5eb8ef34b08c45725f3fbd4f739f98de20812c106133c43461ba7400b72f2cb592c9fd8c62a30e2bda7a0887ed60885af2b2f60c0c771d07e06e261ab7dc93490ae2a00f073e49d07cdf7dc1f0766dab222992a33b5629449c7a8010000007e0600a5cca3c52b51be3aa5be2b55e01c3bcb42d058b030d206bac007ed96334010dd1a93fa39179a85d9037017aac407664cd971e974234ed352b8fb8577d79a8b981aec25e181b8c2fcf204a1681a86c812d6f419a527ee9d308fe993e49b0a000000d970b98af613698630cef324f4b5be23af504779bdb8d5cc494907a69ef92fd8406f3bbd0edf686e533ad06fdbc118f061c76d188e42fb76ff5eb1d608ea3c4c4adfcb6d473f0aa8329af2115ede309c903b8021cfa6b6c061890184fd458cf40a000000e7d4dd9b4dcdd8f632b2411fde2041031daaaeef061cb8ddc5f9f2062f6e2caf408e4a28470530f6524a2cfdcf632c9925427d511cc4af2d1b5a65016ba08c071147fc0e45e48052c42ef5dddbc45f97b5413f6d21b0a44a1ca810eca17e82ab07000000ca29c53d6702161e4487fdf1264cc3875d068361c163a2891765b8749de055b2406df4279abcdb45f12510341184d26a7b99db1be53dae63378c49c58a1fa97528a8c2c4dd35c8893f4ddcb09a43bcd004510de86d9968370ac4582a37d868d200000000de2b38286aabe037ef800bf84ebb4eb63a8f45505d9ace367bf2ca4451c91baf40c883a031c48e56c93fe982b55f6f92dcac387b2e25449e1dbbea285369f8b0f035e746a5cb17595b388417148f32508d916e7e7e709a5216a47b92f547518c0f000000e9151c991698f78605551287e40680455c8b16f0dc736fbd7e0ef5f3f1be672740d7b7818d7b33706e5c3bbadcbd1b1cdce44d66afc798565f2dd780e0473e708acba3638c6ea6252e413e450fd8e01269ce4289a1fcfb44b5675f51621d98f10300000086a8b4f66506ddc5afb3c93a4078d1dbc2becf1cbf9eeb1719f627badcc9eeae403fe605af196b06321fa4e0db29162903a7388498bc3e6e5e723dca0013a98802d00a2a28c7a14e56cc37e94441f9ed42c8acf638bb677d075135133ec9e8c40d000000588fd129cb31cedf3368e71bb66a5581649b8c369e61004e0b277e869b5970aa404c5dea3beee0804b13c08462711755d47ac0fb4872266975d2e7c6eb71a0205ebc06dce8531e9096a35b42b24d5ea88dc9eaafc2815ce86c19c1b2b601f8ff02000000677a2aadc337e7a7fff9e7a8778952ec8e3fde545690ddfd9cb7e1ce12766f55400405b0b6dd8b0344f8d51c388ffa8068df27f5b81f488163edbcddb9ca80906700e021425c30aa2c2615643916f97505ba5a41341c22f2d1deb501ddf4d0c50c00000038302d91b61625958640ee0bb69be2667f25479e078ce4e034bea786ae2d8df5405bbfdcb4e2f337eb5daf8eeabeb74b24e6b3fa783970dcc4b9f4b74f80feae61dd34bbfd16218648c71486a4f522f4afbb2d4510f6ecae0b39735eee394c030f0000000e7fcd8693fb4db698b321abdf097de88558a71bff3c0d7d5a9ab31881b12ae24011e7ec63232e03598069c65ae44dacf5d57fdf4d4885bb645a392de916af4d7764276c69997a483127e2014fa031e872475b62611fcd6f82c0704a28578b68060000008b900282fd5c75c715f4fc5e2b78f58d23089640d3f75048e2804319cd961ab440a2f42eceb5ecf7be2240ef993612a7e85deab3ce4b08fb06fe10465110a932d31643fbcd0af3fbd38068fa69c3146fd893e5195c4e347d2a7b0558056f91d10c000000dc4c131a7ea4bbec3eab84cee304650f01daef095c434933552edd970a86c14d4091b14b50be5593a352adf22b1f583a966a42101a1fb872cb9473cfe37584dd5b676509cee3520ca41ac308fe106873767f50570da64404bd9057e43b3e27e5010000009d295a463a49462c0bee76bf4c12fee416db9ef70666b24218694519f60e812940d04059f6da3631d7726455951e42f424261b9fc40909f92a6bc7778b3296cf4a351421c9a4fef46e7867cf73ef0eceba32070f506e69612db6450811d303e50d000000353f79f0e9707570a1d853474d0c4c8e483c5263261c9054346a147e738417204059d30d725f76d1e96f8b699f32e08af87a6451caab88662d523d8eae7feec15102972d9b7b847f3269c3805c72805854d6f05f709f61c0fbba6878b87bb2130600000055ac4cc428c2a68d7516917b9959e36cb8b7791995c9145540372f9aed3bddd640414d2852eeda11bb054ad859b174fb2926415f55ce13e9ed568e4bcf47b9fb31ae3a1b048e95947dac84d27000aef372d67b823bd7829375a7bae20e02acc8050000001b8e7c80979fb1613a45cf10374f6c321b84e8eac8a50f9a13e9e1bd9f3ad821407beab63c7c2fe1397cb60e5b8831c799d9b71ebf082ab1cf44187913b310ceffdfd33c18cfbb107308f7d022541d581d2cde2e06d4469f3e575aeeef184fd209000000bc9e4cc3b6efe68fa9811a749411958bbb49af291c8e2a77aab207ff65b9b0e240d7848a1fe8ffef54081f803dde48373acc3c36ae2d30829060253b619eae56c53c4f0221da584f6e0c6633937237caaf15f8f6bc4df4ac491eb6eb41c63d5608000000297a8629b448e84ca60bc9a67e3e8d284ca3faff49e3a6a6a3b346eada269eec40db50942c72a5bbe29d53b33a15046bbcc4b34ce1d41e23c247c75c61938877c072afe77fc5d68502d2f080a97ed04dfab773c792b396b4fb944147da5af01c09000000717c06015685c2be830d53fbc6efe1cc4a5b9782419f153eca0845a85fd40c2d4004ac73d0e458c850d167e6adb70ae0da47afc53f1ac592b1e88f49e6a82a8f974a8895e76e96b812c8985f68caa191e4f6c14f3b0151240491d880795063910e000000bfb17b287618cb3783a204d84c8a3128ab204354e8154392ae9acd31afb2445e409eac2c8117a40245104f14a8b6db21dc6379b6bd13323f49b6788987350c9a7a46e98457afd2cb4cf17c129bd56c249135822f80d1b7161065431341816e730b0000002fe5632d9d4a2095ecb2bd082737850de465d160def34452c6221607dece2a034034d8baad26a81f389477cc30f003fa73a3037c74ebce132a01ed9b30ccff0b0cc8dc4994971915dc92d51a95e5852869faf8f90c411dfb7caf5328d6bb343809000000a0320741a620dc7b827ac330e489afa8cd47d5c26ba23939edfc93f769d54b4340d68bf40d24d6ab5fcd3817a1a8ae3e35a5658dd8d1d62b15f27e08ed75f7ddafe0fcebea0a12581ac9c3ef23dfc854fa4d4f9607a97d48344509a4fb0927d30c0000006549d5389efc02446299f7fbdc672a16641feed0193d8ee09454b2c89c9cfa59403e53a089e76f94755c95b4bac6b3805e384fddad84c5ecc679ff65b130d15597a26f489708627a285062ca75370415fde1a44c0d2627b5dde96e678abd370f07000000c73d6e781ed5c278f65e7160d2fbf372f007cb7a7f2e26d252a17c8c4c555ff740a8eff60803ca77846638b97302cc5b66d37a1c093ac4e096f5162f6b2734f05acae8c1f19ed4636d63723bd8711efa040dd84c7002e4a598fb7e8b81f98bed070000006c6f4028efa494020484271989922bac0c926aa0da1621c423b88c8679a35487404aca35ada154e2a5328d6f7b25ea658ac94dfe70a17e294c96df8f22229978bfa796e78a8a8a4a550a5b4b354a7ef3b82b8c38215ebafc06895504c7d99c9b07000000f6e582b20e3d05b138453ccd403f75f8afd8e4b710253e96c10cd06a0c3b292a40ed271e5fec0e602a590fd8bd6181390dcab15580042197f83c0b4064dedfd7eb06d7c5eaaea341c621ae6a3ee1cb0d5a14e47c2c2bcdce56c4b456f025fbf40a00000054326474025fc6d85ab0b9aaf1abd492243664096ab2267fefab968aa67a959a407233a54277dab954d14a433505a07d7c7b8aa91583b00c45ad22fe1030be26bd2f3f278e586c8ea1cbcf83499aa4b9019f12cc5bc926fa7b651f7a3adfae24010000008cc95301a135280bf6abe5523cc96a8c8ef71c162d367bcac3d66bd1502d02b5402f7ee6d69fe5f0cbcae1e4e7ad8f95242cea595568eedfb6d3ca9f0940672d2acff5da19899d9bf04a592b5e3ad4a516c47f56923c75ad7eb92b4eaafc079f0f000000cd5dfa0ed9601c1f396192059d2d91da7ce3513e39d34e95fc0dda682894ca0f40e12c4a19f0464465c0cb74b33930d1479f9597f26a590c00f720161290ee274010f09d3832d846c32a84bc409eb904951802d6e44f4083ce298e9aff754e420500000007dc092f52aec83e87ab5d3dbd1cadcd76ef4b13c590f50a93e4b944a15733bf40d2603d087a41a26acd2802a0d4bd53c9f9cbb42d7dfe0c118f780c757e6502c2903e5d20964a12af4a330ed08a17ea2ab336f3b02a3a9cb8d85cf129def5590c000000eb87b9cce4cc2e6b50a2c147680241bfc864d55aa9ec91da3493281c5d7949b840e8465e3809ebfafdea02cbeedbeb5c8b3460989f6b6ddfb206835ee67a549446d49d4289e0deace899ef0d6439aad698770781db5d000efdbf956115c2a2f80000000045f0d33ec726c3d2e793c7452f56c2951e251084685699c24b7c7f32d574fafa40b9a294d7e3dc13d7821383d1e2528808b0e023caa0b34612cd610b9f658c4d962326fb69731077f6b1f2ab1b9fe5279c77278d4a58773c53e8e34bb0238f5d0d000000a64a08cea96dbfe76f0228f29ef5c804286ff9644398902f7583bf443f9feb5740583a7a1819009328a8f238f5f4641e15cb35f151ae487bb7f18f5f2774ff9c61a82106574a5f5e81d740d0bfb89f068b7241f7bf8e8f9b6b8ea4bda87f0bdb06000000b4f5bb1556de5f921cf3825f3929dde1c1249ff2fb4e32935cf367d0c36799894019ab54073b1aec50d31747315025564fa06ce5df59f3f0cfe30d3a30c68f9aa61ca62984415b450b59ba4a58324a4376a29d7fb0223e85ce3a5bc72c6d5ba7080000001051b280dcfdfb3f999e35c2d9ea8f1cf46e8b7c56c733ce396cdec37399bb20409ccec64d23f4bb5c4275ba5aeb3572b1737914985f5503335c7676a41c85e60f9d9d1d19b616c32e85f65f7e0207b304a4e85ff9737117fd4eeb98337fc28f03000000e6585eba3d3fa6465dc7904b90aceb6d135ce54dfc125bc6b56958835235d4364075afa14f6db396cc218d71f1ca29a6eb7beb599db30e11010f966da05e165184b43a7fecf6783c2af241181c1b5f6e591353f9ee3f6510c52748e83e331cfd000000003e0c2700ba633e85637c292b02c7b014388af9e585d09520be23cc1f892459c540407ea5bbe91821d69fa340e21a40d2ef081b5acf7432c71238dbc2defb91c570bd29148a0129561753f984639731fae099e2443ad37d52d4141faceda5a1020f000000d3d144275f21d51abb1ea9c22e78a6d4d53c2ffa52a5297b697bb4da0ba6b9ec40f83ee9ea0c8e8e0fe3f259a2b1b75aeff1849a9045a1fcc3ebdea231f5e1593029ad2bdc21eb5463a59e1459459691d4f54eaa527ca553d61e906d7ffa0bc20f00000095d29c5e8204ef23c1a34a7fe1f2538684e26d4789f193751d29aebe5874985540298759e3b131b88ba52a2f0b29ff93c2655dfdc9678d7e19fab39c704a0dfd901c6ef750a0ff1e4ac15877aaebdaa55824856bd7c33589902e29a3f558a1ce0700000067ebf30852b6c46dd488863685d0b95efad84b99802acce43beeaf4081d0e8cf4044b81d94ccb198760f1af4df4dab362379bfcf18e3e62d09ff659b9c73d9b06cf47a76a2212eca757f6d519d5a719c0ac85f098f277a502cfd992209ff7623080000004ab4f21fcbecbc763ce6d8f377ab0719c4decd3a2572c68dbfad522d7dc9f53840a2629ce6872c680b70b8f4b4923e605b634c1613b31763f71d5cfc57a85e6cdc5d71fca022c188d28c2e8377da4512f397c1ec175f6dd5f50ebe8245013dfe020000001a9481577fe0e95a5a4bc6c31036d0588b3a1f848257b8297c41c6b0eebea27d4005f219fefb25fa95e7bb7af8272945c6ce5613a2cca69eb3a5e27d3b697eb6d7daa3c8e3a7f5c6f3b669cb4fd4c51bee4ebe87ff795368f107fa29e632460a0000000041d714fd98249db2e51fde31554986f42669bdfa9b0fd925336bc45bdc14b9ed40668b186784920ca8c6f90826827a3a766633f9d3083e223b62e8db7f1f25dc193b0e2e8f84ec742d362b795dba18548662871004ad8c093945046cd66f40490600000061df5fa5ec703ca330972bd7391f1043afd7d38c004ff45adbe7149ff122742240a1c1ac82fbfd32976cdd873f62f39088a7f3d7a3a6f433aeb98dabe92a97b009ede293e3c7d0f3cebe231d57810f0c54371558125d815aa832eeb1374ffa860a000000fa145abd4e6adcf28bfac8aa7e52c3ae1199dd1dd74190fcebd029c0babe546c400821b7f52c2947cb50c439bfb50823d11c64d6702896423036733ef5d647da8efefb6e1dd90a0f8bb02a9f40d52a12812b99fecef0e49f9b5c6b42b6508caf0f0000001cce0f52b5757299ffffffff0000000000000080b7b7920194781e4697f23bc62cc52dcbf786807ef4a0da119cc52fb7a2ba166937aa4ddce13df047a1696f95fe8e45287534d10f7454618faa75fd7c54bd2a3c2020fa7bffffffff0000000000000080f0f79201503b1a195dd21f5e17d74de4bc34a44839b0b3cf21d84ad071b9fea14dabd0a46b408b0778314c586b0022ba3e6c31a15274e7f3937d6ee6cf3708722cb00e13fe530100b5ee9c720102070100014700094603503b1a195dd21f5e17d74de4bc34a44839b0b3cf21d84ad071b9fea14dabd0a4002101241011ef55aaffffff110203040501a09bc7a9870000000006010192f7f00000000100ffffffff000000000000000063bada1400001f348f5d0b0000001f348f5d0b072d9d0b5c0005fe910192f7ed0192b7b7c400000003000000000000002e062848010165258961c3eedd19d8ee3fe1aac95c660e1be01ff5114b270643e71dcc55b894000328480101fb4d107c445b1b5b06f4f2600a46f4e3deb1237784115ea61a62fd05e954889200202848010107fac2844a846e0ac14797d5eb2d6b43ecb2ac854984c25931f7a73d13e2c66b0014009800001f348f4dc8c40192f7efa59cae9a7abefe80a70c13cc95df7afc4047b43aca1ff684d4bd4d1c0ad0c6a272fb54b0d7554d8831b668e1b6dec6819d43662a2ec7031d771450610aae4ea500feb35600b5ee9c72020202090001000056a3000009460394781e4697f23bc62cc52dcbf786807ef4a0da119cc52fb7a2ba166937aa4ddc00190001241011ef55aaffffff11000200030004000501a09bc7a9870000000006010192b7b70000000100ffffffff000000000000000063b9fa1500001f3070b8078000001f3070b807846eed34910005fdab0192b7b40192aec1c400000003000000000000002e00062848010171ea7e438453f240f4d75f8f24046db15cf2c30e4778e8079b411864cd94219a0003284801016383381e04c6d63520e3234e07d6427f6fbbe4e2766767836da68be0f41defff001824894a33f6fd9e4771d3f06764a8581ca45af7c54fe528f3e1dc05e847270e6c0399f62a78bcd7c4a0322cf76cbde1bed8f724d3cf79645931f8a64c9a203afee0fb576495a3c0000700080009000a009800001f3070a8c5440192b7b6d320546cfce535343360a71f960728c74f29046a0084e84f1db8a8d2f0da76d4cb96ad6732dfd04a85cac18954f72aceaf70ad57a1abad04ea9d8479c8069952284801012e2e0b31734aefa5ec125760faf2675e199c3de78cf68dced015aaf004c101c90004000102284801010ec9556e95aade9f683980a9c5859d985e86ae2dfebeb02535fddb5421bb4d9300072457cca5e87810714243b9aca002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac000b000c000d000e28480101117888ce5c92064759efd9a37136e5c04d5df6246ecb04eeb5ed6e39c69a1e840002003fb000000000400000000000000021e041c5090ee6b280087810714243b9aca004210150000f22012000100011284801010c0f7a4a5c1e554f09b98f480b3910af415f9dd7a2b20c194390afe3080b58ac00032202d8001200132848010124d21cf7ae96b1c55a1230e823db0317ce24ec33e3bf2585c79605684304faf200072201200014001528480101fd78695ffd58402e209cb0b060c95b1a8a83dae389c7eac9554a3c086e52b8980007220120001600172201ce002100222848010114265b804cdb772e1c9a48d1dd67ad6e9315495151d6f49bf5f203b2b883ae7c000c2201200018001928480101ff9fb607464434b8240b30817c4e6c358ad723c3ddeed45b2b82d45b9fb0f6210004220120001a001b2848010135495972e4dffc56ffc325d2abeaa6db04e07d832cc8b8847ae195158fd724d20002220120001c001d220120001e001f28480101ab446ae5250a0e5acbf42540f12f69bc49e22d74782881442954471a01c67d6c0005010120002028480101e1e66c22df500de6499c055de17ff3d1216fe5f15247186dde0708e01c52526300010024c201000000fa000000fa000003e8000000172848010168395a614ffa1cb9a730bbf2c9337d7f45e2f01986fabb4c68a2abd83710925c000a0101480023012b1263b9fa1363bafa1300f300640fffffffffffff83c000240202c80025002602012000270028020120002d002e0201200029002a020120002b002c020120003300340201200071007202012000af00b002012000ed00ee020120002f003002012000310032020120012b012c0201200169016a02012001a701a802012001e501e6020120003500360201200053005402012000370038020120004500460201200039003a020120003f0040020120003b003c020120003d003e009b1ce3a049e2b88fbf19ec1bf19a55040b1e63ff1e512ed3f3a82b4696946953983c389ea960c006524f49bc90563ba04c54d49d0c2a248697f32eaba92097fd5d726fa4e91f749e61f55e1b37d460009b1ce3a049e2ac369d37c8a9fbb71dd4a67b520e01cdedd2b68af23f79547aa56de7f505a0158006524f49bc9056034c8f378c65a7a2f837c86a9c061d6afb43bb893755048ae64876e99d2b0c2da0009b1ce3a049e28ee192ade5654d4756e040ce3ff1d264362a8032d91afd29fc2d6a11643e259480065059d3330b8d3c27cd80b3fd0e46b373e778d9de40a15bdd34327d709724c56d12e679830b3c60009b1ce3a049e2b7469b0fc074d5e3132ed693dfa8051d2c58897f31c0c3a7e24362e4e6b9995ac006490f6dbf2b01258127502a6c4d42b201970a44a30069fa999390d4df8425368c992461161f47600201200041004202012000430044009b1ce3a049e2a882245fa7b9524bcd501846c580b171c26d3e647adab59de9df6a004225b4a4400648fe40e362134116118ca6141513385bce13e34d6854fac170cba9d216efc5f71c1423d3ca8e60009b1ce3a049e2a1211845390631b7fa396c8989d44abd0d591d8264fdf4f9af74e96d1112120a000648f66a0636da2427283ea0bd92891d48b32f4464f1489fae9684ef47e15bc33d865089bc8da720009b1ce3a049e2b7c2e2f7d87d187c1efb443ac42df709df8507e1af5833c44265f11dff2ca460000647d5a739c56bdffa7efe55a1b9a55e20d9a0d5b34ddda9cc8fb15cd3810480f41b5fabcb599a20009b1ce3a049e2819998df0b12ce7f0a3c3e7474e2ea19cf703b39035138ba21edd582e2807913c0064748c7fd124987a104cc175cff079e7ddc767de7c18945406ae521e14ab5093ddc4ed618175e2002012000470048020120004d004e0201200049004a020120004b004c009b1ce3a049e29c6f00d6fa4d6c438499b45550b313bdd379c2ecc53156e7b20875f0dfe9a54940062dc2e0b07850518743ced0ce2f84909844c1b90f000a3ec96c66896d5a2ef71c3cfab5f2125fa0009b1ce3a049e29d1fc73d8f3f595d157ec0f8cff605694731387aa7a6b19c9f3886c7648c6bc640060d32f1801874b4a6303ed5565e9878c5b727902d93cdac1a9c9c3531c56a42db05aaabb7a25220009b1ce3a049e290a3db057ed1da78d374b9aa155f4cc715b8a8d6663b5602bd75a733ac9f731040060d30107816276325a469419b77eb341c7cb49b14545c1ee06df4301a0ac566bdda425e82e883a0009b1ce3a049e29ea9675841b12c2e3297fbd21685f9043810c0387d3a91f2bda202f028d2e9fd40060d2fbf9c3add483b4199504264abb17d1db2b27514b626c70d308431230755e346d1aa0a902220020120004f005002012000510052009b1ce3a049e2b3bee3d38e986408e3e4aef41c11f767864075aa1cdd8d2fd60c3199b462f52940060cac325cf303eb820f19876b593dcd332fd692fb7ce62f133d69afd1538ddaed2d10df2ed32720009b1ce3a049e282c21b9cffbd938a4eae2d45a5f5718d58c41997a016d3db7c062839e2834ba080060cac324f7463352accf8f07d56050efd8fb3e0ac9ada86b58d4526bf3694237f3d4f77bd27a860009b1ce3a049e2aa43827ae383d7e6a6c517a36a444e1492aedd8cc660fd2964394881a1bc832ac005cbabf73b22dbf18e28452aad9bd641f98e55d7744039595724c1ae5286a6a26ac2917414715c20009b1ce3a049e290945ee8a48dc641be93b428b5350a0a2b431e30cf84eec9a048e0ab4c73c0618005cb81c171b457c5e0cfa335d13c8bdc2cb6c84c534419d6a4a0d1d2427f5f7c6b3d52e5377ffae0020120005500560201200063006402012000570058020120005d005e0201200059005a020120005b005c009b1ce3a049e284cb4c12216493cc37bc6b1202fb63baa6e9ed680e434743e9ba69088f5d48ba0005cb72ba8526597e141a8cd5031943574478d98f63ac3454492ad47adb30c1b3531c8cc349a7ad20009b1ce3a049e2b2acc9eb9570b3f6af2038b2f3dee66e3c2222aeaa3033ae48b0eb629d554f290005ca878bd289b00a73ab24af4170e8a646f6faf62520a9e70ae02f66a8faa8d739ef087bfc7e5ea0009b1ce3a049e297953f1fefb57bf42a90e7c229798ab201a8ab9899b538bbc1936afb93bc15488005ca878bab9db3027b0096de4bc955d34d0aec0615701d8a028e921f17a53bb9348a002f13d86fe0009b1ce3a049e296e903d0f8064a0a4d5489621c40e7d28e67cb836d5b9e01bd2aa868fc324322c005ca823af161060bbd302453127d952ee1de2b6eb1b4d3effa98ee8a6a66d2d1cf34f60a8adf4ee0020120005f006002012000610062009b1ce3a049e29c9683b106324ab04304024dd0417ca573067eb4442b6134c27a6982404081b48005ca08a3aeac13cdcdb94b5329e0ff38fb4327c57407542d0bcf751c201644c0ec7eb9dfc76c84a0009b1ce3a049e2b2e366dfd33c95baf747bd2bd9645819adf22d6ed3b6ae746f8cd2c098950d53c005ca0794742033278b4f2d833b5dfc6c48d222ade39fa4a96bc874e62b16ade02c50ac553929e920009b1ce3a049e299ddb43b3b281fd1dbf45da72d8ba52933d10358d11a1f982c9264a09d2d0e538005ca07946df6af48491234782701a48ea4a5a886cf15f978781699d77e4c3f6bf2ea201b3ebab5a0009b1ce3a049e2bfbfcbf73f29c65da86dc9e4151eb6bd0217f69d479db95a34e611d00bf7664fc005c9fffcd115a6d8a899164b1822d2e39dac978d93383eb78d0354004ae047083bd1275fa5323b6002012000650066020120006b006c020120006700680201200069006a009b1ce3a049e2bbc4f50d1e4e3704d5d7f8748df4d694ad5de5ff17346a69555f8f602c3284cc8005c9fffcc3071a2354621106c08ebc3e44c338088f0c135efbbc18605d7ddfab414ab0b88c4806e0009b1ce3a049e29e2521082f5dedaca99a8ebed3aff54022dc952d2edac8b72a90fefbc3e667cd4005c9f9f528e3f824ccb3c8c877acf99513bd653d35def60e18fae62414b0b3be77073c36abc72760009b1ce3a049e2a5b005b5345b45ae89ff72c377fe80b6bd054ef941c71d0ac178436cec6d23414005af4a8e4c84ce6778e76b5162b3acd0d538d0ce14f1f870abc0d7b4516106d364582e1e4bb31060009b1ce3a049e281d47790975834650e4c418af6424ed07a1ad9e885c07b181204b17a83c9b7a7c005af47b0affdc2cdf8da74fd965e4d1bb896131555669d612c644f8e8e2d51b91521ccc12a575d20020120006d006e020120006f0070009b1ce3a049e2a04d5b0078f67b2b5aad2ec4344967ad32f036baf72ec94eb7fdcde9a6315cfc8005ad728dfe7d6987d38e728dd85d6c10021deded0962c65c77f742201cf5e27d2382e3cd525f31a0009b1ce3a049e2b2321ce2377c3351f4d1c9901794cc4c6f090f145a750de2b676f6d1449beba3c005a72af28c42226c585c80807a816a6d3ac84a149a069ede2c4aebb370439d8419e8e05c7dddfae0009b1ce3a049e2bec62af0b0533ede7c76bd7357238cbbc902a42fcade1a4510f8b1146aa4405d00059912f4265c44e53e530f138dc23034ab3a93aa105beba7f3adfc8fac6756c6a41d3b17ec8c0520009b1ce3a049e29fe0eb27b4788a735247c531944b0641fd17658212c53d7d6ad87a1cd7505241c005900b60b239b27c8f78839e5db3ad4221bd66f6d6180cf1184d5d96583bf2ed103649493e1168200201200073007402012000910092020120007500760201200083008402012000770078020120007d007e0201200079007a020120007b007c009b1ce3a049e286d22de552c229d9e862e9e0310ce485fd1d0be68bd72a31a7419ccb233d8a4f40058ae4e047ebf424b8c2ebccf36bbbb976ebbcbeb7953d5946c815783d21c88131d32e40692dd220009b1ce3a049e2a3301a177aea3eefbf01bb25a46b2ce3965804be4b89cf8c70eb703ae187e0f200058a2d3fd4ac3d707c0bf6f11a135ee1c6c851d45a7348cb431f9172132ee32466b138b1525fa660009b1ce3a049e2866466493f5a96f24bf3c80e50f260add068a6bac0d9d55986836e2e4bb67f85400589ccf96bd47c67a33cc15c7eb18478d558617106c49971e53fb44cefdcfd01def54676324c8aa0009b1ce3a049e2b0c4935681f94ba5487c500d67e1904e941222867b22ed1cc2ee784c29d87df00005878e841c1336dd6c2dc87c6cfb33d88ffd3b1f2f220f90092ee20f25a0cf94490b56b50cfee220020120007f008002012000810082009b1ce3a049e2b8b9e99740af16b3bc30e9681f2c0ba20619fd885055725d29fa86047f1481ca800587482e0a7dbdb14cb33c7d6fe094c752529ee15ce9a43482d7e9cf6f76583ef338760706c84e20009b1ce3a049e2875e626c3e7488454ef71cabd700216a7a7d857f22304bfcbf784452e02a7e2b000586e786ecec3fa7ecc28b733ac93e707cf11ab01189010d43e05211703894bac9a0f9f6b7e9d9e0009b1ce3a049e29ad872f5b299ee14aaee3d22fec4365bbd0989780a2b6e21aa560efac23e564c800585b314223f431a3325d669b08511eda154caf8e2a894674119b58682a68c27e24f20ccdeb07660009b1ce3a049e2b5c1427074c2db329cc2015697045233b3c7b0b9f596788502e69d6644132138c00583c41e87d72753fc4158940c46108797153c2e535b84c6d4fdf70f945f866d2bb19774a38d57e002012000850086020120008b008c020120008700880201200089008a009b1ce3a049e2a706efdd1a2830158b555c377bfadb756977c4ae5e3f58210a9c1b897308ae188005815a0b53844d818dfd4152ff370f50ab0a7de08ede0cd56d266a28868d87b6099a40a45353c6e0009b1ce3a049e2b8f003243ed85015221355c08929d10a6e45d02db3bbd1ae837c2dfa632d2bcb800569e1dab97216e88373683b06a1fcb1f2e01f2e650b9cd6f64e5df8e5826b646f4a4e8028df2ce0009b1ce3a049e28f0c8115a328cce0ebe729c041c8ed0d986ad5aa20b9485ff04859bb0ce8517ec00569d8131e44b953cb7269341296477bfe73faa48d3b782a9d242932658b1fbc0dd9da4dd8eaf6a0009b1ce3a049e28bdf35b63290522e9b3c6edcc314e38b16fc3f50ab05584b4a0eeabd35427842c005621aad530d0804c02af186d0d951f649d9091d98f7646afa8e1336f3c97523262947a2f7f66260020120008d008e020120008f0090009b1ce3a049e2a9a8d3fbd125baa3db437de31ad6ad4c230385c3bc07bdb59233f7d2e4e3cc5240055fd4166339366cb7250bf2fc6c9bc6f91dfb5151f1354900de181ddc4e471069af8c40c7d2c3a0009b1ce3a049e282f946a992f3b86f0d2f83f35b593558e5199b43bdbe4c050dbd5280b66a358f80055ebf6c55e1002b0650a4773c4cb96e0d7674437b0084f8dbcdde8a5a06da4f55381027ee840760009b1ce3a049e29a95e722dd8e734db9bdae045b1bfc6856ff9e5ff62ef8f2373f8d263e82313cc0055aba4644d04d76b90d0b43e4f4e2004fa75686da2228a063f2c36015dae01b3aba01233956c960009b1ce3a049e290624f3bb408dde9d8c142963a5b5e05a6b45b2aa133c301a42011e95afce5df800558fe0fe9e66adee4b71ea37c53a39d78c22a7d5444337bcab1ea092bffc9f7bb7550d0fa929fe00201200093009402012000a100a202012000950096020120009b009c020120009700980201200099009a009b1ce3a049e2b6c7f9b796ed605164e1e9d4b3053446dc535d8cbd6caa836e616772bdae4c94c005535b64849fe7f6f9bd85d5b0016f6d5dfa99d23eb5ac4b1575af05db1dedd6a9a39f171313fc60009b1ce3a049e2a92ec7ed00e5ec2489bb4cc0f37b16e7754a148e113443ccd50bb902053e296d800551a5046fde558b2b2f620d8add53a175a14d651ce70897b905fa513c6c747fd62077c0ac132ae0009b1ce3a049e2af44d6d124f80ec402b651c90d172689b8ed721e17ba61ee2636d3d8ca3ede7fc00551a241ef4631796ff9b8ad8c438eafc451fd474a77e974b1bfa3e3a53a5d549c84f365471a24e0009b1ce3a049e2a2233561f00f5df0fb1db850ec76839e1f1b0a088f8eb4418824abd709ac6321c005513184582401ee4e016f51815d3338ab8c29e0bd03890feab9e861f0fcb68ed8353d02b6b02460020120009d009e020120009f00a0009b1ce3a049e2a8374f8736be34c1f7bec071779c1b4d06fa02d669191e361cf6aac8bb5c68ef00053d1956a3f4f0bf95778029be79b4a96dfd0a7896c2f1b2303e461971d9ebea30943f4cbcbe40a0009b1ce3a049e2a9bcded1950e2b9b43b9894ce4557736b6eb92868f77ff46c9143149617a48fa80053cc54d645ae22b045d350f2fc365eba43228e9c2f627dcd81169daab5f647006d9446a31d92760009b1ce3a049e2887c034fe70c2e67837c9412c8a491db244e41e9c1aa4072493a70576a237668800523b5cbbae104e8cfae9a113091b84c87afe09d9300d3b4a590b6e84e8bbfa27c08ca0ddebb6720009b1ce3a049e282a75874798654a39bc1b4970e297184afa4816a98593cbdba4d54e1638fe5a24005229c894b7d0154004c7e2ba9f771c433eeaa2d643fd9385e196be675dab46443bddacb48dc51a002012000a300a402012000a900aa02012000a500a602012000a700a8009b1ce3a049e280a05c2ec183c3b3411074c24dfe3fe4694bfa2dad550a91a9375720cbd23dbd0005229c894b7d0142806043d2b147ad74636168f92c3439e9c855a7a62f1edc90ecb5decb849142a0009b1ce3a049e288b128022c2992792c7b30d09b644141790f88f2a04408dd88053f4be0a3e7f78005229c894b7d0143f8cc27a8677a5cd20d3e4b33240b9090ce216aff62f9818253029087709a50e0009b1ce3a049e2a5e446ec2be2527988f330ff73609f7b54f28158a8a3ac9f9cd0c3de64a3db674005229c2055c66023f4b3e58ec64113979c30d1ba4b20a7ee74eb230dfa20b9049a81f585807151a0009b1ce3a049e2bd14622192e8620e5b1e8fbfbd0e3d1ead5bd370f11b5325001ade2700863168c005229c2055c660122fa60d66c60bc073efe50fadd0ddcc561272f2a7df8203747af16f19049a3da002012000ab00ac02012000ad00ae009b1ce3a049e2a7d00eedca94722f936f33901af8baa85833038637b53c18a8f0527f539fc0c78005229c2055c660165ddff0dc24e96654a4397e037cdf84df73c7bf80088d8a4afcce8aef254ce360009b1ce3a049e282eb1c5c14ba97737c775301131df9363827b0a9ccdbbcb550dd4f678a70e47d0005229c2055c6603c5edb843dffcbc92f656b36931a259a696ff945ea938b63ccb9230131b8de0c60009b1ce3a049e2a60e82f2a84ea0596a4e06e4e060e2cc630f255072f9c21814bee6c1bb363b560005229c2055c6603c701fae1858c4ddc2e68a82e1e2bf6972164dbf247bc6b4dcfbd95f9edf7b99e0009b1ce3a049e2ba7a728957ff543d20db7d25c0c533e67f2c54f042f70f8dcad9646220086b868005229c2055c6603fef90ec059adf8005d61f1527de5a0e1b1d3ee63d607634c4d36ad2ebe63fd26002012000b100b202012000cf00d002012000b300b402012000c100c202012000b500b602012000bb00bc02012000b700b802012000b900ba009b1ce3a049e2baf18d69d4b7030e15c590440e874a77c562957255f9dba3a4922b8ee5c3a39f4005229c2055c66025e3286571c2422c4c6e8c4eab4ac0b8fcef57950bd2d5c7e041adbc16bc3697a0009b1ce3a049e2969f457e68d994d723703c847e6cfaa7bc415289e25939d996e07abf29fe06368005229c2055c660382ef75f5d980998f3d6f972187346e03cc2cc1a6207322ad4c3bb3e94fc59cf60009b1ce3a049e29b4c2dbc9fc554fc12c939cd5c6409f8f2f1aa23a564b300f5477b2d0f269fdfc005229c2055c660207ca8ba58d1cd91d0a583a768112d51295d4efd9fe99259f0d4da5a3d6c3512a0009b1ce3a049e2a9eb2aeb634f541e04a224b26b80cc6d7c99d78c369827856e7712572afc54024005229c2055c66023be3bbc78d2197d05ff4cbb3ce4e02c3dc30c10ba97af39b20d40c2f11c356e2002012000bd00be02012000bf00c0009b1ce3a049e2ba8682a717057adf008bf4d8dbc053b4bd9262b7c26b1667fbacdafa6d873bd10005229c2055c66039b58444067d863896f5380ced22d5540b1c05fb6b2cee78bb6397b07e43d2c3a0009b1ce3a049e2a297d7b315de9b2eb01c2ff38086c5f408a939596e9c976dd5983e804a9929d88005229c2055c66038a07b9eedba60c4a5720f4404eb2319d594ac01fcc097cb92bac153c0bc469be0009b1ce3a049e2b9887241874185753a9ceec1fa8692991d90784805e2378ec9a52a5f6930addd8005229c2055c66022f24c67e44f32e9a475a7db1d8c9cf54de8f7da6e0411a2d76444feac8c67ae60009b1ce3a049e2a9162151f32150725923408c2d456060500bba55e7c3c3202a718f042a6a199ec0050a56ff40f30872b91def8b3e3c77a66db288991637f705e981aef30a18455d634d26513930cce002012000c300c402012000c900ca02012000c500c602012000c700c8009b1ce3a049e293530d5c1f6564e88410d2a8c8b6500b4fc34029c38ee6f4c7d3337bcdf19f5080050843a35462dddcedd6eb17b65e5f17f4dc0adaa102c83f8c64aa3000dc42d836bff6ded8e1a160009b1ce3a049e2bb7a1d5e80dfc4cdb3e921b4f14b863012d64ad078d6d4a9e5fb8e6b42e471c30004f3142adb906fb8b972b6a9871b613e1a8d863525ba82f6631e7b71e5abe6256e0bee0f2d99ae60009b1ce3a049e2ae09235ab69b78c972c5fefd2dbab6ffe34d67d619bfdaa00f1b06fda86a4f734004f3142adb906f9e07ef68daa54c13e081ad58d7d53812e9544b3ebfdde0940e36ee1414531ba6a0009b1ce3a049e2b4c0e2fa8dd3ee26293c68c3be7dfd6224520f78f0f393d2a3fd61c87326ab5cc004f30013d39b940c243e0ab84c6ce8324939e1888aea6363bc3b081d6ad18eca492fb89a8125c9a002012000cb00cc02012000cd00ce009b1ce3a049e28594e3a0afb3f15773437149cb7d42adc35c97ed17b11210110213f759cddf580004ef21e3f99f56d9867e1d8c71f6175a5ea27ba5cfc9e1d27e6234e65fd7306a363e0a1de3c51120009b1ce3a049e2bf4b58255b57f08de585f10c25e1876eba92e90f2a95153d0e7e215305dfe9ffc004c4a6547a477a506a492cb59bef4c9ab52def25e140442bbe9f26e63e71ae787a9a7fbfa1aa8860009b1ce3a049e2b2260739dbeb4de575cd89f99fee839113d103e0931fe660551dd19e9d241fa50004c0069ab267093af9675e686c90fe2a02290d434d32e987beb21ecda88dc46dbbec0f2537f5e0e0009b1ce3a049e29e47d7220297de6dd3aaaadddcb117c02487c723bb8194b333317e01edb4e3240004bb090ff2a55636802d2ba64eec84cad5b03ab06554b3f0e1e57ac20967e14ebc37106f31153ae002012000d100d202012000df00e002012000d300d402012000d900da02012000d500d602012000d700d8009b1ce3a049e2a8cae7da58f2a5b8107801387f8f1baa656165860de2d85848034d7a19999e86c004b12b0e826766e2a10b37bcb1ec1baed930bf99ce1842d6380c306b80fcb5ff2971f5fbaf3cd3e0009b1ce3a049e2bd67c56622c6f08ced54d5da5fa29d6873e062ae7078c38edff8d0af433d32e28004b12b0e826766c940fa67fc37c020ba8a5ce7e7a9e40073034f2005e95432538a8f9d72a496b0e0009b1ce3a049e2a3c01eda91cc7e065b42121c2499dffae2a43f05e0d46bfb80444e7c55d9040a4004b12b0e826766d8ada53fbe1b8204016a111b642c5c10b6efb15a9157ee01f73d1fc76ce6f42b20009b1ce3a049e2b807c33b4c87f02f160a8fe6d72f37130fbd18901562416b13996fcccc850243c004b12b0e826766eb823314e26d653a3dce059977a0c83c970a98befcf5e75c937aa9db29d67feaa002012000db00dc02012000dd00de009b1ce3a049e29152da877dd3199a7e3fabbea2d6fae3ab0f7f5be935a5563ccf310800aef9058004b12b0e826766f0e08c7ddf1bfc3c18fc59d5a8c49b262d4a98de685d888117d87e80e3688c12e0009b1ce3a049e2bd0ac9922621256bddd7383e14d9dc4e4dc6923bd0b0f65a6d7b0343153e4b0c0004b12b0e826766c264b4a58989a560db1e2b784ec64a2cd7f1e31f707785189844a455aa2f019da0009b1ce3a049e2a1fdcc407f339819c7f0cede372b1599f0467021ceb45dc415fc392ac280a1e8c004b12b0e826766c200da27d131557afb6ca1c7542ed43c867320507d68f6595dd01e0bb32c471ae0009b1ce3a049e2a11a1fcd7db2f698e3cd70c136b1eb84afcc2e447701412fe33adbc853a156f7c004b12b0e826766e22d3e8b9e0208c7324c00eaf69b7ea62df5ba4fa59714f465dee6a87953d8c42002012000e100e202012000e700e802012000e300e402012000e500e6009b1ce3a049e2b5d77ccd10d8971d90a561cdc387140b582c23b80741c0ab53218ccc7be156408004b12b0e826766c9b866bb0a015a1b9cb4a04259e75c2854e14017f653f3e42e34e3e2f87ebeb1e0009b1ce3a049e2821d90708575fd760edaa982534f097f463b95e095a37d44b95e142f14305bb24004b12b0e826766ebc819c25d36ea49ec9b99cfdd3cfaf91d642ba9dc94ff8273ef4a7b4fd1690220009b1ce3a049e2a3a4a5f35de80fdff36122b9471c8b6a5279924c4d194a7f2f4132e007573b028004b12b0e826766ffec45c828ddfd9fc9b3f6fcc0b358d37753667ccb44a8a5af094e0c9c6ec36060009b1ce3a049e294ccdfcc9e400b0c105f73bca7042417a7a9c914bf7f575a81b9bef286cce7cd8004b12b0e826766cc9ba8487cda2ccc88d92c89a7c1459c7585459e44f942bb38fcf192199fbfba2002012000e900ea02012000eb00ec009b1ce3a049e28e82125c37d81fc3d6c88e9774c96338fc1655b07fd097dbb28ec4672994337e8004b12b0e826766c82336dc9226ff3651616ad7d83224c1c7bfdfc647001283ccfeabb8a38e526120009b1ce3a049e2b42853632f476064d70f571e0bf958822a0c9b0fca3fd4ed16d593b5c6c09dd0c004b12b0e826766dba3eccda1a1a67603cc4de6a8b3de4f6f42c68b481bb25667ad0f2a4882697e20009b1ce3a049e2a7cb2e113d592d8546e3597989c40fff73e25370a03f9f32bde7a922b0a4e59e8004b12b0e826766cc9c22d344f11ca4eb99dd0fbb543fc11dfb1e86e3206669bb76df787e1f02bbe0009b1ce3a049e2966b73fc185114aaa5a3b59e488b06019f1bf0c08d6d4e17df030df62ed41c6f8004b12b0e826766f32f2c478c701e91245aa3d88dd55817e44c73d0c42da9f2e84161d79c27c223a002012000ef00f0020120010d010e02012000f100f202012000ff010002012000f300f402012000f900fa02012000f500f602012000f700f8009b1ce3a049e2b49c8edb025fd91dca7ff4585b8064dc903c48ae6a4116a47f6f333ac6c3653bc004b12b0e826766d2e07107e20b6685a7c898dec3007a9785808ed41d747c0d75078d63b7c76d0e60009b1ce3a049e2b7b4f167bd3cebf6b7e195487cd9f9a35af5df27ad0236b5ab5b5e7b7945fc850004b12b0e826766c51e74a504d562876807e239c6cb607461d858c47336791a1bbfa84f3964353960009b1ce3a049e29b0a5a9aa0d79e5fd9404a4394040ca984cb484fe4f15ba05703cb47baec056c0004b12b0e826766e158086f70a6e1366c4ddf33f82641fe760fed5c84a92fe68da8a3967be66b7760009b1ce3a049e299061c5757c8cb361f41cfedb8a6fd1daf71d106eaf41de52192d7a69e3f12fa4004b12b0e826766d6680c6a2a94f3515ee812cc8865a8cfb40ae24128c0f68230d7f03c9055c1dae002012000fb00fc02012000fd00fe009b1ce3a049e2a861b5a10f457e1c0c522d200486f6e4a863c6a9695b1896efe0fc6561b6ff080004add5e4347a70cbf783a061684fbe1608e701ea2c6f13371cf276862016b349ebc1150977c05360009b1ce3a049e28c6de44cad7b03ce4300994a88bdc19f24d81249bc712a3871cb2d1811fe84b18004add5e43472f6c60dd58645d6b8d97fe4ba07286e084488fabb602c0872b5e57c6705ed9de64020009b1ce3a049e28e1829c3c56aa9e495b633b9d91576bc4cfab9d9424740ee29c4f2d1e2352e02c004add5e4346f38f909342cba491b08507f8a25ba54c409ba6d10cf7b9cb58a3eaf5e464fd7bfe5e0009b1ce3a049e28b1b5443761687098e543d638212533287db8401325ff0e631e6b709346166970004add5e4344d8ec1bed0b68ff4bf4108f22687b94f94b3a45c56a98c5a293986b062a2c72c4da46002012001010102020120010701080201200103010402012001050106009b1ce3a049e28d030689304892e4b8ab43a0b8d33923446e08406b17e76f020e93720e1b25fe4004add5e423be1c68ea011dc72f54b87e8b43c94a59c6d499c19394fa56f6d0df127a393d11b77da0009b1ce3a049e29939ada3593741c99efe146539d064d8b5e4a68e498b162a4a01e9da6b80cf908004adcbc6676d254a9cd2bf686dbe7ba6d440aaaf67f9be34e0b3d990749e7e700949d420578a8a60009b1ce3a049e284ab9d7161d3190e1db64375aa8bc5f7fb41b602134863a505fb6b07cc3d10298004aa3c85eb5739c24f830979f1ba394187d506e3dd3568fed7c2f320e5760c540b5393b590983f20009b1ce3a049e2975701845d40ef9952c4373b700c5cf46575521f34b2c939fab5ee8b8c8fa4580004a98e45a4ae07423fef9cf49149b2e2a3fd7dec7dda3a1f0d120cdd262f6ced9b72be999785cb600201200109010a020120010b010c009b1ce3a049e2bfd781ca6c18118e1f848fd06f6f0e82987fa9c68b054fd0ed8539567c1dc0f10004a6f2acabf7ee064170278680894f6ea68ca69ed38d7c8004d9acc66269c52dcba495130bf58960009b1ce3a049e2bceb1d28aacb5ef46647b620936f72ced5cad00c829013e30533be67861458038004a3a596f934364424f5e283adc3e8da52c90a2dcbd07e311c826dbc4b63dd81990fb6cb7309bc60009b1ce3a049e2ae51a43787e33b9f5e37466755d40a24ea61e1e6091552d000cc1bfba34923d1c004a10d3bdc7c272c0b948f616efdbdce362a389bdc2ff7c1596075ae4b69a6092b2a7535ff8c2360009b1ce3a049e28b90185a659a7709da378232b6c4d95ef35371466565643cf2fce5b0b07df67300049e95d7d3abc26dcc150c16fe0897241e80f4413339d2e0415efaa02a2c352173263a0a0b3e2760020120010f0110020120011d011e02012001110112020120011701180201200113011402012001150116009b1ce3a049e2b485a42ac81ee3eebbea73c091e3d5bd664d4c597517d96903c9b52b20ada3dd80049de1bf18e5df560b8a7b21c57d27f0931e8e6cfdb7ddd6b4e5f2799f7d8ccab31d578cc667e420009b1ce3a049e2b0e837bdb7cd711803c6f858c71e7110feff941b97f7ce9aa76d98101996e28940049d940c127de91559766f814cee12945ec3c4a16cd5fe28b8aa917aabc059569c0591e5ab8eee60009b1ce3a049e2ade9d952b98c371d6caa21ceee00f99f6499ce92a088c945b394a8a5347125e900048db62c99fc06e9fe01ee4c98aa31c42d62389794ddae1692e08d60154e0b6a8674d7a46cfd6160009b1ce3a049e2a4caa2881570aae17143c57cf873e001c35b517b33511de40fd22b02f328f47940048b021eefba966a3ea0c15b74bf9ca563a8cecb1faec9acdb620557a084a7c862e19df048f83ea00201200119011a020120011b011c009b1ce3a049e296899b61c9dba0cafff76a30f362de4c49b725cd891af04fa91a007a986b237ac00483070e9137ce6c7839a36d9c3a50549fe17f50cbb02e554a4b2c1d257004b4c9f707134a7c6e20009b1ce3a049e2b6933613d85796034b8ffa681e9db9eb35237dd9d2b01b77b675a38c6ef723204004811f13f87aae1e6d4bd93473ad1dc6b84176e07c834f1a1e10e2595739841ad9724a93503e1560009b1ce3a049e282405354ec68e6046f0089aea339c6632a632e786dbc788fe36f4ae4f082e233c0047c1388801c5045fa55f0aa07f8a913949529f844a6d4575c26fe919a23051ac8ba288dadf10e20009b1ce3a049e288ffb120358e28164086da0bc178cf7ec0f7740bb6fee668a0ca1665944058db80047b5d55713557d528e1f2a08f6c977deb5e1ba1eabecda6ce4b2ee114eb8f678ca2918f77b615e0020120011f0120020120012501260201200121012202012001230124009b1ce3a049e2bf7bb19438ff352ffce692cc8a4cd9230285f4cd5b8fbe589edfd3d4dbb09f0980047b59e5b170eee495ebb678b36f86245c959728e2166f3600d364b3843284667a297061efb9b060009b1ce3a049e2aece1c1b1cbdfa14e5b6f8c5ba51095292fc65df1e9bff551a073ce6a9c88ca280047b34039763f46923f7fbb1c77f24be5deabda8e6b8930675d0751aa2d8335dc8d710cb929842e0009b1ce3a049e285fdc747baf92a10b390cb8eb30ec83c9fe88855aad2314e5880ea5357d5ecdac0047b280b5a44f5e95ae334a41002a3acb6bd81cee5ef4258f7c1003c7d2f7f4c3b9b385c711968e0009b1ce3a049e289742fa27e4a2a910855c83d8fd95da896cbd68f24dd5e6ab769bc61a9e3395f8004766af2608ee4fce1db1c705c494511a33bffd387a79d10f195d0ba82653325f88a7d52b8ee7260020120012701280201200129012a009b1ce3a049e2b3c1549d1bb22d904213f27ae62a49d36d3f39f8289546e330b0a4f070da32f48004762bb37158a0a8b43081357b4885f7d6a67a762a88101e31026031cf6ec6bc1fe92976035cd8a0009b1ce3a049e28dfb76613ae691b2f4f640c7f2462929373940dcaf83f7a2de6ef71b49bf6a324004741c474854f38d3a5c152504a1ce49bbd0c5f022169be07c1f530da7255c17855a8bd810dde7e0009b1ce3a049e2b12ad2cfa4dc4214b7b3ca584097c65f373a167c034cf92eabdf7ee51638760cc0046e03de99d9f619a28a87acfaff5de1c222cf4af07dc11e8e3fa4aadef5dab7ce01c114e5b9f6a0009b1ce3a049e2b7ba336e75f2feb3469f9780172bcd4876541b62566c865379d75a616fa536d500046677cb5e7d85ae53147ee1c9a4d4900c0c292df9fee569b02e0554c91ea3774f861af81fc3c960020120012d012e020120014b014c020120012f0130020120013d013e02012001310132020120013701380201200133013402012001350136009b1ce3a049e2a6f88793e800863f5d06808854a07d4693d1bd9dfd9d9d254707c1e502a156cd00046677cb5e2f0b125ea341585947baa0194b1406662fccc2693dd8932211203a1326a59f50ce64a0009b1ce3a049e2af589277683dbaa65f0987627443eea11c363e33865caa2fbe69c806ba2a605980046677cb56a855b98c7b95f42a89c2a5ed53d6ae8dc665a1ae424ef1e961bac85be227ae5dfce5e0009b1ce3a049e2b06ade9fbec9274d98dee3e3603cc6ace57c437c65cf62ba4489ef67b98d715280046677cb4ebed06d16d52d1d34af75b70c1a1c7363abfc373cf7fbf3229cc8be80276825670bff20009b1ce3a049e2b9acc7d33676dd78d9d428b35f7f200c669c016aa2cb64a164a05a6368530f3680046619860c7aaeb23623fe37a6a77b0547345396708c9363518d18af94528b92014a6d7950fe9b200201200139013a020120013b013c009b1ce3a049e293a4568f3c6037d3026be90e23fa3f4b97b16e37290884a822ea41a4dd51cbce0004661985beeda7e8dec11592e433234901611fce32fadd47e24f7536ac942b81c5ef7c26d979dae0009b1ce3a049e2b9d23bb63fb046dd4737caeb129b6b46915bca8d50acb914f0d9d478847531d0c004611795c6765afd9b69681f6a2d635073aeaad83c2107fde9639331762bbdc489662d80881fa460009b1ce3a049e28f94183d880d06db698ccbb5173f61864b0f9c50921f8aaf01901be26722b4318004611795c6765afb08339ae393d96b9a5c519258e1c62c12c65bd32222ad5c45d8f201fa7c8d29e0009b1ce3a049e2939a4ba49026f7c049b6d8d4c373bcdf92b54adac8416e2cef25a7c4f9e1c78840045e2dea47e2555d1dac2c9fa11b7233fb8fed809b60b2242e804da5c370c791909130c6f635d1a0020120013f0140020120014501460201200141014202012001430144009b1ce3a049e2898fe38466bf40658f3e0759f616c882b984d1b1140ebb23c415f130c361deb1000451ee9545ad3e62bae4ce9ca3b27c4b57c5bfd4c91ed11f604df3803cf0beddb4437b63c7ccfb60009b1ce3a049e2aedb325e9855e02c9c14394a2870909a6127f00beedcf5924ba8213ddd020364c0044dfb24791b281a13f11ff3180a7b3dd16e833c3a411c9cd17c8859c0c288098c80fa80b47b67a0009b1ce3a049e28273be7ca56b95a905815e643e5cfb3d930aa3af69113461655d5b5e839c8a7600044ce71b55956cc848cc771bbc8361d86f381187db7bb35f83fe8ad8241d33b8c2c9acaf59723b60009b1ce3a049e285ec5d338f84f9d2a9d8bdced0b6277ba84d90e014dcbb7b8a866c40ba9062b8000448e46bf07ef14a82e510b4d9f501503c4769c8f05cc7f25236f156f00aacdee9b7e06eb07ed820020120014701480201200149014a009b1ce3a049e2bb5f38cafd6ddb7ee65b8209b2ca77c4550993a408876fc4ad997b24e59e0db3000447771a862b6a2b3ff15b5771e8aa82e713e2ff3943969629e0f64e0ddb68165d190c2557ce5b60009b1ce3a049e29ca93cd684d162bf8e014366ba27e25ad6f2c2230b81c8c8e62a5f77368ceb4e40043e58f46242b606095072f6eb127007e98b0c2c855151bac6b94c20700df1f544969a2a7f853460009b1ce3a049e296ffd47a624cd4afe4de303d656ace546daaa6a0e2067b0eaf1f156a552c4b5c400436a685653597bb41318996d6e8ce34927a5ab553a01ea365fc17998486465516d4fd420aa885a0009b1ce3a049e29cf0051ea0e774e382511c6cb5b56aed836f6a7f00d057870ce013a1d8f0d65480042d01caa4e2d02220f165e4717e1f52cecafc84e487107c80ec6b4b65d993b9262347297dd74ae0020120014d014e020120015b015c020120014f0150020120015501560201200151015202012001530154009b1ce3a049e2ae8e9f7eb1a09fbd7b59d8c29a76350dcf8ffefd9d0134cb3d94b166a50673a9c00423078f373d0cc3943525f8161f8aec2fb535335fc2bbb1ab0b47681903cb447cca69824f1b9ce0009b1ce3a049e2905f388d04165316d84aac1b52d84805030b5001f62ac0c310152a5865732fc2c004218566845b33c0be1e2bdb47318045ffe1bb6e79f6bdbd0bb5413fa37fc222bfbcdfee2e857a20009b1ce3a049e2b4abd38638e121e04340474ac14ff573fc36f948226ccd8a30ea5837893b634dc004147b2faddfb7c5d2496398d7959f433a2c366c5656ef64a8b1e04f32f4b49c4156665ec1a258a0009b1ce3a049e2996780d709e23247fac421007cd882e49925b02becf95d742e5abc4a1c608a2b4004135bc6d8c84203536dae1af1fc09513176aff7c79d638ee99ae975fd964bf942db7d0fb91b77a0020120015701580201200159015a009b1ce3a049e29c1ed68e4321e0b709d2a0cd77adda44b935846d014b4b96cff311df162760f4400411ae18f52445c48921455da5b253bf0a0373e940dab1f62c33db1b6c38e2c2509e90b18d6d8b60009b1ce3a049e295029d53a3c2dff3c6e34ed73018c838ceb975316178267ed1e85118a122ec8f4003fc374ccfc2c4a3a49af7f589fe5c368507b67a2fbbdf28486af9372c42a64f913017cd699bfa20009b1ce3a049e2ae88d192829741d38859f1efcd4c7502a94c4ff7e15b030b9ee6a22c1b1a01cf4003f4c1eb9ae57bd63dd94a980935e004b618f63008b1227557d464cc7cf26e705a8a109108c4efe0009b1ce3a049e282be184b4707e5d383db329e08422c6d1e0f9e0d1243a48a1baef971001489908003f42f23fd8007fa152ab83b747d20af6cae343449237c3b902628861aff74ba65a90133c0e489e0020120015d015e02012001630164020120015f016002012001610162009b1ce3a049e283e9d28d82412218e439014390dbc6fc884eaffeb80cd2637e4146ca1b7a2cde8003ebae0b5b5c04c3c44edb7d681a9eefb9ee72b66ec874c2dcdbbefef4f9cd0ec9131c6e32ba0420009b1ce3a049e2b63126b00325294a8aa455fbcaeb04e8f63b8935bba742786d175a27d114c38bc003e0f7262cbaf17aaa83f00bd051fbb5536517bb5a916537bcc03e27a87a7ec0af1943fa239f3420009b1ce3a049e2a32fa67c5d6d23b76e3271ba36d6f2a430e3dd9896ce39da6dc6482f8535ab304003d63a1a98666b781055db64e196e3396ede7bea28437c1d49f6db06acff8689eb73b13ea3f53420009b1ce3a049e2ab7c4f6404d141554b69d9568b5cc895e7a19046737dec62098ce405e5a60f1ac003d42727a18ce22763a6c36379ecbe3bd2c9d80028a02c67b03e5e663eb0a06339ab1fb7caecfa600201200165016602012001670168009b1ce3a049e29fcaa0327fe256c557c8f657084b9471d3afc0f9b0b025f8fed485010765d4afc003ce3d45e78805fe6fb39fa18008021f69cf749ebd9830bafe10e67757265e392706ee3c38acd6e0009b1ce3a049e29bccfcd8fec7016fe01f73db763a872c69f8b20fd25a08fdb299e2711273f493c003ce3d45d6e182e9944ac68574578f8ed0bddfca72d4ff96126182d0aba84e1eec9c49d3719eaba0009b1ce3a049e2b694db3461d310a932a782a6749d80ad06e8dfe3c069f10221ce720fccc791494003c5ccbdbe14ff8feac07f0e4bc11320a8da8b1b3a66462b53c494a4e14e76c238f26664fffe24e0009b1ce3a049e29de530e29b428ececaa5cca88498867104d818539228fa0d9882b6e3179126348003c4ec78b8da85630b8e5463bb6f4bae077e1956a261234d3f1df5317559c2c0cd5f4b8057f475e0020120016b016c0201200189018a020120016d016e020120017b017c020120016f0170020120017501760201200171017202012001730174009b1ce3a049e2a729a2016586a2c3ed8971b3d9117350fd9c05dfd034275d095f67f669d3ce80c003c107c9a79dee1d347c45cc9b3c30a240a3994be6e75f39126d0d63cf6a853769ef998ca6d590a0009b1ce3a049e2a21b9bfed34cb39d4cd0eea55de3b24e2847756d9b601bd5c5d2b8b5a507f4b68003b2852b7433fa89a0aba445a362a7aa7b5be60b52a9885315a3c192b5313e881d68322578e79a60009b1ce3a049e285458fe43317036b3f6e31080dc2fa71524703dedea477800ec478c39549f0f0c003b0eb2ba2ce38a6ba35a67d878b9ce8cd176458a2afbf5b8d642531b3f489a9fde93f24a1ec7120009b1ce3a049e28ec231368c0b82add48f5ae075fab41d4818a47a7a47d3371438c673bbcc3e0f4003aa8f79289e1587a27dbb19ba353b571991f65bffe5aed1f4760ec1b5e2ffb23dc9430e3a0be220020120017701780201200179017a009b1ce3a049e2b803b6a331c21af8ea439ed1ea28fcba067d527ccdb54351fa48088eec59e5d1c003a8f15fbe16078e5b6248ae957819c53195463dd7a29277835a5b27323db64cea1c0b8712907ae0009b1ce3a049e287fb7cfd44aedf69a6270945a7181838c3bd1a67b2df6e4e84dd305b3c0b4454c003a59dce335c06163653295d7a0ab3ffe70a8e39b431046c93e5a51976ec30f17c81151a28b62420009b1ce3a049e285a043b5d13d3ff7f2c676de0a4ac9974ed74888a4cce54647d62d26bb09da040003a4ae5daabc3ec303963b55830d2d2853361134b7618ab43528bbdaf687a69d26867141792ffca0009b1ce3a049e29162b9abca5db8228938bc22ec2d055476c3a1b79cee4d40d1a2b82c190ac93f00039d3ff81c922be648a634deee5132ed07cc454c7e774e25efa5b427d89aa80656253524aa9f8de0020120017d017e02012001830184020120017f018002012001810182009b1ce3a049e2b3a8532d59461f7371269d42e0615417f20ae4dc323e03f4ad3c2dbd962e3d1000038ac1d69318dd91f36a9b75b9687f793dec216c606e3f7c6bd8abbe1afa40a288e30de2950ef1e0009b1ce3a049e2ab24d2e3ecc478ef9009a2503d8586460dbf84918246f38480d102c9b6583d0dc003877e20fc10eadeb73d6117661e38f086a8631096061f73baa8ca5181082177fe773edeae06cd20009b1ce3a049e2b044f80771abc64a0a2ead36b6f2b7b3d1db71546f07866a4bdb349f258a1742400382383abb14bce7242fbe7fc4774f4d3dab3613e7cafa7b079fa124a33a6fc90ca96baa69704c20009b1ce3a049e2affd2b95804e5fa3ce703c2e257b43047c3c1320db1a83e10985ac083b8f4ae3800377ea4ee0b7ebb751d7dee28e7a37b1e3572a62abd33af2ca3f86d1858a0cce6ff60bda6e3459e00201200185018602012001870188009b1ce3a049e2938d22996e473b8c962ec85375458a87175ed883105844a41d2a5c672dc12422c00370dbb114d6bfb06d5026994fa04e5b710b4e68c4429a9e705ce1a95c7c0813127b2a8fe381ea20009b1ce3a049e290ad48f8e484399a940433bebc9de826095fef341055ddc833d3827f09c72bb600036871939bf6d6c1894d7dd51f484773b9a020f2a4731cc0bea996959772f0026844aed6d0b459a0009b1ce3a049e299c3ffc3e3e541fe89b3402e1d298e1f06c6a4afebbed682260d0f0d718af9acc0034fc155666819c3117a1436555507b67b126b413f84b55c58482661f7a5e81105ba616ba26df720009b1ce3a049e2b1fcfcee437aca70c927eec12f09c93d297432e5c0aa29a8c2b846f5d1846a23c0034791437589b91a023d9beb6ee16304988b5dc61e3ebc7d0911b35becc2bdf617c284de350d93e0020120018b018c0201200199019a020120018d018e02012001930194020120018f019002012001910192009b1ce3a049e2952a1818d78d8fb0e9134acc7b9ca37001c919b59ccf9f56243f0d5cb0897f674003336cfdf30cfe3d812c697eae700ac388711e6f6732690f3232914d4ed8050d0c4a89e7aa035960009b1ce3a049e29c87066d212631d9ba83aae73a51728bab202394c1a8f32c9774316d5e2a4dac40032f61c6957c9a0932130f044374de6c5cbd9e723044aec3af3f77b18de54c9b9f7cf43290db89e0009b1ce3a049e2a92ec198940bde3d276365399eedc5597ee8e15edf1213645248ffd9ed3340afc00329216e9010325660031191e56dde5e0ca9fac0a7adb0422ea50b5a77769ce6754124760a0c9320009b1ce3a049e2b301ce8abd7dc93f14c71e48ffa86d5b54f0116c9fd6d133c7845b3052e8663c0003238f4bf6cac1d6d40d6f38e60cb6b302febdb408fcaa67fff8c3271a40929b1ea0274b2e7302600201200195019602012001970198009b1ce3a049e2879331e7efc1866e4143bc57570b9210b781c4b7c6117e4c5fbb274397106b3c400320c73c05080eff09a1ca5182f7a1832d9964fdae6786d148544642138d9c1d91c3660a3bca58e0009b1ce3a049e280b4e0858e5ac7518e0342b66f538c47a9f19b607919f1a45a4f536322d9235180031d933c623c8ae9d32e6213ac7ee6541c7691835955b5c383bf1e277aca1dba4825d8b8e5b09e20009b1ce3a049e2add8af62d060d4d0b271e8bdf16db10a1b90fca8696e1688ac5461a8c58d773400030bf679440119ec196c5b1cb6bc04add46eb9eb075aa93d31826c69b548eff130b118aa1f09d260009b1ce3a049e2973f08dbc138cdb087858131449f998c9bd05177dea43249303e3f2daae09b2c8002f0bb417b1b563a48075ecd741d50fee154318dc3c16bda368046babcf4d0ae90619e10a3b27be0020120019b019c02012001a101a2020120019d019e020120019f01a0009b1ce3a049e2bd1a4b0ce851645d90a915110918e0645a940007eb4bcc466ae8fa8c6665b9260002e904805ae7cde517e02c8ac346b58789397d3a6037f74656cd72e1ec4b6567992d58e07d98d9a0009b1ce3a049e28afb03fa31bb61b37497d06ed87b1efdbbbde69eeef5787caf57e968d3e27d630002d7649c2d7eadcdbc32e7f98f5f18ddf0847960f69dc56903cb7924ff0bd4232512ea170108e660009b1ce3a049e2b50dd0a78ef676a506b7355ccdc9cc5292b191c71ffb9cbe248da16373f003ca0002d6f8c4f6d10db85c1cfdc020bd8aa220810902f1bb066557e3927968850f219267da0bed3d52e0009b1ce3a049e2838b52401bdb88dbf02f50511c031c71322a373316a9fd814d84316983a8b5dc0002cfa9ff8a2514e9ea2d14b979198992f73ff458a40d76fe3157ee74c5a780e1d0cc1e93f326052002012001a301a402012001a501a6009b1ce3a049e2a6c752366daf6c75dfb92b6d874389bec9162886a2c6e6319be12152c7ccbd19c002c8333396302ca56d776e804f4c2763599d0bf0b586833ba8e36c474f43238da2169b0746157620009b1ce3a049e299246302919c27729ec6010cf73d4de43e87054521cb655cf86597ca879b96d08002c3db32a325c8b5d219533d6a9d383f0a19caf6dd415e9c444edf0a7739081733c5669a72c94ea0009b1ce3a049e28160f6a0173ac205ce05f0c47b87a8a16ce6af63bb7de933f88787f7860286aac002c257ad29c1327e6f8d83ea8942b09d61d60366fc0fcdedb5415ac13f4d2cd690136d3d02d26ae0009b1ce3a049e2a87a95e2211fe6037d44dc8927ea4a2bf508f5d91d687791290c97a2b0b391a58002b89fce706640d7a22a2bbc6f1a3b88e34d3ec3226408f6df3caff6d30785d07bd1501961a0d4a002012001a901aa02012001c701c802012001ab01ac02012001b901ba02012001ad01ae02012001b301b402012001af01b002012001b101b2009b1ce3a049e2ace806ff8e7a9531eaa5a710b2b5462ec054bf92b2f58a6949a2e6072f9b13e18002b82f8c0076c75ee9c4e215c1203ad0f95cd8dc58bfbc667801c1ec68886d16573346915867b620009b1ce3a049e28e79355a6a7dd16e7679a3ec49a9baf02321dd584c4247fbf27e3cf066a0b0ddc002afb47d5eb12c95805a66889fc09b433eb1cac810c5975500818e12c8e0ae0e3bdc0974768e9ea0009b1ce3a049e2ae5838efd8e7fa0887a392e9618bd2d35148f47f6fa37dc59bcca8cf3606bdf30002ae6f8f89bfd275302e6519d43cdfff5af212c987ba369df8c801054a5e11436f41e09cdf9b3660009b1ce3a049e2af302b25d3bdf6b69baa3267c4b55101ab0fca954d7bac1b3349988b7802528a8002a9d5f64386b9ad2dca6096524a35a32e685ba71cca426b0e3cf91c3269cd6eeb73671b7134e96002012001b501b602012001b701b8009b1ce3a049e2a5d3bdae4f4277e1172985f81f66610cf659491e5c9eec3d4ff01ffcdd22112a4002a3fcb2f51da0a29141b26bd203d751782e5ec505807ca9574e9c73296495de83d5b39b51523fa0009b1ce3a049e2a5731537022e11580f1de5760408e1124d5b04eb8560ff90d742fd5f89c75e1f0002a29815386ba733be7af211d13b1637d8ac7086c5f4ee0faa764f3d951943ee00ef5468c76617a0009b1ce3a049e2b1ff0e0e6890b0e7962f23c31cc1a834c67bc4b72c6d69c2e5d3016fca73eb24400299e592ca233bc9e744c630804d331bc19d8ea9526071fb66743a527259298eb9b175e2c4a49de0009b1ce3a049e2b1c2d519c82e894366b8db379b8a549d439e0378c48b813dc4b24f9bfb37496f000295c214ace02aff0d9d05277ea1c26ab95ec012c57d5a12090749eb1ad9f3149bc6b670786cdd2002012001bb01bc02012001c101c202012001bd01be02012001bf01c0009b1ce3a049e2ba44843376e7a04d5e75738d757b4eb066c9f96188a69ebb6be3fcf4fab8edb900028c2bb4f8bc49987f135d6440bd6a79964873da81d2c0b7b376a26f07254059187ce262d485c0a0009b1ce3a049e2821ca6225e21c5b46d6d0238fd0410af86655d724dce60a1d6caeb58e5c5dd06400287af6fc63f8fda17d1d73ddd00cba98a4cf38b3ac649bb9e6ce7064d651c825b650ef7e5e005a0009b1ce3a049e2aa7eb8ed80a97bc705898e23ea51570b34fa4beeaff3c988ada73a7ca092c2134002862cf746d1e5567339f65d1a206965adb6c3f41c0332f0408ab3b37eb1a1e5030776b0cbef34e0009b1ce3a049e2b9749e218100553b5af0e40bafa28f42aed7bf222d20794b57a52a1536d2199880028184f344b8a73b1f366ec8202d0d1dd0f7428a8f2368678939775dfd43322e3caafd2f9a69ac6002012001c301c402012001c501c6009b1ce3a049e2832c6b3f67ae4af756524276a0c1c0052da43bfee7fd4d0311f233f7c45137d540028063824ad9c77808b604c0ce8b366048d6d932d77b0dc270dd59287dd9cae58c5c599887fb83e0009b1ce3a049e2936a27c56d9a60c083927e94079e4335ba29632d7aceb15a3261b510578c50ef40028063824ad92738286f75181e77418494c8b18c5b3d9056703d5650263c2aa0f45774f662862ca0009b1ce3a049e28c6662b1ecb89049ad7d484ea20d765cb312eb0c634a964c1537be09fd6cb85ac0028063824ad92725424030284a2643df3e9a3dc27a4e92418f7d2863b8c4d44413bf747d8eb6b4a0009b1ce3a049e2aa9697554883aa9850b716619ece9c3a6c6fcfc3c1adfb8b8835984329ca63e4c0028063824ad6a98c356490435d8b26734a3e8523ddf06685aa2b3f48031952beb28e88b19587c42002012001c901ca02012001d701d802012001cb01cc02012001d101d202012001cd01ce02012001cf01d0009b1ce3a049e2a2582304d633d7c3419c2d4367ef1b6f92c0582bc50344c44b4f3d745c4fb43440028063824ad4ca9b3489fe5453dbfe5e2c00d9a58d5920865ea58c8da8731fe37a74989b56dc3e60009b1ce3a049e2944d04808d8a9c19410a57cd10369f9f6cd0707e7024aa19efc94ba07360f27b00028063824ad4cabd67baa0a2ec93ba4a924e50bf0815259cad58a0e0e8a47d0a7feb3f19bb256be0009b1ce3a049e280a77faf68d9d85f5b38408a2eab6aad4add9c60dd361e2e35514244932dbc6980028063824abb3b1b28de42ca52a505d1c22619285238fff02d7b6fb8c96e62f7b7a465ef7b444460009b1ce3a049e2a358caf51b0e4dfa763eee5485ad0ed1252a7cfa31c34214fb5e642cee990eb100028063824ab8bdb713e6329c1e0f7355ae0667f209856d13e7efc9fe21d87c8016e2e0c83aadc7a002012001d301d402012001d501d6009b1ce3a049e292ba2f43332734c373d1dbfbce9968568bcc10f53e8b38afcdcb1b082763949280028063824ab6deb8e30bccbc20b0da660bcdc106ceb249da6953cbd33d6713e6a4d16a42100e2620009b1ce3a049e2ad2c70ad15398326e0e0ac1138ba753b7a029c7e036a57694ed88e2d2e19249400028063824ab28224435e1b49423dd16a326044b7c0af9dc8d51fb43bfc21a6e0edcf011820843820009b1ce3a049e2b8add7ceed1704f547967dcae9126123f0a01822aec1f6a2ce146748bb49dfba40028063824a9fce2df18ff6b9ec3586138047fde2a25860445693fda2306c2e05c14512b598f232e0009b1ce3a049e2a947b4da685f541fa7a63bc4e1c577df2bc659897edb1e1a4b09d43f19c7873780028063824a9fce17d57ae37657359404c1e94e5ae5d51fea8bfdd72801c75fff533c325915f25d2002012001d901da02012001df01e002012001db01dc02012001dd01de009b1ce3a049e2a19bf970296645c332a80c869af2fddcd4af9bba7034d97b286f6f9f712c7d9bc0028063824a9c1073d42bc06e3a77fba211c4e8ffbfba78655fd20a3624c29e42cb03a94459242960009b1ce3a049e2a63195a5b6344050e13be6e92fbfd4ad7e6daac154347d8bccd413da0396a70680028063824a9992da547d83c93830cbde24bf104cd2a3ae9610c458ec80c1a30a2a0dcc48367724a0009b1ce3a049e2b0dfe31266b719a3cd306ab549f274e3b4314d41999b434b400de36db3f8cd8340028063824a9534879ea4eacc9d314d9f1aae3a9dde43bda77e6bd4d95eaa76a20c8e004ea9f00ea0009b1ce3a049e2bfde73855bf29633091c077f787b133245dd4a34d251e0e1a5e61be8c4739718c0028063824a55a04452f31ee76d4c83a5ebdc65266998b956d7c77e963593e84acc384cf8b48689e002012001e101e202012001e301e4009b1ce3a049e2ad389ab02bce18e5f97d8d4d05933ec1c5e9b0f909f9b5e08048b9b9ad04732040028063823a24ee87d88a02253d6d6538c80a6d2083fe31c60f28bbde53e3aa1afbb68ebe8645db20009b1ce3a049e29f4adf4ac08f9f6f87c5240288667f0b9b5854e70a60dcc2b2d6d57cb75f792fc0027af5f4bb5b438cb07efad3a6a6b2b17df9688981b3b75ceacc5bc448fd9e5dcf567933d474eda0009b1ce3a049e2aedf17ecee41e08c3b4cae9bf60f255bce6c6ce58ced36753337197f465e5095c002793b352e7c33bb88705d8a1a927b941511fa4dc9dc5d50d0da4cf7fbb48496bf1a962df4ce1d20009b1ce3a049e28a35ace7da02c3bbc60c5cd54162dbb26a5715af11f117e3a40f819ebb7279c4400275ba7d8ac0b5d2ba92761425bbcb6844ea868c56d0429e313ee963d1288a446edcd9725135076002012001e701e80201620205020602012001e901ea02012001f701f802012001eb01ec02012001f101f202012001ed01ee02012001ef01f0009b1ce3a049e2bbecf9437680fb1aeb37ab7d295801e58595eb3b62d792271a0db3f588aff11e000271a34a23e742dfe968e6748584d4833998ab0f2118fc101699e06d3b0659322cef4c666802ebe0009b1ce3a049e28389f8936cf88322e27288300a5b36f6235bfd216b6d9fc6214ded18ca8618dd40026cd80b5be18c7e11c57246e6770c27b5507791009d09e3912f7c16e08bda5e5ef9506c4694e560009b1ce3a049e2a65c161473ba031d4b2e66829f1d5128edf0c6a4e56f4cb821255b711f2546d4c0026c8f1c087e6ed8324d3181966a141c514523c202e2a22d8aed2506b06ebd09b6abe0dfff3ffd60009b1ce3a049e2a54457348388c5d158b543f02c8c754d1e32c74f349f0c18be1fe10dd44aba38400269d31039963f86dee48b7d754cb10756ee56e24b1f947b72bb5d6c4dd820300e1a254e716ddb6002012001f301f402012001f501f6009b1ce3a049e2b65c8b7001a2eff424252c5c2df0df95a51f1a7f78545a3fb4e1c69682905652800269521c16f12c5a24819b16ef4e614fff38afa70fa7d6f7a68b75728272b882e324f5680cb623a0009b1ce3a049e287e51d2724eb388d46182333316228cfe3c00263ab2b16ad4f2092103a89e8c4000262a4102df5a7b3de3900acaa1c1d147728ab1a4274054f1e3e7870d5a30dbe53d31bf2e559e7e0009b1ce3a049e2b85e018e2038353642ae80d86555e919df293d447fa331ff0def861e68c2682d40025d072f8b944e31fd43f1e6c98cb9c0d8c3b59274e1026378fdc0dbdb50eb1d801cab3747f5ffa0009b1ce3a049e2a037bf191f8de94ad56d6b95dd8fa293bce9a1ab541a99071b84102d69f4e82040025cea369e159af58225a84ba60e141b1a49f40e964bf444a9135d940fab32e8a3cc9ae2836eb7a002012001f901fa02012001ff020002012001fb01fc02012001fd01fe009b1ce3a049e2a7bb0c1ab2c0ecd5197fb8cd0bb24d037704d143be51e3ca24901398593f338a8002576fc38b8d7ac05ab8bbe1c5e2e3b1e546636910d34eb91b232b31e21ba0b3b2162e599de997a0009b1ce3a049e28bef689bd95f3f9ab9b40df475b9ab11fc9cb8b2cffbc6a5c5794d60c9a41c78c00256c6062e34c2a758a1cf665f267e2c057047cd643bcdbbddfa2d43aa470886dd9898f9fefb6d20009b1ce3a049e2896717ab0a536ca6fe62d5a775181567209fa0ec4925e8012ca5d55c3efeddbb4002517fb2fc43cd8cb8a8fbb84820193b4d204821beac23c58cb8ec2ac314ff35ed535aee0078fae0009b1ce3a049e285ce49bab29efa5e637f98c5ae8ec8e468cbf23310664a99a6ec89cd8e7a63f7c002472c9837bef2a0d011e830eeaf39b99ed78f7c7e91e0914678ca4a7c6edec4be7ab6a18ffaea200201200201020202012002030204009b1ce3a049e280a0ac45bbd4eaa6ee7118ecfe2a1b3f170fbae95bf444e1d64f303fba3727564002424dcdd81aace2146cf7c9dd9e666392a3c3f6b4d3032b13332abc5b3f83e047c4a556a8a380e0009b1ce3a049e299047b0392a8560acd2cb44137d26b919538aa6a890faae1ce151bcee2290a9a400239296f6dde1f461ea29453572e3376d806c49c80fc3f1bf871f69227bdf8413c4479036033d5a0009b1ce3a049e28a7989520b9fd67088f7ba34e6daad1d57c7e73dd6fb9d34b46086a3b8f30af8800239292d09d2e8587ee340235f5a8975b70d9330b6dbae735efc3c36109bb53143abc134da125ea0009b1ce3a049e2adf9b469220eea2b4a946b96ac752728465a4865dfc9eafa2253b5eff97c41bf00023131d9346fb1aabaafe477aaec7b83921ba90cf18dd33ff4f03e2f7b35bc4a4e9c58272276386002012002070208009b4738e81278a4f45a10acf0cfc5dbdbda9c4e654c66caf054e443fede401045f49e938e1508300086dbf0cfb6b1d860f8d19ee041eb7a35ce60c44db21c6146c5c5005d05bdd1c59dbe3d16eb6248009b1ce3a049e2930ed91b53f34f0eacb9a2afc6b3ac372fad209b34e6ff519bbfd7688f7969f5c0022a468b3d6ace904ceefb39cc1209d689bc4c761581b3f27d9cc7c1fd281b36c58013fe7f1d1d20009b1ce3a049e2b93fa94e363dc099ef147bc8b3140c297cea7ccefaa0aca5941dddb72f1f151f000221e0ba894a31ef7222a228ac5c6afc0ce82e4f2b06c03fcc2ccc11f18f74102de79e527e3db32000e6a644f65c0b9d2d91fe0500580000005a7da825aa08ccdf9f22ee47316e2ccaa411f3ef8f021a698b02ceadc366c42140cc0fccd8c4c6f5ce8ce5835b7431cef1dc7b2bbf6577b78dc2e0491446a9a363d1f38b67f05abc93fccf6897d5e197ff7ec5e05d38c85e71e1a12a4e8652640f000000e1b8aa2038fb346c4a602b074e3b1756f2fcc1a716f11e0f94c7df8da384375640b3c26e601f6905edebcb7d325045326b9bedae9944cf8915186b0dc6358a705916f80819507b41c3ddce1fc7aea7c53296273f3455a7663b1a0b0403b2fd5b0c0000005a7d1e613909330d4c201ef78500f5c766edc870edc845b08f89005c539a89464018f61d521ede92cf1a398f531d964e42143101e3e869154a92b646dc34b0130ce968fbda0273c2bc434c9b5cfdca70ae1f9b93e048752732bdd34e9af2fe9402000000712486dea60f8b02ca674ba8e3b52094eedbe03579c3a40fecc0463e8f7da41440f9ac8ed1592d4952c6071b68d4193395045402c2f476532e8bb9fca4ebbd04c162fc4c7135ff9ded1caabc35d9301388b8eb0160d532dc379671ca39c4171d08000000f661d197cf0c81a3fd0d03112c2527c1130f380a084debffb17416e5c061c04a4091be5c11f4fb7fab5a3d9bd9a84bf0fa1d0e5f727d50757b206ef80a2b54882853411134e02f926ed6daeeba59230a8021577824a03620df5f01079d80143f0a0000006d28bb121ce4ff0aac6c1840dc55035749a7b1e60886aaf11c2af8e22f2960a3404a6f51d66518f38c9368da99b881d984ac3d73c599069d4e672ea4a9dba1826e8eb0575938d15d0b57036feb44846747dba86ae2addc6beba28a1f9c8009920a00000096edb74df211e82091c51e0df26e4ba030a9112b9377fe04a226b8f50c03a5554086da90af0edb029a6b47280b07a4e1e38deb02d63a53930297603ca0ce3ad8d577dbf12c7781a0d1f4c4fdb797b1b8ae0d69835249bd2069bf2d6a14557b2205000000af7b931fc41956167d3aa2c25e4357391a6991245fdd2e59897045075af05c3940913410b56d7a22a9d73a5aef5ceacf91eb4b3489362ad5fb7b0b8c602808021a1a3b6dcd5bc104eeae493a3e3549ec3c4d78f26c83e0030aa95fca44dfaef104000000f07b190eb76a81539adc4278920571d74b0ecf780bbd85c36d505f58a2700825405afa0602f192e31625512ec1e965cfcfcfb77331bff26752aee7365ec6607660b2bca2076a76f467616a2135e2f8c9bf8c0f95ca6687e96785064f7c0c4fd807000000984ab09d67af11566ad8f844d1e7e3fdda75070013c44f3634ba95f323d51a9c40b33a0bdbc4beef77c1fe4f348e3969ce1b03489c3bf177be25ebe802680e0f045f6cb9be6ab945a07f9eebd997b823f9cd88050b662a6c57944e6fe7dcd7db0e000000799114e8c1fc83c25f30eb3ec463cadf38f31009ac4db0bc70e3a7de56656d5840b52b5d5e6b8481fde75c683e9f32bacc198c2f6929798038b34533771a1e475d2d37bed54f08877a637d27a77df30b5248a634d8102286a486c0de45e5627a0a000000449675e503159ae5ed59bc335a7b161282e415c0b9116aa157227e78b5bcb60d403c9910eb73dd3abe0bae15cc10aa1fd35efcc5f135b7ab67dd4e2295defd83228300007f73141f283293d0ca24cef743262f29ca3aa4ea61d2d46017ba8f3c08000000a29ac856501c0cd82b28f078b4eee00f7aa75c828ff255267dd2c9234480201840c27fa90f0496823dd7f01b5c8026583ebfd929ac390230515f194101845feb5178eae84ba6ebf1f2c24ea390e35fda45f3cceab4533499266acae2d2c875e20f0000001fd188ba6274c7ddd61324ad4fb33e4d4ce1d8313fd4924cf6bd93a2d26e29d9405eadd14f33c87e84fc3aa3347134157267206cffc86b09ac92fb6d9d953c39ae4e83a2e269da4711c34409eb0375f13203ffe6fa2a2a9df17eaef678378b2306000000691bdda21848b63c748326b287bff99d21cd16f7ab5ec20ce2f983ce65a60abe401294d6b38b0cc5ea45d16f4036622ea354a31d747583bab53cab78ce510d9674d75f6b779db17aeffe32ea7d73fac5e2f70c397b43cf8ceaf1f5938cf4631c0400000089016ca20f378f2474ff5e92ffbe08e40822d5e2346a2eb1707c6c89393132344062cce8759680e1f80168d9b3e9aca7e1099c7db735ea15d3aaaf7c88d3bbc47661270854d2a7986416799095b91474005c69351580f65f64cfdd39e1fc2e2b06000000174ba737b67c17a1f29cac1493c63ce6680cf4be739e669a1c4d4e17cbf834aa403603928f794f21597d0758dc2a555ba0c580c76a4301a3eb04089322f3bc203998638f48a641556496ed52c3fc13b380eb9737ddd2bee16a664c6e56da10fb0b0000004e2ff3eb80500016364bad01a05cd4dea98e47755cfc84f2ae0b64234f1e6e6b4012bff413e8c53781708f0a04f4415284d30addba66e6571edc55be7a4a7318fb32d1b488b27f4989f704565baa0d0a4d90fd3a6f9f2defcb1eb836d8635ef3080000000c14858baaf8961538696d85d6a744bddcf4b6069a2bbc349e04fa6202c7f49c403e2d780455a6d4ab5b8f9a6a0af5e7839f6f6604b4ff7d49d136cd1084c49a81c64c321184ca29883472938606e547caa6a0c19a0bc019a87c0957ec04716a0e00000047d20d2c651782785b75d92a955ec94304349d3f154d51e0835929fa069f3b2640a007a3f1fa815aed6a5fe49ac7c519738699a2c0c07654a06f039286c02d849aae02333ecdcf8927af0e7212cf24c5abfae30ea4c301533fd7fd8f5c27c56d050000004c8c0be0d33230ffc8f4b1b0234888d7ab7f45c7ca1ae883a30e3b157f53178140c2fc3e09141c2a76429de37457a5d4017d132ce9cacfd18eee805f50f83b28738ee32cd48c80f4190bdfdef69d91039e96e7c4a1e255a74d354d6090bd165f0200000083ac16ac2aaca967bbf98572d1f2eb33bc5876e202d796c9f2ddeae2c3d29aef40d66606fbfb0362f250ff829fcbee9693ae295865ccb1fffef9b67a71e1631b4aa49ce7c5bd5fc68e013b1d4c94ef1d16d2df317b556d4a3b0407e0932c58950d00000071f761243b8bee1afbe6293532c4ec1cfb32f5d9e41d665436cfbf9c55cc9fed40f82c1c43ba9659261546b12e55e5edbd101c3e2f7bc56d2b90941636515e7e25bd62fa995a2edbae3f26ac3485d679e24cea7fdbb38e0cec06794b148f30a500000000801a07fad5691016e52e528f5d0f4377053ec64fb4a1aaebeea73dbf20d4bd364005f52faa0dd8e08ba6e3861ee87169dfea72097b596d40bc03e6822005c9894a5a66a804fb0b7b8a61bc83de98915b6b17db824f1b752ff114953d34414b7c07000000853dbf2ab09646369729539138357d3f80008679cad1a4840ba0a4e02dd2932d40ba72dffd6bf76f29877904e73d004c78510124d89f7ccbe71f794d5e0fc12a464b930b4f01afe4f9543123c1a6b5b850c5030f03699999812b774cca47e53e08000000bd2540e1c8bd4d0d5391e46433e023c55da908477966baf1e82f3c1687e25fd840b539f28740e948811843cd8b71e1c22a632c00b3d93eaf632569dd48bbeac6035444dcc299e68cfc46fe3a2a3d2d12b1525c33a700b94f3d23c7ed3f4ecee607000000a39257f60a70c6eaab930548330c49500953a3ca58b349779ac53e087d54796a400dd1375614b99a6f4c0c094ff56ae5cd107907ffd8de610509b7be7263fab5bf2b92783d4f0fa8aa3e799289786909da9b05c319fe1dc387f010e2662bee9c040000007cf65d3c7f7495e30d81e0a3492f62ba525bf54b997574a567051225cd885c9d40aeb0152ac82609494d4fa0bf4dd674d503a06bef1e024c9fa4bb5976cb04c13d581a93a3aa92c47391f676936b22edd4cdd265f2236e7328c518edc1b7d7350e0000001220c585c2c76de9976a29394255b28b0cfa85d9d268a21d16fcb9546f3284904038253c9daf11109ea455412adade8cf1e3d92305dafdd9b0ff72e7f040343fd1456a92d63f61e3a5f7a0edc90d4f282a6e5f2f47fab4de31c6380f3ae1e9e60d000000386c82cb08defa3b839dfb7010de7ece399211f93f5934b127727374ac0c006940da1a2fedb63424f75968996d9c02457a02a16d50db3b24869439ea5719bbe7099f74731c9bcabd0f3528d7049ad1985f8f435184228f49cbbed001df62252206000000cc16be4b89df0fd6800144ca705e7b06ae59cd23f709f1a86c7a2612fa58f57d40f385ec1623872b31e49f2d5fa43efea8ac79c57bc06e00e91d66fe52a1eaf52f993c292e91ed303d70d07be2278c3dd692c6a704db337fdb272938279db3b80e000000876a9941811024dc46b5441ea344c841d608f040bffae967f543af3c695b27654056ede1f4ca76ba0c8e38efb8d4db560f09e4a8db4dafb10e064a063cf32bd8eca4f44bec5ac6525b5d81ba956662cae1e2cf54786a1d6ead28a669645a1fe6070000004d465a97c000d81f28a3c46bb9d4b39063189f7970ad29fc1fcaf2427be1d41c4058d54992d37d43a8cb25b301f65305b486988e27944c9d53c3ddd95bca4b98d9c5827266d45964080d4501a4b5515eee08767d9618fe12cc2a7fd72d2f6cd10e000000ad96f1341930e5b0def1d0f923eb69741f43d14176bbce21a4fa3d7dd0e16fad407b397adb7640f5ae19040caadd9c8d5d9c9b69a4624be8286117737669d6778b3c6462b5f4181e69d462a02e294d814119e546979441b00d8db71c2d9a710603000000a4c10652a04776e1449f7f4560ed4160d81f3959291d20e8934e5d52d36df6dd4089c49fb09a1a5cc7a714e28543d0d354f74729e3f327774affd6ec9451d34c2d7125d9eed2d543a429f02f3ccad11e34d8658f414cb5f84b26a4e5cfc5d4d50400000005a425992ad18fe6bb2b9100d6c910a8dde9836778cc9832a6d452181c19b94240b247a614188f4288e6b04049cda3e26ad390f0ce8b6bfe4f81c63ef772af29b4f6310faab833bbf9cf366637142b3535cc20db325dc55bb39cea1b556738e70d0000003f3a3217c998d27988b3cf49b14f0232d800a6d620c10d132bc159acb369d83640846f6e2a85e72e1b2d10ff0705ecd74e99e322d6dae9b3e01ef7360f345dfaa65fc8b8647b95b8236f67f93e8e0a30664888e7f5e1a4cec515c09c101789750a0000000232aa7f76b50ee848d10899d21c8509e66f66fe2f080c6944c0195fe77114b94052593dcb966e38bf6eea7b83004782c32ad590228b9f3a2d61ffcd6e5554efab66fece9e726fe9bb04e3436018435fade7a4a1e98a6a7f6dde21e0fd2a07a008000000d9e5400dc264b6cb1e68f73419e267a690a20019bf893cb7cb2522289e32b08940d466a26abcc7f451ad4caed5eaa541689ba04a23a5e1839da76243dad8f011e3a5e80b31f54725baa7134a6c64ec62888f15869ae08c42e339187ed1f219fb040000001ce97661ee4a636da6c8d7e02c7a85fb7d3591d3701009c637ca98890d73ae694052da28c1c00f091f91a77d7a3f34d68f77dfc8d44fad1520ead2065374e1edbc70558c6fbdbfb5483bca6383a82a6af3097f411e0555aaf21bd685ba3b06270d00000038c8f7ed80bf1796999b043d4d3d12858980abe499544d5daa2b3868aebd3983402c1861e08fa16abb4474af06af955d3fd33cace0dd1c0cd7b3abca2b230ff6cd52a8aa7eb7825311ce2f2db10b980d874bf1c52b503462e3c5216c366fa4760800000019f048b498d63c7bf54c71e26f1c7c207fe7073503a400024b837ff01e5bee224011b6ea1c5b7ef53914d1b06a7781442e1253b0c48f4c5fafc2dae9462d8761ae0d0199c11c52476aa49898a8494ea8756bfeaa23472022ba468f13af1f58cc08000000b35833826845867bd740415f5d166194278c7af075e7c5332c659ffe5a87dcf140f88e0bbd209a803bb654c0722219c7e31069e5b5ba6f60253fee7b7768d9d2aea1e270a090513d6d3f7b5d22c9465ff89c633d355c80b5c5f368f8b7562b450a0000005929cc442ec12a98b4df01202bed467f5d681bcc0a5a74af581459e8053a29a440809addb2ea9ff5ff1e351ca493253b442dca969eb4d56bac35143e3944926a25ca7a15ebd0cee6107acdcb595ec0e775941438397ff99d714643ec32dce2df05000000564c0a92c9123e369603ea1b2b66cadda40d29a0620519f3ed641a46c02e03004090472625e4cb0c1e49e03e795052f92f8e3f47206b460cb9e71ce41df4df643b4926787fb28f423c48bbda3a1c43f844495d610ea8c18a8c9e5efa1f454e2809000000f1ee85c3194a824801b447903f4ad731396431413729070b145a44721272566a40ee3c0f802e194ad4a11375c761431cbc1029bc8be72ace1fa1337ef0c8ca1bbcd56ea2f87544403365f19c56ed417d8abab01526d0d870a5a3ea663607fcb40d00000085737456a9e4e4a8e0404e148adb83518b88007f8d5680e93e85bc4ec342d2e140cee13d23fea98877bda7a5b80b7d3bd78878db5c7520184f221d09546d98110bba5512645d286d6efe83ea5da5a0aea0d97a0321f6db8e667083c9ad43fd7d040000005863e9c4ca5590aba086f6c4177116b94dd88b7e79f612986632407935694b9840593451e2ba99afaf80ba7a7cef2ac13ea87242ea5afd7845eeed7794ca4082c947d1784eb2d247bb06fea8f8a0c85ea31d5803600a8c4c3b683a8d2fd000960b0000008f14e74803a031fcd5258aa87139f08655a5417e031e0873b129afb70ac4ec634014ed87df80703536d007536dabc0758da6befd09a692516d5f213bb512e49998e6f6d54d79c219b4affb2cbe8797813784c941569153c6a45795bef3d0205b0f00000044b5cf35b168cee1d8243c6f219871892a5cbb56bb66e0a8362bb97175deb78b406f1747352983b13348091a3d4310fd345bd5f64e00a0382ac9b39923204cc6ff629b4db32f2e78a478b6dab9770d47d9ed0275c60d05277802898880968cdc05000000f66494b791f0b4f3f4cf322aa320624ea7c1ba1d29e30a117dfc1c2162ad422140c2b330e7a1eb7ba61e925011ee9a7188f2a7d4b1c9c196c18af8717d0bbb882af8fddef2fe338f54af3279c79e7298b1964a80385332d1ef76c89cf450ba8d0700000015b391d41b96ce396553db620c6e3457933871d2b854b5255974a6e85e2141eb40d2dbfa5744915204392d795bfcb7dda1f60410fe5489b4d257b16ca6a783bb43cbe8591f2d9ebe2b8d14169178c66739619bee08075c29111e3f253fa7d75708000000c062e1e37fd26b8852f0fb667c379eaa806e00e076d621e16340199dff51db34400f682185390409787432e4e89f33b68b9c0d82ed43984dc5ce4d430f756201d01c9ed96914a4839e938681f08253fc0000d29a4a958381dbadc53128976ced050000008107aa363462a0e74d785644edf454a8e63a62c9254d277a622559f67914efb14027f2ae66ea878895961e9c2e0a75ff6f3e13b90c8ca2ac29a1113db57d5ba1d17a25b4fd847ccb0acdbe43499d7d44ae3084892211bc403fdd358958d18e7d0c000000e24c84e7cf72346370f5859266cb34bcbfd7007375c70b363b4b002d7b700a8340835536a2dfb4c3b598596167b345de1dbaece5489aac1a6f614bef236d118ef7c6637a74f8b8dd965d1ea5a9d0ef19174277b1643cd2beedcb6d51fade287a04000000e2ee35b381602ffc5c5515bb7f25cfbc06c8a42f1e53f0d56c16b96f83d80e4b40350484bfc4d95ed847655cad897ffeb425ce9021ec439c8cac98f9f36377529fe9b11a8aad30f578d24e86d28c568e7b5a71aeb6151fbf5c15eb249a0d56ad0600000014fd66310c2b3700db6d23baf994957877ffab247ba800d171c77e7d0c267cd1406e4f62893de78a34c887a2b041675272f23d0b2e601e22cc6dfa278ebafb51d625109096cc06c9639a24b804e749456e76813dc1f407bdb6177658bfe3eec603000000b00ccf4cb6b24cd4c65213c267f08387831af3af8012a3a94b4ea4ddacef8aad40e27097db98f43c557e878507f886b3600b5ae7aa991607457dcb671682ba1842fe24c8523d66e054d59ad4cf3350c5773e4a4f645d08a9468be0cd7ef307d603000000a4a8a9a44939b2d4b2836ffc6349d64e363c908292f6fdad96c0c876492e74364095cbdc82a208482107dcb46041c9a0d9a5b135eb2ae1b68a9d2c2b049f030c3917ab6841b009e9c22046850960b96bd723c2d3bc84db4f7b3876bcb6f827370d000000a1689bd799345c04ed268344c876a6298a8caec42072466d71b0f49bacd8d65c405787407e841264a1f01a18527a1fa095256d7f94ef39f4d3e981256ac1cd738fe486af01600751428a967948725d06b49cef7f071c935c012e56d8faf80a8d0c0000000ea6627c8f08aa22e2143d4a69e1b1cb0188f91e4d7234b3a15b446d89342e53408fe231cdac9202d05617fd6021ba4e68b7751d5e465fe179609fe00f490c18beb33f36dbb27cf36545ea1e83fe672978b2f15bc6a036b0a8f3aa113105f8bd0f000000b6f3a4da0a7ced96a07c76621a39ffcf99370ba74039a30551f5147060a498ce403f9eb5427b6d9986519d51fa26b7c72f5a7e0559c2d79580d2894ad057aa94c07bcc1ce4087c9b6b9c1ef03a70845dbc6236f63a2f571965e7ab2c4bf5af9f0d000000e9e725b172e3855cb8688111a74060e13200a99c60a943437443e18720ba24b340eb9c06b42e164c3123c350a400baf66ffe14de2f43186c7b49e4730d5e64ea2422f3646c36afd30d0bd343ddd6dea2536671ebec8ba72f3c5dea7066a18f3c02000000e47d941d7aa617a291292d11c0930a60f3d7374bfdf3ee8762c4194bd4f52a54401476687f605b2ddea463049d7905a17c8f94f62771e84549eaeca88d1184d37dfd05d4771c5841eafd1bef51188aeff4bc4acb0f8ae357356648d7238672880900000025379e1f04276af6057383e74eb224248520d7554779641dce21ab9bc637264b40bdb23b715f1750cfc789e139f18c1582c102cba57b0607dafb228fef0bac1f4854856e8cadb35137129e05c58d8d3e3b0b12ac6943141cf48a658b6753bc360d000000143d72989db37766729d68ef74101afaa0dcfb591a8dbe715373d91f82eb139d409e813b61abdf23d4a6de043be9df7bc1d44b5107e3302af7a3d11250c25d78eb98333a52071bdd56c7cd34c314d4a76b0320570bb6cbf224ed4f60bf2e2a4702000000e82fe9e158f519eb85011b38649f248dbadb299bb33c360648d8df832718cc92406b150fda154c9d8bf6715989b1b2e8b608dacf6ed03c5612992ec5c99dcadb1655aa277874cc50af2545d69a7feb6e5c070b4e898292a52dd7829bb22ce59104000000d7ad0b99c105ab652c9383e6d600688aca9dec4f7a17e3958002d60c76baba4540e61c95cbee674096ef3f689267e47855a590148b71ce5b20043a36d822b94b53c0968fc5b57fae1d35078d36e293af299006e169ad5ffa84dad6670182c3da04000000ae3e0157524f83c9ee6a37dc1f11d03f965b0234325009df890e52825128b42a4093c9a522a1cbeab805ee1155284bb1f47ba5c63afffd2b21f3ba6f86c448fc8b5530b10ae000306f339b47bd7a5882a5789094bede4f19753ba84deda04a800f000000f69d5782e5b9f36fab9408c4a20d2843ecadad1d7ee5bab6697b20d19ff89766408255bd71396e9ae61e611a5fbf01e1af2a3e3d149ba46f4ccbbbf8e0fed6e2ad260fd4e9c1d0bc3ea6d0b1ffb05f28fbfc0ba1799154f996f7b2d1f009bd830600000007961feff30da547b49abaee2e30bd4741c07c6f5b99646860a3fefb8a799b004026aef319d365b112a515543ae29d43436c6a989a64091aeb167196364a546549b0e8064015ba51b46853ecb4657e218857f09bea81cad7ae0cb1d2bacf8938020000001dd77dfae27fb3b3d8b7c9fed1fc5a14fb0bc396931f111e6a455bd6371b98e640d25e8e89c12429d910a513575ac1fcaf39cfb2de3be75e426722926094663029ce9acc29c3c2ecf0d5be2aa0933485facf008fd4b2703cb686564f2201c68b0300000001b543099f75b25346c628aeac4e402d1445bbdeab84449b2105e2c4fe21d21b40773ececec7ea7e8ec91d0fa70f18ad9c3f4b378ff472eb740fdc96a23fe627b3d51a980e92008bbbf40658ac27423b61a9ff221c9aa5dab47fc7490296dc26050000000ee61f10ecf14f4dbbbe9fbaa953343781aded06b5c095f011b3c21399b2a75b40463b3b8cef936126f0ed58738223506ad6dfae2bac70adcb7b0136b3bb9c4674b67bf0fc7e58e1e93b6783aa3acd72cf002636677a8e3c687a0519c72d1b2802000000113c4eb8eeb5da7b1dba7849d01ce85dee935635c7bf59d0ca6c36272062a31f400b84d6b3c858553fe5459bc8a1e8dcfdbe1771df0f25e42883f2337723474210144968521d53e9e8f92044ae5716e28c00ca4c627b453a8921a84d5b436b86010000005f17b4d419e5c62aefd645bffd3a6c74b75770da5f1366e092280667503683a940453f75d7a046f2fe225019abde20b3d6c489de23daa6a9f01f4c0366560501c1300548d8800fd637c90b84466d7f0c6ddec1f02daeecd0e20370d3d23884940e000000669af80def262af4463ac48265e05cea3c3f41e24cc492a075806ae6568d0a9e406917af3823e8c149ec13d8630d0a1d9cdaaded13c96aea0e36e7d3f37f51c240217bb83401bd72c1e023ed953e96898e179d989b5fbfc26510775d03f7394208000000661df36dac76c449f46c7f8f8a38b47e2e0d74faeb58e79938ac4ba91842d64a406ad74bf17983768d645c021cc2e8fdc10bbfc7ca0996ac73d54dd7132c8629f7341e42d379945795283e0ce879771fee4d128cd5d74f5ddee9e0659f84af0308000000921d44074018736b30629fc7c85f49acbcc8d05298c5c7fe93d4cd2fdf8a79e5406ac6054b8728cf974daea80f4f6c47efd94c87eca6fc722b175af23556499aa58a9992b898df9e0b6de8fe806d60cdb57f4ab4e030b5af6f7f151505518f5b040000008030a2a51874e29dcdc644ba128466a1b13d291d1af677c98712938be3ac7dce40101a2c8f89834770ef7b51e93e53396c141bbd96680d2a4b5995e8ccfd0bcefae47e560dbaf35253167b73e3178aa070fd8c6c71435c34993908c278d8449d0a000000842f447ba2b446cb6918dde3ac50477eb1585b8495c6b6e0a50b5efc90868bcb400c1ab3b76088ba1b1becdceb9304f8a95270d8f9d87437d66162b9a3398a86dd204d6006334d7ead192907c536ed33edad213bd89b340fe38a649a76ac71e2030000003e696f4b0b6e19dfeac5cbe91a454fd110bcc7d98aea18f4a7d7527119343403409abfece167b96021c3ea06bf831ed7922210489246d087ff9ff6e224a3bce8aa7bbe8b7f309a77b218012cd6127f8a08d66f8f6e99f25cf50fb0272b8ea2e40f000000ec419d05abb5dc6e817aa59bc71166a82023930a55fe44d0868b046df8ee1f7b404731d1d9b44b765fc93fd9fe98172f78d2ec3f7e132c06ba572243972246d01c174e4ad62e151d9e9dbbc3f25038f67103a2bdb69e3d60a401da10e65fbc430b0000000e9c2122abe8eed91d20ceae088000adcf823746370db4f902f0f9bddaf18620406a2bef109fee48e2ff5770057492f18238ed623b2585b5999c48a0b427e4dd6a13f144fe5052e650f758348b0a66bff2f9198d7754661a04880ca1f379cf3f02000000bf3ae2f2bd60e638c59c088def93350321c3cb78c3d12e3d80b5e501c1b5abe1405064a1ea60852f5a987c247be9b61af4444d2eecb27d86e6497a4aab0d2c43a5cc3826e14bf0b1f0a994ba1d724f124a1f365ee2341be4175568787f3ac6990500000027cd844989c8b2e74662dc6bb45806ac047d80d321739b882f37e6b151c088b7406bce724eea61df0757548495fb4da4be4628044048ad408390cb287fdcb26f65fb212ea24ab2dde20b2c23810198be234543116a51ebf9a0683e56443ae3670f0000004d61e2c37973d539a6755826d5535514e3409d6bfd0557dbb2d21bd1bab830fc40b5745f54c39dcc4f9300fb02111c6bbbe7e8c50dd8cbfee5eb282d5a2418e4ee5fdda95abc17e3b63fe2644b1e2613bbc0967a346bd66fa54869761252816b0d000000105f4d1785618bc84af51360ffa27580bb35fb51e5674dc6c745dfb3425af1e440c5620f2af42432db70dc472bed0261278c59007dea14f55b2609bdb4d25cc34bc7c263817cc7afd9cc227f0ef47e4d5b5005b7976a8825549e9174b0c171550c0000001cce0f52b5757299ffffffff0000000000000080f0f79201503b1a195dd21f5e17d74de4bc34a44839b0b3cf21d84ad071b9fea14dabd0a46b408b0778314c586b0022ba3e6c31a15274e7f3937d6ee6cf3708722cb00e13ffffffff0000000000000080b9009301457ef453bf5ff6181705a2b246cf859c986fdd103b7e4a82870f07a30cc1dda979f1c14ee6ef9a4a40954da2175c90c1c5631fc882b7e758d2a0573b24212fdcfe530100b5ee9c720102070100014700094603457ef453bf5ff6181705a2b246cf859c986fdd103b7e4a82870f07a30cc1dda9001901241011ef55aaffffff110203040501a09bc7a987000000000601019300b90000000100ffffffff000000000000000063bafa1600001f351f6d894000001f351f6d89443d7e711c0005feb3019300b60192f7f0c400000003000000000000002e06284801018231d41fbee5e24a3c761d03a9dcc17fd2c6cbe9e283e00aa8390fdfcf3545d30003284801014d3c0b1276b989e0d5a79c47ea4f578729dd3198bbf98304fe86dcf52c36d64c001828480101e9612efa01995b4c540c29e467b1399959842bb44cfe187d056bde7c01ec8e020012009800001f351f5e4704019300b82bdbc72ea30858e553f855be63c7e33ef7f856ee573fba1071aef99e2f3f0ecf25555167d3e7e3b9d743ab51ebb60e1dd0646c108468a80dfff45042f5bc76e100fe035700b5ee9c720202020b0001000056f30000094603503b1a195dd21f5e17d74de4bc34a44839b0b3cf21d84ad071b9fea14dabd0a400210001241011ef55aaffffff11000200030004000501a09bc7a9870000000006010192f7f00000000100ffffffff000000000000000063bada1400001f348f5d0b0000001f348f5d0b072d9d0b5c0005fe910192f7ed0192b7b7c400000003000000000000002e00062848010165258961c3eedd19d8ee3fe1aac95c660e1be01ff5114b270643e71dcc55b894000328480101fb4d107c445b1b5b06f4f2600a46f4e3deb1237784115ea61a62fd05e9548892002024894a33f6fd3cbae16a6a1ba394ff0533b402eae18a2c508fda152076bf2853fba60dab0d7d6d30b6f27f1553f04b24e735719027e3cbc6a88e9592cc03d51decb43c9a7f7fc0000700080009000a009800001f348f4dc8c40192f7efa59cae9a7abefe80a70c13cc95df7afc4047b43aca1ff684d4bd4d1c0ad0c6a272fb54b0d7554d8831b668e1b6dec6819d43662a2ec7031d771450610aae4ea528480101aab8ec3c16688174c38eefb28e36277da9d1eb7792b99ac35e2e1df72e5a7442001028480101f3e8556089f02329eabf991dc7845746b114b4e3fce3eb155207fa538376d8a9001028480101a82bdee1f9b24df5e5ae5c40d95eae98b9825306b74d9fb2a2ad94060daa197a00132457cca5e879281ae443b9aca002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac000b000c000d000e284801015c719d9a8bd458ebd6e825b071e71ffe0c74256c534cd8c14a2ecd851ef192d60002003fb000000000400000000000000021e4a06b910ee6b2800879281ae443b9aca004210150000f22012000100011284801016ce8de0d2a338abd835e0cafd445653e7331ddabe14946be1313c8c09ec4cb7d00032202d8001200132848010124d21cf7ae96b1c55a1230e823db0317ce24ec33e3bf2585c79605684304faf200072201200014001528480101fd78695ffd58402e209cb0b060c95b1a8a83dae389c7eac9554a3c086e52b898000722012000160017220162002100222848010114265b804cdb772e1c9a48d1dd67ad6e9315495151d6f49bf5f203b2b883ae7c000c2201200018001928480101ff9fb607464434b8240b30817c4e6c358ad723c3ddeed45b2b82d45b9fb0f6210004220120001a001b2848010135495972e4dffc56ffc325d2abeaa6db04e07d832cc8b8847ae195158fd724d20002220120001c001d220120001e001f28480101ab446ae5250a0e5acbf42540f12f69bc49e22d74782881442954471a01c67d6c0005010120002028480101e1e66c22df500de6499c055de17ff3d1216fe5f15247186dde0708e01c52526300010024c201000000fa000000fa000003e80000001722012000230024284801015b3388f01f89ba9313b2ac7bfae94b0062b73d66f4211884468fcf3b7ec60bd3000a2848010168395a614ffa1cb9a730bbf2c9337d7f45e2f01986fabb4c68a2abd83710925c000a0101480025012b1263b9fa1363bafa1300f300640fffffffffffff83c000260202c8002700280201200029002a020120002f0030020120002b002c020120002d002e020120003500360201200073007402012000b100b202012000ef00f00201200031003202012000330034020120012d012e020120016b016c02012001a901aa02012001e701e802012000370038020120005500560201200039003a02012000470048020120003b003c02012000410042020120003d003e020120003f0040009b1ce3a049e2b88fbf19ec1bf19a55040b1e63ff1e512ed3f3a82b4696946953983c389ea960c006524f49bc90563ba04c54d49d0c2a248697f32eaba92097fd5d726fa4e91f749e61f55e1b37d460009b1ce3a049e2ac369d37c8a9fbb71dd4a67b520e01cdedd2b68af23f79547aa56de7f505a0158006524f49bc9056034c8f378c65a7a2f837c86a9c061d6afb43bb893755048ae64876e99d2b0c2da0009b1ce3a049e28ee192ade5654d4756e040ce3ff1d264362a8032d91afd29fc2d6a11643e259480065059d3330b8d3c27cd80b3fd0e46b373e778d9de40a15bdd34327d709724c56d12e679830b3c60009b1ce3a049e2b7469b0fc074d5e3132ed693dfa8051d2c58897f31c0c3a7e24362e4e6b9995ac006490f6dbf2b01258127502a6c4d42b201970a44a30069fa999390d4df8425368c992461161f47600201200043004402012000450046009b1ce3a049e2a882245fa7b9524bcd501846c580b171c26d3e647adab59de9df6a004225b4a4400648fe40e362134116118ca6141513385bce13e34d6854fac170cba9d216efc5f71c1423d3ca8e60009b1ce3a049e2a1211845390631b7fa396c8989d44abd0d591d8264fdf4f9af74e96d1112120a000648f66a0636da2427283ea0bd92891d48b32f4464f1489fae9684ef47e15bc33d865089bc8da720009b1ce3a049e2b7c2e2f7d87d187c1efb443ac42df709df8507e1af5833c44265f11dff2ca460000647d5a739c56bdffa7efe55a1b9a55e20d9a0d5b34ddda9cc8fb15cd3810480f41b5fabcb599a20009b1ce3a049e2819998df0b12ce7f0a3c3e7474e2ea19cf703b39035138ba21edd582e2807913c0064748c7fd124987a104cc175cff079e7ddc767de7c18945406ae521e14ab5093ddc4ed618175e200201200049004a020120004f0050020120004b004c020120004d004e009b1ce3a049e29c6f00d6fa4d6c438499b45550b313bdd379c2ecc53156e7b20875f0dfe9a54940062dc2e0b07850518743ced0ce2f84909844c1b90f000a3ec96c66896d5a2ef71c3cfab5f2125fa0009b1ce3a049e29d1fc73d8f3f595d157ec0f8cff605694731387aa7a6b19c9f3886c7648c6bc640060d32f1801874b4a6303ed5565e9878c5b727902d93cdac1a9c9c3531c56a42db05aaabb7a25220009b1ce3a049e290a3db057ed1da78d374b9aa155f4cc715b8a8d6663b5602bd75a733ac9f731040060d30107816276325a469419b77eb341c7cb49b14545c1ee06df4301a0ac566bdda425e82e883a0009b1ce3a049e29ea9675841b12c2e3297fbd21685f9043810c0387d3a91f2bda202f028d2e9fd40060d2fbf9c3add483b4199504264abb17d1db2b27514b626c70d308431230755e346d1aa0a9022200201200051005202012000530054009b1ce3a049e2b3bee3d38e986408e3e4aef41c11f767864075aa1cdd8d2fd60c3199b462f52940060cac325cf303eb820f19876b593dcd332fd692fb7ce62f133d69afd1538ddaed2d10df2ed32720009b1ce3a049e282c21b9cffbd938a4eae2d45a5f5718d58c41997a016d3db7c062839e2834ba080060cac324f7463352accf8f07d56050efd8fb3e0ac9ada86b58d4526bf3694237f3d4f77bd27a860009b1ce3a049e2aa43827ae383d7e6a6c517a36a444e1492aedd8cc660fd2964394881a1bc832ac005cbabf73b22dbf18e28452aad9bd641f98e55d7744039595724c1ae5286a6a26ac2917414715c20009b1ce3a049e290945ee8a48dc641be93b428b5350a0a2b431e30cf84eec9a048e0ab4c73c0618005cb81c171b457c5e0cfa335d13c8bdc2cb6c84c534419d6a4a0d1d2427f5f7c6b3d52e5377ffae002012000570058020120006500660201200059005a020120005f0060020120005b005c020120005d005e009b1ce3a049e284cb4c12216493cc37bc6b1202fb63baa6e9ed680e434743e9ba69088f5d48ba0005cb72ba8526597e141a8cd5031943574478d98f63ac3454492ad47adb30c1b3531c8cc349a7ad20009b1ce3a049e2b2acc9eb9570b3f6af2038b2f3dee66e3c2222aeaa3033ae48b0eb629d554f290005ca878bd289b00a73ab24af4170e8a646f6faf62520a9e70ae02f66a8faa8d739ef087bfc7e5ea0009b1ce3a049e297953f1fefb57bf42a90e7c229798ab201a8ab9899b538bbc1936afb93bc15488005ca878bab9db3027b0096de4bc955d34d0aec0615701d8a028e921f17a53bb9348a002f13d86fe0009b1ce3a049e296e903d0f8064a0a4d5489621c40e7d28e67cb836d5b9e01bd2aa868fc324322c005ca823af161060bbd302453127d952ee1de2b6eb1b4d3effa98ee8a6a66d2d1cf34f60a8adf4ee00201200061006202012000630064009b1ce3a049e29c9683b106324ab04304024dd0417ca573067eb4442b6134c27a6982404081b48005ca08a3aeac13cdcdb94b5329e0ff38fb4327c57407542d0bcf751c201644c0ec7eb9dfc76c84a0009b1ce3a049e2b2e366dfd33c95baf747bd2bd9645819adf22d6ed3b6ae746f8cd2c098950d53c005ca0794742033278b4f2d833b5dfc6c48d222ade39fa4a96bc874e62b16ade02c50ac553929e920009b1ce3a049e299ddb43b3b281fd1dbf45da72d8ba52933d10358d11a1f982c9264a09d2d0e538005ca07946df6af48491234782701a48ea4a5a886cf15f978781699d77e4c3f6bf2ea201b3ebab5a0009b1ce3a049e2bfbfcbf73f29c65da86dc9e4151eb6bd0217f69d479db95a34e611d00bf7664fc005c9fffcd115a6d8a899164b1822d2e39dac978d93383eb78d0354004ae047083bd1275fa5323b6002012000670068020120006d006e0201200069006a020120006b006c009b1ce3a049e2bbc4f50d1e4e3704d5d7f8748df4d694ad5de5ff17346a69555f8f602c3284cc8005c9fffcc3071a2354621106c08ebc3e44c338088f0c135efbbc18605d7ddfab414ab0b88c4806e0009b1ce3a049e29e2521082f5dedaca99a8ebed3aff54022dc952d2edac8b72a90fefbc3e667cd4005c9f9f528e3f824ccb3c8c877acf99513bd653d35def60e18fae62414b0b3be77073c36abc72760009b1ce3a049e2a5b005b5345b45ae89ff72c377fe80b6bd054ef941c71d0ac178436cec6d23414005af4a8e4c84ce6778e76b5162b3acd0d538d0ce14f1f870abc0d7b4516106d364582e1e4bb31060009b1ce3a049e281d47790975834650e4c418af6424ed07a1ad9e885c07b181204b17a83c9b7a7c005af47b0affdc2cdf8da74fd965e4d1bb896131555669d612c644f8e8e2d51b91521ccc12a575d20020120006f007002012000710072009b1ce3a049e2a04d5b0078f67b2b5aad2ec4344967ad32f036baf72ec94eb7fdcde9a6315cfc8005ad728dfe7d6987d38e728dd85d6c10021deded0962c65c77f742201cf5e27d2382e3cd525f31a0009b1ce3a049e2b2321ce2377c3351f4d1c9901794cc4c6f090f145a750de2b676f6d1449beba3c005a72af28c42226c585c80807a816a6d3ac84a149a069ede2c4aebb370439d8419e8e05c7dddfae0009b1ce3a049e2bec62af0b0533ede7c76bd7357238cbbc902a42fcade1a4510f8b1146aa4405d00059912f4265c44e53e530f138dc23034ab3a93aa105beba7f3adfc8fac6756c6a41d3b17ec8c0520009b1ce3a049e29fe0eb27b4788a735247c531944b0641fd17658212c53d7d6ad87a1cd7505241c005900b60b239b27c8f78839e5db3ad4221bd66f6d6180cf1184d5d96583bf2ed103649493e116820020120007500760201200093009402012000770078020120008500860201200079007a020120007f0080020120007b007c020120007d007e009b1ce3a049e286d22de552c229d9e862e9e0310ce485fd1d0be68bd72a31a7419ccb233d8a4f40058ae4e047ebf424b8c2ebccf36bbbb976ebbcbeb7953d5946c815783d21c88131d32e40692dd220009b1ce3a049e2a3301a177aea3eefbf01bb25a46b2ce3965804be4b89cf8c70eb703ae187e0f200058a2d3fd4ac3d707c0bf6f11a135ee1c6c851d45a7348cb431f9172132ee32466b138b1525fa660009b1ce3a049e2866466493f5a96f24bf3c80e50f260add068a6bac0d9d55986836e2e4bb67f85400589ccf96bd47c67a33cc15c7eb18478d558617106c49971e53fb44cefdcfd01def54676324c8aa0009b1ce3a049e2b0c4935681f94ba5487c500d67e1904e941222867b22ed1cc2ee784c29d87df00005878e841c1336dd6c2dc87c6cfb33d88ffd3b1f2f220f90092ee20f25a0cf94490b56b50cfee2200201200081008202012000830084009b1ce3a049e2b8b9e99740af16b3bc30e9681f2c0ba20619fd885055725d29fa86047f1481ca800587482e0a7dbdb14cb33c7d6fe094c752529ee15ce9a43482d7e9cf6f76583ef338760706c84e20009b1ce3a049e2875e626c3e7488454ef71cabd700216a7a7d857f22304bfcbf784452e02a7e2b000586e786ecec3fa7ecc28b733ac93e707cf11ab01189010d43e05211703894bac9a0f9f6b7e9d9e0009b1ce3a049e29ad872f5b299ee14aaee3d22fec4365bbd0989780a2b6e21aa560efac23e564c800585b314223f431a3325d669b08511eda154caf8e2a894674119b58682a68c27e24f20ccdeb07660009b1ce3a049e2b5c1427074c2db329cc2015697045233b3c7b0b9f596788502e69d6644132138c00583c41e87d72753fc4158940c46108797153c2e535b84c6d4fdf70f945f866d2bb19774a38d57e002012000870088020120008d008e0201200089008a020120008b008c009b1ce3a049e2a706efdd1a2830158b555c377bfadb756977c4ae5e3f58210a9c1b897308ae188005815a0b53844d818dfd4152ff370f50ab0a7de08ede0cd56d266a28868d87b6099a40a45353c6e0009b1ce3a049e2b8f003243ed85015221355c08929d10a6e45d02db3bbd1ae837c2dfa632d2bcb800569e1dab97216e88373683b06a1fcb1f2e01f2e650b9cd6f64e5df8e5826b646f4a4e8028df2ce0009b1ce3a049e28f0c8115a328cce0ebe729c041c8ed0d986ad5aa20b9485ff04859bb0ce8517ec00569d8131e44b953cb7269341296477bfe73faa48d3b782a9d242932658b1fbc0dd9da4dd8eaf6a0009b1ce3a049e28bdf35b63290522e9b3c6edcc314e38b16fc3f50ab05584b4a0eeabd35427842c005621aad530d0804c02af186d0d951f649d9091d98f7646afa8e1336f3c97523262947a2f7f66260020120008f009002012000910092009b1ce3a049e2a9a8d3fbd125baa3db437de31ad6ad4c230385c3bc07bdb59233f7d2e4e3cc5240055fd4166339366cb7250bf2fc6c9bc6f91dfb5151f1354900de181ddc4e471069af8c40c7d2c3a0009b1ce3a049e282f946a992f3b86f0d2f83f35b593558e5199b43bdbe4c050dbd5280b66a358f80055ebf6c55e1002b0650a4773c4cb96e0d7674437b0084f8dbcdde8a5a06da4f55381027ee840760009b1ce3a049e29a95e722dd8e734db9bdae045b1bfc6856ff9e5ff62ef8f2373f8d263e82313cc0055aba4644d04d76b90d0b43e4f4e2004fa75686da2228a063f2c36015dae01b3aba01233956c960009b1ce3a049e290624f3bb408dde9d8c142963a5b5e05a6b45b2aa133c301a42011e95afce5df800558fe0fe9e66adee4b71ea37c53a39d78c22a7d5444337bcab1ea092bffc9f7bb7550d0fa929fe00201200095009602012000a300a402012000970098020120009d009e0201200099009a020120009b009c009b1ce3a049e2b6c7f9b796ed605164e1e9d4b3053446dc535d8cbd6caa836e616772bdae4c94c005535b64849fe7f6f9bd85d5b0016f6d5dfa99d23eb5ac4b1575af05db1dedd6a9a39f171313fc60009b1ce3a049e2a92ec7ed00e5ec2489bb4cc0f37b16e7754a148e113443ccd50bb902053e296d800551a5046fde558b2b2f620d8add53a175a14d651ce70897b905fa513c6c747fd62077c0ac132ae0009b1ce3a049e2af44d6d124f80ec402b651c90d172689b8ed721e17ba61ee2636d3d8ca3ede7fc00551a241ef4631796ff9b8ad8c438eafc451fd474a77e974b1bfa3e3a53a5d549c84f365471a24e0009b1ce3a049e2a2233561f00f5df0fb1db850ec76839e1f1b0a088f8eb4418824abd709ac6321c005513184582401ee4e016f51815d3338ab8c29e0bd03890feab9e861f0fcb68ed8353d02b6b02460020120009f00a002012000a100a2009b1ce3a049e2a8374f8736be34c1f7bec071779c1b4d06fa02d669191e361cf6aac8bb5c68ef00053d1956a3f4f0bf95778029be79b4a96dfd0a7896c2f1b2303e461971d9ebea30943f4cbcbe40a0009b1ce3a049e2a9bcded1950e2b9b43b9894ce4557736b6eb92868f77ff46c9143149617a48fa80053cc54d645ae22b045d350f2fc365eba43228e9c2f627dcd81169daab5f647006d9446a31d92760009b1ce3a049e2887c034fe70c2e67837c9412c8a491db244e41e9c1aa4072493a70576a237668800523b5cbbae104e8cfae9a113091b84c87afe09d9300d3b4a590b6e84e8bbfa27c08ca0ddebb6720009b1ce3a049e282a75874798654a39bc1b4970e297184afa4816a98593cbdba4d54e1638fe5a24005229c894b7d0154004c7e2ba9f771c433eeaa2d643fd9385e196be675dab46443bddacb48dc51a002012000a500a602012000ab00ac02012000a700a802012000a900aa009b1ce3a049e280a05c2ec183c3b3411074c24dfe3fe4694bfa2dad550a91a9375720cbd23dbd0005229c894b7d0142806043d2b147ad74636168f92c3439e9c855a7a62f1edc90ecb5decb849142a0009b1ce3a049e288b128022c2992792c7b30d09b644141790f88f2a04408dd88053f4be0a3e7f78005229c894b7d0143f8cc27a8677a5cd20d3e4b33240b9090ce216aff62f9818253029087709a50e0009b1ce3a049e2a5e446ec2be2527988f330ff73609f7b54f28158a8a3ac9f9cd0c3de64a3db674005229c2055c66023f4b3e58ec64113979c30d1ba4b20a7ee74eb230dfa20b9049a81f585807151a0009b1ce3a049e2bd14622192e8620e5b1e8fbfbd0e3d1ead5bd370f11b5325001ade2700863168c005229c2055c660122fa60d66c60bc073efe50fadd0ddcc561272f2a7df8203747af16f19049a3da002012000ad00ae02012000af00b0009b1ce3a049e2a7d00eedca94722f936f33901af8baa85833038637b53c18a8f0527f539fc0c78005229c2055c660165ddff0dc24e96654a4397e037cdf84df73c7bf80088d8a4afcce8aef254ce360009b1ce3a049e282eb1c5c14ba97737c775301131df9363827b0a9ccdbbcb550dd4f678a70e47d0005229c2055c6603c5edb843dffcbc92f656b36931a259a696ff945ea938b63ccb9230131b8de0c60009b1ce3a049e2a60e82f2a84ea0596a4e06e4e060e2cc630f255072f9c21814bee6c1bb363b560005229c2055c6603c701fae1858c4ddc2e68a82e1e2bf6972164dbf247bc6b4dcfbd95f9edf7b99e0009b1ce3a049e2ba7a728957ff543d20db7d25c0c533e67f2c54f042f70f8dcad9646220086b868005229c2055c6603fef90ec059adf8005d61f1527de5a0e1b1d3ee63d607634c4d36ad2ebe63fd26002012000b300b402012000d100d202012000b500b602012000c300c402012000b700b802012000bd00be02012000b900ba02012000bb00bc009b1ce3a049e2baf18d69d4b7030e15c590440e874a77c562957255f9dba3a4922b8ee5c3a39f4005229c2055c66025e3286571c2422c4c6e8c4eab4ac0b8fcef57950bd2d5c7e041adbc16bc3697a0009b1ce3a049e2969f457e68d994d723703c847e6cfaa7bc415289e25939d996e07abf29fe06368005229c2055c660382ef75f5d980998f3d6f972187346e03cc2cc1a6207322ad4c3bb3e94fc59cf60009b1ce3a049e29b4c2dbc9fc554fc12c939cd5c6409f8f2f1aa23a564b300f5477b2d0f269fdfc005229c2055c660207ca8ba58d1cd91d0a583a768112d51295d4efd9fe99259f0d4da5a3d6c3512a0009b1ce3a049e2a9eb2aeb634f541e04a224b26b80cc6d7c99d78c369827856e7712572afc54024005229c2055c66023be3bbc78d2197d05ff4cbb3ce4e02c3dc30c10ba97af39b20d40c2f11c356e2002012000bf00c002012000c100c2009b1ce3a049e2ba8682a717057adf008bf4d8dbc053b4bd9262b7c26b1667fbacdafa6d873bd10005229c2055c66039b58444067d863896f5380ced22d5540b1c05fb6b2cee78bb6397b07e43d2c3a0009b1ce3a049e2a297d7b315de9b2eb01c2ff38086c5f408a939596e9c976dd5983e804a9929d88005229c2055c66038a07b9eedba60c4a5720f4404eb2319d594ac01fcc097cb92bac153c0bc469be0009b1ce3a049e2b9887241874185753a9ceec1fa8692991d90784805e2378ec9a52a5f6930addd8005229c2055c66022f24c67e44f32e9a475a7db1d8c9cf54de8f7da6e0411a2d76444feac8c67ae60009b1ce3a049e2a9162151f32150725923408c2d456060500bba55e7c3c3202a718f042a6a199ec0050a56ff40f30872b91def8b3e3c77a66db288991637f705e981aef30a18455d634d26513930cce002012000c500c602012000cb00cc02012000c700c802012000c900ca009b1ce3a049e293530d5c1f6564e88410d2a8c8b6500b4fc34029c38ee6f4c7d3337bcdf19f5080050843a35462dddcedd6eb17b65e5f17f4dc0adaa102c83f8c64aa3000dc42d836bff6ded8e1a160009b1ce3a049e2bb7a1d5e80dfc4cdb3e921b4f14b863012d64ad078d6d4a9e5fb8e6b42e471c30004f3142adb906fb8b972b6a9871b613e1a8d863525ba82f6631e7b71e5abe6256e0bee0f2d99ae60009b1ce3a049e2ae09235ab69b78c972c5fefd2dbab6ffe34d67d619bfdaa00f1b06fda86a4f734004f3142adb906f9e07ef68daa54c13e081ad58d7d53812e9544b3ebfdde0940e36ee1414531ba6a0009b1ce3a049e2b4c0e2fa8dd3ee26293c68c3be7dfd6224520f78f0f393d2a3fd61c87326ab5cc004f30013d39b940c243e0ab84c6ce8324939e1888aea6363bc3b081d6ad18eca492fb89a8125c9a002012000cd00ce02012000cf00d0009b1ce3a049e28594e3a0afb3f15773437149cb7d42adc35c97ed17b11210110213f759cddf580004ef21e3f99f56d9867e1d8c71f6175a5ea27ba5cfc9e1d27e6234e65fd7306a363e0a1de3c51120009b1ce3a049e2bf4b58255b57f08de585f10c25e1876eba92e90f2a95153d0e7e215305dfe9ffc004c4a6547a477a506a492cb59bef4c9ab52def25e140442bbe9f26e63e71ae787a9a7fbfa1aa8860009b1ce3a049e2b2260739dbeb4de575cd89f99fee839113d103e0931fe660551dd19e9d241fa50004c0069ab267093af9675e686c90fe2a02290d434d32e987beb21ecda88dc46dbbec0f2537f5e0e0009b1ce3a049e29e47d7220297de6dd3aaaadddcb117c02487c723bb8194b333317e01edb4e3240004bb090ff2a55636802d2ba64eec84cad5b03ab06554b3f0e1e57ac20967e14ebc37106f31153ae002012000d300d402012000e100e202012000d500d602012000db00dc02012000d700d802012000d900da009b1ce3a049e2a8cae7da58f2a5b8107801387f8f1baa656165860de2d85848034d7a19999e86c004b12b0e826766e2a10b37bcb1ec1baed930bf99ce1842d6380c306b80fcb5ff2971f5fbaf3cd3e0009b1ce3a049e2bd67c56622c6f08ced54d5da5fa29d6873e062ae7078c38edff8d0af433d32e28004b12b0e826766c940fa67fc37c020ba8a5ce7e7a9e40073034f2005e95432538a8f9d72a496b0e0009b1ce3a049e2a3c01eda91cc7e065b42121c2499dffae2a43f05e0d46bfb80444e7c55d9040a4004b12b0e826766d8ada53fbe1b8204016a111b642c5c10b6efb15a9157ee01f73d1fc76ce6f42b20009b1ce3a049e2b807c33b4c87f02f160a8fe6d72f37130fbd18901562416b13996fcccc850243c004b12b0e826766eb823314e26d653a3dce059977a0c83c970a98befcf5e75c937aa9db29d67feaa002012000dd00de02012000df00e0009b1ce3a049e29152da877dd3199a7e3fabbea2d6fae3ab0f7f5be935a5563ccf310800aef9058004b12b0e826766f0e08c7ddf1bfc3c18fc59d5a8c49b262d4a98de685d888117d87e80e3688c12e0009b1ce3a049e2bd0ac9922621256bddd7383e14d9dc4e4dc6923bd0b0f65a6d7b0343153e4b0c0004b12b0e826766c264b4a58989a560db1e2b784ec64a2cd7f1e31f707785189844a455aa2f019da0009b1ce3a049e2a1fdcc407f339819c7f0cede372b1599f0467021ceb45dc415fc392ac280a1e8c004b12b0e826766c200da27d131557afb6ca1c7542ed43c867320507d68f6595dd01e0bb32c471ae0009b1ce3a049e2a11a1fcd7db2f698e3cd70c136b1eb84afcc2e447701412fe33adbc853a156f7c004b12b0e826766e22d3e8b9e0208c7324c00eaf69b7ea62df5ba4fa59714f465dee6a87953d8c42002012000e300e402012000e900ea02012000e500e602012000e700e8009b1ce3a049e2b5d77ccd10d8971d90a561cdc387140b582c23b80741c0ab53218ccc7be156408004b12b0e826766c9b866bb0a015a1b9cb4a04259e75c2854e14017f653f3e42e34e3e2f87ebeb1e0009b1ce3a049e2821d90708575fd760edaa982534f097f463b95e095a37d44b95e142f14305bb24004b12b0e826766ebc819c25d36ea49ec9b99cfdd3cfaf91d642ba9dc94ff8273ef4a7b4fd1690220009b1ce3a049e2a3a4a5f35de80fdff36122b9471c8b6a5279924c4d194a7f2f4132e007573b028004b12b0e826766ffec45c828ddfd9fc9b3f6fcc0b358d37753667ccb44a8a5af094e0c9c6ec36060009b1ce3a049e294ccdfcc9e400b0c105f73bca7042417a7a9c914bf7f575a81b9bef286cce7cd8004b12b0e826766cc9ba8487cda2ccc88d92c89a7c1459c7585459e44f942bb38fcf192199fbfba2002012000eb00ec02012000ed00ee009b1ce3a049e28e82125c37d81fc3d6c88e9774c96338fc1655b07fd097dbb28ec4672994337e8004b12b0e826766c82336dc9226ff3651616ad7d83224c1c7bfdfc647001283ccfeabb8a38e526120009b1ce3a049e2b42853632f476064d70f571e0bf958822a0c9b0fca3fd4ed16d593b5c6c09dd0c004b12b0e826766dba3eccda1a1a67603cc4de6a8b3de4f6f42c68b481bb25667ad0f2a4882697e20009b1ce3a049e2a7cb2e113d592d8546e3597989c40fff73e25370a03f9f32bde7a922b0a4e59e8004b12b0e826766cc9c22d344f11ca4eb99dd0fbb543fc11dfb1e86e3206669bb76df787e1f02bbe0009b1ce3a049e2966b73fc185114aaa5a3b59e488b06019f1bf0c08d6d4e17df030df62ed41c6f8004b12b0e826766f32f2c478c701e91245aa3d88dd55817e44c73d0c42da9f2e84161d79c27c223a002012000f100f2020120010f011002012000f300f40201200101010202012000f500f602012000fb00fc02012000f700f802012000f900fa009b1ce3a049e2b49c8edb025fd91dca7ff4585b8064dc903c48ae6a4116a47f6f333ac6c3653bc004b12b0e826766d2e07107e20b6685a7c898dec3007a9785808ed41d747c0d75078d63b7c76d0e60009b1ce3a049e2b7b4f167bd3cebf6b7e195487cd9f9a35af5df27ad0236b5ab5b5e7b7945fc850004b12b0e826766c51e74a504d562876807e239c6cb607461d858c47336791a1bbfa84f3964353960009b1ce3a049e29b0a5a9aa0d79e5fd9404a4394040ca984cb484fe4f15ba05703cb47baec056c0004b12b0e826766e158086f70a6e1366c4ddf33f82641fe760fed5c84a92fe68da8a3967be66b7760009b1ce3a049e299061c5757c8cb361f41cfedb8a6fd1daf71d106eaf41de52192d7a69e3f12fa4004b12b0e826766d6680c6a2a94f3515ee812cc8865a8cfb40ae24128c0f68230d7f03c9055c1dae002012000fd00fe02012000ff0100009b1ce3a049e2a861b5a10f457e1c0c522d200486f6e4a863c6a9695b1896efe0fc6561b6ff080004add5e4347a70cbf783a061684fbe1608e701ea2c6f13371cf276862016b349ebc1150977c05360009b1ce3a049e28c6de44cad7b03ce4300994a88bdc19f24d81249bc712a3871cb2d1811fe84b18004add5e43472f6c60dd58645d6b8d97fe4ba07286e084488fabb602c0872b5e57c6705ed9de64020009b1ce3a049e28e1829c3c56aa9e495b633b9d91576bc4cfab9d9424740ee29c4f2d1e2352e02c004add5e4346f38f909342cba491b08507f8a25ba54c409ba6d10cf7b9cb58a3eaf5e464fd7bfe5e0009b1ce3a049e28b1b5443761687098e543d638212533287db8401325ff0e631e6b709346166970004add5e4344d8ec1bed0b68ff4bf4108f22687b94f94b3a45c56a98c5a293986b062a2c72c4da460020120010301040201200109010a0201200105010602012001070108009b1ce3a049e28d030689304892e4b8ab43a0b8d33923446e08406b17e76f020e93720e1b25fe4004add5e423be1c68ea011dc72f54b87e8b43c94a59c6d499c19394fa56f6d0df127a393d11b77da0009b1ce3a049e29939ada3593741c99efe146539d064d8b5e4a68e498b162a4a01e9da6b80cf908004adcbc6676d254a9cd2bf686dbe7ba6d440aaaf67f9be34e0b3d990749e7e700949d420578a8a60009b1ce3a049e284ab9d7161d3190e1db64375aa8bc5f7fb41b602134863a505fb6b07cc3d10298004aa3c85eb5739c24f830979f1ba394187d506e3dd3568fed7c2f320e5760c540b5393b590983f20009b1ce3a049e2975701845d40ef9952c4373b700c5cf46575521f34b2c939fab5ee8b8c8fa4580004a98e45a4ae07423fef9cf49149b2e2a3fd7dec7dda3a1f0d120cdd262f6ced9b72be999785cb60020120010b010c020120010d010e009b1ce3a049e2bfd781ca6c18118e1f848fd06f6f0e82987fa9c68b054fd0ed8539567c1dc0f10004a6f2acabf7ee064170278680894f6ea68ca69ed38d7c8004d9acc66269c52dcba495130bf58960009b1ce3a049e2bceb1d28aacb5ef46647b620936f72ced5cad00c829013e30533be67861458038004a3a596f934364424f5e283adc3e8da52c90a2dcbd07e311c826dbc4b63dd81990fb6cb7309bc60009b1ce3a049e2ae51a43787e33b9f5e37466755d40a24ea61e1e6091552d000cc1bfba34923d1c004a10d3bdc7c272c0b948f616efdbdce362a389bdc2ff7c1596075ae4b69a6092b2a7535ff8c2360009b1ce3a049e28b90185a659a7709da378232b6c4d95ef35371466565643cf2fce5b0b07df67300049e95d7d3abc26dcc150c16fe0897241e80f4413339d2e0415efaa02a2c352173263a0a0b3e276002012001110112020120011f0120020120011301140201200119011a0201200115011602012001170118009b1ce3a049e2b485a42ac81ee3eebbea73c091e3d5bd664d4c597517d96903c9b52b20ada3dd80049de1bf18e5df560b8a7b21c57d27f0931e8e6cfdb7ddd6b4e5f2799f7d8ccab31d578cc667e420009b1ce3a049e2b0e837bdb7cd711803c6f858c71e7110feff941b97f7ce9aa76d98101996e28940049d940c127de91559766f814cee12945ec3c4a16cd5fe28b8aa917aabc059569c0591e5ab8eee60009b1ce3a049e2ade9d952b98c371d6caa21ceee00f99f6499ce92a088c945b394a8a5347125e900048db62c99fc06e9fe01ee4c98aa31c42d62389794ddae1692e08d60154e0b6a8674d7a46cfd6160009b1ce3a049e2a4caa2881570aae17143c57cf873e001c35b517b33511de40fd22b02f328f47940048b021eefba966a3ea0c15b74bf9ca563a8cecb1faec9acdb620557a084a7c862e19df048f83ea0020120011b011c020120011d011e009b1ce3a049e296899b61c9dba0cafff76a30f362de4c49b725cd891af04fa91a007a986b237ac00483070e9137ce6c7839a36d9c3a50549fe17f50cbb02e554a4b2c1d257004b4c9f707134a7c6e20009b1ce3a049e2b6933613d85796034b8ffa681e9db9eb35237dd9d2b01b77b675a38c6ef723204004811f13f87aae1e6d4bd93473ad1dc6b84176e07c834f1a1e10e2595739841ad9724a93503e1560009b1ce3a049e282405354ec68e6046f0089aea339c6632a632e786dbc788fe36f4ae4f082e233c0047c1388801c5045fa55f0aa07f8a913949529f844a6d4575c26fe919a23051ac8ba288dadf10e20009b1ce3a049e288ffb120358e28164086da0bc178cf7ec0f7740bb6fee668a0ca1665944058db80047b5d55713557d528e1f2a08f6c977deb5e1ba1eabecda6ce4b2ee114eb8f678ca2918f77b615e002012001210122020120012701280201200123012402012001250126009b1ce3a049e2bf7bb19438ff352ffce692cc8a4cd9230285f4cd5b8fbe589edfd3d4dbb09f0980047b59e5b170eee495ebb678b36f86245c959728e2166f3600d364b3843284667a297061efb9b060009b1ce3a049e2aece1c1b1cbdfa14e5b6f8c5ba51095292fc65df1e9bff551a073ce6a9c88ca280047b34039763f46923f7fbb1c77f24be5deabda8e6b8930675d0751aa2d8335dc8d710cb929842e0009b1ce3a049e285fdc747baf92a10b390cb8eb30ec83c9fe88855aad2314e5880ea5357d5ecdac0047b280b5a44f5e95ae334a41002a3acb6bd81cee5ef4258f7c1003c7d2f7f4c3b9b385c711968e0009b1ce3a049e289742fa27e4a2a910855c83d8fd95da896cbd68f24dd5e6ab769bc61a9e3395f8004766af2608ee4fce1db1c705c494511a33bffd387a79d10f195d0ba82653325f88a7d52b8ee72600201200129012a020120012b012c009b1ce3a049e2b3c1549d1bb22d904213f27ae62a49d36d3f39f8289546e330b0a4f070da32f48004762bb37158a0a8b43081357b4885f7d6a67a762a88101e31026031cf6ec6bc1fe92976035cd8a0009b1ce3a049e28dfb76613ae691b2f4f640c7f2462929373940dcaf83f7a2de6ef71b49bf6a324004741c474854f38d3a5c152504a1ce49bbd0c5f022169be07c1f530da7255c17855a8bd810dde7e0009b1ce3a049e2b12ad2cfa4dc4214b7b3ca584097c65f373a167c034cf92eabdf7ee51638760cc0046e03de99d9f619a28a87acfaff5de1c222cf4af07dc11e8e3fa4aadef5dab7ce01c114e5b9f6a0009b1ce3a049e2b7ba336e75f2feb3469f9780172bcd4876541b62566c865379d75a616fa536d500046677cb5e7d85ae53147ee1c9a4d4900c0c292df9fee569b02e0554c91ea3774f861af81fc3c960020120012f0130020120014d014e02012001310132020120013f0140020120013301340201200139013a0201200135013602012001370138009b1ce3a049e2a6f88793e800863f5d06808854a07d4693d1bd9dfd9d9d254707c1e502a156cd00046677cb5e2f0b125ea341585947baa0194b1406662fccc2693dd8932211203a1326a59f50ce64a0009b1ce3a049e2af589277683dbaa65f0987627443eea11c363e33865caa2fbe69c806ba2a605980046677cb56a855b98c7b95f42a89c2a5ed53d6ae8dc665a1ae424ef1e961bac85be227ae5dfce5e0009b1ce3a049e2b06ade9fbec9274d98dee3e3603cc6ace57c437c65cf62ba4489ef67b98d715280046677cb4ebed06d16d52d1d34af75b70c1a1c7363abfc373cf7fbf3229cc8be80276825670bff20009b1ce3a049e2b9acc7d33676dd78d9d428b35f7f200c669c016aa2cb64a164a05a6368530f3680046619860c7aaeb23623fe37a6a77b0547345396708c9363518d18af94528b92014a6d7950fe9b20020120013b013c020120013d013e009b1ce3a049e293a4568f3c6037d3026be90e23fa3f4b97b16e37290884a822ea41a4dd51cbce0004661985beeda7e8dec11592e433234901611fce32fadd47e24f7536ac942b81c5ef7c26d979dae0009b1ce3a049e2b9d23bb63fb046dd4737caeb129b6b46915bca8d50acb914f0d9d478847531d0c004611795c6765afd9b69681f6a2d635073aeaad83c2107fde9639331762bbdc489662d80881fa460009b1ce3a049e28f94183d880d06db698ccbb5173f61864b0f9c50921f8aaf01901be26722b4318004611795c6765afb08339ae393d96b9a5c519258e1c62c12c65bd32222ad5c45d8f201fa7c8d29e0009b1ce3a049e2939a4ba49026f7c049b6d8d4c373bcdf92b54adac8416e2cef25a7c4f9e1c78840045e2dea47e2555d1dac2c9fa11b7233fb8fed809b60b2242e804da5c370c791909130c6f635d1a002012001410142020120014701480201200143014402012001450146009b1ce3a049e2898fe38466bf40658f3e0759f616c882b984d1b1140ebb23c415f130c361deb1000451ee9545ad3e62bae4ce9ca3b27c4b57c5bfd4c91ed11f604df3803cf0beddb4437b63c7ccfb60009b1ce3a049e2aedb325e9855e02c9c14394a2870909a6127f00beedcf5924ba8213ddd020364c0044dfb24791b281a13f11ff3180a7b3dd16e833c3a411c9cd17c8859c0c288098c80fa80b47b67a0009b1ce3a049e28273be7ca56b95a905815e643e5cfb3d930aa3af69113461655d5b5e839c8a7600044ce71b55956cc848cc771bbc8361d86f381187db7bb35f83fe8ad8241d33b8c2c9acaf59723b60009b1ce3a049e285ec5d338f84f9d2a9d8bdced0b6277ba84d90e014dcbb7b8a866c40ba9062b8000448e46bf07ef14a82e510b4d9f501503c4769c8f05cc7f25236f156f00aacdee9b7e06eb07ed8200201200149014a020120014b014c009b1ce3a049e2bb5f38cafd6ddb7ee65b8209b2ca77c4550993a408876fc4ad997b24e59e0db3000447771a862b6a2b3ff15b5771e8aa82e713e2ff3943969629e0f64e0ddb68165d190c2557ce5b60009b1ce3a049e29ca93cd684d162bf8e014366ba27e25ad6f2c2230b81c8c8e62a5f77368ceb4e40043e58f46242b606095072f6eb127007e98b0c2c855151bac6b94c20700df1f544969a2a7f853460009b1ce3a049e296ffd47a624cd4afe4de303d656ace546daaa6a0e2067b0eaf1f156a552c4b5c400436a685653597bb41318996d6e8ce34927a5ab553a01ea365fc17998486465516d4fd420aa885a0009b1ce3a049e29cf0051ea0e774e382511c6cb5b56aed836f6a7f00d057870ce013a1d8f0d65480042d01caa4e2d02220f165e4717e1f52cecafc84e487107c80ec6b4b65d993b9262347297dd74ae0020120014f0150020120015d015e02012001510152020120015701580201200153015402012001550156009b1ce3a049e2ae8e9f7eb1a09fbd7b59d8c29a76350dcf8ffefd9d0134cb3d94b166a50673a9c00423078f373d0cc3943525f8161f8aec2fb535335fc2bbb1ab0b47681903cb447cca69824f1b9ce0009b1ce3a049e2905f388d04165316d84aac1b52d84805030b5001f62ac0c310152a5865732fc2c004218566845b33c0be1e2bdb47318045ffe1bb6e79f6bdbd0bb5413fa37fc222bfbcdfee2e857a20009b1ce3a049e2b4abd38638e121e04340474ac14ff573fc36f948226ccd8a30ea5837893b634dc004147b2faddfb7c5d2496398d7959f433a2c366c5656ef64a8b1e04f32f4b49c4156665ec1a258a0009b1ce3a049e2996780d709e23247fac421007cd882e49925b02becf95d742e5abc4a1c608a2b4004135bc6d8c84203536dae1af1fc09513176aff7c79d638ee99ae975fd964bf942db7d0fb91b77a00201200159015a020120015b015c009b1ce3a049e29c1ed68e4321e0b709d2a0cd77adda44b935846d014b4b96cff311df162760f4400411ae18f52445c48921455da5b253bf0a0373e940dab1f62c33db1b6c38e2c2509e90b18d6d8b60009b1ce3a049e295029d53a3c2dff3c6e34ed73018c838ceb975316178267ed1e85118a122ec8f4003fc374ccfc2c4a3a49af7f589fe5c368507b67a2fbbdf28486af9372c42a64f913017cd699bfa20009b1ce3a049e2ae88d192829741d38859f1efcd4c7502a94c4ff7e15b030b9ee6a22c1b1a01cf4003f4c1eb9ae57bd63dd94a980935e004b618f63008b1227557d464cc7cf26e705a8a109108c4efe0009b1ce3a049e282be184b4707e5d383db329e08422c6d1e0f9e0d1243a48a1baef971001489908003f42f23fd8007fa152ab83b747d20af6cae343449237c3b902628861aff74ba65a90133c0e489e0020120015f0160020120016501660201200161016202012001630164009b1ce3a049e283e9d28d82412218e439014390dbc6fc884eaffeb80cd2637e4146ca1b7a2cde8003ebae0b5b5c04c3c44edb7d681a9eefb9ee72b66ec874c2dcdbbefef4f9cd0ec9131c6e32ba0420009b1ce3a049e2b63126b00325294a8aa455fbcaeb04e8f63b8935bba742786d175a27d114c38bc003e0f7262cbaf17aaa83f00bd051fbb5536517bb5a916537bcc03e27a87a7ec0af1943fa239f3420009b1ce3a049e2a32fa67c5d6d23b76e3271ba36d6f2a430e3dd9896ce39da6dc6482f8535ab304003d63a1a98666b781055db64e196e3396ede7bea28437c1d49f6db06acff8689eb73b13ea3f53420009b1ce3a049e2ab7c4f6404d141554b69d9568b5cc895e7a19046737dec62098ce405e5a60f1ac003d42727a18ce22763a6c36379ecbe3bd2c9d80028a02c67b03e5e663eb0a06339ab1fb7caecfa60020120016701680201200169016a009b1ce3a049e29fcaa0327fe256c557c8f657084b9471d3afc0f9b0b025f8fed485010765d4afc003ce3d45e78805fe6fb39fa18008021f69cf749ebd9830bafe10e67757265e392706ee3c38acd6e0009b1ce3a049e29bccfcd8fec7016fe01f73db763a872c69f8b20fd25a08fdb299e2711273f493c003ce3d45d6e182e9944ac68574578f8ed0bddfca72d4ff96126182d0aba84e1eec9c49d3719eaba0009b1ce3a049e2b694db3461d310a932a782a6749d80ad06e8dfe3c069f10221ce720fccc791494003c5ccbdbe14ff8feac07f0e4bc11320a8da8b1b3a66462b53c494a4e14e76c238f26664fffe24e0009b1ce3a049e29de530e29b428ececaa5cca88498867104d818539228fa0d9882b6e3179126348003c4ec78b8da85630b8e5463bb6f4bae077e1956a261234d3f1df5317559c2c0cd5f4b8057f475e0020120016d016e020120018b018c020120016f0170020120017d017e02012001710172020120017701780201200173017402012001750176009b1ce3a049e2a729a2016586a2c3ed8971b3d9117350fd9c05dfd034275d095f67f669d3ce80c003c107c9a79dee1d347c45cc9b3c30a240a3994be6e75f39126d0d63cf6a853769ef998ca6d590a0009b1ce3a049e2a21b9bfed34cb39d4cd0eea55de3b24e2847756d9b601bd5c5d2b8b5a507f4b68003b2852b7433fa89a0aba445a362a7aa7b5be60b52a9885315a3c192b5313e881d68322578e79a60009b1ce3a049e285458fe43317036b3f6e31080dc2fa71524703dedea477800ec478c39549f0f0c003b0eb2ba2ce38a6ba35a67d878b9ce8cd176458a2afbf5b8d642531b3f489a9fde93f24a1ec7120009b1ce3a049e28ec231368c0b82add48f5ae075fab41d4818a47a7a47d3371438c673bbcc3e0f4003aa8f79289e1587a27dbb19ba353b571991f65bffe5aed1f4760ec1b5e2ffb23dc9430e3a0be2200201200179017a020120017b017c009b1ce3a049e2b803b6a331c21af8ea439ed1ea28fcba067d527ccdb54351fa48088eec59e5d1c003a8f15fbe16078e5b6248ae957819c53195463dd7a29277835a5b27323db64cea1c0b8712907ae0009b1ce3a049e287fb7cfd44aedf69a6270945a7181838c3bd1a67b2df6e4e84dd305b3c0b4454c003a59dce335c06163653295d7a0ab3ffe70a8e39b431046c93e5a51976ec30f17c81151a28b62420009b1ce3a049e285a043b5d13d3ff7f2c676de0a4ac9974ed74888a4cce54647d62d26bb09da040003a4ae5daabc3ec303963b55830d2d2853361134b7618ab43528bbdaf687a69d26867141792ffca0009b1ce3a049e29162b9abca5db8228938bc22ec2d055476c3a1b79cee4d40d1a2b82c190ac93f00039d3ff81c922be648a634deee5132ed07cc454c7e774e25efa5b427d89aa80656253524aa9f8de0020120017f0180020120018501860201200181018202012001830184009b1ce3a049e2b3a8532d59461f7371269d42e0615417f20ae4dc323e03f4ad3c2dbd962e3d1000038ac1d69318dd91f36a9b75b9687f793dec216c606e3f7c6bd8abbe1afa40a288e30de2950ef1e0009b1ce3a049e2ab24d2e3ecc478ef9009a2503d8586460dbf84918246f38480d102c9b6583d0dc003877e20fc10eadeb73d6117661e38f086a8631096061f73baa8ca5181082177fe773edeae06cd20009b1ce3a049e2b044f80771abc64a0a2ead36b6f2b7b3d1db71546f07866a4bdb349f258a1742400382383abb14bce7242fbe7fc4774f4d3dab3613e7cafa7b079fa124a33a6fc90ca96baa69704c20009b1ce3a049e2affd2b95804e5fa3ce703c2e257b43047c3c1320db1a83e10985ac083b8f4ae3800377ea4ee0b7ebb751d7dee28e7a37b1e3572a62abd33af2ca3f86d1858a0cce6ff60bda6e3459e0020120018701880201200189018a009b1ce3a049e2938d22996e473b8c962ec85375458a87175ed883105844a41d2a5c672dc12422c00370dbb114d6bfb06d5026994fa04e5b710b4e68c4429a9e705ce1a95c7c0813127b2a8fe381ea20009b1ce3a049e290ad48f8e484399a940433bebc9de826095fef341055ddc833d3827f09c72bb600036871939bf6d6c1894d7dd51f484773b9a020f2a4731cc0bea996959772f0026844aed6d0b459a0009b1ce3a049e299c3ffc3e3e541fe89b3402e1d298e1f06c6a4afebbed682260d0f0d718af9acc0034fc155666819c3117a1436555507b67b126b413f84b55c58482661f7a5e81105ba616ba26df720009b1ce3a049e2b1fcfcee437aca70c927eec12f09c93d297432e5c0aa29a8c2b846f5d1846a23c0034791437589b91a023d9beb6ee16304988b5dc61e3ebc7d0911b35becc2bdf617c284de350d93e0020120018d018e020120019b019c020120018f0190020120019501960201200191019202012001930194009b1ce3a049e2952a1818d78d8fb0e9134acc7b9ca37001c919b59ccf9f56243f0d5cb0897f674003336cfdf30cfe3d812c697eae700ac388711e6f6732690f3232914d4ed8050d0c4a89e7aa035960009b1ce3a049e29c87066d212631d9ba83aae73a51728bab202394c1a8f32c9774316d5e2a4dac40032f61c6957c9a0932130f044374de6c5cbd9e723044aec3af3f77b18de54c9b9f7cf43290db89e0009b1ce3a049e2a92ec198940bde3d276365399eedc5597ee8e15edf1213645248ffd9ed3340afc00329216e9010325660031191e56dde5e0ca9fac0a7adb0422ea50b5a77769ce6754124760a0c9320009b1ce3a049e2b301ce8abd7dc93f14c71e48ffa86d5b54f0116c9fd6d133c7845b3052e8663c0003238f4bf6cac1d6d40d6f38e60cb6b302febdb408fcaa67fff8c3271a40929b1ea0274b2e730260020120019701980201200199019a009b1ce3a049e2879331e7efc1866e4143bc57570b9210b781c4b7c6117e4c5fbb274397106b3c400320c73c05080eff09a1ca5182f7a1832d9964fdae6786d148544642138d9c1d91c3660a3bca58e0009b1ce3a049e280b4e0858e5ac7518e0342b66f538c47a9f19b607919f1a45a4f536322d9235180031d933c623c8ae9d32e6213ac7ee6541c7691835955b5c383bf1e277aca1dba4825d8b8e5b09e20009b1ce3a049e2add8af62d060d4d0b271e8bdf16db10a1b90fca8696e1688ac5461a8c58d773400030bf679440119ec196c5b1cb6bc04add46eb9eb075aa93d31826c69b548eff130b118aa1f09d260009b1ce3a049e2973f08dbc138cdb087858131449f998c9bd05177dea43249303e3f2daae09b2c8002f0bb417b1b563a48075ecd741d50fee154318dc3c16bda368046babcf4d0ae90619e10a3b27be0020120019d019e02012001a301a4020120019f01a002012001a101a2009b1ce3a049e2bd1a4b0ce851645d90a915110918e0645a940007eb4bcc466ae8fa8c6665b9260002e904805ae7cde517e02c8ac346b58789397d3a6037f74656cd72e1ec4b6567992d58e07d98d9a0009b1ce3a049e28afb03fa31bb61b37497d06ed87b1efdbbbde69eeef5787caf57e968d3e27d630002d7649c2d7eadcdbc32e7f98f5f18ddf0847960f69dc56903cb7924ff0bd4232512ea170108e660009b1ce3a049e2b50dd0a78ef676a506b7355ccdc9cc5292b191c71ffb9cbe248da16373f003ca0002d6f8c4f6d10db85c1cfdc020bd8aa220810902f1bb066557e3927968850f219267da0bed3d52e0009b1ce3a049e2838b52401bdb88dbf02f50511c031c71322a373316a9fd814d84316983a8b5dc0002cfa9ff8a2514e9ea2d14b979198992f73ff458a40d76fe3157ee74c5a780e1d0cc1e93f326052002012001a501a602012001a701a8009b1ce3a049e2a6c752366daf6c75dfb92b6d874389bec9162886a2c6e6319be12152c7ccbd19c002c8333396302ca56d776e804f4c2763599d0bf0b586833ba8e36c474f43238da2169b0746157620009b1ce3a049e299246302919c27729ec6010cf73d4de43e87054521cb655cf86597ca879b96d08002c3db32a325c8b5d219533d6a9d383f0a19caf6dd415e9c444edf0a7739081733c5669a72c94ea0009b1ce3a049e28160f6a0173ac205ce05f0c47b87a8a16ce6af63bb7de933f88787f7860286aac002c257ad29c1327e6f8d83ea8942b09d61d60366fc0fcdedb5415ac13f4d2cd690136d3d02d26ae0009b1ce3a049e2a87a95e2211fe6037d44dc8927ea4a2bf508f5d91d687791290c97a2b0b391a58002b89fce706640d7a22a2bbc6f1a3b88e34d3ec3226408f6df3caff6d30785d07bd1501961a0d4a002012001ab01ac02012001c901ca02012001ad01ae02012001bb01bc02012001af01b002012001b501b602012001b101b202012001b301b4009b1ce3a049e2ace806ff8e7a9531eaa5a710b2b5462ec054bf92b2f58a6949a2e6072f9b13e18002b82f8c0076c75ee9c4e215c1203ad0f95cd8dc58bfbc667801c1ec68886d16573346915867b620009b1ce3a049e28e79355a6a7dd16e7679a3ec49a9baf02321dd584c4247fbf27e3cf066a0b0ddc002afb47d5eb12c95805a66889fc09b433eb1cac810c5975500818e12c8e0ae0e3bdc0974768e9ea0009b1ce3a049e2ae5838efd8e7fa0887a392e9618bd2d35148f47f6fa37dc59bcca8cf3606bdf30002ae6f8f89bfd275302e6519d43cdfff5af212c987ba369df8c801054a5e11436f41e09cdf9b3660009b1ce3a049e2af302b25d3bdf6b69baa3267c4b55101ab0fca954d7bac1b3349988b7802528a8002a9d5f64386b9ad2dca6096524a35a32e685ba71cca426b0e3cf91c3269cd6eeb73671b7134e96002012001b701b802012001b901ba009b1ce3a049e2a5d3bdae4f4277e1172985f81f66610cf659491e5c9eec3d4ff01ffcdd22112a4002a3fcb2f51da0a29141b26bd203d751782e5ec505807ca9574e9c73296495de83d5b39b51523fa0009b1ce3a049e2a5731537022e11580f1de5760408e1124d5b04eb8560ff90d742fd5f89c75e1f0002a29815386ba733be7af211d13b1637d8ac7086c5f4ee0faa764f3d951943ee00ef5468c76617a0009b1ce3a049e2b1ff0e0e6890b0e7962f23c31cc1a834c67bc4b72c6d69c2e5d3016fca73eb24400299e592ca233bc9e744c630804d331bc19d8ea9526071fb66743a527259298eb9b175e2c4a49de0009b1ce3a049e2b1c2d519c82e894366b8db379b8a549d439e0378c48b813dc4b24f9bfb37496f000295c214ace02aff0d9d05277ea1c26ab95ec012c57d5a12090749eb1ad9f3149bc6b670786cdd2002012001bd01be02012001c301c402012001bf01c002012001c101c2009b1ce3a049e2ba44843376e7a04d5e75738d757b4eb066c9f96188a69ebb6be3fcf4fab8edb900028c2bb4f8bc49987f135d6440bd6a79964873da81d2c0b7b376a26f07254059187ce262d485c0a0009b1ce3a049e2821ca6225e21c5b46d6d0238fd0410af86655d724dce60a1d6caeb58e5c5dd06400287af6fc63f8fda17d1d73ddd00cba98a4cf38b3ac649bb9e6ce7064d651c825b650ef7e5e005a0009b1ce3a049e2aa7eb8ed80a97bc705898e23ea51570b34fa4beeaff3c988ada73a7ca092c2134002862cf746d1e5567339f65d1a206965adb6c3f41c0332f0408ab3b37eb1a1e5030776b0cbef34e0009b1ce3a049e2b9749e218100553b5af0e40bafa28f42aed7bf222d20794b57a52a1536d2199880028184f344b8a73b1f366ec8202d0d1dd0f7428a8f2368678939775dfd43322e3caafd2f9a69ac6002012001c501c602012001c701c8009b1ce3a049e2832c6b3f67ae4af756524276a0c1c0052da43bfee7fd4d0311f233f7c45137d540028063824ad9c77808b604c0ce8b366048d6d932d77b0dc270dd59287dd9cae58c5c599887fb83e0009b1ce3a049e2936a27c56d9a60c083927e94079e4335ba29632d7aceb15a3261b510578c50ef40028063824ad92738286f75181e77418494c8b18c5b3d9056703d5650263c2aa0f45774f662862ca0009b1ce3a049e28c6662b1ecb89049ad7d484ea20d765cb312eb0c634a964c1537be09fd6cb85ac0028063824ad92725424030284a2643df3e9a3dc27a4e92418f7d2863b8c4d44413bf747d8eb6b4a0009b1ce3a049e2aa9697554883aa9850b716619ece9c3a6c6fcfc3c1adfb8b8835984329ca63e4c0028063824ad6a98c356490435d8b26734a3e8523ddf06685aa2b3f48031952beb28e88b19587c42002012001cb01cc02012001d901da02012001cd01ce02012001d301d402012001cf01d002012001d101d2009b1ce3a049e2a2582304d633d7c3419c2d4367ef1b6f92c0582bc50344c44b4f3d745c4fb43440028063824ad4ca9b3489fe5453dbfe5e2c00d9a58d5920865ea58c8da8731fe37a74989b56dc3e60009b1ce3a049e2944d04808d8a9c19410a57cd10369f9f6cd0707e7024aa19efc94ba07360f27b00028063824ad4cabd67baa0a2ec93ba4a924e50bf0815259cad58a0e0e8a47d0a7feb3f19bb256be0009b1ce3a049e280a77faf68d9d85f5b38408a2eab6aad4add9c60dd361e2e35514244932dbc6980028063824abb3b1b28de42ca52a505d1c22619285238fff02d7b6fb8c96e62f7b7a465ef7b444460009b1ce3a049e2a358caf51b0e4dfa763eee5485ad0ed1252a7cfa31c34214fb5e642cee990eb100028063824ab8bdb713e6329c1e0f7355ae0667f209856d13e7efc9fe21d87c8016e2e0c83aadc7a002012001d501d602012001d701d8009b1ce3a049e292ba2f43332734c373d1dbfbce9968568bcc10f53e8b38afcdcb1b082763949280028063824ab6deb8e30bccbc20b0da660bcdc106ceb249da6953cbd33d6713e6a4d16a42100e2620009b1ce3a049e2ad2c70ad15398326e0e0ac1138ba753b7a029c7e036a57694ed88e2d2e19249400028063824ab28224435e1b49423dd16a326044b7c0af9dc8d51fb43bfc21a6e0edcf011820843820009b1ce3a049e2b8add7ceed1704f547967dcae9126123f0a01822aec1f6a2ce146748bb49dfba40028063824a9fce2df18ff6b9ec3586138047fde2a25860445693fda2306c2e05c14512b598f232e0009b1ce3a049e2a947b4da685f541fa7a63bc4e1c577df2bc659897edb1e1a4b09d43f19c7873780028063824a9fce17d57ae37657359404c1e94e5ae5d51fea8bfdd72801c75fff533c325915f25d2002012001db01dc02012001e101e202012001dd01de02012001df01e0009b1ce3a049e2a19bf970296645c332a80c869af2fddcd4af9bba7034d97b286f6f9f712c7d9bc0028063824a9c1073d42bc06e3a77fba211c4e8ffbfba78655fd20a3624c29e42cb03a94459242960009b1ce3a049e2a63195a5b6344050e13be6e92fbfd4ad7e6daac154347d8bccd413da0396a70680028063824a9992da547d83c93830cbde24bf104cd2a3ae9610c458ec80c1a30a2a0dcc48367724a0009b1ce3a049e2b0dfe31266b719a3cd306ab549f274e3b4314d41999b434b400de36db3f8cd8340028063824a9534879ea4eacc9d314d9f1aae3a9dde43bda77e6bd4d95eaa76a20c8e004ea9f00ea0009b1ce3a049e2bfde73855bf29633091c077f787b133245dd4a34d251e0e1a5e61be8c4739718c0028063824a55a04452f31ee76d4c83a5ebdc65266998b956d7c77e963593e84acc384cf8b48689e002012001e301e402012001e501e6009b1ce3a049e2ad389ab02bce18e5f97d8d4d05933ec1c5e9b0f909f9b5e08048b9b9ad04732040028063823a24ee87d88a02253d6d6538c80a6d2083fe31c60f28bbde53e3aa1afbb68ebe8645db20009b1ce3a049e29f4adf4ac08f9f6f87c5240288667f0b9b5854e70a60dcc2b2d6d57cb75f792fc0027af5f4bb5b438cb07efad3a6a6b2b17df9688981b3b75ceacc5bc448fd9e5dcf567933d474eda0009b1ce3a049e2aedf17ecee41e08c3b4cae9bf60f255bce6c6ce58ced36753337197f465e5095c002793b352e7c33bb88705d8a1a927b941511fa4dc9dc5d50d0da4cf7fbb48496bf1a962df4ce1d20009b1ce3a049e28a35ace7da02c3bbc60c5cd54162dbb26a5715af11f117e3a40f819ebb7279c4400275ba7d8ac0b5d2ba92761425bbcb6844ea868c56d0429e313ee963d1288a446edcd9725135076002012001e901ea0201620207020802012001eb01ec02012001f901fa02012001ed01ee02012001f301f402012001ef01f002012001f101f2009b1ce3a049e2bbecf9437680fb1aeb37ab7d295801e58595eb3b62d792271a0db3f588aff11e000271a34a23e742dfe968e6748584d4833998ab0f2118fc101699e06d3b0659322cef4c666802ebe0009b1ce3a049e28389f8936cf88322e27288300a5b36f6235bfd216b6d9fc6214ded18ca8618dd40026cd80b5be18c7e11c57246e6770c27b5507791009d09e3912f7c16e08bda5e5ef9506c4694e560009b1ce3a049e2a65c161473ba031d4b2e66829f1d5128edf0c6a4e56f4cb821255b711f2546d4c0026c8f1c087e6ed8324d3181966a141c514523c202e2a22d8aed2506b06ebd09b6abe0dfff3ffd60009b1ce3a049e2a54457348388c5d158b543f02c8c754d1e32c74f349f0c18be1fe10dd44aba38400269d31039963f86dee48b7d754cb10756ee56e24b1f947b72bb5d6c4dd820300e1a254e716ddb6002012001f501f602012001f701f8009b1ce3a049e2b65c8b7001a2eff424252c5c2df0df95a51f1a7f78545a3fb4e1c69682905652800269521c16f12c5a24819b16ef4e614fff38afa70fa7d6f7a68b75728272b882e324f5680cb623a0009b1ce3a049e287e51d2724eb388d46182333316228cfe3c00263ab2b16ad4f2092103a89e8c4000262a4102df5a7b3de3900acaa1c1d147728ab1a4274054f1e3e7870d5a30dbe53d31bf2e559e7e0009b1ce3a049e2b85e018e2038353642ae80d86555e919df293d447fa331ff0def861e68c2682d40025d072f8b944e31fd43f1e6c98cb9c0d8c3b59274e1026378fdc0dbdb50eb1d801cab3747f5ffa0009b1ce3a049e2a037bf191f8de94ad56d6b95dd8fa293bce9a1ab541a99071b84102d69f4e82040025cea369e159af58225a84ba60e141b1a49f40e964bf444a9135d940fab32e8a3cc9ae2836eb7a002012001fb01fc0201200201020202012001fd01fe02012001ff0200009b1ce3a049e2a7bb0c1ab2c0ecd5197fb8cd0bb24d037704d143be51e3ca24901398593f338a8002576fc38b8d7ac05ab8bbe1c5e2e3b1e546636910d34eb91b232b31e21ba0b3b2162e599de997a0009b1ce3a049e28bef689bd95f3f9ab9b40df475b9ab11fc9cb8b2cffbc6a5c5794d60c9a41c78c00256c6062e34c2a758a1cf665f267e2c057047cd643bcdbbddfa2d43aa470886dd9898f9fefb6d20009b1ce3a049e2896717ab0a536ca6fe62d5a775181567209fa0ec4925e8012ca5d55c3efeddbb4002517fb2fc43cd8cb8a8fbb84820193b4d204821beac23c58cb8ec2ac314ff35ed535aee0078fae0009b1ce3a049e285ce49bab29efa5e637f98c5ae8ec8e468cbf23310664a99a6ec89cd8e7a63f7c002472c9837bef2a0d011e830eeaf39b99ed78f7c7e91e0914678ca4a7c6edec4be7ab6a18ffaea200201200203020402012002050206009b1ce3a049e280a0ac45bbd4eaa6ee7118ecfe2a1b3f170fbae95bf444e1d64f303fba3727564002424dcdd81aace2146cf7c9dd9e666392a3c3f6b4d3032b13332abc5b3f83e047c4a556a8a380e0009b1ce3a049e299047b0392a8560acd2cb44137d26b919538aa6a890faae1ce151bcee2290a9a400239296f6dde1f461ea29453572e3376d806c49c80fc3f1bf871f69227bdf8413c4479036033d5a0009b1ce3a049e28a7989520b9fd67088f7ba34e6daad1d57c7e73dd6fb9d34b46086a3b8f30af8800239292d09d2e8587ee340235f5a8975b70d9330b6dbae735efc3c36109bb53143abc134da125ea0009b1ce3a049e2adf9b469220eea2b4a946b96ac752728465a4865dfc9eafa2253b5eff97c41bf00023131d9346fb1aabaafe477aaec7b83921ba90cf18dd33ff4f03e2f7b35bc4a4e9c5827227638600201200209020a009b4738e81278a4f45a10acf0cfc5dbdbda9c4e654c66caf054e443fede401045f49e938e1508300086dbf0cfb6b1d860f8d19ee041eb7a35ce60c44db21c6146c5c5005d05bdd1c59dbe3d16eb6248009b1ce3a049e2930ed91b53f34f0eacb9a2afc6b3ac372fad209b34e6ff519bbfd7688f7969f5c0022a468b3d6ace904ceefb39cc1209d689bc4c761581b3f27d9cc7c1fd281b36c58013fe7f1d1d20009b1ce3a049e2b93fa94e363dc099ef147bc8b3140c297cea7ccefaa0aca5941dddb72f1f151f000221e0ba894a31ef7222a228ac5c6afc0ce82e4f2b06c03fcc2ccc11f18f74102de79e527e3db32000e6a644f61c717e3db3fe050055000000712486dea60f8b02ca674ba8e3b52094eedbe03579c3a40fecc0463e8f7da4144083de036171bfe07bdf5aba588c26f8473b7b94b0c744a4fc4843147739d88d95e8ae385bd18b0f81827dc4130cbeba20309c836dcc57ad77fa453a5c2e0f340c000000cc16be4b89df0fd6800144ca705e7b06ae59cd23f709f1a86c7a2612fa58f57d406b8997ace2869596f6ade4a35382503bac02397222c872fd28b07c854c0de49762bb248986c0a2efb0b49caa7c2c30cc171fdd8a6a59e97d9891872ed6ae1e01000000a29ac856501c0cd82b28f078b4eee00f7aa75c828ff255267dd2c9234480201840306d525b134e365ea90b75aaf1d32098f3a5bfe1f76aaf9a53aea897d41fec8f533376836e87dde435b6475289f9123ee2256f111a4da9b00ce715369e967905000000e9e725b172e3855cb8688111a74060e13200a99c60a943437443e18720ba24b340028558d5ca88e34aace0d06b6ca2576fd3d10bc8c20f5393e96f6e22c4424a3ae6415c8383cb7348b1690cd8313e000f85d5fd9c58005f9aa0fdb5aa93492f0a000000f661d197cf0c81a3fd0d03112c2527c1130f380a084debffb17416e5c061c04a405c4dba52f5a85b630a1295ab72db70cfe19e9f70ef9961163f73187f173d227d985655ddf1c96c57fcadb6b1521f604e873a2bd9fd2c96efa047cd1c0edb740e0000000c14858baaf8961538696d85d6a744bddcf4b6069a2bbc349e04fa6202c7f49c40f19b46764bcb5f276744baa7291f1297fa98e60ca1d2999a21c9c7ef2df0139d671f63c4ff685985e4e51e03e63f09324a31d33d7f59cc7fa82b6b5d5d35f90f00000005a425992ad18fe6bb2b9100d6c910a8dde9836778cc9832a6d452181c19b942400ad043575cfe983a0211a55750796107280bab65c0c97f3b94fdfa474882ef3e4dc6467ab5e5475085ccea9e25ca487e3f2fcc2b5bbfaaba59a35a6b85c0dd00000000a39257f60a70c6eaab930548330c49500953a3ca58b349779ac53e087d54796a4074c66829b55c06ef37d1e9b2dc34e1fb845f3aec2ebf36728c912559cb863117a75e5f823ecbd4bdcd22397f9235967efd20b3f19858ee9b17406f7bc3601e010000004d61e2c37973d539a6755826d5535514e3409d6bfd0557dbb2d21bd1bab830fc4023f7d29980aefd48258cbf6f2c28863eb4364cfee923987144fb9ebbe744ca57ed9a7fe1fb0660c21af39bdb6e20a98a9a966e8562e88fed36295dd33bb7c60600000055c7cb8fbdd4b18f2781154278a49d8897f51bf6f564e8aec6d0654b9be5376f40bc34b65b7db1b0af6fc7402823f44c8b99308bef4efa383544617a39975c58138de2d683f373a90219f651c8ddc26f1c86f634fec422a44396836d44875977060000000232aa7f76b50ee848d10899d21c8509e66f66fe2f080c6944c0195fe77114b940cb1c8a80c81a83ef4a983b99915ede017dc215d9164470df7142022623b97e196e8913d3ed60f5b6ea86f7f77e3b97142def0d05f5e0afa5a2f40f3231afed0c00000007961feff30da547b49abaee2e30bd4741c07c6f5b99646860a3fefb8a799b0040dc8f38432357942b3d6d691f0c78c6f0a3ed9901449412c0983e1c569b7b3509e46d917b2f8cb6448989e1322104d77dca1fe3516c5dfbbd0e272d3d896f070f00000083ac16ac2aaca967bbf98572d1f2eb33bc5876e202d796c9f2ddeae2c3d29aef4043766ea83aca457734dceb790537a66a723626a33c3481dc32a61817f65413a5c4bdee48fd83a6e448fc403deecf75ac9e22ebf527533be6b7c8da42d0d6ff00000000e24c84e7cf72346370f5859266cb34bcbfd7007375c70b363b4b002d7b700a834003aeb4fc6a586d8156a8501f26c48430134903e709f77cc5980d59e41632f2cae874bb933b418fcdf08f337372ee596a86d5d5a6629577dcf4b3b4ff12fdc50200000071f761243b8bee1afbe6293532c4ec1cfb32f5d9e41d665436cfbf9c55cc9fed4051a5246688de9952407ffe2b939a60708093a1ce8409bcd1a7819cd592cd05d44c68817b2c37225f069d9b47683f1dfe7a05d4a186fd36c7a5edca144057d60f00000047d20d2c651782785b75d92a955ec94304349d3f154d51e0835929fa069f3b26404f55329693c35a30273f9a3ac0aeb97ed64fba709566f5be641c0887248217bdd2d0c4de864bf97e45d79442397004fb8fdd68061cbaba814d768b122d29870a0000009dd07414459fc0a4db5a66454d8af13d6cb8fe3077267e551897b946c329c67e4067d10b1f8719f15db0a6686564c69f083de7942b6789c5bdb13216e667d78df8c1fac076038e9ac68fb5becacbbc49b85a02c76f2e91015b42ebefdaf2897203000000386c82cb08defa3b839dfb7010de7ece399211f93f5934b127727374ac0c006940d02ef42586cdf5687a9ad254ad88e9d6ebad9a5cf6fef09c4cef6ead3b1cdfdd15ae5bc18f92936969df795d7ad368d3c4c5857801b1f75aac0b9f7949f91c01000000bf3ae2f2bd60e638c59c088def93350321c3cb78c3d12e3d80b5e501c1b5abe140772ab916abbcdb3b2531a5928c586c5661ba3f4dc88e12f62a91fc475649fd509be08e10d917da667a861ba26f50a89a51876c8647ddf303885937b137595608000000a4a8a9a44939b2d4b2836ffc6349d64e363c908292f6fdad96c0c876492e743640f9e68a7d39bb7463fc65f723b648b875aa499940aedbd593b90cbb7de689a0b1dba57f46190fcd5c0eb2bfbe3a30a2cb1cdd14a556c36282e9ef1d1a1e195909000000661df36dac76c449f46c7f8f8a38b47e2e0d74faeb58e79938ac4ba91842d64a406640a40ceea697917f0d475c552867a6699d9698dcb794cd009cd673558bbbdfafffa2d84f831b649f8e9d0e3c3662e6a686418fe477f933d08ab586774d4a010000004d465a97c000d81f28a3c46bb9d4b39063189f7970ad29fc1fcaf2427be1d41c4001b3ef0c4c9ed7d2cc5691b804ee1bfeb9cdb87d3b726db6e85ab5d6cbedb25ccf3354b35d3e0128d74b225e2f69d23d694147753427d2c7bf163f3f2ea7bf0b000000ad96f1341930e5b0def1d0f923eb69741f43d14176bbce21a4fa3d7dd0e16fad40698719d1b59506b1e8631145c05494d2553e22418972ecfc5396f36e522f00191e004b9a0c33c08c3ac9b118ba1ef076b1224d8338810d2441a9af10e10d7f0e00000044b5cf35b168cee1d8243c6f219871892a5cbb56bb66e0a8362bb97175deb78b40a194352afabd0a265b171733aceeafc92e419f01b1f05369f3b5f1d5764d8850b271af80392fd9b21ea4b56e56812e41b6ed4f68411c72f01ef4efcc450ff90f000000f69d5782e5b9f36fab9408c4a20d2843ecadad1d7ee5bab6697b20d19ff8976640366db447768e255be902e1820c6f641bf56310a6ff65fb41e60e9fb68cdd07671a344d3c0c7b1a97131fb0b8b7b9648572b519b7a03eb6053bafe0bbf368cc0d00000027cd844989c8b2e74662dc6bb45806ac047d80d321739b882f37e6b151c088b740871340827590aa8840662353ba657e6083351a67e406fb570a8e760090720689f3d51b7acfd560f505c6ee9c22b9813802a5592e1c12f62fcf8317940312df0c000000921d44074018736b30629fc7c85f49acbcc8d05298c5c7fe93d4cd2fdf8a79e540c85988e277c04a3bc4dd80a34b2bf77ddc2128b9c01a7d0a4136657453f3490e84cd8ee7c46002ea53f3c1299fc1aad2f35cd85dc09e62d08d74bee774ec25090000000ea6627c8f08aa22e2143d4a69e1b1cb0188f91e4d7234b3a15b446d89342e534003f311ed7a20e5bea02a1bdeb545483fc1863121a567ca4c44db7f38329e17b281f4ff5f8ff7b8d908b9d530e246115c483349a00c25ccaf3b206c7a4b05f1060000007c430597af809b9cb7334c6f855a7139937fb8463bdf2c23851f566dbf52d49340a4c9220f69a6fdbcdb1e8455b91a9110d7db65c9ae4f2e7674246a02035a382240ac8e5901cf236928efcf9fe6edc4db6f42ec2399a5c55a3513ad08bb9d630e000000853dbf2ab09646369729539138357d3f80008679cad1a4840ba0a4e02dd2932d40fc10ee966695e6004b7942a20f2c627bd8fdd1440d43480c262dc359465f2e73d870ec5fa9fe5f26f0e7476e906be295ab73e80a430690589a6ff1553229720f000000a1689bd799345c04ed268344c876a6298a8caec42072466d71b0f49bacd8d65c4043ff09f5f9d244463d015e3492df358a3a9df0a3eb2c72c26a4dd75a5a5aea7c4e08631543754bff65621c6b621f8512391dc8330ea4189ae0f07299d5fe47070000001dd77dfae27fb3b3d8b7c9fed1fc5a14fb0bc396931f111e6a455bd6371b98e6404782564bd9c7f654b8a79cdb1d6dba794337e17969c8070d78f2ff5ce796b138ba29c541619d8df4e2b4784704f12fd108bd6742df2bc35e35928f14eb769d0d0000001220c585c2c76de9976a29394255b28b0cfa85d9d268a21d16fcb9546f328490406bd25194c28f28cba2d751f53e70977bf003d91aaea7fad64870ea1459a3a71d65d540199369f4f2383ab619bc503a794020a49e5dda234225bb122c6763f808000000f29a05323bcc78ed86cc85158d48a8b3cb581c55ac97f94ad654a872b04f064340de56f3f833474950c209d22c8b26cc73dc41f3ec19ad8cd6255228e5a6856d41354959c47343a6cf283d4eba2e4b40e7f0f74e3c0de4e55621d4d57fa776d802000000113c4eb8eeb5da7b1dba7849d01ce85dee935635c7bf59d0ca6c36272062a31f4061e5cd8bb3b4d82b3b8cdec65608db225dc917d8a085af47da4910f15aaee750f2ed2a82c3844e4faa3953831048a72f4282503fcf53d39f02ec134d7ac17709000000ae3e0157524f83c9ee6a37dc1f11d03f965b0234325009df890e52825128b42a40498fb18ce84280154ceb5affc4fdea4023cd19cb595e14063e6b1ca7b2c1a05570b0fca76395aed59797c35715260f028f685a0a8b6136b6732735998e69510d000000b6f3a4da0a7ced96a07c76621a39ffcf99370ba74039a30551f5147060a498ce4019f8219dabf9ca9bc10c51d189fd5edf552d1fd472b1c40ea5f876d8dd4f298081b6dd0603b39c1784519cc44c2d2cc0d99cabf0bb6306d44b7af594ef6a5a050000001fd188ba6274c7ddd61324ad4fb33e4d4ce1d8313fd4924cf6bd93a2d26e29d94075781b9ddbc19101571ae8cdab56bc958d36a7250bc9a1a7baf9bc9d9b15b4dd80070fb577e6dd5eaa00e81f2400a840102c22b3c7a6f0da924a170135d2310d000000e82fe9e158f519eb85011b38649f248dbadb299bb33c360648d8df832718cc924092dd7da138020ffe44836dd7e7b1ee076cf5a0d4006b21e32a60b7de43a6a75cea87099c0c2125bdebb36b14c00b53b574bc847eeb1736e35f3cb51ae384f407000000669af80def262af4463ac48265e05cea3c3f41e24cc492a075806ae6568d0a9e4079f604ba3cdee766c80a1801adffe7b94acb841a2f6f9785cea04dd5eeba94d22f5d7c3bc48cbb8919d303752c0bda0630f57a59ef4033ef0b764e3610be3b0c0000001ce97661ee4a636da6c8d7e02c7a85fb7d3591d3701009c637ca98890d73ae6940d0e239303d699bee3c36c231aefd2e3466e74bdaa382676bc5b003d0b9cfbb09d5937305ca5dabf1160813fdb843c44daadc71f42cac09bf6937054fb73c840a000000f1ee85c3194a824801b447903f4ad731396431413729070b145a44721272566a40cc418e0c1fd69348afe1e9f9ef3a259bf087ac71815e7baeb7d542b22f5cfa256239644b028a8e444ee2e5f634c176b6b4ea504d889567d70211a245fca8f70a0000007772c0ab77f6e09140137031482539f73b08bc28ca27ebe38541d3f3fb27e256407682515cbc86bcee68c4640ec1f42111c0290f38b3b74287143f833cca323959481dcdf6330968603d5e33a3b011502ed2441244e06ec42d60bf591bd71bbb060000004c8c0be0d33230ffc8f4b1b0234888d7ab7f45c7ca1ae883a30e3b157f53178140624856c4f01409a81c85f9be7f603fbbed8faa64c3b4ada8983fdcfb90edab1679b65c3cecbe5b63834d3c9607dd9e28d60a0db3e553005c8eb750fe72786301000000ec419d05abb5dc6e817aa59bc71166a82023930a55fe44d0868b046df8ee1f7b406ff4596d7a79b3eef0a961e8bb522321facb391cb3b01b74fd28e57fb62ebe3e8a81c03cf84c7569574b4f075d5babe8f5fcbb2c74fdab055880fc5eecea300700000089016ca20f378f2474ff5e92ffbe08e40822d5e2346a2eb1707c6c893931323440934e412289b6b4424d928854bc9b42c481c395884c86cf6f30ca00fcad8ff08dcef95989b63c835bba5734cddccf36ad19953c2527a514fd9d7d46b5fb30d30b000000e47d941d7aa617a291292d11c0930a60f3d7374bfdf3ee8762c4194bd4f52a544050ff5a04b1a796e8f616ca42fdc07a08cf1ce1d5883d8eaf32f6f98ba6c058945c0498a1d79e87f764c51ac3fb6afa06e8fcba2c04426e2cdeaf5a1ca2321704000000105f4d1785618bc84af51360ffa27580bb35fb51e5674dc6c745dfb3425af1e4401bf94a149111da27a59de16001b977352cc92fda22721131ee1600383134673f7800a8f4023a608b90e99fd15d22c00971c382e1a3a67c4c585cf9e0d46f430a000000a4c10652a04776e1449f7f4560ed4160d81f3959291d20e8934e5d52d36df6dd404bd5ffd96d8022fbd3efa03d28b14445d8a4716c1118e279784c3497c6211cf9e9b874d8287fa7777e50afecc506abf326edb0f374247ac6511398fbe6c3a90100000025379e1f04276af6057383e74eb224248520d7554779641dce21ab9bc637264b40d8dfa758cb8646825d2fe47bdbfdc7bcf60b3445e67ab163b382e01ebeac67947d533ba3187f9f79c8c38642a6efe0fdedccd4c82eb8b6c5b1c66ca67460b7000000008030a2a51874e29dcdc644ba128466a1b13d291d1af677c98712938be3ac7dce40cc83e2cb489b2735c9101d7dd174da92c83c7af0d17c8600b8b9996e06e0541593886089c03d30523b0470cd90f293c71b507826e5f0055bcb71b9a1f6a980050000004e2ff3eb80500016364bad01a05cd4dea98e47755cfc84f2ae0b64234f1e6e6b40d0c6dd1c461f0898037d6ed41c8640af674ff913a6f61287209784815afb68b2d6509874370efd64a82f1017fb0b28b3e112b807a8c7455984eaa66637df650000000001b543099f75b25346c628aeac4e402d1445bbdeab84449b2105e2c4fe21d21b402ae86cd14667f38bd68224ec62636cb18e26a49cba99586288db5d05f9075be3b8f2b75645d1c42c44ae065a759fbf29e2deb3d361bd69b149d58ac370c75103000000799114e8c1fc83c25f30eb3ec463cadf38f31009ac4db0bc70e3a7de56656d5840310ffb37986c54d23642762c093235a3100e583dbf967e832df0282718b09b13156952fb387b79eb381e85d2fbde87f0443dd7b45e805daa69a765e71b8b1502000000d7ad0b99c105ab652c9383e6d600688aca9dec4f7a17e3958002d60c76baba4540a489a4dc69fc98df2871561e530b2a3fb9555ea90f46b53de93c102b18c3586085f009dcbacdf177129f0cd66178dafb2c3a354c9619af270de6bbb3ebdfad0100000015b391d41b96ce396553db620c6e3457933871d2b854b5255974a6e85e2141eb4071f8ac061663d51b8c765022d881c97199b990498777046ff415dc231e7427dbaabd68ef381bd4bc8fb95beb43a72c81f9624b92f7010561fb8fb54e65f4c10f000000449675e503159ae5ed59bc335a7b161282e415c0b9116aa157227e78b5bcb60d409c79f8eca77478ce7d020e141238c0e4c3cd884abc4f9b0dfd6e5f088dee20b8a00f32ea182bfc7b91cdb5b70245187a68f3542414a8972afb4f4e71059c840c000000e2ee35b381602ffc5c5515bb7f25cfbc06c8a42f1e53f0d56c16b96f83d80e4b40b76383cb65c962c74d547895d2f20d8642b54edfe9ceba9d827fe83da720f2cd897e096812ba934fae7049be8ce69cb01dda1e61250fcafcf22bf301bb9092040000000ee61f10ecf14f4dbbbe9fbaa953343781aded06b5c095f011b3c21399b2a75b40e5ac290de2cd3a0bc7c80e0d8c124e51e119c3b125198d0f095df2b50b20f5df272a9f44e6692a18ef53aa022f7f72ca72c3ec9bc348353112c3adb4e291eb05000000fa62271bdb29ea4334ddb1eb605926c16533aeb87a8cbef5f40aed55d900229a40276d84eaf59868b37b83c14c8112fa9e1486813b45ceac69f300ee941d2fbeb125651d5895c442079d89b54c73273a0e971033b60c97d4e06559245806bd3c0c0000003f3a3217c998d27988b3cf49b14f0232d800a6d620c10d132bc159acb369d836408537b02a373d979d4f1e370862a989fc9bcc33b6b61997ef0d26415655fa32784b6462464eb3b076cd63d5ed9714afbed7489cad3e1b5172e4613089cdc2460c000000f66494b791f0b4f3f4cf322aa320624ea7c1ba1d29e30a117dfc1c2162ad42214053f9a681f1baa8543d44d7776484cb32dfbca2616e54c08095e04abc9b2457f3ace8135d60098120c0fed139cc2f92061dc66102806550a94a70ec45d0887f0900000019f048b498d63c7bf54c71e26f1c7c207fe7073503a400024b837ff01e5bee2240289cb44f452499f4a46c891ef568f4abb1244aab6ba395121c633b7e3ef0625609ed64a40a654a481e483ef92fb8e8c484a161769fe2970a3782a8a2ce77360c0000001fc7bdf27ffb5f08e4ba8de83756881624ced00da2c7e42485599bdb554903494044208dda7372282d49b9411e0af866f0d4dfef1dbe93e635d7eac06289e0ff24851bceb58f7b2fc3657d7cdbbbf94ac7a6e4e01e9a697180996628a00828cd0d00000085737456a9e4e4a8e0404e148adb83518b88007f8d5680e93e85bc4ec342d2e14042d55251ed2b69b15acdd7baaa96ba3252290ae92353f3512dc9b409d3ee6c74c844be3047337a814f7e1d744614c03335bbbcce818d8ecbc4f0c6b8d89a1f090000005a7d1e613909330d4c201ef78500f5c766edc870edc845b08f89005c539a8946403550770521a07b6a025a587158e26258f4cfd08042bc0973d26a68b3e3bde866370e46e5e9a31958485da8b1a3ed5fb41688a298c7fc2347742e7e99cef18409000000842f447ba2b446cb6918dde3ac50477eb1585b8495c6b6e0a50b5efc90868bcb407f6f70647fbbd93589b08ba0a8d9243ab7e1ea28df1d43e66b7988398165e6f8bae798a57596c817e8c2912038e69f6195f30b93f497cfd59e493064580ea60b000000bd2540e1c8bd4d0d5391e46433e023c55da908477966baf1e82f3c1687e25fd84045058fa60a9193c9428b3fbe739bd21374d46dd0b71429060bf2752083e357027e95b53f0804c01d14daf74d24ff6810398341fa5df4f57d00a2559be5b4970c0000005da44b2da4321a78aeab852da3bb04206426e9077df73ccef2f05f3adc264fe84029e51b8f655c49d7744f5285fbf45a905ad591d5b886bfa4cdfafd728eda585e19dfcd0a6306aeff698aa9eb96ce156de29e5c91c6c7447057f018cb38aea70c000000143d72989db37766729d68ef74101afaa0dcfb591a8dbe715373d91f82eb139d402d113cc2f1d75873cdde8237c910dba62f5d2e30f5caaa7bbbf8115508ffa7644f33b0151e0a26693823746fcb4cd3c3640f28311a375d9fbf82373fcdd34e0a000000af7b931fc41956167d3aa2c25e4357391a6991245fdd2e59897045075af05c3940f12ce99005816d0d61e829a0b32b790dde99326d281172f3b81ce9035d34f6ca16fa8936601ec5d9963e372f0aca5eaf4f173bd7f298ca27454de65f86c9cb0a0000006d28bb121ce4ff0aac6c1840dc55035749a7b1e60886aaf11c2af8e22f2960a340c1e147a140bf9d389164fbb1f177bb8357d35bb8400736f97613cf0124c3598ab7992d17d81fbcd76fa7cca75c9a559a5d8f408947eaa8cfcde646bd3dac8a0e0000003e696f4b0b6e19dfeac5cbe91a454fd110bcc7d98aea18f4a7d752711934340340d0e5476a49d067fbd35cd54c733628bafb891c084d3c98b26ed95c9bda8e09877345737f4428cdec6478a64c16cc4a04cdc5fa630e5fb29d81bfe3d52a885e0c000000e1b8aa2038fb346c4a602b074e3b1756f2fcc1a716f11e0f94c7df8da384375640f9a890e5bd0f7a796297dd03ec1379335df6dfc08500ecc593bab24f35e48873a33d3f45c44111755ae3d6b1a595b2997d96f84306adaa7b11ec7dc47a40ed0800000038c8f7ed80bf1796999b043d4d3d12858980abe499544d5daa2b3868aebd39834043fb840ffcfe7e7263a200dc1fc4f750dfb57f9bffe22e1c1784717d27f4505ca469567f9939c8c867f51f4b3cf4df4da07dae9449d6f24fd0dc6e4490d2a30800000014fd66310c2b3700db6d23baf994957877ffab247ba800d171c77e7d0c267cd1408a2af9c6ec541d93531c2178d231818ed4273aab71d6bda20879cba76ffa205cbee18d35bca46d32959d1656bbc6360f3fea91b915964691e3935da4e1ffb2090000008f14e74803a031fcd5258aa87139f08655a5417e031e0873b129afb70ac4ec6340389e7bfe2eb7fd8ba900785ccd10c8683b837e07eabdd15c4d74d453829aa2a39fe8dbb42959ff738b0fa575722f183617e6102bf150ae553dac3f1e36a92602000000f07b190eb76a81539adc4278920571d74b0ecf780bbd85c36d505f58a270082540f97151f468a4e73c9b43eab24c9dfb92c02e0554ddc74802ef72c0f109621cfd92aa702f5f2e5669c7a61aa19b3eb40593defd6d9cc8db98b1706380f76c8c04000000304924ba7fcf2d9936e0cef218aafc82a867020c1f47db6c7cb2758b00a8136240bb54c9a45f4a595e3bdc2914ed8479939c850bc2be3a8724fedb4243b8016393aebd5672a8da18299472e4e4041fb0c53696e1d89f1617a19827bb49bb618b010000005929cc442ec12a98b4df01202bed467f5d681bcc0a5a74af581459e8053a29a440c88c1b640934ca49243744f8cce1235a391b3d6655f837b5130271b3e316c9be110b3b9b38c37132e19fa750e88a03994c55428b3564488f38df81df63300e0b0000005f17b4d419e5c62aefd645bffd3a6c74b75770da5f1366e092280667503683a940facd794480d5418ddc675d465e59263ccbde652c273826b39e7141c6f5e9b84508f71de1274190d8276edf313dafc580dab229b5527564a17502ba93d6be540f000000691bdda21848b63c748326b287bff99d21cd16f7ab5ec20ce2f983ce65a60abe40f41b7c7d921cfdbed9b4f740e90e4872a2db6694b6c0abcc62c3dc9ed9cc5f8803be06316bd9961517091321791a2d963cb77736a337a2e6340bda886780840400000096edb74df211e82091c51e0df26e4ba030a9112b9377fe04a226b8f50c03a555406a90fe38f8fb136c1c7a7c6a6561903ca81e128bb3de1848b22d9cf9999850b04c6b9133a852299734d6544d4d113021149580f36688e71370a26d195f47bd09000000801a07fad5691016e52e528f5d0f4377053ec64fb4a1aaebeea73dbf20d4bd3640a644917ab8e085b76584bd85a4e2cd9a36533bf9df4dc46981c48c056d9b60dde88148251038ed6edee5dac501d043f596277de2e36b46109be6635597bd5f0d000000174ba737b67c17a1f29cac1493c63ce6680cf4be739e669a1c4d4e17cbf834aa405f98436bf99fc664461d4da313e78c59dbb9aaf2cb14f443894da2eb75706dd6e1a152317ebf99326c71206977d07b9c65e5a04c47182d62561e37f61dd788060000001cce0f52b5757299ffffffff0000000000000080b9009301457ef453bf5ff6181705a2b246cf859c986fdd103b7e4a82870f07a30cc1dda979f1c14ee6ef9a4a40954da2175c90c1c5631fc882b7e758d2a0573b24212fdcffffffff0000000000000080f3409301c47196afb62fcbff11f48ed3870b25e57b0e59684dbac3e60ee5f880e0dd36d2166da4ea671be9a985e6d1a2f9c6b34d5cffe40d9917eda5d540545c09189614fe530100b5ee9c720102070100014700094603c47196afb62fcbff11f48ed3870b25e57b0e59684dbac3e60ee5f880e0dd36d2002101241011ef55aaffffff110203040501a09bc7a987000000000601019340f30000000100ffffffff000000000000000063bbda1300001f3927f58a0000001f3927f58a0724447b320005ff99019340f0019300b9c400000003000000000000002e06284801019f440b830201fab3f3b8ae0cd965cda5b7e5aa261e60147b14f20249885b287f000328480101b2f19125ce27dad24a0e26cbf9be7708b5d798458a82b79f4251fc5c2680f45b002028480101b6671b7686b05d93eb937d2b49b8548c755a0d82c254b5a027acc204e59801610014009800001f3927e647c4019340f2c53c68bcbd50fe99c263f2fbe88ee05a09c82cf339b840429a4e951ed9bc33552ce4a12576d26c4c47bfe60874f3005ee4430000db24a7d47dd21a35f668b20700fe665800b5ee9c72020202130001000058560000094603457ef453bf5ff6181705a2b246cf859c986fdd103b7e4a82870f07a30cc1dda900190001241011ef55aaffffff11000200030004000501a09bc7a987000000000601019300b90000000100ffffffff000000000000000063bafa1600001f351f6d894000001f351f6d89443d7e711c0005feb3019300b60192f7f0c400000003000000000000002e0006284801018231d41fbee5e24a3c761d03a9dcc17fd2c6cbe9e283e00aa8390fdfcf3545d30003284801014d3c0b1276b989e0d5a79c47ea4f578729dd3198bbf98304fe86dcf52c36d64c001824894a33f6fd9f866df17947aa394e4b363f93d3cbe2e81a957d3df083a9b5cc05bfc830a4393c3204568ca33383af9ca7010723b43661ab56a882e5217fc12166ec33a145fbc0000700080009000a009800001f351f5e4704019300b82bdbc72ea30858e553f855be63c7e33ef7f856ee573fba1071aef99e2f3f0ecf25555167d3e7e3b9d743ab51ebb60e1dd0646c108468a80dfff45042f5bc76e128480101a9447e9a567cd0624df1037afb4790360fc9721bfd832bff5d61b3ea65bc3ef300040001022848010184ce1dc421edbf3944d929cd1e1514e16af9234e327122e0bb47ddaf8aae723f00072457cca5e878c0f04243b9aca002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac000b000c000d000e284801017569858769c60289c9362970842a35633345040da0ea3f16c0c1fb2e8f71187a0002003fb000000000400000000000000021e303c1090ee6b2800878c0f04243b9aca004210150000f2201200010001128480101b392afe014d69f54c88b394d04e320eed8f5c3e853e7c515cb2466f2b1ed38ca00032202d8001200132848010124d21cf7ae96b1c55a1230e823db0317ce24ec33e3bf2585c79605684304faf200072201200014001528480101fd78695ffd58402e209cb0b060c95b1a8a83dae389c7eac9554a3c086e52b8980007220120001600172201ce002100222848010114265b804cdb772e1c9a48d1dd67ad6e9315495151d6f49bf5f203b2b883ae7c000c2201200018001928480101ff9fb607464434b8240b30817c4e6c358ad723c3ddeed45b2b82d45b9fb0f6210004220120001a001b2848010135495972e4dffc56ffc325d2abeaa6db04e07d832cc8b8847ae195158fd724d20002220120001c001d220120001e001f28480101ab446ae5250a0e5acbf42540f12f69bc49e22d74782881442954471a01c67d6c0005010120002028480101e1e66c22df500de6499c055de17ff3d1216fe5f15247186dde0708e01c52526300010024c201000000fa000000fa000003e80000001728480101dcb8145c3855df561a292809f62d0f8e99788cc63fd2722d35bb031eb96cd729000a0101480023012b1263bafa1363bbfa1300f800640fffffffffffff7fc000240202c80025002602012000270028020120002d002e0201200029002a020120002b002c020120003300340201200071007202012000af00b002012000ed00ee020120002f003002012000310032020120012b012c0201200169016a02012001a701a802012001e501e6020120003500360201200053005402012000370038020120004500460201200039003a020120003f0040020120003b003c020120003d003e009b1ce3a049e2ae726a8a0bbd8a53d73fcdd25c8640b2a19b63f8165e3605080f696c3f1196360005cef4873ed71a3ba04c54d49d0c2a248697f32eaba92097fd5d726fa4e91f749e61f55e1b37d460009b1ce3a049e2b17e367e62fb7321bbd441fea4ae6e714746f4b546ec799468a443c77f06ff8ac005cef4873ed71a318e28452aad9bd641f98e55d7744039595724c1ae5286a6a26ac2917414715c20009b1ce3a049e29c99dcf5746497809d47e6908427c26d3803daa11be1d65aadc4c0caec1a748bc005cef4873ed71a05e0cfa335d13c8bdc2cb6c84c534419d6a4a0d1d2427f5f7c6b3d52e5377ffae0009b1ce3a049e28adcb4b7ec3265f3c5a7960faa4ac5c077c63b472954e1aa3114cb58cb50f3cd0005cef4873ed71a3e141a8cd5031943574478d98f63ac3454492ad47adb30c1b3531c8cc349a7ad200201200041004202012000430044009b1ce3a049e2b8d8fb2addff53f05e13cf5a16032f176ba2e132c8a5193fe0fd2306f7a3f9a8c005cef4873ed71a0a73ab24af4170e8a646f6faf62520a9e70ae02f66a8faa8d739ef087bfc7e5ea0009b1ce3a049e29094c492d0bd7746742d9430529e4dd20af8e1c95b064a56d64d39586b5d236d8005cef4873ed71a027b0096de4bc955d34d0aec0615701d8a028e921f17a53bb9348a002f13d86fe0009b1ce3a049e2a995a48a0c6fde47b8e044738a033179268deb19544d22981dbc8ed0e5033c690005cef4873ed71a0dcdb94b5329e0ff38fb4327c57407542d0bcf751c201644c0ec7eb9dfc76c84a0009b1ce3a049e2ab7876b4ac3c0f8208c6fed9e7c2b113e6d26a8da250f08054df9c4d6c5e7a7d8005cef4873ed71a08491234782701a48ea4a5a886cf15f978781699d77e4c3f6bf2ea201b3ebab5a002012000470048020120004d004e0201200049004a020120004b004c009b1ce3a049e28c4f654e8b559505316a692c8f58c94e8beb64f05bb571393aa723d23f8c3614c005cef4873ed71a278b4f2d833b5dfc6c48d222ade39fa4a96bc874e62b16ade02c50ac553929e920009b1ce3a049e29e0ab3dcf5bcc353a6b133a13227792290c6bb580fe69c00d51975a7e749540c8005cef4873ed71a24ccb3c8c877acf99513bd653d35def60e18fae62414b0b3be77073c36abc72760009b1ce3a049e2bbba2114b284becf4faf20db8ec88f210c79b5c373fcab0698b12a9104f883f54005cef4873ed71a18a899164b1822d2e39dac978d93383eb78d0354004ae047083bd1275fa5323b60009b1ce3a049e2ae34eafbf8fd0a7a526c8fdbe2091a77849b1338a7ac0da084164c17a6cfe1118005cef4873ed71a2354621106c08ebc3e44c338088f0c135efbbc18605d7ddfab414ab0b88c4806e0020120004f005002012000510052009b1ce3a049e2a2c4c15e7470c3b06617bc03644d28e3b7b65c73f2ce40219fdc1377a26ce5978005cef4873ed71a0bbd302453127d952ee1de2b6eb1b4d3effa98ee8a6a66d2d1cf34f60a8adf4ee0009b1ce3a049e28fec9006be5387854666fbc18c297cc5259400eb0696bbb20739015c05ef879f8005cd78ac153ea62648a634deee5132ed07cc454c7e774e25efa5b427d89aa80656253524aa9f8de0009b1ce3a049e2b7328de7d58d11b3602c754f6302edba405988f56b1de6d8e6663751759890ba0005c99b5ac087831cdf36e4b759a2bb4dabc520c59bd44f7e49b30555e3a59df31808b8de95c579e0009b1ce3a049e2a1ebb2eab622b985b40855cb9c151bb3615753b819db6b3f7b01de9d5803430d8005c2234f95c1d8034c8f378c65a7a2f837c86a9c061d6afb43bb893755048ae64876e99d2b0c2da0020120005500560201200063006402012000570058020120005d005e0201200059005a020120005b005c009b1ce3a049e299ed229c0624b09f0b2a40257ebf463659e0224471b592815aab47d927c3f1db0005c091935da1a9e53e530f138dc23034ab3a93aa105beba7f3adfc8fac6756c6a41d3b17ec8c0520009b1ce3a049e2998df4fbe8c6eab946c942c5dcce5154f389837add7c53782227f1b94ded5fd48005c0301811881cd18743ced0ce2f84909844c1b90f000a3ec96c66896d5a2ef71c3cfab5f2125fa0009b1ce3a049e2a8234704500aaaf5b93c225f513af773d00305434e176658485f14a58cbf7cf28005bcb093059116a88373683b06a1fcb1f2e01f2e650b9cd6f64e5df8e5826b646f4a4e8028df2ce0009b1ce3a049e2b3315f842a3b7c2e9325c4b72e146b074fa8fc1fc48d27fef2c23a6ed0233dcec005b567e625c5a66a8515f6674aabf8a62957c6ae2a152b3503cb3fe2e55597c82b36b99373df36a0020120005f006002012000610062009b1ce3a049e299369fb1d2abeb523709d617d159acdf2994197c7fa877b5493bf90799cb03854005b38ae52b2213c7a104cc175cff079e7ddc767de7c18945406ae521e14ab5093ddc4ed618175e20009b1ce3a049e295331b2364a8b070ec61dfba0dcdb3d943e203a46ac46af13f89fa1850b61fd8c005b1da4c9bd6d44116118ca6141513385bce13e34d6854fac170cba9d216efc5f71c1423d3ca8e60009b1ce3a049e280d105f86fd234aa173c3745fe19b65801968e32647b1dc99965cd254dd8936ec005b1d88ad3bdf5a427283ea0bd92891d48b32f4464f1489fae9684ef47e15bc33d865089bc8da720009b1ce3a049e2a674669de4648b015501d22f0362e23612dc26859ecbe5bf318f289df55d38de0005b1d5d50ecbaa658127502a6c4d42b201970a44a30069fa999390d4df8425368c992461161f476002012000650066020120006b006c020120006700680201200069006a009b1ce3a049e2b0ab5549146990ce2f28cd813e79402b85a91c4680060ffa3c590e5e21101a85c005b1a1a04afb5d9ffa7efe55a1b9a55e20d9a0d5b34ddda9cc8fb15cd3810480f41b5fabcb599a20009b1ce3a049e299a35f7168798111b3a10f845cfa258a14dfcf0dc923177537ed2efb30de3da7c005b0af3c818dbc6325a469419b77eb341c7cb49b14545c1ee06df4301a0ac566bdda425e82e883a0009b1ce3a049e2bccfb6b53aaea1e60b810236ea3398c3653a1e7d22fd7afc906d14d23e93dc3f4005b0abae6fad80883b4199504264abb17d1db2b27514b626c70d308431230755e346d1aa0a902220009b1ce3a049e291a8540ed09db935759c282c0773cca1c4a0f9b85fb90892bd516631ced34a618005b07e685ab297eb820f19876b593dcd332fd692fb7ce62f133d69afd1538ddaed2d10df2ed32720020120006d006e020120006f0070009b1ce3a049e28b9f9878d2e0f22c9d2a9de3ec09533efbfe7313726103152cc7ce39e36fe92c4005b07a57289f84b52accf8f07d56050efd8fb3e0ac9ada86b58d4526bf3694237f3d4f77bd27a860009b1ce3a049e2b8be9ee064c2075db1fac489f3d053156a26276bdcff47f6c0d3c2679cb0cc7f0005b01e39aa743634a6303ed5565e9878c5b727902d93cdac1a9c9c3531c56a42db05aaabb7a25220009b1ce3a049e2a28ab7dba83e2f8aa15cf221cb73f1358e846667c481426a9ca70b49143f86180005aa9399a78be5fc27cd80b3fd0e46b373e778d9de40a15bdd34327d709724c56d12e679830b3c60009b1ce3a049e29a97e6935e8b58f5ffdae6a26b7661f55966b040376b32149df50e39fe9966324005968abee45a0edee4b71ea37c53a39d78c22a7d5444337bcab1ea092bffc9f7bb7550d0fa929fe00201200073007402012000910092020120007500760201200083008402012000770078020120007d007e0201200079007a020120007b007c009b1ce3a049e2948458ee49a2cb75afb0a8338ac6a5137318f92769bf7ec2edcf8f12be5c15a7000581090c33ac6dc7d38e728dd85d6c10021deded0962c65c77f742201cf5e27d2382e3cd525f31a0009b1ce3a049e2b6debe39be8224d120bd9d30b2b04f6ce5034c68a78f8ba48618ebd2610c4d73800576f5d008f340418dfd4152ff370f50ab0a7de08ede0cd56d266a28868d87b6099a40a45353c6e0009b1ce3a049e28d78bea37c14d25eb628171e7cb1404fcd86afba269af805b55d61922f4f81d7c005729797f6bf5afc8f78839e5db3ad4221bd66f6d6180cf1184d5d96583bf2ed103649493e116820009b1ce3a049e29a2c19b2933f5907ce2cf40da4665c6e18b3180a5fb68b25a38e7ed4459563ee4005718fc24e6220b14cb33c7d6fe094c752529ee15ce9a43482d7e9cf6f76583ef338760706c84e20020120007f008002012000810082009b1ce3a049e29c2e821210ebd0ce10ead1aaceb1d48f45bc7b783435bd104995dc54ce485664c00570243ec0e63ddd6c2dc87c6cfb33d88ffd3b1f2f220f90092ee20f25a0cf94490b56b50cfee220009b1ce3a049e28d888438dc9764039fa6b5bb1c4cf86b955c9bf35ad09ada92c93816d988d5058005700f0563f0dba7ecc28b733ac93e707cf11ab01189010d43e05211703894bac9a0f9f6b7e9d9e0009b1ce3a049e2932d3801635215de9f39c40f8b8a4360366a52475e5a9446b9ba6727afdbf8ae80057000ae0d163da4b8c2ebccf36bbbb976ebbcbeb7953d5946c815783d21c88131d32e40692dd220009b1ce3a049e28b56626e097c0e71b210d3c4da960b2547a1fa93f286371bd3f013f09b8e1a54c0056ff332a38eb0da3325d669b08511eda154caf8e2a894674119b58682a68c27e24f20ccdeb0766002012000850086020120008b008c020120008700880201200089008a009b1ce3a049e282340aec54ca842aa91127920f4c3f1711ec1ad7a83a99409907c5697f529d1540056fea6483dfe16b0650a4773c4cb96e0d7674437b0084f8dbcdde8a5a06da4f55381027ee840760009b1ce3a049e291432f1d3bdaaa49d7ef02f37eaad94af4d27720d8872b442ee1d6aab5eae32080056f729fb3274067a33cc15c7eb18478d558617106c49971e53fb44cefdcfd01def54676324c8aa0009b1ce3a049e29eb507c8bf523c607358a2537391d23b6b47418951c6295c47433adae7b91f5f80056f48f85716c8b07c0bf6f11a135ee1c6c851d45a7348cb431f9172132ee32466b138b1525fa660009b1ce3a049e2aa478c9809e672c980ea4aeffeb7a767f07c73867e67f7aa87acba09c0a7f00500056e7dcd30b99d53fc4158940c46108797153c2e535b84c6d4fdf70f945f866d2bb19774a38d57e0020120008d008e020120008f0090009b1ce3a049e2835d25abf7d4c441648a049376cdd36caee275102116da877c46564321dae7f7800552082d14091d0df8da74fd965e4d1bb896131555669d612c644f8e8e2d51b91521ccc12a575d20009b1ce3a049e2b0ddf26d0ace3f8ba8319e49def4db92661c140972d1a9e2ea6280edcaaef6e0c0054eef0d43a305758225a84ba60e141b1a49f40e964bf444a9135d940fab32e8a3cc9ae2836eb7a0009b1ce3a049e284af5762c453cf4c97d35b8e9c40a418f1eb6f46f917e03c26af2e6e112a1a578005498786b87b4f84c02af186d0d951f649d9091d98f7646afa8e1336f3c97523262947a2f7f66260009b1ce3a049e2b182c8a1053b0aa0ae08d59c65467dfa177feb717e9be953f46ec1cc0b18a98a000548983d0a70eb6cb7250bf2fc6c9bc6f91dfb5151f1354900de181ddc4e471069af8c40c7d2c3a00201200093009402012000a100a202012000950096020120009b009c020120009700980201200099009a009b1ce3a049e2b0bb5f4cc8fa03bb4e5c439ce4dbb5416a94d51365808218791331e6c5fe793ac005467e13eb87b6b6b90d0b43e4f4e2004fa75686da2228a063f2c36015dae01b3aba01233956c960009b1ce3a049e29ac05946631acece68a388836d5ee348f8815a45e5d962e2dbb19497d856b6fcc00531056970c6d77f95778029be79b4a96dfd0a7896c2f1b2303e461971d9ebea30943f4cbcbe40a0009b1ce3a049e2b3d19ca5f375b4be4fa9a528d9d4316271390ab2bd79f19186be5bf0200b22c440053022094c00552778e76b5162b3acd0d538d0ce14f1f870abc0d7b4516106d364582e1e4bb31060009b1ce3a049e2be0074d6c21926c537b571c7fe85a734f6b541a97666fc538c0b6991715cde0600052cdd320e4a80396ff9b8ad8c438eafc451fd474a77e974b1bfa3e3a53a5d549c84f365471a24e0020120009d009e020120009f00a0009b1ce3a049e28b211b02de35ec7336bbbb0da50958312c552e3b68555ebfeaf631fe72774ee400052cdba280acbccb2b2f620d8add53a175a14d651ce70897b905fa513c6c747fd62077c0ac132ae0009b1ce3a049e28cb2705f4754a5822c8521eb02cf6e940c9436cfe9e854b58857f2753513e5a300052c3f86e780d2d9867e1d8c71f6175a5ea27ba5cfc9e1d27e6234e65fd7306a363e0a1de3c51120009b1ce3a049e2a993abb64ccf7c0c7fba86af741459c0a657d03970829bb234bae69043c5f7ef000525aeb7cd4037ab045d350f2fc365eba43228e9c2f627dcd81169daab5f647006d9446a31d92760009b1ce3a049e2a77b8ad5ec8ba3ff53c306ed07d971ff7e7065166b3333e5408bf2787221a4a18005169c8b19bf25f6802d2ba64eec84cad5b03ab06554b3f0e1e57ac20967e14ebc37106f31153ae002012000a300a402012000a900aa02012000a500a602012000a700a8009b1ce3a049e28a6c9793e0d1aefeb2e61a19ef09fde10a96abc7a0a2f32b0108c7a841fdf8eb400515adac4f6726ac0b948f616efdbdce362a389bdc2ff7c1596075ae4b69a6092b2a7535ff8c2360009b1ce3a049e29451318f71403afdd7e839213cdd162be59821d3bd54efc3d411f3e3440c5b9a00050b94cc72ca1d83f8cc27a8677a5cd20d3e4b33240b9090ce216aff62f9818253029087709a50e0009b1ce3a049e2936f63e33d85439287d0583055f306dd065329aab5de3453daea0b6db62d9e2040050b94cc72ca1d82806043d2b147ad74636168f92c3439e9c855a7a62f1edc90ecb5decb849142a0009b1ce3a049e28058eaf1b7ba74983ca4ecd5d1db5668a51318709a1aac887f0fefca4b193d4240050b94cc72ca1d94004c7e2ba9f771c433eeaa2d643fd9385e196be675dab46443bddacb48dc51a002012000ab00ac02012000ad00ae009b1ce3a049e2b154add7828c9f0fc1d40f0f4d7430414b815750aa4cee0deab0d5cacc31bfc100050b946553cc20165ddff0dc24e96654a4397e037cdf84df73c7bf80088d8a4afcce8aef254ce360009b1ce3a049e2ba0912e2adac62305a5f8a63c71c46b162bd5cf0cc4e5272828f498c2692918e80050b946553cc203c5edb843dffcbc92f656b36931a259a696ff945ea938b63ccb9230131b8de0c60009b1ce3a049e28a15e6706a71fef8d3044957ec77e934ff2a5858c8b224ffdf62f51bc4c6055c00050b946553cc20207ca8ba58d1cd91d0a583a768112d51295d4efd9fe99259f0d4da5a3d6c3512a0009b1ce3a049e2bbdbddd85c05e67623bda730fb4d5e86314de545c86cb5aa16df39ef779b520740050b946553cc2025e3286571c2422c4c6e8c4eab4ac0b8fcef57950bd2d5c7e041adbc16bc3697a002012000b100b202012000cf00d002012000b300b402012000c100c202012000b500b602012000bb00bc02012000b700b802012000b900ba009b1ce3a049e2b9066cfdb6c9a8d3bc18fd3a7b6e2280be06831e0635c3695250cdf493af3b8fc0050b946553cc20382ef75f5d980998f3d6f972187346e03cc2cc1a6207322ad4c3bb3e94fc59cf60009b1ce3a049e28805546dee977d590bc44f1e448bb2bb07924da413ce64f7a02d230bd6f1b03d40050b946553cc2023be3bbc78d2197d05ff4cbb3ce4e02c3dc30c10ba97af39b20d40c2f11c356e20009b1ce3a049e2bb9508958512a31b56cfa67efbf10c8b41df1253fa5b318e18d3afa37cec9cad00050b946553cc2023f4b3e58ec64113979c30d1ba4b20a7ee74eb230dfa20b9049a81f585807151a0009b1ce3a049e2aa45aa9c34d7a989eefed7a85cf0e9b1d7aab1005756ea6e8135795eaf1e0bf400050b946553cc203c701fae1858c4ddc2e68a82e1e2bf6972164dbf247bc6b4dcfbd95f9edf7b99e002012000bd00be02012000bf00c0009b1ce3a049e2aaeac40ff278a9ee3650b24a52b7d3132d0252360842a9d978fc5372057ca77300050b946553cc203fef90ec059adf8005d61f1527de5a0e1b1d3ee63d607634c4d36ad2ebe63fd260009b1ce3a049e2b43a01ca2a93f9cca6ae5e944f132f6dd54ade54cd45708193dd89fba4aec16240050b946553cc2038a07b9eedba60c4a5720f4404eb2319d594ac01fcc097cb92bac153c0bc469be0009b1ce3a049e299a56e2d483e113bc36edd3d60a7395896332b8c278e741e3caa7d909b3312ddc0050b946553cc20122fa60d66c60bc073efe50fadd0ddcc561272f2a7df8203747af16f19049a3da0009b1ce3a049e2b8793427177d29327e9744c2e2c8adceaaa1685c2ee771037e5fcfe1de8eeac780050b946553cc2022f24c67e44f32e9a475a7db1d8c9cf54de8f7da6e0411a2d76444feac8c67ae6002012000c300c402012000c900ca02012000c500c602012000c700c8009b1ce3a049e2a5144d283b1b25c77fdd9d47c66072f657ebc5bbf9a24fec05273cb68ccb731b80050b946553cc2039b58444067d863896f5380ced22d5540b1c05fb6b2cee78bb6397b07e43d2c3a0009b1ce3a049e2b274a46e079f12139c69904a5de65682a2562df89f4a00a3096d951f1150dd5c80050716c1d03504e8cfae9a113091b84c87afe09d9300d3b4a590b6e84e8bbfa27c08ca0ddebb6720009b1ce3a049e29a6d40bdf589c63cfd06677d52a318e5e5d88c3e5b5e33063e1e38ab0490e3198004f2e2303e090472b91def8b3e3c77a66db288991637f705e981aef30a18455d634d26513930cce0009b1ce3a049e2ae637dbf2220f5b631a9b70cf54a1cc371e9523a6f6788c8dd3a8473be931dc40004f1a5fa3532f6dcedd6eb17b65e5f17f4dc0adaa102c83f8c64aa3000dc42d836bff6ded8e1a16002012000cb00cc02012000cd00ce009b1ce3a049e297851cbc6d26cb01cbcb9c0c3e129c456b6dad1e3e8bf619d8b59bff0c3ab4adc004de13574ddee4fd80efb75ceadab7558f7439deef102082c17590bbf61765112f2e10f9a417e960009b1ce3a049e290cedd07231e3eaa412bc2cf16715e90c595e4e079ea424a10c13dd63789b7444004d2d4d02ffb3cd3cb7269341296477bfe73faa48d3b782a9d242932658b1fbc0dd9da4dd8eaf6a0009b1ce3a049e29e9ea8e64bd755b04e0f5eb2c1087e66c8f5b9d1316bc2c51f7cae2e111dd63ac004bdb686206fece9fe01ee4c98aa31c42d62389794ddae1692e08d60154e0b6a8674d7a46cfd6160009b1ce3a049e2a6dc1f4b715d9f269f21a8aecf30afbe457245b6e35fcc3e4dc31c6f5dcc40e3c004bb0e25b307babce1db1c705c494511a33bffd387a79d10f195d0ba82653325f88a7d52b8ee726002012000d100d202012000df00e002012000d300d402012000d900da02012000d500d602012000d700d8009b1ce3a049e293b53e0be962e3a0c91ecae681fc642355c422de0f3013a6e096d8b4b6dcd9a14004b6dfa9ee7038506a492cb59bef4c9ab52def25e140442bbe9f26e63e71ae787a9a7fbfa1aa8860009b1ce3a049e28f15e5bb867d85637b43db2be14bc9ab9d05e3c3993a6a410329f04091d176e70004b2b95da1c672a517e02c8ac346b58789397d3a6037f74656cd72e1ec4b6567992d58e07d98d9a0009b1ce3a049e2b7bd0565790e7ec246200d6dab9b5e54001d3a86193a9bf8f9f9d703549774758004ae42987104684a9cd2bf686dbe7ba6d440aaaf67f9be34e0b3d990749e7e700949d420578a8a60009b1ce3a049e28b631b67f84d0e5597ba14f0bcfbcf59e4c086e54251e7f9a1f003acab78922c8004ae24171b556a9559766f814cee12945ec3c4a16cd5fe28b8aa917aabc059569c0591e5ab8eee6002012000db00dc02012000dd00de009b1ce3a049e2b6a824cf01d4312dc61013dbaa5932f6ca746f90c38d4e03b60fc210ef431a170004aaabaf2d6e663af9675e686c90fe2a02290d434d32e987beb21ecda88dc46dbbec0f2537f5e0e0009b1ce3a049e2ade7f83dbb15b525ac8f2108f12262a0c012e65091fb1a53065d3b69dc82dbfe00049c20162ff9358940fa67fc37c020ba8a5ce7e7a9e40073034f2005e95432538a8f9d72a496b0e0009b1ce3a049e29d5f6b16aa4333ac7436c05157b3bb4c0cae90c13f221a23cc33af62e70aadba80049c20162ff93598ada53fbe1b8204016a111b642c5c10b6efb15a9157ee01f73d1fc76ce6f42b20009b1ce3a049e28838647941bcaf13b516c4cf29fe2ac11ac12acfa31a04495f8198d320b5a7e740049c20162ff935ab823314e26d653a3dce059977a0c83c970a98befcf5e75c937aa9db29d67feaa002012000e100e202012000e700e802012000e300e402012000e500e6009b1ce3a049e2b9c9e2c6a38f0894167748866c65c02a437b32e82cca3fceb50123bf2b2be3cb40049c20162ff935b0e08c7ddf1bfc3c18fc59d5a8c49b262d4a98de685d888117d87e80e3688c12e0009b1ce3a049e28b9c8f75bf80dc00050b08ca51ba698a8db1bbbae801baac50f7e1ee4a6fb4e180049c20162ff9358264b4a58989a560db1e2b784ec64a2cd7f1e31f707785189844a455aa2f019da0009b1ce3a049e28043fe45fb2c661b969f3d220ac4f5d28e755c5070487c2ca4a12932e26f10cb40049c20162ff9358200da27d131557afb6ca1c7542ed43c867320507d68f6595dd01e0bb32c471ae0009b1ce3a049e29cc4f0b39ba4abb49b0a95b8a059989b29a35d5e2f23d87ae2dafa2409accad440049c20162ff935a22d3e8b9e0208c7324c00eaf69b7ea62df5ba4fa59714f465dee6a87953d8c42002012000e900ea02012000eb00ec009b1ce3a049e28f0f1dc7b52fd0b431c0d2cbcc1506e4808496bc5e9e5a8d827365dc5321fbf140049c20162ff93589b866bb0a015a1b9cb4a04259e75c2854e14017f653f3e42e34e3e2f87ebeb1e0009b1ce3a049e2be48e1f08792d52d240ab96b57ff947d642a9db9d25fb886c083d53e9c6108c1c0049c20162ff935abc819c25d36ea49ec9b99cfdd3cfaf91d642ba9dc94ff8273ef4a7b4fd1690220009b1ce3a049e2bd638e0fb15df5ec2a5fd45a60a8d00b6d10cc5118ebef4317a6fbdc1c80a593c0049c20162ff935bfec45c828ddfd9fc9b3f6fcc0b358d37753667ccb44a8a5af094e0c9c6ec36060009b1ce3a049e298888590d90d12cc830fea5e9f834ccf4e00d0a98871d5eac821aa59163d82f840049c20162ff9358c9ba8487cda2ccc88d92c89a7c1459c7585459e44f942bb38fcf192199fbfba2002012000ef00f0020120010d010e02012000f100f202012000ff010002012000f300f402012000f900fa02012000f500f602012000f700f8009b1ce3a049e285629452ad64f715531d0b51548e5bb4432b17cb4a24fb1aa53ca78233865bc200049c20162ff935882336dc9226ff3651616ad7d83224c1c7bfdfc647001283ccfeabb8a38e526120009b1ce3a049e29b3edebd748db84bb1a641d3cef42601ccdd1d2761815cbd5138ec6bc4cbe08880049c20162ff9359ba3eccda1a1a67603cc4de6a8b3de4f6f42c68b481bb25667ad0f2a4882697e20009b1ce3a049e2a120ba4a853aeef47a4980d55377893bf6e496e2b7d19cee9cf86cc2501e20f480049c20162ff9358c9c22d344f11ca4eb99dd0fbb543fc11dfb1e86e3206669bb76df787e1f02bbe0009b1ce3a049e29463cfd2f2909174be8b2ba40987d4b39133fd2f022e0f57a760a3c3cd7df0ac40049c20162ff935b32f2c478c701e91245aa3d88dd55817e44c73d0c42da9f2e84161d79c27c223a002012000fb00fc02012000fd00fe009b1ce3a049e2a095fdde6f126585971bb73ead7ff08c97d9fdacc497a1d4d029698147ab49de80049c20162ff93592e07107e20b6685a7c898dec3007a9785808ed41d747c0d75078d63b7c76d0e60009b1ce3a049e28b1b3e7789ba07fa3319cd83c0606810ad4b003c6806e4c9d8fbd784ffbe78c400049c20162ff935851e74a504d562876807e239c6cb607461d858c47336791a1bbfa84f3964353960009b1ce3a049e2b0adf91990feb580a005a578edc102e127533c8c42b7dac75658715879edec0ac0049c20162ff935a158086f70a6e1366c4ddf33f82641fe760fed5c84a92fe68da8a3967be66b7760009b1ce3a049e2a493d650fec146beee25ebc1cd7b5db2c6b2da9c3a1dc6eca449fc6f2e8d564bc0049c20162ff93596680c6a2a94f3515ee812cc8865a8cfb40ae24128c0f68230d7f03c9055c1dae002012001010102020120010701080201200103010402012001050106009b1ce3a049e2833cffe7b1f41c3789cabc61e6a140a3dcf2264d490a8d239da84512c6b48f25c0049c20162ff935a2a10b37bcb1ec1baed930bf99ce1842d6380c306b80fcb5ff2971f5fbaf3cd3e0009b1ce3a049e28f97b7f6679bf5bb2e63995e69d8741ff679c676b00a9ffa80debe612a085c07c0049876d782fd12f6f9bd85d5b0016f6d5dfa99d23eb5ac4b1575af05db1dedd6a9a39f171313fc60009b1ce3a049e2977ae7e147d0ebd465d7ef7b2e520916bf260159ecaec1f468c06156e22b5168c00494a2adc2d7242dcc150c16fe0897241e80f4413339d2e0415efaa02a2c352173263a0a0b3e2760009b1ce3a049e2a232060affda9fd15ed68b20d17df08d472bfc3edfc73128b4ef44c0dec3f28fc00493922a8b2d5b20d011e830eeaf39b99ed78f7c7e91e0914678ca4a7c6edec4be7ab6a18ffaea200201200109010a020120010b010c009b1ce3a049e2b19b49afa52b82e525370125f33fab952ac3d3d4ca6ad73e3f9506cb7df27f8fc0048e5720f031d1460dd58645d6b8d97fe4ba07286e084488fabb602c0872b5e57c6705ed9de64020009b1ce3a049e2b866da234c3bca9b58a424856940558ba974f8063eaf457b38a6039d0daadc5740048e5720f02a7a7909342cba491b08507f8a25ba54c409ba6d10cf7b9cb58a3eaf5e464fd7bfe5e0009b1ce3a049e2a7005d311684149516c82ec0b3115d404bd6446a74504d517c96cdc7b2dba91400048e5720f01a8e41bed0b68ff4bf4108f22687b94f94b3a45c56a98c5a293986b062a2c72c4da460009b1ce3a049e29d6ffb951d46ef36c2463b55da5782b1a67d77d5f9f82c29aed754c1dd003c79c0048e5720f019550bf783a061684fbe1608e701ea2c6f13371cf276862016b349ebc1150977c05360020120010f0110020120011d011e02012001110112020120011701180201200113011402012001150116009b1ce3a049e2ae72efc8d108507ed8ceda92d2e08fde7e52a173e65f4c7cdbad0a0e01bdc44c00048e5720dfb6c028ea011dc72f54b87e8b43c94a59c6d499c19394fa56f6d0df127a393d11b77da0009b1ce3a049e2923329c3d6d9e0ca3ca2207d8b2cae2537294b073f6576a662af640caf95e6f480048de915a8f03dee4e016f51815d3338ab8c29e0bd03890feab9e861f0fcb68ed8353d02b6b02460009b1ce3a049e2a6c1b5e89583865b68fd94450be421804083488afbbdd7541d065f1ee8e2bf6140048a284287b702c24f830979f1ba394187d506e3dd3568fed7c2f320e5760c540b5393b590983f20009b1ce3a049e294d3124cfbf71f4ec56161bdceef9fa7a80b9eaee933af0bd65cdf52c9aeba3f00048a168869b2fac23fef9cf49149b2e2a3fd7dec7dda3a1f0d120cdd262f6ced9b72be999785cb600201200119011a020120011b011c009b1ce3a049e28ad75d2655295d49a847eae1d7adbd88b98aba0d319f0a9b26a87abade793de2400479cfe29c6688c6095072f6eb127007e98b0c2c855151bac6b94c20700df1f544969a2a7f853460009b1ce3a049e2815c41c36fa00547473902992b8027224993ed9a1ddd773e3ee3ac57c8b5b52c8004704630db75a45cd9245931ddfc6d508b411ab4018995c5f62752e054803c9f82d15485be001fa0009b1ce3a049e2994ba5249329be5f1caf7d94224c2251ff854b120ea11b85e12800b67be883efc0046fbe04d6d2f68fd203e334de61abfcf85b23a17c6f87853d99aa68eec646047abda2fc837ae860009b1ce3a049e29b21403b333c0bdbddc23fddf3062fddb3d63312190ed1b076bc14d928cb822700046ceb964b88ebde6d4bd93473ad1dc6b84176e07c834f1a1e10e2595739841ad9724a93503e1560020120011f0120020120012501260201200121012202012001230124009b1ce3a049e2ac4ac1f9d532fbe6c82aa2a48ba25e4f9d19f9e21bbe4b76c54501e0f253ffaec0046bee7e598afac932130f044374de6c5cbd9e723044aec3af3f77b18de54c9b9f7cf43290db89e0009b1ce3a049e294b8e27edcbaf70f43b5e7135a51b56b06a854fd1966165d88ab01401bded0f440046aebac9700c256d40d6f38e60cb6b302febdb408fcaa67fff8c3271a40929b1ea0274b2e730260009b1ce3a049e2825cc0ca59c42f64871441f3f9e0637f777941688c4875edc57a9cfb88edd5e7800467e3cb3814142220f165e4717e1f52cecafc84e487107c80ec6b4b65d993b9262347297dd74ae0009b1ce3a049e2ba160b5c6840fa4269e617620a2f0a954a99cd8521af2436a5454023b0f5dcfdc004678bb724bc4ae923f7fbb1c77f24be5deabda8e6b8930675d0751aa2d8335dc8d710cb929842e0020120012701280201200129012a009b1ce3a049e291a8bff208cc1c264f9f3dbd4a4a0528012440a65c8351cdffccec7e347b68ca000467893f6c4460295ae334a41002a3acb6bd81cee5ef4258f7c1003c7d2f7f4c3b9b385c711968e0009b1ce3a049e29bc507e9e8b1e62930c78a321ac922c562a2e00dc4075f0bb8014704ff6d0dabc0046764e34356672495ebb678b36f86245c959728e2166f3600d364b3843284667a297061efb9b060009b1ce3a049e2a7ce1f67f3e73703a81157a05fb95944bae1b9e81edf76c8cc153af40fe6f241400467612f1e23381528e1f2a08f6c977deb5e1ba1eabecda6ce4b2ee114eb8f678ca2918f77b615e0009b1ce3a049e28ec537af88ef524efa75b12fd7889d992694da443557cfacb9d253cab034e953400462941499aa5ee8b43081357b4885f7d6a67a762a88101e31026031cf6ec6bc1fe92976035cd8a0020120012d012e020120014b014c020120012f0130020120013d013e02012001310132020120013701380201200133013402012001350136009b1ce3a049e2ab2304f3fab6e93534135f1213ab391bea083b2887e8748d7ca508bb50d69b2d40045fc177bf03296c7839a36d9c3a50549fe17f50cbb02e554a4b2c1d257004b4c9f707134a7c6e20009b1ce3a049e2ab34a753fafe52d80bf480ef6e2efa8c413be8a9eb911cc5c4f184d9c062829cc0045f27998c36f9aa3ea0c15b74bf9ca563a8cecb1faec9acdb620557a084a7c862e19df048f83ea0009b1ce3a049e2a3a47704f1c57409c9d4cfe8547f8e16d1a5f227e2b8a72f3ce0c027ebc7b7df00045d88b00faafbd60b8a7b21c57d27f0931e8e6cfdb7ddd6b4e5f2799f7d8ccab31d578cc667e420009b1ce3a049e2b10884a7cdd9438c348dcf74c4262bcd291213024fce02c72bca0bde6cdc7154c0045b136a81e50fc848cc771bbc8361d86f381187db7bb35f83fe8ad8241d33b8c2c9acaf59723b600201200139013a020120013b013c009b1ce3a049e2886830c2fb7e04c39c0ce25cf913500913dcd3956da4cc05a6b8e5965961b5c700045a130daa3fc459a28a87acfaff5de1c222cf4af07dc11e8e3fa4aadef5dab7ce01c114e5b9f6a0009b1ce3a049e29b2bfba3620d3bc9c429345819fcb55c25093229111dbca5bb8422c8d0b13f0f400452b1e8f26a01ae53147ee1c9a4d4900c0c292df9fee569b02e0554c91ea3774f861af81fc3c960009b1ce3a049e2b2da928df98e7de4288aaeebaaf2963105840ba5d26cb42ff076ff43e72bb804c00452b1e8f1de8b925ea341585947baa0194b1406662fccc2693dd8932211203a1326a59f50ce64a0009b1ce3a049e29db4ec5931a8e6c9ee73311d8eff5f3d0226110500cd4d8a8f9f9c21df814737400452b1e8eaed69398c7b95f42a89c2a5ed53d6ae8dc665a1ae424ef1e961bac85be227ae5dfce5e0020120013f0140020120014501460201200141014202012001430144009b1ce3a049e2869a0ce453fcb68bd8d89b59ecd518941ba589ae302606bdd3a78a84b0e59a4ac00452b1e8e327442d16d52d1d34af75b70c1a1c7363abfc373cf7fbf3229cc8be80276825670bff20009b1ce3a049e291fae10d2f01646fd8106ec54651f4a6af7fe263d4ea67e654ec393741929727c0045255c89170eb723623fe37a6a77b0547345396708c9363518d18af94528b92014a6d7950fe9b20009b1ce3a049e291a5c3973ef268d5825e34f8c261cd77e23f43e2baccba77e0303222a67ecad1c0045255c845804268dec11592e433234901611fce32fadd47e24f7536ac942b81c5ef7c26d979dae0009b1ce3a049e2900853925452717b221b5fb348d94d900fa5f9c6aa69b78315fcffaec014e778c0044d73bcfcb13b3d9b69681f6a2d635073aeaad83c2107fde9639331762bbdc489662d80881fa460020120014701480201200149014a009b1ce3a049e28df1a42722b005edb5b309383098c5fa0c88f769d85b4eb44ab60835349fc4b280044d73bcfcb13b3b08339ae393d96b9a5c519258e1c62c12c65bd32222ad5c45d8f201fa7c8d29e0009b1ce3a049e2b457e59df3cac18f5970658394bd209fa47a2780a7402064c1ec0ee58ea472c240044a4e6d26439fbb41318996d6e8ce34927a5ab553a01ea365fc17998486465516d4fd420aa885a0009b1ce3a049e2bd12742539ca52b0499937880a935949ca1253c663558cdbcc8d4b650ff1dd96000448bacdd821c4badf573699dc359e1c159690b32f85c446b8d8f73651aca205b06560f081d11f20009b1ce3a049e2b509160152a6ed80c7473ff9f6dfec7520b06016f79f3276dfb462e46a37a172c0043d17aec585eac424f5e283adc3e8da52c90a2dcbd07e311c826dbc4b63dd81990fb6cb7309bc60020120014d014e020120015b015c020120014f0150020120015501560201200151015202012001530154009b1ce3a049e28b86d559c608f2e32d2a33844fbc047435b4598bc99f011742c359b565e0b3148004388aa152e1ff0df97491a293787166266f3c3ec9e93390f0aaeb74b079e92dc6694e9ec7747fe0009b1ce3a049e2979ed40dbcd38792fde6a9e5c31cdd840b0d01a00c5b8ad667768ccbe9bc309380043446300635606b3ff15b5771e8aa82e713e2ff3943969629e0f64e0ddb68165d190c2557ce5b60009b1ce3a049e2a18a9cdaca0a2e6705f387343f7d87c4fc38c57118a40d5a36478e5599a2123240042c0861d01e2a8a82e510b4d9f501503c4769c8f05cc7f25236f156f00aacdee9b7e06eb07ed820009b1ce3a049e2a7584a15bed9b623882f76499a2252b3d0aeec3338d79045fa662e31835b55b40004043afc9af47bc0be1e2bdb47318045ffe1bb6e79f6bdbd0bb5413fa37fc222bfbcdfee2e857a20020120015701580201200159015a009b1ce3a049e2a2a673547d2e9e4605a50e642fae1d80ce99be80b33ff0b4a16329d4805cbe7bc003fadf0885a8b305d2496398d7959f433a2c366c5656ef64a8b1e04f32f4b49c4156665ec1a258a0009b1ce3a049e2a0a8a5042e88920c04038db7f45dd733f28c8e0a492cb69b4786a391b30dfcf84003faa22d4c4a6863a49af7f589fe5c368507b67a2fbbdf28486af9372c42a64f913017cd699bfa20009b1ce3a049e29855a4f9efdf6f9fba7481e023d9cea9d202591ceaebbc54ca4270e851d6e0500003f9850387676543536dae1af1fc09513176aff7c79d638ee99ae975fd964bf942db7d0fb91b77a0009b1ce3a049e29ebaa14d24347ff682d6314fc378842a5f7ff206618830d7781ca027e20930b34003f8d3a1fa10c21a13f11ff3180a7b3dd16e833c3a411c9cd17c8859c0c288098c80fa80b47b67a0020120015d015e02012001630164020120015f016002012001610162009b1ce3a049e2a80a0fa1b61ad2038591ed5d71e2edf030b375a80813d07287d6bb6e88bac4274003f61e86e95f46048921455da5b253bf0a0373e940dab1f62c33db1b6c38e2c2509e90b18d6d8b60009b1ce3a049e2834a811892ca75516748c45494605bc0e3eb4d1b92b86e2c79ae0d6d9e32d4ad0003edab689732ac51f36a9b75b9687f793dec216c606e3f7c6bd8abbe1afa40a288e30de2950ef1e0009b1ce3a049e2b8b4cb1dbc72e6585eac7942557901054f803c82eec3b47439bffd6d4eefee830003e304bc53b02a563dd94a980935e004b618f63008b1227557d464cc7cf26e705a8a109108c4efe0009b1ce3a049e2a0f4655001ea5362445cbc4b16b0dd3f97409becb42fe349ba902f10d43cbd904003d96d1e9600e803943525f8161f8aec2fb535335fc2bbb1ab0b47681903cb447cca69824f1b9ce00201200165016602012001670168009b1ce3a049e2b52a02c7ba362b01e52d5d8b364c1950589f423753034ca82ee8183a239db3c40003d915942bc48ca9944ac68574578f8ed0bddfca72d4ff96126182d0aba84e1eec9c49d3719eaba0009b1ce3a049e2af49065d3339367d9c28224d6c674582f4642c422d453ad95711d5c3ce0f1977c003cfaa7e5f42ad43c44edb7d681a9eefb9ee72b66ec874c2dcdbbefef4f9cd0ec9131c6e32ba0420009b1ce3a049e2bf82ef5bd001980c91d30bcc5d79fd808785ca645261a489ff6e0caa9337ed888003cf91ebfcbd4bbaaa83f00bd051fbb5536517bb5a916537bcc03e27a87a7ec0af1943fa239f3420009b1ce3a049e2af5411c451529de19ea896b743af84edec415307ae380dc2df081b6b5818b6410003c03baafc45f89663ebf5b15b05dd8974676487cccb33fed640bc4a68b490626d98f540fc1c7ce0020120016b016c0201200189018a020120016d016e020120017b017c020120016f0170020120017501760201200171017202012001730174009b1ce3a049e2a7584275ef41d7bea5632c8d9775503807292471a8e0308913e1c901764ca9014003b973c4ca8d86064170278680894f6ea68ca69ed38d7c8004d9acc66269c52dcba495130bf58960009b1ce3a049e2a73f4680e8b1d6206c29b333e69e7b31ebc16373675e863f47d725528908b7830003b7e4bd59e3a0b81055db64e196e3396ede7bea28437c1d49f6db06acff8689eb73b13ea3f53420009b1ce3a049e28ea14126aea3bdbf38ea86759f256ced47486ed03e4bbba12e0fb34a1b8d9af98003b49c0fb146c14feac07f0e4bc11320a8da8b1b3a66462b53c494a4e14e76c238f26664fffe24e0009b1ce3a049e29d9dc65c30c2735855a51732b57851727c5afaf4658efb151b5e590aacb475a90003b3c82e036814a30b8e5463bb6f4bae077e1956a261234d3f1df5317559c2c0cd5f4b8057f475e0020120017701780201200179017a009b1ce3a049e2b8ef7aa13dd242c53b023b3696fe41fb8c395c6bb07347a16edfcca7e7b13ec48003a3b16124b1984303963b55830d2d2853361134b7618ab43528bbdaf687a69d26867141792ffca0009b1ce3a049e2ad5a053730b268dccca5bdd7126b943c217c3d5c78b3183d4e81a74a8566004a8003a1f03d2872e209a0aba445a362a7aa7b5be60b52a9885315a3c192b5313e881d68322578e79a60009b1ce3a049e29dbb3d83490f85c77181304da353801fa995be7a2bf228db99110c3577a61287c003a1f03d2872e226ba35a67d878b9ce8cd176458a2afbf5b8d642531b3f489a9fde93f24a1ec7120009b1ce3a049e29fb424b43c300c449c91f6f287ae34d5f5ec1196fac6664d62f283693a37b34f40039e0daf40d5e1163653295d7a0ab3ffe70a8e39b431046c93e5a51976ec30f17c81151a28b62420020120017d017e02012001830184020120017f018002012001810182009b1ce3a049e2a6b44ec29ba02667b36ac73d67031382a460f85a2b797edcd0e0b7068555242e80038ebbdc9548718e5b6248ae957819c53195463dd7a29277835a5b27323db64cea1c0b8712907ae0009b1ce3a049e2b1f718fae7952cee30035cf9ae7506589f4625bad4f2c88849bac3cd8df8c66b80038dbf4bad34ca87a27dbb19ba353b571991f65bffe5aed1f4760ec1b5e2ffb23dc9430e3a0be220009b1ce3a049e2bc9030771fdeaf7eb2a21c89a7d2b6fd017cb337c1fef57a724f86b2d2da9bcc80038b57d3bad2793751d7dee28e7a37b1e3572a62abd33af2ca3f86d1858a0cce6ff60bda6e3459e0009b1ce3a049e2b704c71ac24313e9b244f05b4e5cf5b87aa749dd247f0bdab6b38e61d3c37a5d4003841f965354328d3a5c152504a1ce49bbd0c5f022169be07c1f530da7255c17855a8bd810dde7e00201200185018602012001870188009b1ce3a049e29fbeb3a5ae17dcb8dade60d84d8de56db82de854692ec5697333f93f826fd37f40038109a6b762fc27242fbe7fc4774f4d3dab3613e7cafa7b079fa124a33a6fc90ca96baa69704c20009b1ce3a049e2b5026c714b4332e0a01df2ee9f56501fea6ecdc635d6e3e2cc4279bb4698ca5800037e3b1edfa29f005ab8bbe1c5e2e3b1e546636910d34eb91b232b31e21ba0b3b2162e599de997a0009b1ce3a049e2b285d558330e2e5d2a4ace4b50685ba79f187023627ec2f62461ea293ab9032740037b85df86260b4fb2578a99c369561d684eb320a8f13ef320143899fc9850c38e74e95b0eaf40e0009b1ce3a049e29a7952c40475c1eb48229a67ea82eb00e74f438e257c13e07805c4e365ebc4570003755c884224247b6d3b4430cdbe843e76d179865e48f49a36bb16867897d45dd53b004067be3e60020120018b018c0201200199019a020120018d018e02012001930194020120018f019002012001910192009b1ce3a049e2bd340340d8c89573f51267ff119a784959077c8478a24bf8bb4264411be2149fc0036f9213edcaf19eb73d6117661e38f086a8631096061f73baa8ca5181082177fe773edeae06cd20009b1ce3a049e2902215592f16d7895b9e148447b6add4701414d3f496f106d9c35f03cf926e5c4003616d3d867fcab06d5026994fa04e5b710b4e68c4429a9e705ce1a95c7c0813127b2a8fe381ea20009b1ce3a049e298e104e1fe46731eb8341b6cec81bb31d317d0648a9adf91ba0d415c21eb7339400356ed90f5c37dec196c5b1cb6bc04add46eb9eb075aa93d31826c69b548eff130b118aa1f09d260009b1ce3a049e28579037ac4975970e0c99460b6610c4f728199b705c1c986719438c0dd2e1b9a40034a7e5f28746e9f64bdc3ee3effd34f1eb0ebb0fb48e99c40e5b042c18661f7cf2837d3965c3e600201200195019602012001970198009b1ce3a049e29775744747063080075dd5293f156ad22763003789e710782523615d6886535900034110d4e8dc26a1ea43d67ab725691048a03b4a4b10be18c03fc4447238864ebfbe528e9afafa60009b1ce3a049e290cc41c3428657bff63113f01c1bf66868a45a6b32355e07cf481b037e093ea0800328c7c26c0c66a4bf04f4e4bc1f57ed53926a829ac7687196fac601487c228d65acece629cf61e0009b1ce3a049e29d3bdd7bb63958b7ba3257f35628887afaf6ec82689cb7c9384ed15d26b62d4b000327aaf7d4998ecc243e0ab84c6ce8324939e1888aea6363bc3b081d6ad18eca492fb89a8125c9a0009b1ce3a049e28c3b271295c7fcf9193a8e7917429d755d48c7520ddbd517c5ec60d3907149ca00031b362086bbba7d5f13b8eb2fb2811f8f2fd2248f8897e151bd652c93f307b1e0d0c71dbdbd10a0020120019b019c02012001a101a2020120019d019e020120019f01a0009b1ce3a049e2a22b653005c001b076b0842f2a3e1b62f1c7edcc212aa7d4f0a017123bd1d203400312bfec6afc24bf09a1ca5182f7a1832d9964fdae6786d148544642138d9c1d91c3660a3bca58e0009b1ce3a049e28bdd4ef27fe2acfcaea6c87aec292e2a8aca49efbdf937c50917c48f52a5a09080030f9a4a4ab06429d32e6213ac7ee6541c7691835955b5c383bf1e277aca1dba4825d8b8e5b09e20009b1ce3a049e28b99700c7e6882477c3632054d72cc0c344d370d6996c0b28b9b035f36f9beb60002f9c18b7b08c9724c43b5243ee6b2f766a6f24f55b171fa37a3a125b9c72e6a7abeefbc3620ee60009b1ce3a049e28443c8ec4f94b386db81a5fd7c97a029304bbe7082b65328d06adda09e7b75180002f02a98d3483da2bae4ce9ca3b27c4b57c5bfd4c91ed11f604df3803cf0beddb4437b63c7ccfb6002012001a301a402012001a501a6009b1ce3a049e283e6bcb7eec4528dbb52bcc76f368d7be67da04874785b944f285b8d00ccfa494002e90d16bb364da9ea2d14b979198992f73ff458a40d76fe3157ee74c5a780e1d0cc1e93f3260520009b1ce3a049e2a235103b45c15aef4530d7deb09973d014eb27978c6cb0f501176353d3db054fc002e38b6c868bdafa48075ecd741d50fee154318dc3c16bda368046babcf4d0ae90619e10a3b27be0009b1ce3a049e285408a544fbc78d35367141041dbccd3754df96afda44d113f609484c99a14c5c002d4ec69ca56333b88705d8a1a927b941511fa4dc9dc5d50d0da4cf7fbb48496bf1a962df4ce1d20009b1ce3a049e2a88b4982e206c01d5795c9caf247e2648c005f6c195867325c3a4c3c03bf2c3a0002d22cbb1c399c6aac223bfc85b1185059e8996194a8271c84abd7cdcb11b24cc3efc04ecb68136002012001a901aa02012001c701c802012001ab01ac02012001b901ba02012001ad01ae02012001b301b402012001af01b002012001b101b2009b1ce3a049e2ab8ac9a6150bc8b1d8ce65efc95c585c5dc63d7b63a237b14589a31f323f38ef4002caa57841285bf85c1cfdc020bd8aa220810902f1bb066557e3927968850f219267da0bed3d52e0009b1ce3a049e2aa9fa6a6be78f2e1c3090c73be92ec964290b6f22f74e7b577a03ccb83ca193c8002caa07468a9384dbc32e7f98f5f18ddf0847960f69dc56903cb7924ff0bd4232512ea170108e660009b1ce3a049e299cc7b409581c78a2d741de47e9680768c2983a2de0f56f4e52cc3bac395dc214002b64adb906570c6dee48b7d754cb10756ee56e24b1f947b72bb5d6c4dd820300e1a254e716ddb60009b1ce3a049e281736bba306bdb6e69f876a41af10ccf79539d88e2328548836b97ffe2b559400002b47e36f7cf1333de3900acaa1c1d147728ab1a4274054f1e3e7870d5a30dbe53d31bf2e559e7e002012001b501b602012001b701b8009b1ce3a049e2b8a1b87f83522ba7ef95bf093ffa7f895f2009f5be5febb433c24299fbc862320002af534d85a3a27e11c57246e6770c27b5507791009d09e3912f7c16e08bda5e5ef9506c4694e560009b1ce3a049e2a9962515914935675732d592222a4b67e15999a1209aa76216dd7951735cfe35c002aa8d245acdbfd8324d3181966a141c514523c202e2a22d8aed2506b06ebd09b6abe0dfff3ffd60009b1ce3a049e2b397c2349ac2930dc062b3ebb17bdae462743948b639acddd5e8b0b4c00b18f00002a983d90385df75d219533d6a9d383f0a19caf6dd415e9c444edf0a7739081733c5669a72c94ea0009b1ce3a049e29980d13ee4f9ad180536874ab7ae0131b6d8ac1dd5fcd1b4185e6c08f63e106d4002a828c6cd5b3b5fe968e6748584d4833998ab0f2118fc101699e06d3b0659322cef4c666802ebe002012001bb01bc02012001c101c202012001bd01be02012001bf01c0009b1ce3a049e287fd69955f981d55efa19c56977a34a1ffdb9a5fe7343213580157ceee67190d8002a33370e6310da29141b26bd203d751782e5ec505807ca9574e9c73296495de83d5b39b51523fa0009b1ce3a049e28d2ca45325eac4c60c9ff4fdbbd0a73a8dbe0341a7bf24fa9f533b39d212920340029cb709147ac3d571b3ab859148402488b98e9dda1fd151968863eb72d61528d989d9f3d96b1660009b1ce3a049e2bdec7c9ef164929bdde32415e4c44a742d7786cf5e3d6903a2b3236a1ee4343580029bdc84d41f59a56d776e804f4c2763599d0bf0b586833ba8e36c474f43238da2169b0746157620009b1ce3a049e2b9aba2c173dc3573d832680279047eef190dc9337fc74433ea1542cb77df7998000298a974e4de76c9e744c630804d331bc19d8ea9526071fb66743a527259298eb9b175e2c4a49de002012001c301c402012001c501c6009b1ce3a049e2899fec223b806e553811a95378456d5a3483043f91aebc13bd0d4a1dce5a5d34c00296d3e9414b14f3be7af211d13b1637d8ac7086c5f4ee0faa764f3d951943ee00ef5468c76617a0009b1ce3a049e2870b8e40eafaac7add123fe76f235a208c501983f57348aff4dfcc8cc12d18c980029654718377068cb07efad3a6a6b2b17df9688981b3b75ceacc5bc448fd9e5dcf567933d474eda0009b1ce3a049e28f4ba0c18a4d029d44d106633fbb1546e451cebee77f5cf41c2a28c32265551f8002955eb4724439da24819b16ef4e614fff38afa70fa7d6f7a68b75728272b882e324f5680cb623a0009b1ce3a049e2bb1831ac6df76c514fcc3ed09298ffe98a7e4d5c03aa5827c05fba7c44a0b179800293c26a1b35bca2146cf7c9dd9e666392a3c3f6b4d3032b13332abc5b3f83e047c4a556a8a380e002012001c901ca02012001d701d802012001cb01cc02012001d101d202012001cd01ce02012001cf01d0009b1ce3a049e2aec50b021a32432679929f54f88ef4bf8a66532a2d6d9edd894abc970b4db982800287fef8b333233b1f366ec8202d0d1dd0f7428a8f2368678939775dfd43322e3caafd2f9a69ac60009b1ce3a049e2aa93f0803b1433e11479b7605bf186569d41dfd61b58091dec68a3e2584cfc9c00027b5887e2df43967339f65d1a206965adb6c3f41c0332f0408ab3b37eb1a1e5030776b0cbef34e0009b1ce3a049e2a24c5c20fd3db705d58ebbe8ca0692b5663df02692edd7103566bfb9c6700fabc0027802857d8ff4da17d1d73ddd00cba98a4cf38b3ac649bb9e6ce7064d651c825b650ef7e5e005a0009b1ce3a049e28cd7170f3d65038407f0a229767fe84a94a1767fa01a686807b10cd19488eb9c0002753251758786ec55aa14232e9228032dbb019fd765435ed319f633cbef102114ccaf1609f6442002012001d301d402012001d501d6009b1ce3a049e2bd21b0724d4aeb2cac3cf19857f6c6d335cc02de6f8e9981b00541a44b25e24300026e7db11fdfc19ee9c4e215c1203ad0f95cd8dc58bfbc667801c1ec68886d16573346915867b620009b1ce3a049e2bd3cda0ed33172ccf45a54a219ca7ea7ad0bfaf4d7476d2e5affd48a0a9836fe80026c7d82a6a5d652ba92761425bbcb6844ea868c56d0429e313ee963d1288a446edcd97251350760009b1ce3a049e28b2812ae48d6efe8799c3b6c062a67439635ac478d670442944be79f72524aea000269aed57af6929a023d9beb6ee16304988b5dc61e3ebc7d0911b35becc2bdf617c284de350d93e0009b1ce3a049e2817c0c036bd63c11c2f21e47b9842c2e9b39abf31b8fc755ab757583e0560aff000269a8e5e000fdb5302e6519d43cdfff5af212c987ba369df8c801054a5e11436f41e09cdf9b366002012001d901da02012001df01e002012001db01dc02012001dd01de009b1ce3a049e28d33207abf77acf47ab7c1733da4a76ca5d42705a8321325e654928af723b3f24002672420556b34ff0d9d05277ea1c26ab95ec012c57d5a12090749eb1ad9f3149bc6b670786cdd20009b1ce3a049e2b9682d96fb10015876bad066843d1e45fe56eba30f85e0ea22815f73386de876c00265163c792f0595805a66889fc09b433eb1cac810c5975500818e12c8e0ae0e3bdc0974768e9ea0009b1ce3a049e283a8365b5b2e8a6a245773ad88616843dd0201ad3bb85cd82ec324ae11fcd86ac00264b05ec5af5b5660031191e56dde5e0ca9fac0a7adb0422ea50b5a77769ce6754124760a0c9320009b1ce3a049e2a254eec76283671d22a8da4bab856ee061213612f778c9448022318e5c652693c00261217a0587be2d2dca6096524a35a32e685ba71cca426b0e3cf91c3269cd6eeb73671b7134e96002012001e101e202012001e301e4009b1ce3a049e2960a40165bcacc02163387da17020976f2416b3292dafe425eadf615b93dd62fc00257a78efd1298d87f135d6440bd6a79964873da81d2c0b7b376a26f07254059187ce262d485c0a0009b1ce3a049e2b57cc226b7c5aafdc2a5193ff1878dc7559bb1c1b9c550c0561639e66f0db04a4002546d1bacca68b1fd43f1e6c98cb9c0d8c3b59274e1026378fdc0dbdb50eb1d801cab3747f5ffa0009b1ce3a049e2885390909be0ee95222891123270c56253934867dc5bbc01cfa639bef895912340024f02e2a997ddd7a22a2bbc6f1a3b88e34d3ec3226408f6df3caff6d30785d07bd1501961a0d4a0009b1ce3a049e282cd213006384291d46551a620ef4b380375e104faeeb53d00fd3a8f1919ed1e00024c48a8bb5d0ca758a1cf665f267e2c057047cd643bcdbbddfa2d43aa470886dd9898f9fefb6d2002012001e701e80201480205020602012001e901ea02012001f701f802012001eb01ec02012001f101f202012001ed01ee02012001ef01f0009b1ce3a049e2972ea16c83f28d3d83165f00f75809ccc7a342a3daf7bb69a419c526b7eded4140024c23626c550e0d20fb1dc5900e90d35582a9c256d35751c5c6220757f784bbb0bd4989a922cee0009b1ce3a049e2936343a7c16535cfc6801b710aef50fd834184fc7381c1600c0a75846aec54570002461d4ce0082dccb8a8fbb84820193b4d204821beac23c58cb8ec2ac314ff35ed535aee0078fae0009b1ce3a049e2a296651037fe386b25db395526b41b1b4cf77573dcfb1d11d80f93aa9871622f40024595231203c09d1dac2c9fa11b7233fb8fed809b60b2242e804da5c370c791909130c6f635d1a0009b1ce3a049e28336306f11bab19fd9f5eb2ac56904a9474d7aea141bb6572ad9e02c5327405b000242f552f849d86df18ff6b9ec3586138047fde2a25860445693fda2306c2e05c14512b598f232e002012001f301f402012001f501f6009b1ce3a049e2a5de3ae2fe0386134a79cbdd55d73b44849076a59ec3b8e83c2a96ce9b69dbecc00242f552f84801f3d42bc06e3a77fba211c4e8ffbfba78655fd20a3624c29e42cb03a94459242960009b1ce3a049e2bce1e9b88943f781d5f75febce28d9c1f878ba47788f4ee2125e2b1c1ef79ef6c00242f552f8458dc452f31ee76d4c83a5ebdc65266998b956d7c77e963593e84acc384cf8b48689e0009b1ce3a049e29fe79b4cb3abfb861c5d2c3ee26016642459bf9e69d74d34ae8ca31d8f33b5de400242f552f841e08c356490435d8b26734a3e8523ddf06685aa2b3f48031952beb28e88b19587c420009b1ce3a049e2929adbb03b4c180ddd602047b67a505c12bddea300983aac7f06a5af33377012800242f552f8363f1a547d83c93830cbde24bf104cd2a3ae9610c458ec80c1a30a2a0dcc48367724a002012001f901fa02012001ff020002012001fb01fc02012001fd01fe009b1ce3a049e28fac377f7d923b63cf446fc62d90588e045160b0adcf5a39edd73e0e1d8f3393000242f552f83468b8e30bccbc20b0da660bcdc106ceb249da6953cbd33d6713e6a4d16a42100e2620009b1ce3a049e2bc41616994a05c3001e31f7021feb64b2e6d5f6ca54bbce522c7061e213fbaecc00242f552f805dbf8286f75181e77418494c8b18c5b3d9056703d5650263c2aa0f45774f662862ca0009b1ce3a049e28c3d4ba5943cf5b86abf6d7059cc105bee9517c7b193d990958220fb12730698000242f552f80406db3489fe5453dbfe5e2c00d9a58d5920865ea58c8da8731fe37a74989b56dc3e60009b1ce3a049e2b36380b2eb455059ebeb74a6c8ad15dc26b4af0d8a96214a7d5a15fd4aad071d400242f552f80059a5424030284a2643df3e9a3dc27a4e92418f7d2863b8c4d44413bf747d8eb6b4a00201200201020202012002030204009b1ce3a049e29d2e7ed3f13cb1197f263ad7fec58f54496bdd346fad2cb34895c9f1d0a9ac60400242f552f7fd4a24435e1b49423dd16a326044b7c0af9dc8d51fb43bfc21a6e0edcf011820843820009b1ce3a049e299b362fdb5c454281bbc1e482ac76e6fb90aaf66aa9ad1a17c31a3f1eafbd1a1800242f552f7e6a11b28de42ca52a505d1c22619285238fff02d7b6fb8c96e62f7b7a465ef7b444460009b1ce3a049e2b3b43afdbea626465366facdc3ed69eb9380833b21e5e483a014cb89d940bab8800242f552e7e60a07d88a02253d6d6538c80a6d2083fe31c60f28bbde53e3aa1afbb68ebe8645db20009b1ce3a049e2b416c5c217a2fceef680b4c576bb448346ae9a7ea1b4dd1eb2032529d1212d8200022f64aa62e758861ea29453572e3376d806c49c80fc3f1bf871f69227bdf8413c4479036033d5a002012002070208020120020d020e0201200209020a020120020b020c009b1ce3a049e2ac653e12d96d59da40bdc82a3d3a76e9e9d1ac9183ad48de2d72d2531610473d00022f5c82d8538a987ee340235f5a8975b70d9330b6dbae735efc3c36109bb53143abc134da125ea0009b1ce3a049e29dd92cdf5fd041190809e8e883534e42de4406040bbb1e90ce9a293648d4f569c0022dd05b1debdd01894d7dd51f484773b9a020f2a4731cc0bea996959772f0026844aed6d0b459a0009b1ce3a049e2b3a200ea14da3be6ca9ec1404e668d241e9076e85a57106bdf41197583fa6714c00226b96cf4cab40ce67a68d27ba3c67fe1590ab9df0a8837b33e5873aec114dc432e30a986bfe8a0009b1ce3a049e28fd06a504918be966e1c76573621bb14efd2f211731650d46900dceb9ca269b7c0021e3d5e5dcf223c107ef3afcbeb159ee00deb0da381cf8eaf7ee3c54258ecb9fe354cfb3d9f8d20020120020f021002012002110212009b1ce3a049e28977bc2b04ba18816525cc7d36bc2a34c62d19796553eec6345665ddfd9e0cad4002122282755cb06183e3467b8107ade8d739831136c871851b1714017416f7471676f8f45bad8920009b1ce3a049e2b98bd1978eda7a008763f1db4b66897ecf0ccc43ec189503107d84527a7376680001fa8d8ee61d6f57eec3f9b0e8ec4f7252197b59249072ed20a89cb36c7864d28212ee858d6ed9a0009b1ce3a049e2889e0e480e26ed6a2609a2c81de043ecedc5214762ac611526790dfb73e69c1cc001f8b5ed9c02ba46d31d2170d3bb67765785fe00cab6380beb648993790c6b62f6d6f9aa8653d660009b1ce3a049e2bb9f8b807a2e73ed1e053d62dd5b833eca6a3708d5871e7d54f1c96dc859debd8001efa6d7bf9d08a5fe10377345d60992f0c173a8ee2383d821c494cc3c9c95f069d8b51855d473e00000e6a644f6327b442499ff050059000000bab698a2f314d90ac2fec5cbc64289d602fba17eb57386a249d8e5428efef9a040ee7c4298acfdaa77446be99bf083fc3ad0dc55a3da3b990332c163651101f03258a6b4f64047cd09723d1e834fa4b32594b76f6da35f912cd79fc6a8773f2905000000dda6ed4b32798777096b4a4ed60572f6f0f5fa376ab4dc3f2ed51dab402f2bb7403c3066767d674992f8251c2ccc5f4863dcbe22a81025648b62e16967e49f2eca60abeac010764115420520efe64e93f45afcc0ba7cfd43cc65ea3156f8c3b3070000000f8dd8c2da1ea87c389a01260b367e99427390398d8080ca00ef1139b07aed3240d24acaa1d024cb2f833d7c42889aa676a41a306d1142c79de59e5eb00f1f7b2514b3cb6737c0469ebe761cd2f94f2cb42d3862b8ba99e589ee4fad20fceca701000000bbb7f9eba2c8f72d05f0a81b9d68ef5c639486de7ccce195951acaaa17cbd626404285c5e39e20656442778bb4ece854a20cd13bca0a9e78e34076e108f200a7ea02770ac3affabb682ffa204df6e26a021c5a863eaafc90f96fdfd11ac75b7d08000000de20f19e769b36b05a702faf804fa6b330720892e28c81ec2654aec5734560aa40e68654f62d9d42c82ae367c7117d6ae1fcfd6a8755df8b86c92fbdc73ae8118482aa4942c2b7d19a09849f3569c3fa25f9714d704dc195a87dd384dce685d00c000000a1c099ba04d7f90a23a7b82eacf542e5923809b654530c1666e45ac343ba3daa403b1c8f1fa1e54bc62d5654caeebdce784a9075974e399884dfe7f4a12ed13f866ecf8c724516b356d9db8db557552537fe6210e5994d923bbcb12a72ce5a3a0a000000185055d276c761c8b8b081ca16edc4511f35ba7f7692a7b097dd8cd550242f5d40c3f1e86b76de8dd3bb7cd0d13c802833d05755fbbd405d91632ed35eed0da9c161e7b1e749187a216f93612272cb7dc3811931963b9c6e6f940c6e551eb74a0100000007608fe3fd22d39501167160d1a90bdc08a7bcb77056bd7e3d8c1b12c3de7806400fff2ad0dde4aad71170ace45a418fcd4925d8477dc316c8df75c9f83f471889549d7fffe1f6ef4649f96125971fb47b89ae503359637b44a8da54ff484e1d030000009555b1de4b45d96ea77e5baed3d10b8807c50f3e548896b02927070dfb52e8df40fd3a17bc2a304c73250178b9883ecd1cedb9e4c9632b080bb5e2f0812c018f96025cc8e9577d1ba2f0d29c71a527f9f53108672359158747dd53c0e37366240e000000a39014f8daffe23a0cd0b4bae45d1adef9b00d7c42d250a41d11a9a69ae469514023500186ed5c109234943f8ae49f499dc4a6adaccbba3b5ddf52fb2713982aa0014b4e8a2f57dbd54da52f3ae2b4f4ed69f2b604be10bf97176893bc058b3900000000e53e8439f20e37ed39e2ecc6cf5f7b4aee6014e34cfb26060ce986fcbd17875340f566ec1bc7655b473dacea9062ed6a9af095897f386058592753cc66e314e95bd133728b8657d458ea53ae50f8c40ac4fc7de053c7fb3dd86ee15f19d917a8060000008d881f732cb8d25e019c55d5fce34a41955a0430a3fdc993e4428c2b53eb1d8740d28d3933c58d6e88a3c8f375804941eb19c2db58e4d3806816ab8a600659787c072e4657850748269e829642ee79cd84fafaa874d8ef419ab7be65b751f332010000003bfd501401bd2aea78de3d91f82256378339c551443910a3c1803fa35cd04c2b40564b1add8f2cdeb2045080b5f85293e250b68b478d29416e4d8599f42cb35aad01fab26b6450af96ab4ab513b61ff6b4a902d37209f29aab32eb76c67932a700000000ca996d705d9f10fc3520401642c45b97f99f4e506c57aedab783a99e8c092643405764eff5b467aed2247689473d5b5a1b07bc368f9df340062a50f2e4f065837ab8d207494be8fc2d5586f0e8ada50431006780ec65ec5cc9f3d53b4528b61800000000db40f4b76420f5919e8105d34a3d8fe8ee07ae213c7c1dd00cb519be5db0515e4060d9a0051b94469bca177505a4010fd465807b33855c3752a3bac35b2a7a7f0f884d0ac98760b80082064b6322a30a1074a0e5b9ae65d1fc006bb4adcb86ba0f0000009bf4fb9576d3e4c1fdd99a538fca7acf2f1aaf770cf35b7863c4cdad5836398940e1572388c70181496dc980ec5b7c4ea462c8a20863eaf1b2ad0eaef2fe19d34bb4d85c0d2bfc54058c1d5737ebf3f5d2f6c67db93ddd90628c61e8c8e394a307000000524ac46ab4f5652804dec5b9e9f701d9d4b09149c0bd35f74eed6c7dbe5c7448400d10086cfb699dc64b4758391fcd8c5473f50f30689500bbe8b39fe89734a4201993810f933251061a4ef23b6309cc2db8215f1b3c05989b85e700444ed90307000000f214349abfceb2970bb490df26be9fec994a98968b8f5b23e61618763c6ae667401436a393cd3d922888ccf4709daa5e010035e4260c2c6168cfb9e4e0b725dc94837dd2cfa290eb75bb51787daedde7f123a8beccbadd522ed4bb5e2a5c230403000000a087d994ccb1c49b73136d0ee4cb0bd6202a49cb7bc00634ba8d05ec6c4da7ae40614f7b1293234413b151ac92e1dff6b739e19687579907fc6f7cbd52722a21c8de7dff6091e85c470ba83e68f92597dd6f9d00cb943f0f8fbe32066da147d9060000002d98d2f66bb3e2c81abaad9f709e3e259cb4add151b82db4c89a3292715e558840d62481a432ca9f7268596d2d7d0fd8c47c0adb80e70e810d954b4456f36eca1526e0fb9a19777ffa30d94b7936c22c91c628ddc6a59d6831cc10a300889aeb09000000643dd4da4e9aad6502debbe0873c2fdee86ebac2638bebcd517e8aa8245b1c3a40c07903b4d9227b5cec192c3871afd27f45bb75fab365ea500a0fed4d633ebcc207f786c9cbd5431264bb40f1676f8238b2a48f44207d23ced77484d3a457c607000000f072709960294193b266b0c7dc9b6515c90f182664f4d18e7c875bc5a6e8cc43409038405cf7e2b94e6a1ce4575ddcbcf5aa1b49f8e8d0ed630a4ce4cd7dfa8fedea69770d53c914064c0a73e9c5b9c56ab93d42a8b7ad238f90ca3f413b8ef400000000b948ea36f9e6f9c6894b2c115f2d917ef24420fef7ad28d49eafff19eb9ae3af40ec4af1dcd65375c34d183b0f0619deb33497ddd5f6446b962e1c787c1b15a6220e2df380737a99c12fcc74ae48fdb7b24fa799fa3bc9d2628f377a1bd0dabb0f000000de9f68bf62d27fce2c462374759d1f742f7ee9d6bd88140973ca0d41b383ad6a40b9b9ca28ed78f546bf25f4de497521a953efe72d031bae676ba2f46984a1e3c0e2e70369f1a507cf3ec11b34830c62cec28c2c07046f679d005f70e41d716a010000009addb23da660855380833f471bf959aad4a66b6411b3dc5223134fee4fa8da3a40d7efb717e9e7e07863f0102ad1814bef41ea073dc8aa04accc1ca1f1901aafe4312cc9d6ad56e1bd44adb368e4fbb65f29d39f106c428524e98c7a335f5c130e00000037eec49c2e37e563784f05389ca71c2e7cc876c70ecec7e0945081987de7d61240e3a1e3a3b59a9edb78af70a15086d30be96d7b49f6455e1eb84e9179fe0865a8f3a9bcdc3f8b852dda91de58c10a3156d5106dea5840fae0914293f84ed81e0a0000003e892a73582493e4d05afe52d9d80c288597c8f26d97939158363793e06982e1409ba497ae811e86445e24f640b0e8576f1c1d1b134650e39536bbae2cea0b9d6a7f4ac97c4f48b62d7a88bd00b89a007b66d63dcb8334cab768f3a070a3510009000000194de2e9e678155a3dd15e4613ec0ab27becaf2e6eb07407f6726d5e3cb0579b406529ae359386d43471058be0a7c22c9c2c71da4b88ea510c3348224f2519a61ac3c8c8693f4aa683af4c8b95951ec743be3573cdcd4db8d23930c48ff852a00b0000003ed3a45b7b15dcf5a3a24a31f228ff2800c5786c64f84f79c699981db4e456a940fc7514c88e5634a03e99476ce9766cca6a0aeaaca8f6f9a0840764dfefcbeacbcaed6c13bad7386533689c87433fecc12e08658603cfc29c0909714826ddbc070000005bce0a71110aa02de4f13d6d14bd6c4d6edf5391ecb7f3af4b64cce612e8cd7f40c878723b0584cd1ee4d420efce78345f428f7e250e56cd4aaee8d2f34d2c1cab12045662e4fdfa389c0182cac8508b29b20b5af3a00dd76b31400aee7455a6090000008812c4e7e4a1b27d5a9c6cc4a1e257aabf733d0a69d4a314b6a947a763872035405cd26eefc02e3a4d9bfc42319e1496c936c1d778ef844038cae38cf51d8e83228e00503bf1562323927d8ef12a1effd1d7a6459f267ca3ef2e9535e11b4df90c000000ee685271ddf3c91d5134e384b83e844d868a1f6fcdb0ed3da0fb4562fcb54af8401d510136fd305649bae3d5b25485dd8d28f1ed7efdef0489fd148ca7d18b5df86200ee02f904412a723d6b0291c27a9b029f730e68f1452a987280806bfa380e000000fd0af847835a0c395e1d65cb58e72f70e2c664b42cfeae46e4df4e878c5ca1c04060b25f6b8f4874f6620c7822b7fee27fcb2eb42944f448fe13d4437a5df17ec8cda2ba9f34b938f3271d40179d5976b9ef4a60dfc4ecba3a44d7ee833e5a640f0000006e409305353c79252f70f4d9af057929862cf630f04c3593898c292a312175b14009ff139e336cc290b12c2f248a63b0e98645e0dc430d6a129cc79ef8a6bbb150c1db6c400553f82f3f6a28fc0330a4797abf29a782769c58604f69d7dd6f2b0d00000004f59cd16b9cb15a398274f005545bf486200310294d7784f0e65773908a2292403f57bf6301c499544bbb3c2270f36ec4e12223f5848ed5b173adb0d1aa8d457343cd5f02ceb21a2f56fe201ab613eb3c637a03ad90df13aef30035ce6bb02409000000335b1dfee02c5bbb22993926dd58afdcb7a5b9f9054a99c099a32d63e0d0f7ad4042e1dd3224fa0ca40c8a0827e8e4e68e2ce45af3559c9dc3845bad653fbe543aeb36e12124d51a9ec4571d46bbe963d2c38ee49827c530dab2cab46b73c91b0c000000a9506a42272f71cba62dff6e90d4b0cf1d03d5207de2ec2cd958181d70c672a740948c5c11b6399c0be518b151cc3f47964f16794880ec2f8459d79d5ab7200aaab373d339a1ae4cc6ff9ee7f455f0dd2878add85997df899b781e627f0eb4500f0000007177e86e43748d1cdbcad08df5e03b14ebc4e39e7ee13b28e60fcabf0bd182c04093d1e2f7b02d90aa45116b62af73b5b942340284f3b09f0ab4ae2c0871f5ce76b9f93039eb763b5a1b99f0ddb8932c4ea038d616a377e28297f3aa1baefce30d000000984836df55e774d6e7e894c7f16aa153161e52ba66c609bfb3e81e1ee940f619404f4af6e03c9505888b0423753ea9a3b00a26f5b3e7cbdb7aa0d78db1c8c09a5d1164ca358f710b196ec9a949b83b0055209ab707fb4765d6ad96528833563908000000612f6377c951c046130f7ebc26695ddabc91dd83ecc9fbe10543c382e473a6fc40642dda7bdb4d4fb97fb459fa1df32e7cb1c817f55af5495412efbb12793dde1e7fff6ba16ccadb25d0f48dbf04063a7ca8bc02dff64d716cab3e16aee4cc3408000000497f087530ee86814cda055ae6e55eb4a6b80e21de0da49842a848ced5fb808440f04e15ceb4d39abb6ed500a604e2d7f6620fed51e48ec35ef2667f779b914a52a345343cd63cfb30fc21f4ec64188e9cff8743c8475d39d43199e695b07cf3090000006bfb04dd80eb9ac4555db53e00e9174b7c4f2a5bce9dd071aa7489ed5dc2091140adc7e6cf84c32cefd1107ca8d40fd4ccf613386f3dca1b04b0292c84efd0353e72469d8f48054d8d31e1f338c710ee242558e58d9f8af3a90b069354117e60000000003bafa36684009f88881911b807da85bc98e2ed15310aee8fea9757c297416b3140585ea290d67fb8612c5aa5a150b8996aa8f33d45e3ebfd62a1f840b6ca0fb5b6d7b71e6fa39570ef385ca0a28034b3a5841beb4ef4b215405df843dc552b240b000000f2e460120201cced4edf848e7ea0aace63f1bd097fa85d3aeea405dc5afccdaa40303a6a25636301cd248e535910c86c05b90f905eda4faabbb32fff4f58318432a3518086dac093eb1a9e42cbb0cb03d72e58e96b43b655acd8d6fa7efcaa8d020000002563107dc396456d2607921b413ec44d79e7cd120c4b7726ae3b774636049bb540f2c99eddf9248096e125829f32297be024698457db77692ad50c078a5931aad379bf18109164449d589f51592ddb8b9451d47f5c9fd9ffdd14ddcf4959b7e707000000131e17c95b75c24cff1ab822bb60223c4cc34d6b23301615f225519090614f5c4018ea92511f1f33b1b55e1c4902745af21be3f9f1529dcf9ab76ee0dfee545ed7b6631ce5ef563a1bfb4f1420ecba386a5a6d4e7fc7095fddc9e348273fc8c7060000008c41f6a075422e89ac3ff5511e42d31cd6fa1e5c8f07a0c652f7a631079b4317405d575bc6c32884c349c75f0789b4a3a5b8d72a476ea8aff6174fd14e652c742cfd2cdddf198041286875ff9b3a6e590af561b3f1cc308129455353ab534c69090000003ca8b990235231575516d889e4facc8b4d81796a3caf37cfe55f726f5f4da8f540e915698ef80e50728d1c6e6f15d20bc2da11ac12c3b2f422d41b649ff830a4fc44941f1737e5bee4e6144971bd131094831eea683a7d0c2e34c6548ad0a448090000004f509f637399cc3c140d2407d2acbece505b0c308221a720f4787b7576047e2840e8e8c467fceda35977970649141e70cb11bab27c95a3c3417b84ff87c30044119c503d1a13822514dba4d120059408d9c9ccf611304e05fb6df22d14458ea206000000fd562f54394ea94e7b8919dadd936638923e06b92e8edefba10af94843b8b90440bb1df7522c4070b6f0af2a31f6f93b72cde856801ddeabf980281e0f7230c6cf294e981e426a6641e89126c6ae9649f8a67d76fd975fe3bcd82c0c40989ada0d000000a439cbd4e7d7467ad0c107ac11c987d652202ca95128354f954470587cf8d15c4073d2a292030a4d305a8e350d7fe59951524ccc99bd578d38dbbfed75833104104646c3635fbc21d10b36358d2464ade2b2e71b68d9553c0a448095061282910f00000068b499bb22ac9bcc137c70c37ef8a8cdbe4862edbe04de0cd6fe1059a44823f640791da3136148de9cafec2aa5ac69a96a980d76e39348987c948748758e212ee2a2d3501e18aeaa044cb64bfce1de3f0b88683d7c3f54fe70619c12f8cbad220b000000bd45713b20380f19dcef5c9f39ced0dd94f75e1edbd54283ada41c980907a9c8405d0e0a8d263cdcc1a55b72069bbe3eef1a3e9d068ae1fb27f34d637829757b4e784795356c6296bfab4a1f52151cf0b07edcbbbb79f02a461c3a679cde45d506000000711325352231c77d0680f1f6b4134c57028ea040ce8c20a3f7c7db42a7f614a940d2acb7e207d82b59006b93ccb00c1e5ef1f754bf5a0c077a09a0244c8eafb566f9f884f19447a0c1fee04845d801ba49c5e48f7e301f44c0b460659ef1f17409000000a1b97169e085eec0b535597972780a090eba5a840efc20cae909a64ca784b6604063e33648ff5043e57716d387ce656f6200e07556ce6dcfeb2ddfa2bd784d90aae9d9b3405bf65bda30003c54aa425e7fbbf536afcbefddd76804e29a382acd03000000201471dd478abad0bf438f85084a93be935713a66446640c6cdfbb26b39d455c40d12b67a3713c7eea6c0fbfeac94b70528d39f960b2cf78da752299d790efd622b2a17a04d6a7673751fc0905f39e063a745c3c65957b22491bd4e7663d66a007000000f2952891e69b97ba70a18dfc6a0fd224b513a9d82773794a4be344905c3cd6ae4037dc8975aafb592b9d3cd1a1d5c73a6a3906622ab94f25dd14b1a51478edabda8b4b6d202fa3307f88a3fdc66e4e0e80d0bfd6d2d60d05d92a4f3affe141f50d000000e42549100c88c71869b77aa619fdf9f7c260f9f5d0d6d3458091a240933a5775408ef9bde96a726979db215853960b3adce017a4d27763a269501c598f23990de25e455c74fd1f96d48b8b37ea8c9d8c8dbad6b677609fd4e1d6a79bff2973600a000000c7266089880fac531a9da0cab0dc1547c74a5b007b223fba3e1ff3c875180ba2405be2b668db6a352653ff91dbd6ee693cf1100f9470c0b204b780762d41719ec992df0ccbeb3a45df1b67db6907586c4ac8f224782209ffbaef82a944f4b476000000000f16c6a0ecfc8e1a042185d94d0c58d9ef9b8072f98b027eb88a036218fd717640370f8fb5b511f41aee25e6a3c3c3593ca43c9f09a30f53ef682571e003c512189855f7822dfda40dab9c4138fd2f10ba44a89b1b3f4deafbfcdcf37aa3504801000000de93466468f615267f57d7c97c26c7314a5cbf278e239eba2928a069d5d2eced40f8149a32f91af8dac25af198e76b8737528dd320de9ba47f9464c9285c2e2580a18ccf58e65834eeaea618757332198092f34515361bfeea6d8a10bac6111b020000008a6923d06f7573b400761769737f6c5071c153825de0dc40081cce138a54c08740bcff11add7c6c38dc19f3759bbfb67196cc5299e469cd5e44c591cc764ccf4ae65f83653339783bc70004c552cb4004d11a34225cc683b643cc50d8fff32f803000000a9b687a275cdb0e13bdd92aeb73782cb7c7e1b4077d27d30303fd0e9d96a3edf40bcb7e9196a26962a8280bc33a97897145d5fb1c7e36909163299aadaeaf7db02988375a77b06b8eaac515816cbff3fe10de36b47aa41b1bc5527fe40a9040b08000000e48b217ae2377be5df2a832385730101cf3aa7a05b58120f31ec3c03d264c7ee409c6fa8eaf223b636863093b91f31c370cd96385b3f9ab4957a20db1712d778161aaa6d4d5398ef28ed9e11f877f9d83c107f6f8b893cbe39b99914a3ef7da90b0000003b2ae94a34f0d327bb836d78c1b78c03ab8cadb71468e065b0a83749a2b165a540829ff46bfe92ecf4d270d2f820e57d5a8f6d179186619c559eeed6c7173df0cc893b6e8c573b3c79154d90c47bbc39e6a5b0f698732a40244f9728a22dd9c90b000000e329bbe537bb159f3425601078e1c98df7eec51f74df884fd081b93ec515e574403dab7bbfcab91d2108dff26908022103642c7b69bf718dbe42251de3fca71354519451f505cf9c0c16f463d2d6ac5e405d5024157d01c5823f7e676bc2c8c608000000be03abff1ac92c3e799025b5039c972d913cd3b5fee54680879dc3e4d720216940d1faa4f38852a24857f7907cd429ce151168aef83f2ffcc07a9746a88102067fdbf57b12cfd8f96723b1cfb7ea0bc348bf00dfa4ae16dd028250bb9081a3a40b000000a3de1275b58cf7056a46046220bdaff36c96027f1c588cbcbb4e2991975b0e1040700289b5e040c750f693c319056ed0020110027528bda218869084e7cbfb1799247dd35d8f09ac21b26c9e234c70588f2a2b05fc675bf141979cf8880c46c2000000004c097744412a3a9ee6fc795a28ca66d8fc2b0279687f6e3b309cf89e3dd3cd724007456ed8ecae451a4db70431792eb8fbe81b347a36b099c1f2130b82fa2ea5b7ea4a5d66def2a0e0e7214b4ef7288a7e7108f46f3c8e11ed5e5c36bdb577410c000000a03fac4036a89dc798e41c4280ad8c9ad24852cdb32da51062a91ff24aefd349408a565c04e456f2fe1acb83056e21337bc9533277886eefc9cd2b3fd6f79ab56bed0f79a49b8a23268f6b54eec60c83e1e374a4dbd7a91efb5fd8b947beea200a000000330d875c470bb27104c192674d536871545571ad19ebd9c881b38397da383fbe40a62de7e75fd535eccb17c08b2e375aea56f88f9c547b58b8f89c444a76c59b3bea6e9708cab8ea307fd2e2299d5ccef1469e8b01abb1ba063db81423eaeffc090000005e3341cef4d4c7ae2474c238237cd0716a69ea1fc198bb62dc24eea4a5ee4554409a5ed0667f86e38688432c9d02311875921283bd42283ba2e56c7146d2c99ec3e88035ce8e80ee51e447b84aec1d2791e03960bb94b1d53d5682605c27f96d0100000093ef819afc6034bd2c90170137533f65078bc8373a382a3b1c9d2d635184e15c40ffa7fea76815e5928a227ce8820568f5fc2cbece98b2e327c9b56bb723b32cd21aac1876ddd5383d8a7cafb1cb2049c2534ec375ceeec7649c10352cdbc4970e00000017a3405c398add8ebd327eda4ed241cde78822da634431e0d5c53822f4485f1640ddcd02eec5d1c8890846552132ca5d2484187a0ddacccb8d263e4e3d5b673c2d90e76e0cade6a8c3fcd15405bb27915f2529ddd5f16d38837379bc8d6b17df09000000e46d05ec618199bb7721da37f66f60de426f06b4ee770e60a63cc139b0511412404bb5421c42cf3ca6cd37ca1537625866be3ded27c38647f0d4f0df2888fcf921f9f60125c6f484e11c0cca8f68cb9bcc6bc5344b23b1b12a67eed45427f9860b000000e9812509d1a03bb7e111f1c71f65c506e75b4eb07199843a5993e79de26594eb409ae50861356b7000376842d9d2129b8da595f7a74404dfd0c80e24449e1ab4b2addc281905b8da6ebaae72534566f3945dff3daeac9546bcb1b9c9f2bef62f040000001c5a3aaca35ad2941ec3a39398e959460f56dd358ebf1186472b284c509ad8c6409c0f3ffad58db166421c388947f51559df3a7d3eefc0c9df512ab45889804657b13653d5e07762a152eb0cd1d91ec859fabecd07fb331d9ef4d17b0e2ee7c9030000007980b3236ded8f680d6faa1a2cc88e3e38704738810a3cbb9827ba84ed5ade5640b16852fbe39ecf4c40854a9607cfbbd401c931084b7ec211eada07a574f5646db3520a36fe16961cd34bc78077ddd9496fd6b33fca34b978f29b005cde639f04000000f6e602c6c3a4567a847d9bcdca04e2b5d43c8620d6d4878cad55b26933f4e78340575247e2276542aef42153d67412b3f08bdf05cbda03874d05ca2e3188cb7b664d640017258ee7f0181a1b60cba53e0fca24badd92478a199143e645a4411b0e00000045641bb328831c0a95cf805efb55afdbb857571e970b4f83b6f39b686ccfb27940cf6b83f07a4f28eb8eb0c3a69405e3505dd5b21f7b94b0e0fec8d659f97b91ab473a7c0104525d380cf499719b8132824badd158e65708b28d052ae1e6992b0c000000ad9d265c37b8211c3e6ce0542054f2b9096885ad9d59ff814c0d368bb5ba0cea407c71ea821864eebff3eaa4c4b33f8dddbd204a4602fe4201ba21fdab6a4c583d794a1a76ae43cec93197a37aa20db13072ed73caf280446c1f1077b846addb0d000000f8a29f22b3272624e2604ccde1dc1a4b29b6700c343409325cb1b3f5c9e5b814401b438fcffd814a2b7b546eeaa9c6fa1e344560f161fa3fc45e32411b085e7afc10792af895e5dbf9ee2e196af667356d64e66ae55124ab3b2d65dabd07b40a08000000dcea147e1c9e3e8fb0b228700b3f1c95a0d323fb264f87bfc673c085964b0b3b40b5f890505a2af87248e024078a35b5a1954454984a1b134f907169f8641cec768db0e31c3b18eba3ac7edd4d56eed2649be0e8dd6dbf684bbed4677c89b8c108000000c5be0b72b2f4e0820d62d9a3e56bcdb84e12ecd8107e765d924daa11d6193ccb4011ebb4d833c0c8f82dcbef31e6de9eb149a728e020e91fc21f005c7dec22b9c99a12a02cbe4f00f642395cf166559382ba5bdef29a42d60cf68aff00f8d1b103000000aab17958b72088e196163826ebdeeab54b044bf7900f7281ecc4f484944fe5e940fd72025db6b23c651f1390cd86885014199a724e41a947ccb275855d8fa77de2dd13835e368eac17e8788502c98d010bb71d78e7e6dbc63d8817b8a156502d07000000a6f67d64dc6eea9159917f835bacdf4b9b9a6db7d2b07fccb50d20d0b9f16cc240ee1ef672c7a5f7a9c038b340cf547bc7c13e0582be4afa5e72a4ab760b86fc482e7b6c708471fb55ae9d8c9311cacff3a8afc56ae7ed0772fe6dfd0fca26d7020000009c30331800d3847732d2a4cb7bc02371043bbb823f50ab3c2f5ce6322fc9b63a404bc1aba5faacb6bb255263e5c2fa5d14911d06c442f268a888c8286f42e3b1a8b6e321060889637338f4f4f6cd1bd4d472024edfb1c0e4383849ee42fc03300c000000a604d124f4878ecee70792dc0e813b02fa7c37d5cbb887cc941d87fe2132273e40950ad231d2bb4ee57fee93baeaf0e513df26f00162ce98bb53cd661f6dc10077ef2f3a53220c7ec53ff55ec785c29bb249448e3ed6645c5b5e578b3bece9f40b000000241b3dec0cfad11e1f626322a3843b669c56b81d4791647cfa6a07868ed04b5340941f017bf5d6098b528bbf0888cfa21955a773e87bcafa59609a4f46fc22846348e3eaece6161bc5e99ac8e9ac5b84d818167143a4d20e427921d868ddc87b0e0000001cce0f52b5757299ffffffff0000000000000080f3409301c47196afb62fcbff11f48ed3870b25e57b0e59684dbac3e60ee5f880e0dd36d2166da4ea671be9a985e6d1a2f9c6b34d5cffe40d9917eda5d540545c09189614ffffffff0000000000000080ee4993013b565f7396c34846f1724eeeb2696e0a78198dca059d7e7bd9dc3053e584407443f119cf0670d63cc74cd50941a062e2be74f32934e5afbc530cb30da33677fffe530100b5ee9c7201020701000147000946033b565f7396c34846f1724eeeb2696e0a78198dca059d7e7bd9dc3053e5844074001901241011ef55aaffffff110203040501a09bc7a987000000000601019349ee0000000100ffffffff000000000000000063bbfa1700001f39b955b9c000001f39b955b9c4521bea230005ffbb019349ec019340f3c400000003000000000000002e0628480101e5d3fa4cb4ae119b0d5956a8a3af93b8c690f3ba0ac82ff353a2a5d76215d6740003284801018f2490e263452d94f758cbcd1649387a79f822134a73ee4300b24c7ff1697e09001828480101c093c6bc33f3ee7c0313efced970b28ef6952c8e1efca8ba122d9b7f8046cbf60012009800001f39b9373544019349ed5d405866062d6b79e7467e5ca14811feee93843f959ab2e67178302de597f1712a6eaed15f76e6741824f6b7ddab503661499005a7249e244b8d7bd726615d7100feb65800b5ee9c72020202150001000058a60000094603c47196afb62fcbff11f48ed3870b25e57b0e59684dbac3e60ee5f880e0dd36d200210001241011ef55aaffffff11000200030004000501a09bc7a987000000000601019340f30000000100ffffffff000000000000000063bbda1300001f3927f58a0000001f3927f58a0724447b320005ff99019340f0019300b9c400000003000000000000002e0006284801019f440b830201fab3f3b8ae0cd965cda5b7e5aa261e60147b14f20249885b287f000328480101b2f19125ce27dad24a0e26cbf9be7708b5d798458a82b79f4251fc5c2680f45b002024894a33f6fde6810abf14add15f812e2395d3d30ed69ced8a13ddb6fd98c63c5e7a93ca28dd7313c2ce6e92aed26c2a56e28166626ca68d7578bc8f61eb8b6be89026b32b51c0000700080009000a009800001f3927e647c4019340f2c53c68bcbd50fe99c263f2fbe88ee05a09c82cf339b840429a4e951ed9bc33552ce4a12576d26c4c47bfe60874f3005ee4430000db24a7d47dd21a35f668b207284801017c95927461b81cac1ad138d178ac863b818d00f85671979ad25cb706d7784371001028480101d69351cba4d7b696974edfcdb1646287ae0a9dbef80e20042114c5aa491168d8001028480101cad726a3a6e6df10bce47764313255f7396a6be50f0c86ab83985014cce33b8b00132457cca5e8f7bcfdf44773594002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac000b000c000d000e2848010192578460faca2e89d9fcf94ca23542505fff70f656c64c0a11d8683192ad365d0002003fb000000000400000000000000023def3f7d11dcd650008f7bcfdf44773594004210150000f22012000100011284801010b88c13cd9b115eaeee5e15563534c8bb7f804d5c1b286e022ee9e8ef4a8ca0400032202d8001200132848010124d21cf7ae96b1c55a1230e823db0317ce24ec33e3bf2585c79605684304faf200072201200014001528480101fd78695ffd58402e209cb0b060c95b1a8a83dae389c7eac9554a3c086e52b898000722012000160017220162002100222848010114265b804cdb772e1c9a48d1dd67ad6e9315495151d6f49bf5f203b2b883ae7c000c2201200018001928480101ff9fb607464434b8240b30817c4e6c358ad723c3ddeed45b2b82d45b9fb0f6210004220120001a001b2848010135495972e4dffc56ffc325d2abeaa6db04e07d832cc8b8847ae195158fd724d20002220120001c001d220120001e001f28480101ab446ae5250a0e5acbf42540f12f69bc49e22d74782881442954471a01c67d6c0005010120002028480101e1e66c22df500de6499c055de17ff3d1216fe5f15247186dde0708e01c52526300010024c201000000fa000000fa000003e80000001722012000230024284801012c8641af35ae1facd6a2f0cafe62ac2a9e0b029aae17e04e5b49d49591675fb7000a28480101dcb8145c3855df561a292809f62d0f8e99788cc63fd2722d35bb031eb96cd729000a0101480025012b1263bafa1363bbfa1300f800640fffffffffffff7fc000260202c8002700280201200029002a020120002f0030020120002b002c020120002d002e020120003500360201200073007402012000b100b202012000ef00f00201200031003202012000330034020120012d012e020120016b016c02012001a901aa02012001e701e802012000370038020120005500560201200039003a02012000470048020120003b003c02012000410042020120003d003e020120003f0040009b1ce3a049e2ae726a8a0bbd8a53d73fcdd25c8640b2a19b63f8165e3605080f696c3f1196360005cef4873ed71a3ba04c54d49d0c2a248697f32eaba92097fd5d726fa4e91f749e61f55e1b37d460009b1ce3a049e2b17e367e62fb7321bbd441fea4ae6e714746f4b546ec799468a443c77f06ff8ac005cef4873ed71a318e28452aad9bd641f98e55d7744039595724c1ae5286a6a26ac2917414715c20009b1ce3a049e29c99dcf5746497809d47e6908427c26d3803daa11be1d65aadc4c0caec1a748bc005cef4873ed71a05e0cfa335d13c8bdc2cb6c84c534419d6a4a0d1d2427f5f7c6b3d52e5377ffae0009b1ce3a049e28adcb4b7ec3265f3c5a7960faa4ac5c077c63b472954e1aa3114cb58cb50f3cd0005cef4873ed71a3e141a8cd5031943574478d98f63ac3454492ad47adb30c1b3531c8cc349a7ad200201200043004402012000450046009b1ce3a049e2b8d8fb2addff53f05e13cf5a16032f176ba2e132c8a5193fe0fd2306f7a3f9a8c005cef4873ed71a0a73ab24af4170e8a646f6faf62520a9e70ae02f66a8faa8d739ef087bfc7e5ea0009b1ce3a049e29094c492d0bd7746742d9430529e4dd20af8e1c95b064a56d64d39586b5d236d8005cef4873ed71a027b0096de4bc955d34d0aec0615701d8a028e921f17a53bb9348a002f13d86fe0009b1ce3a049e2a995a48a0c6fde47b8e044738a033179268deb19544d22981dbc8ed0e5033c690005cef4873ed71a0dcdb94b5329e0ff38fb4327c57407542d0bcf751c201644c0ec7eb9dfc76c84a0009b1ce3a049e2ab7876b4ac3c0f8208c6fed9e7c2b113e6d26a8da250f08054df9c4d6c5e7a7d8005cef4873ed71a08491234782701a48ea4a5a886cf15f978781699d77e4c3f6bf2ea201b3ebab5a00201200049004a020120004f0050020120004b004c020120004d004e009b1ce3a049e28c4f654e8b559505316a692c8f58c94e8beb64f05bb571393aa723d23f8c3614c005cef4873ed71a278b4f2d833b5dfc6c48d222ade39fa4a96bc874e62b16ade02c50ac553929e920009b1ce3a049e29e0ab3dcf5bcc353a6b133a13227792290c6bb580fe69c00d51975a7e749540c8005cef4873ed71a24ccb3c8c877acf99513bd653d35def60e18fae62414b0b3be77073c36abc72760009b1ce3a049e2bbba2114b284becf4faf20db8ec88f210c79b5c373fcab0698b12a9104f883f54005cef4873ed71a18a899164b1822d2e39dac978d93383eb78d0354004ae047083bd1275fa5323b60009b1ce3a049e2ae34eafbf8fd0a7a526c8fdbe2091a77849b1338a7ac0da084164c17a6cfe1118005cef4873ed71a2354621106c08ebc3e44c338088f0c135efbbc18605d7ddfab414ab0b88c4806e00201200051005202012000530054009b1ce3a049e2a2c4c15e7470c3b06617bc03644d28e3b7b65c73f2ce40219fdc1377a26ce5978005cef4873ed71a0bbd302453127d952ee1de2b6eb1b4d3effa98ee8a6a66d2d1cf34f60a8adf4ee0009b1ce3a049e28fec9006be5387854666fbc18c297cc5259400eb0696bbb20739015c05ef879f8005cd78ac153ea62648a634deee5132ed07cc454c7e774e25efa5b427d89aa80656253524aa9f8de0009b1ce3a049e2b7328de7d58d11b3602c754f6302edba405988f56b1de6d8e6663751759890ba0005c99b5ac087831cdf36e4b759a2bb4dabc520c59bd44f7e49b30555e3a59df31808b8de95c579e0009b1ce3a049e2a1ebb2eab622b985b40855cb9c151bb3615753b819db6b3f7b01de9d5803430d8005c2234f95c1d8034c8f378c65a7a2f837c86a9c061d6afb43bb893755048ae64876e99d2b0c2da002012000570058020120006500660201200059005a020120005f0060020120005b005c020120005d005e009b1ce3a049e299ed229c0624b09f0b2a40257ebf463659e0224471b592815aab47d927c3f1db0005c091935da1a9e53e530f138dc23034ab3a93aa105beba7f3adfc8fac6756c6a41d3b17ec8c0520009b1ce3a049e2998df4fbe8c6eab946c942c5dcce5154f389837add7c53782227f1b94ded5fd48005c0301811881cd18743ced0ce2f84909844c1b90f000a3ec96c66896d5a2ef71c3cfab5f2125fa0009b1ce3a049e2a8234704500aaaf5b93c225f513af773d00305434e176658485f14a58cbf7cf28005bcb093059116a88373683b06a1fcb1f2e01f2e650b9cd6f64e5df8e5826b646f4a4e8028df2ce0009b1ce3a049e2b3315f842a3b7c2e9325c4b72e146b074fa8fc1fc48d27fef2c23a6ed0233dcec005b567e625c5a66a8515f6674aabf8a62957c6ae2a152b3503cb3fe2e55597c82b36b99373df36a00201200061006202012000630064009b1ce3a049e299369fb1d2abeb523709d617d159acdf2994197c7fa877b5493bf90799cb03854005b38ae52b2213c7a104cc175cff079e7ddc767de7c18945406ae521e14ab5093ddc4ed618175e20009b1ce3a049e295331b2364a8b070ec61dfba0dcdb3d943e203a46ac46af13f89fa1850b61fd8c005b1da4c9bd6d44116118ca6141513385bce13e34d6854fac170cba9d216efc5f71c1423d3ca8e60009b1ce3a049e280d105f86fd234aa173c3745fe19b65801968e32647b1dc99965cd254dd8936ec005b1d88ad3bdf5a427283ea0bd92891d48b32f4464f1489fae9684ef47e15bc33d865089bc8da720009b1ce3a049e2a674669de4648b015501d22f0362e23612dc26859ecbe5bf318f289df55d38de0005b1d5d50ecbaa658127502a6c4d42b201970a44a30069fa999390d4df8425368c992461161f476002012000670068020120006d006e0201200069006a020120006b006c009b1ce3a049e2b0ab5549146990ce2f28cd813e79402b85a91c4680060ffa3c590e5e21101a85c005b1a1a04afb5d9ffa7efe55a1b9a55e20d9a0d5b34ddda9cc8fb15cd3810480f41b5fabcb599a20009b1ce3a049e299a35f7168798111b3a10f845cfa258a14dfcf0dc923177537ed2efb30de3da7c005b0af3c818dbc6325a469419b77eb341c7cb49b14545c1ee06df4301a0ac566bdda425e82e883a0009b1ce3a049e2bccfb6b53aaea1e60b810236ea3398c3653a1e7d22fd7afc906d14d23e93dc3f4005b0abae6fad80883b4199504264abb17d1db2b27514b626c70d308431230755e346d1aa0a902220009b1ce3a049e291a8540ed09db935759c282c0773cca1c4a0f9b85fb90892bd516631ced34a618005b07e685ab297eb820f19876b593dcd332fd692fb7ce62f133d69afd1538ddaed2d10df2ed32720020120006f007002012000710072009b1ce3a049e28b9f9878d2e0f22c9d2a9de3ec09533efbfe7313726103152cc7ce39e36fe92c4005b07a57289f84b52accf8f07d56050efd8fb3e0ac9ada86b58d4526bf3694237f3d4f77bd27a860009b1ce3a049e2b8be9ee064c2075db1fac489f3d053156a26276bdcff47f6c0d3c2679cb0cc7f0005b01e39aa743634a6303ed5565e9878c5b727902d93cdac1a9c9c3531c56a42db05aaabb7a25220009b1ce3a049e2a28ab7dba83e2f8aa15cf221cb73f1358e846667c481426a9ca70b49143f86180005aa9399a78be5fc27cd80b3fd0e46b373e778d9de40a15bdd34327d709724c56d12e679830b3c60009b1ce3a049e29a97e6935e8b58f5ffdae6a26b7661f55966b040376b32149df50e39fe9966324005968abee45a0edee4b71ea37c53a39d78c22a7d5444337bcab1ea092bffc9f7bb7550d0fa929fe0020120007500760201200093009402012000770078020120008500860201200079007a020120007f0080020120007b007c020120007d007e009b1ce3a049e2948458ee49a2cb75afb0a8338ac6a5137318f92769bf7ec2edcf8f12be5c15a7000581090c33ac6dc7d38e728dd85d6c10021deded0962c65c77f742201cf5e27d2382e3cd525f31a0009b1ce3a049e2b6debe39be8224d120bd9d30b2b04f6ce5034c68a78f8ba48618ebd2610c4d73800576f5d008f340418dfd4152ff370f50ab0a7de08ede0cd56d266a28868d87b6099a40a45353c6e0009b1ce3a049e28d78bea37c14d25eb628171e7cb1404fcd86afba269af805b55d61922f4f81d7c005729797f6bf5afc8f78839e5db3ad4221bd66f6d6180cf1184d5d96583bf2ed103649493e116820009b1ce3a049e29a2c19b2933f5907ce2cf40da4665c6e18b3180a5fb68b25a38e7ed4459563ee4005718fc24e6220b14cb33c7d6fe094c752529ee15ce9a43482d7e9cf6f76583ef338760706c84e200201200081008202012000830084009b1ce3a049e29c2e821210ebd0ce10ead1aaceb1d48f45bc7b783435bd104995dc54ce485664c00570243ec0e63ddd6c2dc87c6cfb33d88ffd3b1f2f220f90092ee20f25a0cf94490b56b50cfee220009b1ce3a049e28d888438dc9764039fa6b5bb1c4cf86b955c9bf35ad09ada92c93816d988d5058005700f0563f0dba7ecc28b733ac93e707cf11ab01189010d43e05211703894bac9a0f9f6b7e9d9e0009b1ce3a049e2932d3801635215de9f39c40f8b8a4360366a52475e5a9446b9ba6727afdbf8ae80057000ae0d163da4b8c2ebccf36bbbb976ebbcbeb7953d5946c815783d21c88131d32e40692dd220009b1ce3a049e28b56626e097c0e71b210d3c4da960b2547a1fa93f286371bd3f013f09b8e1a54c0056ff332a38eb0da3325d669b08511eda154caf8e2a894674119b58682a68c27e24f20ccdeb0766002012000870088020120008d008e0201200089008a020120008b008c009b1ce3a049e282340aec54ca842aa91127920f4c3f1711ec1ad7a83a99409907c5697f529d1540056fea6483dfe16b0650a4773c4cb96e0d7674437b0084f8dbcdde8a5a06da4f55381027ee840760009b1ce3a049e291432f1d3bdaaa49d7ef02f37eaad94af4d27720d8872b442ee1d6aab5eae32080056f729fb3274067a33cc15c7eb18478d558617106c49971e53fb44cefdcfd01def54676324c8aa0009b1ce3a049e29eb507c8bf523c607358a2537391d23b6b47418951c6295c47433adae7b91f5f80056f48f85716c8b07c0bf6f11a135ee1c6c851d45a7348cb431f9172132ee32466b138b1525fa660009b1ce3a049e2aa478c9809e672c980ea4aeffeb7a767f07c73867e67f7aa87acba09c0a7f00500056e7dcd30b99d53fc4158940c46108797153c2e535b84c6d4fdf70f945f866d2bb19774a38d57e0020120008f009002012000910092009b1ce3a049e2835d25abf7d4c441648a049376cdd36caee275102116da877c46564321dae7f7800552082d14091d0df8da74fd965e4d1bb896131555669d612c644f8e8e2d51b91521ccc12a575d20009b1ce3a049e2b0ddf26d0ace3f8ba8319e49def4db92661c140972d1a9e2ea6280edcaaef6e0c0054eef0d43a305758225a84ba60e141b1a49f40e964bf444a9135d940fab32e8a3cc9ae2836eb7a0009b1ce3a049e284af5762c453cf4c97d35b8e9c40a418f1eb6f46f917e03c26af2e6e112a1a578005498786b87b4f84c02af186d0d951f649d9091d98f7646afa8e1336f3c97523262947a2f7f66260009b1ce3a049e2b182c8a1053b0aa0ae08d59c65467dfa177feb717e9be953f46ec1cc0b18a98a000548983d0a70eb6cb7250bf2fc6c9bc6f91dfb5151f1354900de181ddc4e471069af8c40c7d2c3a00201200095009602012000a300a402012000970098020120009d009e0201200099009a020120009b009c009b1ce3a049e2b0bb5f4cc8fa03bb4e5c439ce4dbb5416a94d51365808218791331e6c5fe793ac005467e13eb87b6b6b90d0b43e4f4e2004fa75686da2228a063f2c36015dae01b3aba01233956c960009b1ce3a049e29ac05946631acece68a388836d5ee348f8815a45e5d962e2dbb19497d856b6fcc00531056970c6d77f95778029be79b4a96dfd0a7896c2f1b2303e461971d9ebea30943f4cbcbe40a0009b1ce3a049e2b3d19ca5f375b4be4fa9a528d9d4316271390ab2bd79f19186be5bf0200b22c440053022094c00552778e76b5162b3acd0d538d0ce14f1f870abc0d7b4516106d364582e1e4bb31060009b1ce3a049e2be0074d6c21926c537b571c7fe85a734f6b541a97666fc538c0b6991715cde0600052cdd320e4a80396ff9b8ad8c438eafc451fd474a77e974b1bfa3e3a53a5d549c84f365471a24e0020120009f00a002012000a100a2009b1ce3a049e28b211b02de35ec7336bbbb0da50958312c552e3b68555ebfeaf631fe72774ee400052cdba280acbccb2b2f620d8add53a175a14d651ce70897b905fa513c6c747fd62077c0ac132ae0009b1ce3a049e28cb2705f4754a5822c8521eb02cf6e940c9436cfe9e854b58857f2753513e5a300052c3f86e780d2d9867e1d8c71f6175a5ea27ba5cfc9e1d27e6234e65fd7306a363e0a1de3c51120009b1ce3a049e2a993abb64ccf7c0c7fba86af741459c0a657d03970829bb234bae69043c5f7ef000525aeb7cd4037ab045d350f2fc365eba43228e9c2f627dcd81169daab5f647006d9446a31d92760009b1ce3a049e2a77b8ad5ec8ba3ff53c306ed07d971ff7e7065166b3333e5408bf2787221a4a18005169c8b19bf25f6802d2ba64eec84cad5b03ab06554b3f0e1e57ac20967e14ebc37106f31153ae002012000a500a602012000ab00ac02012000a700a802012000a900aa009b1ce3a049e28a6c9793e0d1aefeb2e61a19ef09fde10a96abc7a0a2f32b0108c7a841fdf8eb400515adac4f6726ac0b948f616efdbdce362a389bdc2ff7c1596075ae4b69a6092b2a7535ff8c2360009b1ce3a049e29451318f71403afdd7e839213cdd162be59821d3bd54efc3d411f3e3440c5b9a00050b94cc72ca1d83f8cc27a8677a5cd20d3e4b33240b9090ce216aff62f9818253029087709a50e0009b1ce3a049e2936f63e33d85439287d0583055f306dd065329aab5de3453daea0b6db62d9e2040050b94cc72ca1d82806043d2b147ad74636168f92c3439e9c855a7a62f1edc90ecb5decb849142a0009b1ce3a049e28058eaf1b7ba74983ca4ecd5d1db5668a51318709a1aac887f0fefca4b193d4240050b94cc72ca1d94004c7e2ba9f771c433eeaa2d643fd9385e196be675dab46443bddacb48dc51a002012000ad00ae02012000af00b0009b1ce3a049e2b154add7828c9f0fc1d40f0f4d7430414b815750aa4cee0deab0d5cacc31bfc100050b946553cc20165ddff0dc24e96654a4397e037cdf84df73c7bf80088d8a4afcce8aef254ce360009b1ce3a049e2ba0912e2adac62305a5f8a63c71c46b162bd5cf0cc4e5272828f498c2692918e80050b946553cc203c5edb843dffcbc92f656b36931a259a696ff945ea938b63ccb9230131b8de0c60009b1ce3a049e28a15e6706a71fef8d3044957ec77e934ff2a5858c8b224ffdf62f51bc4c6055c00050b946553cc20207ca8ba58d1cd91d0a583a768112d51295d4efd9fe99259f0d4da5a3d6c3512a0009b1ce3a049e2bbdbddd85c05e67623bda730fb4d5e86314de545c86cb5aa16df39ef779b520740050b946553cc2025e3286571c2422c4c6e8c4eab4ac0b8fcef57950bd2d5c7e041adbc16bc3697a002012000b300b402012000d100d202012000b500b602012000c300c402012000b700b802012000bd00be02012000b900ba02012000bb00bc009b1ce3a049e2b9066cfdb6c9a8d3bc18fd3a7b6e2280be06831e0635c3695250cdf493af3b8fc0050b946553cc20382ef75f5d980998f3d6f972187346e03cc2cc1a6207322ad4c3bb3e94fc59cf60009b1ce3a049e28805546dee977d590bc44f1e448bb2bb07924da413ce64f7a02d230bd6f1b03d40050b946553cc2023be3bbc78d2197d05ff4cbb3ce4e02c3dc30c10ba97af39b20d40c2f11c356e20009b1ce3a049e2bb9508958512a31b56cfa67efbf10c8b41df1253fa5b318e18d3afa37cec9cad00050b946553cc2023f4b3e58ec64113979c30d1ba4b20a7ee74eb230dfa20b9049a81f585807151a0009b1ce3a049e2aa45aa9c34d7a989eefed7a85cf0e9b1d7aab1005756ea6e8135795eaf1e0bf400050b946553cc203c701fae1858c4ddc2e68a82e1e2bf6972164dbf247bc6b4dcfbd95f9edf7b99e002012000bf00c002012000c100c2009b1ce3a049e2aaeac40ff278a9ee3650b24a52b7d3132d0252360842a9d978fc5372057ca77300050b946553cc203fef90ec059adf8005d61f1527de5a0e1b1d3ee63d607634c4d36ad2ebe63fd260009b1ce3a049e2b43a01ca2a93f9cca6ae5e944f132f6dd54ade54cd45708193dd89fba4aec16240050b946553cc2038a07b9eedba60c4a5720f4404eb2319d594ac01fcc097cb92bac153c0bc469be0009b1ce3a049e299a56e2d483e113bc36edd3d60a7395896332b8c278e741e3caa7d909b3312ddc0050b946553cc20122fa60d66c60bc073efe50fadd0ddcc561272f2a7df8203747af16f19049a3da0009b1ce3a049e2b8793427177d29327e9744c2e2c8adceaaa1685c2ee771037e5fcfe1de8eeac780050b946553cc2022f24c67e44f32e9a475a7db1d8c9cf54de8f7da6e0411a2d76444feac8c67ae6002012000c500c602012000cb00cc02012000c700c802012000c900ca009b1ce3a049e2a5144d283b1b25c77fdd9d47c66072f657ebc5bbf9a24fec05273cb68ccb731b80050b946553cc2039b58444067d863896f5380ced22d5540b1c05fb6b2cee78bb6397b07e43d2c3a0009b1ce3a049e2b274a46e079f12139c69904a5de65682a2562df89f4a00a3096d951f1150dd5c80050716c1d03504e8cfae9a113091b84c87afe09d9300d3b4a590b6e84e8bbfa27c08ca0ddebb6720009b1ce3a049e29a6d40bdf589c63cfd06677d52a318e5e5d88c3e5b5e33063e1e38ab0490e3198004f2e2303e090472b91def8b3e3c77a66db288991637f705e981aef30a18455d634d26513930cce0009b1ce3a049e2ae637dbf2220f5b631a9b70cf54a1cc371e9523a6f6788c8dd3a8473be931dc40004f1a5fa3532f6dcedd6eb17b65e5f17f4dc0adaa102c83f8c64aa3000dc42d836bff6ded8e1a16002012000cd00ce02012000cf00d0009b1ce3a049e297851cbc6d26cb01cbcb9c0c3e129c456b6dad1e3e8bf619d8b59bff0c3ab4adc004de13574ddee4fd80efb75ceadab7558f7439deef102082c17590bbf61765112f2e10f9a417e960009b1ce3a049e290cedd07231e3eaa412bc2cf16715e90c595e4e079ea424a10c13dd63789b7444004d2d4d02ffb3cd3cb7269341296477bfe73faa48d3b782a9d242932658b1fbc0dd9da4dd8eaf6a0009b1ce3a049e29e9ea8e64bd755b04e0f5eb2c1087e66c8f5b9d1316bc2c51f7cae2e111dd63ac004bdb686206fece9fe01ee4c98aa31c42d62389794ddae1692e08d60154e0b6a8674d7a46cfd6160009b1ce3a049e2a6dc1f4b715d9f269f21a8aecf30afbe457245b6e35fcc3e4dc31c6f5dcc40e3c004bb0e25b307babce1db1c705c494511a33bffd387a79d10f195d0ba82653325f88a7d52b8ee726002012000d300d402012000e100e202012000d500d602012000db00dc02012000d700d802012000d900da009b1ce3a049e293b53e0be962e3a0c91ecae681fc642355c422de0f3013a6e096d8b4b6dcd9a14004b6dfa9ee7038506a492cb59bef4c9ab52def25e140442bbe9f26e63e71ae787a9a7fbfa1aa8860009b1ce3a049e28f15e5bb867d85637b43db2be14bc9ab9d05e3c3993a6a410329f04091d176e70004b2b95da1c672a517e02c8ac346b58789397d3a6037f74656cd72e1ec4b6567992d58e07d98d9a0009b1ce3a049e2b7bd0565790e7ec246200d6dab9b5e54001d3a86193a9bf8f9f9d703549774758004ae42987104684a9cd2bf686dbe7ba6d440aaaf67f9be34e0b3d990749e7e700949d420578a8a60009b1ce3a049e28b631b67f84d0e5597ba14f0bcfbcf59e4c086e54251e7f9a1f003acab78922c8004ae24171b556a9559766f814cee12945ec3c4a16cd5fe28b8aa917aabc059569c0591e5ab8eee6002012000dd00de02012000df00e0009b1ce3a049e2b6a824cf01d4312dc61013dbaa5932f6ca746f90c38d4e03b60fc210ef431a170004aaabaf2d6e663af9675e686c90fe2a02290d434d32e987beb21ecda88dc46dbbec0f2537f5e0e0009b1ce3a049e2ade7f83dbb15b525ac8f2108f12262a0c012e65091fb1a53065d3b69dc82dbfe00049c20162ff9358940fa67fc37c020ba8a5ce7e7a9e40073034f2005e95432538a8f9d72a496b0e0009b1ce3a049e29d5f6b16aa4333ac7436c05157b3bb4c0cae90c13f221a23cc33af62e70aadba80049c20162ff93598ada53fbe1b8204016a111b642c5c10b6efb15a9157ee01f73d1fc76ce6f42b20009b1ce3a049e28838647941bcaf13b516c4cf29fe2ac11ac12acfa31a04495f8198d320b5a7e740049c20162ff935ab823314e26d653a3dce059977a0c83c970a98befcf5e75c937aa9db29d67feaa002012000e300e402012000e900ea02012000e500e602012000e700e8009b1ce3a049e2b9c9e2c6a38f0894167748866c65c02a437b32e82cca3fceb50123bf2b2be3cb40049c20162ff935b0e08c7ddf1bfc3c18fc59d5a8c49b262d4a98de685d888117d87e80e3688c12e0009b1ce3a049e28b9c8f75bf80dc00050b08ca51ba698a8db1bbbae801baac50f7e1ee4a6fb4e180049c20162ff9358264b4a58989a560db1e2b784ec64a2cd7f1e31f707785189844a455aa2f019da0009b1ce3a049e28043fe45fb2c661b969f3d220ac4f5d28e755c5070487c2ca4a12932e26f10cb40049c20162ff9358200da27d131557afb6ca1c7542ed43c867320507d68f6595dd01e0bb32c471ae0009b1ce3a049e29cc4f0b39ba4abb49b0a95b8a059989b29a35d5e2f23d87ae2dafa2409accad440049c20162ff935a22d3e8b9e0208c7324c00eaf69b7ea62df5ba4fa59714f465dee6a87953d8c42002012000eb00ec02012000ed00ee009b1ce3a049e28f0f1dc7b52fd0b431c0d2cbcc1506e4808496bc5e9e5a8d827365dc5321fbf140049c20162ff93589b866bb0a015a1b9cb4a04259e75c2854e14017f653f3e42e34e3e2f87ebeb1e0009b1ce3a049e2be48e1f08792d52d240ab96b57ff947d642a9db9d25fb886c083d53e9c6108c1c0049c20162ff935abc819c25d36ea49ec9b99cfdd3cfaf91d642ba9dc94ff8273ef4a7b4fd1690220009b1ce3a049e2bd638e0fb15df5ec2a5fd45a60a8d00b6d10cc5118ebef4317a6fbdc1c80a593c0049c20162ff935bfec45c828ddfd9fc9b3f6fcc0b358d37753667ccb44a8a5af094e0c9c6ec36060009b1ce3a049e298888590d90d12cc830fea5e9f834ccf4e00d0a98871d5eac821aa59163d82f840049c20162ff9358c9ba8487cda2ccc88d92c89a7c1459c7585459e44f942bb38fcf192199fbfba2002012000f100f2020120010f011002012000f300f40201200101010202012000f500f602012000fb00fc02012000f700f802012000f900fa009b1ce3a049e285629452ad64f715531d0b51548e5bb4432b17cb4a24fb1aa53ca78233865bc200049c20162ff935882336dc9226ff3651616ad7d83224c1c7bfdfc647001283ccfeabb8a38e526120009b1ce3a049e29b3edebd748db84bb1a641d3cef42601ccdd1d2761815cbd5138ec6bc4cbe08880049c20162ff9359ba3eccda1a1a67603cc4de6a8b3de4f6f42c68b481bb25667ad0f2a4882697e20009b1ce3a049e2a120ba4a853aeef47a4980d55377893bf6e496e2b7d19cee9cf86cc2501e20f480049c20162ff9358c9c22d344f11ca4eb99dd0fbb543fc11dfb1e86e3206669bb76df787e1f02bbe0009b1ce3a049e29463cfd2f2909174be8b2ba40987d4b39133fd2f022e0f57a760a3c3cd7df0ac40049c20162ff935b32f2c478c701e91245aa3d88dd55817e44c73d0c42da9f2e84161d79c27c223a002012000fd00fe02012000ff0100009b1ce3a049e2a095fdde6f126585971bb73ead7ff08c97d9fdacc497a1d4d029698147ab49de80049c20162ff93592e07107e20b6685a7c898dec3007a9785808ed41d747c0d75078d63b7c76d0e60009b1ce3a049e28b1b3e7789ba07fa3319cd83c0606810ad4b003c6806e4c9d8fbd784ffbe78c400049c20162ff935851e74a504d562876807e239c6cb607461d858c47336791a1bbfa84f3964353960009b1ce3a049e2b0adf91990feb580a005a578edc102e127533c8c42b7dac75658715879edec0ac0049c20162ff935a158086f70a6e1366c4ddf33f82641fe760fed5c84a92fe68da8a3967be66b7760009b1ce3a049e2a493d650fec146beee25ebc1cd7b5db2c6b2da9c3a1dc6eca449fc6f2e8d564bc0049c20162ff93596680c6a2a94f3515ee812cc8865a8cfb40ae24128c0f68230d7f03c9055c1dae0020120010301040201200109010a0201200105010602012001070108009b1ce3a049e2833cffe7b1f41c3789cabc61e6a140a3dcf2264d490a8d239da84512c6b48f25c0049c20162ff935a2a10b37bcb1ec1baed930bf99ce1842d6380c306b80fcb5ff2971f5fbaf3cd3e0009b1ce3a049e28f97b7f6679bf5bb2e63995e69d8741ff679c676b00a9ffa80debe612a085c07c0049876d782fd12f6f9bd85d5b0016f6d5dfa99d23eb5ac4b1575af05db1dedd6a9a39f171313fc60009b1ce3a049e2977ae7e147d0ebd465d7ef7b2e520916bf260159ecaec1f468c06156e22b5168c00494a2adc2d7242dcc150c16fe0897241e80f4413339d2e0415efaa02a2c352173263a0a0b3e2760009b1ce3a049e2a232060affda9fd15ed68b20d17df08d472bfc3edfc73128b4ef44c0dec3f28fc00493922a8b2d5b20d011e830eeaf39b99ed78f7c7e91e0914678ca4a7c6edec4be7ab6a18ffaea20020120010b010c020120010d010e009b1ce3a049e2b19b49afa52b82e525370125f33fab952ac3d3d4ca6ad73e3f9506cb7df27f8fc0048e5720f031d1460dd58645d6b8d97fe4ba07286e084488fabb602c0872b5e57c6705ed9de64020009b1ce3a049e2b866da234c3bca9b58a424856940558ba974f8063eaf457b38a6039d0daadc5740048e5720f02a7a7909342cba491b08507f8a25ba54c409ba6d10cf7b9cb58a3eaf5e464fd7bfe5e0009b1ce3a049e2a7005d311684149516c82ec0b3115d404bd6446a74504d517c96cdc7b2dba91400048e5720f01a8e41bed0b68ff4bf4108f22687b94f94b3a45c56a98c5a293986b062a2c72c4da460009b1ce3a049e29d6ffb951d46ef36c2463b55da5782b1a67d77d5f9f82c29aed754c1dd003c79c0048e5720f019550bf783a061684fbe1608e701ea2c6f13371cf276862016b349ebc1150977c0536002012001110112020120011f0120020120011301140201200119011a0201200115011602012001170118009b1ce3a049e2ae72efc8d108507ed8ceda92d2e08fde7e52a173e65f4c7cdbad0a0e01bdc44c00048e5720dfb6c028ea011dc72f54b87e8b43c94a59c6d499c19394fa56f6d0df127a393d11b77da0009b1ce3a049e2923329c3d6d9e0ca3ca2207d8b2cae2537294b073f6576a662af640caf95e6f480048de915a8f03dee4e016f51815d3338ab8c29e0bd03890feab9e861f0fcb68ed8353d02b6b02460009b1ce3a049e2a6c1b5e89583865b68fd94450be421804083488afbbdd7541d065f1ee8e2bf6140048a284287b702c24f830979f1ba394187d506e3dd3568fed7c2f320e5760c540b5393b590983f20009b1ce3a049e294d3124cfbf71f4ec56161bdceef9fa7a80b9eaee933af0bd65cdf52c9aeba3f00048a168869b2fac23fef9cf49149b2e2a3fd7dec7dda3a1f0d120cdd262f6ced9b72be999785cb60020120011b011c020120011d011e009b1ce3a049e28ad75d2655295d49a847eae1d7adbd88b98aba0d319f0a9b26a87abade793de2400479cfe29c6688c6095072f6eb127007e98b0c2c855151bac6b94c20700df1f544969a2a7f853460009b1ce3a049e2815c41c36fa00547473902992b8027224993ed9a1ddd773e3ee3ac57c8b5b52c8004704630db75a45cd9245931ddfc6d508b411ab4018995c5f62752e054803c9f82d15485be001fa0009b1ce3a049e2994ba5249329be5f1caf7d94224c2251ff854b120ea11b85e12800b67be883efc0046fbe04d6d2f68fd203e334de61abfcf85b23a17c6f87853d99aa68eec646047abda2fc837ae860009b1ce3a049e29b21403b333c0bdbddc23fddf3062fddb3d63312190ed1b076bc14d928cb822700046ceb964b88ebde6d4bd93473ad1dc6b84176e07c834f1a1e10e2595739841ad9724a93503e156002012001210122020120012701280201200123012402012001250126009b1ce3a049e2ac4ac1f9d532fbe6c82aa2a48ba25e4f9d19f9e21bbe4b76c54501e0f253ffaec0046bee7e598afac932130f044374de6c5cbd9e723044aec3af3f77b18de54c9b9f7cf43290db89e0009b1ce3a049e294b8e27edcbaf70f43b5e7135a51b56b06a854fd1966165d88ab01401bded0f440046aebac9700c256d40d6f38e60cb6b302febdb408fcaa67fff8c3271a40929b1ea0274b2e730260009b1ce3a049e2825cc0ca59c42f64871441f3f9e0637f777941688c4875edc57a9cfb88edd5e7800467e3cb3814142220f165e4717e1f52cecafc84e487107c80ec6b4b65d993b9262347297dd74ae0009b1ce3a049e2ba160b5c6840fa4269e617620a2f0a954a99cd8521af2436a5454023b0f5dcfdc004678bb724bc4ae923f7fbb1c77f24be5deabda8e6b8930675d0751aa2d8335dc8d710cb929842e00201200129012a020120012b012c009b1ce3a049e291a8bff208cc1c264f9f3dbd4a4a0528012440a65c8351cdffccec7e347b68ca000467893f6c4460295ae334a41002a3acb6bd81cee5ef4258f7c1003c7d2f7f4c3b9b385c711968e0009b1ce3a049e29bc507e9e8b1e62930c78a321ac922c562a2e00dc4075f0bb8014704ff6d0dabc0046764e34356672495ebb678b36f86245c959728e2166f3600d364b3843284667a297061efb9b060009b1ce3a049e2a7ce1f67f3e73703a81157a05fb95944bae1b9e81edf76c8cc153af40fe6f241400467612f1e23381528e1f2a08f6c977deb5e1ba1eabecda6ce4b2ee114eb8f678ca2918f77b615e0009b1ce3a049e28ec537af88ef524efa75b12fd7889d992694da443557cfacb9d253cab034e953400462941499aa5ee8b43081357b4885f7d6a67a762a88101e31026031cf6ec6bc1fe92976035cd8a0020120012f0130020120014d014e02012001310132020120013f0140020120013301340201200139013a0201200135013602012001370138009b1ce3a049e2ab2304f3fab6e93534135f1213ab391bea083b2887e8748d7ca508bb50d69b2d40045fc177bf03296c7839a36d9c3a50549fe17f50cbb02e554a4b2c1d257004b4c9f707134a7c6e20009b1ce3a049e2ab34a753fafe52d80bf480ef6e2efa8c413be8a9eb911cc5c4f184d9c062829cc0045f27998c36f9aa3ea0c15b74bf9ca563a8cecb1faec9acdb620557a084a7c862e19df048f83ea0009b1ce3a049e2a3a47704f1c57409c9d4cfe8547f8e16d1a5f227e2b8a72f3ce0c027ebc7b7df00045d88b00faafbd60b8a7b21c57d27f0931e8e6cfdb7ddd6b4e5f2799f7d8ccab31d578cc667e420009b1ce3a049e2b10884a7cdd9438c348dcf74c4262bcd291213024fce02c72bca0bde6cdc7154c0045b136a81e50fc848cc771bbc8361d86f381187db7bb35f83fe8ad8241d33b8c2c9acaf59723b60020120013b013c020120013d013e009b1ce3a049e2886830c2fb7e04c39c0ce25cf913500913dcd3956da4cc05a6b8e5965961b5c700045a130daa3fc459a28a87acfaff5de1c222cf4af07dc11e8e3fa4aadef5dab7ce01c114e5b9f6a0009b1ce3a049e29b2bfba3620d3bc9c429345819fcb55c25093229111dbca5bb8422c8d0b13f0f400452b1e8f26a01ae53147ee1c9a4d4900c0c292df9fee569b02e0554c91ea3774f861af81fc3c960009b1ce3a049e2b2da928df98e7de4288aaeebaaf2963105840ba5d26cb42ff076ff43e72bb804c00452b1e8f1de8b925ea341585947baa0194b1406662fccc2693dd8932211203a1326a59f50ce64a0009b1ce3a049e29db4ec5931a8e6c9ee73311d8eff5f3d0226110500cd4d8a8f9f9c21df814737400452b1e8eaed69398c7b95f42a89c2a5ed53d6ae8dc665a1ae424ef1e961bac85be227ae5dfce5e002012001410142020120014701480201200143014402012001450146009b1ce3a049e2869a0ce453fcb68bd8d89b59ecd518941ba589ae302606bdd3a78a84b0e59a4ac00452b1e8e327442d16d52d1d34af75b70c1a1c7363abfc373cf7fbf3229cc8be80276825670bff20009b1ce3a049e291fae10d2f01646fd8106ec54651f4a6af7fe263d4ea67e654ec393741929727c0045255c89170eb723623fe37a6a77b0547345396708c9363518d18af94528b92014a6d7950fe9b20009b1ce3a049e291a5c3973ef268d5825e34f8c261cd77e23f43e2baccba77e0303222a67ecad1c0045255c845804268dec11592e433234901611fce32fadd47e24f7536ac942b81c5ef7c26d979dae0009b1ce3a049e2900853925452717b221b5fb348d94d900fa5f9c6aa69b78315fcffaec014e778c0044d73bcfcb13b3d9b69681f6a2d635073aeaad83c2107fde9639331762bbdc489662d80881fa4600201200149014a020120014b014c009b1ce3a049e28df1a42722b005edb5b309383098c5fa0c88f769d85b4eb44ab60835349fc4b280044d73bcfcb13b3b08339ae393d96b9a5c519258e1c62c12c65bd32222ad5c45d8f201fa7c8d29e0009b1ce3a049e2b457e59df3cac18f5970658394bd209fa47a2780a7402064c1ec0ee58ea472c240044a4e6d26439fbb41318996d6e8ce34927a5ab553a01ea365fc17998486465516d4fd420aa885a0009b1ce3a049e2bd12742539ca52b0499937880a935949ca1253c663558cdbcc8d4b650ff1dd96000448bacdd821c4badf573699dc359e1c159690b32f85c446b8d8f73651aca205b06560f081d11f20009b1ce3a049e2b509160152a6ed80c7473ff9f6dfec7520b06016f79f3276dfb462e46a37a172c0043d17aec585eac424f5e283adc3e8da52c90a2dcbd07e311c826dbc4b63dd81990fb6cb7309bc60020120014f0150020120015d015e02012001510152020120015701580201200153015402012001550156009b1ce3a049e28b86d559c608f2e32d2a33844fbc047435b4598bc99f011742c359b565e0b3148004388aa152e1ff0df97491a293787166266f3c3ec9e93390f0aaeb74b079e92dc6694e9ec7747fe0009b1ce3a049e2979ed40dbcd38792fde6a9e5c31cdd840b0d01a00c5b8ad667768ccbe9bc309380043446300635606b3ff15b5771e8aa82e713e2ff3943969629e0f64e0ddb68165d190c2557ce5b60009b1ce3a049e2a18a9cdaca0a2e6705f387343f7d87c4fc38c57118a40d5a36478e5599a2123240042c0861d01e2a8a82e510b4d9f501503c4769c8f05cc7f25236f156f00aacdee9b7e06eb07ed820009b1ce3a049e2a7584a15bed9b623882f76499a2252b3d0aeec3338d79045fa662e31835b55b40004043afc9af47bc0be1e2bdb47318045ffe1bb6e79f6bdbd0bb5413fa37fc222bfbcdfee2e857a200201200159015a020120015b015c009b1ce3a049e2a2a673547d2e9e4605a50e642fae1d80ce99be80b33ff0b4a16329d4805cbe7bc003fadf0885a8b305d2496398d7959f433a2c366c5656ef64a8b1e04f32f4b49c4156665ec1a258a0009b1ce3a049e2a0a8a5042e88920c04038db7f45dd733f28c8e0a492cb69b4786a391b30dfcf84003faa22d4c4a6863a49af7f589fe5c368507b67a2fbbdf28486af9372c42a64f913017cd699bfa20009b1ce3a049e29855a4f9efdf6f9fba7481e023d9cea9d202591ceaebbc54ca4270e851d6e0500003f9850387676543536dae1af1fc09513176aff7c79d638ee99ae975fd964bf942db7d0fb91b77a0009b1ce3a049e29ebaa14d24347ff682d6314fc378842a5f7ff206618830d7781ca027e20930b34003f8d3a1fa10c21a13f11ff3180a7b3dd16e833c3a411c9cd17c8859c0c288098c80fa80b47b67a0020120015f0160020120016501660201200161016202012001630164009b1ce3a049e2a80a0fa1b61ad2038591ed5d71e2edf030b375a80813d07287d6bb6e88bac4274003f61e86e95f46048921455da5b253bf0a0373e940dab1f62c33db1b6c38e2c2509e90b18d6d8b60009b1ce3a049e2834a811892ca75516748c45494605bc0e3eb4d1b92b86e2c79ae0d6d9e32d4ad0003edab689732ac51f36a9b75b9687f793dec216c606e3f7c6bd8abbe1afa40a288e30de2950ef1e0009b1ce3a049e2b8b4cb1dbc72e6585eac7942557901054f803c82eec3b47439bffd6d4eefee830003e304bc53b02a563dd94a980935e004b618f63008b1227557d464cc7cf26e705a8a109108c4efe0009b1ce3a049e2a0f4655001ea5362445cbc4b16b0dd3f97409becb42fe349ba902f10d43cbd904003d96d1e9600e803943525f8161f8aec2fb535335fc2bbb1ab0b47681903cb447cca69824f1b9ce0020120016701680201200169016a009b1ce3a049e2b52a02c7ba362b01e52d5d8b364c1950589f423753034ca82ee8183a239db3c40003d915942bc48ca9944ac68574578f8ed0bddfca72d4ff96126182d0aba84e1eec9c49d3719eaba0009b1ce3a049e2af49065d3339367d9c28224d6c674582f4642c422d453ad95711d5c3ce0f1977c003cfaa7e5f42ad43c44edb7d681a9eefb9ee72b66ec874c2dcdbbefef4f9cd0ec9131c6e32ba0420009b1ce3a049e2bf82ef5bd001980c91d30bcc5d79fd808785ca645261a489ff6e0caa9337ed888003cf91ebfcbd4bbaaa83f00bd051fbb5536517bb5a916537bcc03e27a87a7ec0af1943fa239f3420009b1ce3a049e2af5411c451529de19ea896b743af84edec415307ae380dc2df081b6b5818b6410003c03baafc45f89663ebf5b15b05dd8974676487cccb33fed640bc4a68b490626d98f540fc1c7ce0020120016d016e020120018b018c020120016f0170020120017d017e02012001710172020120017701780201200173017402012001750176009b1ce3a049e2a7584275ef41d7bea5632c8d9775503807292471a8e0308913e1c901764ca9014003b973c4ca8d86064170278680894f6ea68ca69ed38d7c8004d9acc66269c52dcba495130bf58960009b1ce3a049e2a73f4680e8b1d6206c29b333e69e7b31ebc16373675e863f47d725528908b7830003b7e4bd59e3a0b81055db64e196e3396ede7bea28437c1d49f6db06acff8689eb73b13ea3f53420009b1ce3a049e28ea14126aea3bdbf38ea86759f256ced47486ed03e4bbba12e0fb34a1b8d9af98003b49c0fb146c14feac07f0e4bc11320a8da8b1b3a66462b53c494a4e14e76c238f26664fffe24e0009b1ce3a049e29d9dc65c30c2735855a51732b57851727c5afaf4658efb151b5e590aacb475a90003b3c82e036814a30b8e5463bb6f4bae077e1956a261234d3f1df5317559c2c0cd5f4b8057f475e00201200179017a020120017b017c009b1ce3a049e2b8ef7aa13dd242c53b023b3696fe41fb8c395c6bb07347a16edfcca7e7b13ec48003a3b16124b1984303963b55830d2d2853361134b7618ab43528bbdaf687a69d26867141792ffca0009b1ce3a049e2ad5a053730b268dccca5bdd7126b943c217c3d5c78b3183d4e81a74a8566004a8003a1f03d2872e209a0aba445a362a7aa7b5be60b52a9885315a3c192b5313e881d68322578e79a60009b1ce3a049e29dbb3d83490f85c77181304da353801fa995be7a2bf228db99110c3577a61287c003a1f03d2872e226ba35a67d878b9ce8cd176458a2afbf5b8d642531b3f489a9fde93f24a1ec7120009b1ce3a049e29fb424b43c300c449c91f6f287ae34d5f5ec1196fac6664d62f283693a37b34f40039e0daf40d5e1163653295d7a0ab3ffe70a8e39b431046c93e5a51976ec30f17c81151a28b62420020120017f0180020120018501860201200181018202012001830184009b1ce3a049e2a6b44ec29ba02667b36ac73d67031382a460f85a2b797edcd0e0b7068555242e80038ebbdc9548718e5b6248ae957819c53195463dd7a29277835a5b27323db64cea1c0b8712907ae0009b1ce3a049e2b1f718fae7952cee30035cf9ae7506589f4625bad4f2c88849bac3cd8df8c66b80038dbf4bad34ca87a27dbb19ba353b571991f65bffe5aed1f4760ec1b5e2ffb23dc9430e3a0be220009b1ce3a049e2bc9030771fdeaf7eb2a21c89a7d2b6fd017cb337c1fef57a724f86b2d2da9bcc80038b57d3bad2793751d7dee28e7a37b1e3572a62abd33af2ca3f86d1858a0cce6ff60bda6e3459e0009b1ce3a049e2b704c71ac24313e9b244f05b4e5cf5b87aa749dd247f0bdab6b38e61d3c37a5d4003841f965354328d3a5c152504a1ce49bbd0c5f022169be07c1f530da7255c17855a8bd810dde7e0020120018701880201200189018a009b1ce3a049e29fbeb3a5ae17dcb8dade60d84d8de56db82de854692ec5697333f93f826fd37f40038109a6b762fc27242fbe7fc4774f4d3dab3613e7cafa7b079fa124a33a6fc90ca96baa69704c20009b1ce3a049e2b5026c714b4332e0a01df2ee9f56501fea6ecdc635d6e3e2cc4279bb4698ca5800037e3b1edfa29f005ab8bbe1c5e2e3b1e546636910d34eb91b232b31e21ba0b3b2162e599de997a0009b1ce3a049e2b285d558330e2e5d2a4ace4b50685ba79f187023627ec2f62461ea293ab9032740037b85df86260b4fb2578a99c369561d684eb320a8f13ef320143899fc9850c38e74e95b0eaf40e0009b1ce3a049e29a7952c40475c1eb48229a67ea82eb00e74f438e257c13e07805c4e365ebc4570003755c884224247b6d3b4430cdbe843e76d179865e48f49a36bb16867897d45dd53b004067be3e60020120018d018e020120019b019c020120018f0190020120019501960201200191019202012001930194009b1ce3a049e2bd340340d8c89573f51267ff119a784959077c8478a24bf8bb4264411be2149fc0036f9213edcaf19eb73d6117661e38f086a8631096061f73baa8ca5181082177fe773edeae06cd20009b1ce3a049e2902215592f16d7895b9e148447b6add4701414d3f496f106d9c35f03cf926e5c4003616d3d867fcab06d5026994fa04e5b710b4e68c4429a9e705ce1a95c7c0813127b2a8fe381ea20009b1ce3a049e298e104e1fe46731eb8341b6cec81bb31d317d0648a9adf91ba0d415c21eb7339400356ed90f5c37dec196c5b1cb6bc04add46eb9eb075aa93d31826c69b548eff130b118aa1f09d260009b1ce3a049e28579037ac4975970e0c99460b6610c4f728199b705c1c986719438c0dd2e1b9a40034a7e5f28746e9f64bdc3ee3effd34f1eb0ebb0fb48e99c40e5b042c18661f7cf2837d3965c3e60020120019701980201200199019a009b1ce3a049e29775744747063080075dd5293f156ad22763003789e710782523615d6886535900034110d4e8dc26a1ea43d67ab725691048a03b4a4b10be18c03fc4447238864ebfbe528e9afafa60009b1ce3a049e290cc41c3428657bff63113f01c1bf66868a45a6b32355e07cf481b037e093ea0800328c7c26c0c66a4bf04f4e4bc1f57ed53926a829ac7687196fac601487c228d65acece629cf61e0009b1ce3a049e29d3bdd7bb63958b7ba3257f35628887afaf6ec82689cb7c9384ed15d26b62d4b000327aaf7d4998ecc243e0ab84c6ce8324939e1888aea6363bc3b081d6ad18eca492fb89a8125c9a0009b1ce3a049e28c3b271295c7fcf9193a8e7917429d755d48c7520ddbd517c5ec60d3907149ca00031b362086bbba7d5f13b8eb2fb2811f8f2fd2248f8897e151bd652c93f307b1e0d0c71dbdbd10a0020120019d019e02012001a301a4020120019f01a002012001a101a2009b1ce3a049e2a22b653005c001b076b0842f2a3e1b62f1c7edcc212aa7d4f0a017123bd1d203400312bfec6afc24bf09a1ca5182f7a1832d9964fdae6786d148544642138d9c1d91c3660a3bca58e0009b1ce3a049e28bdd4ef27fe2acfcaea6c87aec292e2a8aca49efbdf937c50917c48f52a5a09080030f9a4a4ab06429d32e6213ac7ee6541c7691835955b5c383bf1e277aca1dba4825d8b8e5b09e20009b1ce3a049e28b99700c7e6882477c3632054d72cc0c344d370d6996c0b28b9b035f36f9beb60002f9c18b7b08c9724c43b5243ee6b2f766a6f24f55b171fa37a3a125b9c72e6a7abeefbc3620ee60009b1ce3a049e28443c8ec4f94b386db81a5fd7c97a029304bbe7082b65328d06adda09e7b75180002f02a98d3483da2bae4ce9ca3b27c4b57c5bfd4c91ed11f604df3803cf0beddb4437b63c7ccfb6002012001a501a602012001a701a8009b1ce3a049e283e6bcb7eec4528dbb52bcc76f368d7be67da04874785b944f285b8d00ccfa494002e90d16bb364da9ea2d14b979198992f73ff458a40d76fe3157ee74c5a780e1d0cc1e93f3260520009b1ce3a049e2a235103b45c15aef4530d7deb09973d014eb27978c6cb0f501176353d3db054fc002e38b6c868bdafa48075ecd741d50fee154318dc3c16bda368046babcf4d0ae90619e10a3b27be0009b1ce3a049e285408a544fbc78d35367141041dbccd3754df96afda44d113f609484c99a14c5c002d4ec69ca56333b88705d8a1a927b941511fa4dc9dc5d50d0da4cf7fbb48496bf1a962df4ce1d20009b1ce3a049e2a88b4982e206c01d5795c9caf247e2648c005f6c195867325c3a4c3c03bf2c3a0002d22cbb1c399c6aac223bfc85b1185059e8996194a8271c84abd7cdcb11b24cc3efc04ecb68136002012001ab01ac02012001c901ca02012001ad01ae02012001bb01bc02012001af01b002012001b501b602012001b101b202012001b301b4009b1ce3a049e2ab8ac9a6150bc8b1d8ce65efc95c585c5dc63d7b63a237b14589a31f323f38ef4002caa57841285bf85c1cfdc020bd8aa220810902f1bb066557e3927968850f219267da0bed3d52e0009b1ce3a049e2aa9fa6a6be78f2e1c3090c73be92ec964290b6f22f74e7b577a03ccb83ca193c8002caa07468a9384dbc32e7f98f5f18ddf0847960f69dc56903cb7924ff0bd4232512ea170108e660009b1ce3a049e299cc7b409581c78a2d741de47e9680768c2983a2de0f56f4e52cc3bac395dc214002b64adb906570c6dee48b7d754cb10756ee56e24b1f947b72bb5d6c4dd820300e1a254e716ddb60009b1ce3a049e281736bba306bdb6e69f876a41af10ccf79539d88e2328548836b97ffe2b559400002b47e36f7cf1333de3900acaa1c1d147728ab1a4274054f1e3e7870d5a30dbe53d31bf2e559e7e002012001b701b802012001b901ba009b1ce3a049e2b8a1b87f83522ba7ef95bf093ffa7f895f2009f5be5febb433c24299fbc862320002af534d85a3a27e11c57246e6770c27b5507791009d09e3912f7c16e08bda5e5ef9506c4694e560009b1ce3a049e2a9962515914935675732d592222a4b67e15999a1209aa76216dd7951735cfe35c002aa8d245acdbfd8324d3181966a141c514523c202e2a22d8aed2506b06ebd09b6abe0dfff3ffd60009b1ce3a049e2b397c2349ac2930dc062b3ebb17bdae462743948b639acddd5e8b0b4c00b18f00002a983d90385df75d219533d6a9d383f0a19caf6dd415e9c444edf0a7739081733c5669a72c94ea0009b1ce3a049e29980d13ee4f9ad180536874ab7ae0131b6d8ac1dd5fcd1b4185e6c08f63e106d4002a828c6cd5b3b5fe968e6748584d4833998ab0f2118fc101699e06d3b0659322cef4c666802ebe002012001bd01be02012001c301c402012001bf01c002012001c101c2009b1ce3a049e287fd69955f981d55efa19c56977a34a1ffdb9a5fe7343213580157ceee67190d8002a33370e6310da29141b26bd203d751782e5ec505807ca9574e9c73296495de83d5b39b51523fa0009b1ce3a049e28d2ca45325eac4c60c9ff4fdbbd0a73a8dbe0341a7bf24fa9f533b39d212920340029cb709147ac3d571b3ab859148402488b98e9dda1fd151968863eb72d61528d989d9f3d96b1660009b1ce3a049e2bdec7c9ef164929bdde32415e4c44a742d7786cf5e3d6903a2b3236a1ee4343580029bdc84d41f59a56d776e804f4c2763599d0bf0b586833ba8e36c474f43238da2169b0746157620009b1ce3a049e2b9aba2c173dc3573d832680279047eef190dc9337fc74433ea1542cb77df7998000298a974e4de76c9e744c630804d331bc19d8ea9526071fb66743a527259298eb9b175e2c4a49de002012001c501c602012001c701c8009b1ce3a049e2899fec223b806e553811a95378456d5a3483043f91aebc13bd0d4a1dce5a5d34c00296d3e9414b14f3be7af211d13b1637d8ac7086c5f4ee0faa764f3d951943ee00ef5468c76617a0009b1ce3a049e2870b8e40eafaac7add123fe76f235a208c501983f57348aff4dfcc8cc12d18c980029654718377068cb07efad3a6a6b2b17df9688981b3b75ceacc5bc448fd9e5dcf567933d474eda0009b1ce3a049e28f4ba0c18a4d029d44d106633fbb1546e451cebee77f5cf41c2a28c32265551f8002955eb4724439da24819b16ef4e614fff38afa70fa7d6f7a68b75728272b882e324f5680cb623a0009b1ce3a049e2bb1831ac6df76c514fcc3ed09298ffe98a7e4d5c03aa5827c05fba7c44a0b179800293c26a1b35bca2146cf7c9dd9e666392a3c3f6b4d3032b13332abc5b3f83e047c4a556a8a380e002012001cb01cc02012001d901da02012001cd01ce02012001d301d402012001cf01d002012001d101d2009b1ce3a049e2aec50b021a32432679929f54f88ef4bf8a66532a2d6d9edd894abc970b4db982800287fef8b333233b1f366ec8202d0d1dd0f7428a8f2368678939775dfd43322e3caafd2f9a69ac60009b1ce3a049e2aa93f0803b1433e11479b7605bf186569d41dfd61b58091dec68a3e2584cfc9c00027b5887e2df43967339f65d1a206965adb6c3f41c0332f0408ab3b37eb1a1e5030776b0cbef34e0009b1ce3a049e2a24c5c20fd3db705d58ebbe8ca0692b5663df02692edd7103566bfb9c6700fabc0027802857d8ff4da17d1d73ddd00cba98a4cf38b3ac649bb9e6ce7064d651c825b650ef7e5e005a0009b1ce3a049e28cd7170f3d65038407f0a229767fe84a94a1767fa01a686807b10cd19488eb9c0002753251758786ec55aa14232e9228032dbb019fd765435ed319f633cbef102114ccaf1609f6442002012001d501d602012001d701d8009b1ce3a049e2bd21b0724d4aeb2cac3cf19857f6c6d335cc02de6f8e9981b00541a44b25e24300026e7db11fdfc19ee9c4e215c1203ad0f95cd8dc58bfbc667801c1ec68886d16573346915867b620009b1ce3a049e2bd3cda0ed33172ccf45a54a219ca7ea7ad0bfaf4d7476d2e5affd48a0a9836fe80026c7d82a6a5d652ba92761425bbcb6844ea868c56d0429e313ee963d1288a446edcd97251350760009b1ce3a049e28b2812ae48d6efe8799c3b6c062a67439635ac478d670442944be79f72524aea000269aed57af6929a023d9beb6ee16304988b5dc61e3ebc7d0911b35becc2bdf617c284de350d93e0009b1ce3a049e2817c0c036bd63c11c2f21e47b9842c2e9b39abf31b8fc755ab757583e0560aff000269a8e5e000fdb5302e6519d43cdfff5af212c987ba369df8c801054a5e11436f41e09cdf9b366002012001db01dc02012001e101e202012001dd01de02012001df01e0009b1ce3a049e28d33207abf77acf47ab7c1733da4a76ca5d42705a8321325e654928af723b3f24002672420556b34ff0d9d05277ea1c26ab95ec012c57d5a12090749eb1ad9f3149bc6b670786cdd20009b1ce3a049e2b9682d96fb10015876bad066843d1e45fe56eba30f85e0ea22815f73386de876c00265163c792f0595805a66889fc09b433eb1cac810c5975500818e12c8e0ae0e3bdc0974768e9ea0009b1ce3a049e283a8365b5b2e8a6a245773ad88616843dd0201ad3bb85cd82ec324ae11fcd86ac00264b05ec5af5b5660031191e56dde5e0ca9fac0a7adb0422ea50b5a77769ce6754124760a0c9320009b1ce3a049e2a254eec76283671d22a8da4bab856ee061213612f778c9448022318e5c652693c00261217a0587be2d2dca6096524a35a32e685ba71cca426b0e3cf91c3269cd6eeb73671b7134e96002012001e301e402012001e501e6009b1ce3a049e2960a40165bcacc02163387da17020976f2416b3292dafe425eadf615b93dd62fc00257a78efd1298d87f135d6440bd6a79964873da81d2c0b7b376a26f07254059187ce262d485c0a0009b1ce3a049e2b57cc226b7c5aafdc2a5193ff1878dc7559bb1c1b9c550c0561639e66f0db04a4002546d1bacca68b1fd43f1e6c98cb9c0d8c3b59274e1026378fdc0dbdb50eb1d801cab3747f5ffa0009b1ce3a049e2885390909be0ee95222891123270c56253934867dc5bbc01cfa639bef895912340024f02e2a997ddd7a22a2bbc6f1a3b88e34d3ec3226408f6df3caff6d30785d07bd1501961a0d4a0009b1ce3a049e282cd213006384291d46551a620ef4b380375e104faeeb53d00fd3a8f1919ed1e00024c48a8bb5d0ca758a1cf665f267e2c057047cd643bcdbbddfa2d43aa470886dd9898f9fefb6d2002012001e901ea0201480207020802012001eb01ec02012001f901fa02012001ed01ee02012001f301f402012001ef01f002012001f101f2009b1ce3a049e2972ea16c83f28d3d83165f00f75809ccc7a342a3daf7bb69a419c526b7eded4140024c23626c550e0d20fb1dc5900e90d35582a9c256d35751c5c6220757f784bbb0bd4989a922cee0009b1ce3a049e2936343a7c16535cfc6801b710aef50fd834184fc7381c1600c0a75846aec54570002461d4ce0082dccb8a8fbb84820193b4d204821beac23c58cb8ec2ac314ff35ed535aee0078fae0009b1ce3a049e2a296651037fe386b25db395526b41b1b4cf77573dcfb1d11d80f93aa9871622f40024595231203c09d1dac2c9fa11b7233fb8fed809b60b2242e804da5c370c791909130c6f635d1a0009b1ce3a049e28336306f11bab19fd9f5eb2ac56904a9474d7aea141bb6572ad9e02c5327405b000242f552f849d86df18ff6b9ec3586138047fde2a25860445693fda2306c2e05c14512b598f232e002012001f501f602012001f701f8009b1ce3a049e2a5de3ae2fe0386134a79cbdd55d73b44849076a59ec3b8e83c2a96ce9b69dbecc00242f552f84801f3d42bc06e3a77fba211c4e8ffbfba78655fd20a3624c29e42cb03a94459242960009b1ce3a049e2bce1e9b88943f781d5f75febce28d9c1f878ba47788f4ee2125e2b1c1ef79ef6c00242f552f8458dc452f31ee76d4c83a5ebdc65266998b956d7c77e963593e84acc384cf8b48689e0009b1ce3a049e29fe79b4cb3abfb861c5d2c3ee26016642459bf9e69d74d34ae8ca31d8f33b5de400242f552f841e08c356490435d8b26734a3e8523ddf06685aa2b3f48031952beb28e88b19587c420009b1ce3a049e2929adbb03b4c180ddd602047b67a505c12bddea300983aac7f06a5af33377012800242f552f8363f1a547d83c93830cbde24bf104cd2a3ae9610c458ec80c1a30a2a0dcc48367724a002012001fb01fc0201200201020202012001fd01fe02012001ff0200009b1ce3a049e28fac377f7d923b63cf446fc62d90588e045160b0adcf5a39edd73e0e1d8f3393000242f552f83468b8e30bccbc20b0da660bcdc106ceb249da6953cbd33d6713e6a4d16a42100e2620009b1ce3a049e2bc41616994a05c3001e31f7021feb64b2e6d5f6ca54bbce522c7061e213fbaecc00242f552f805dbf8286f75181e77418494c8b18c5b3d9056703d5650263c2aa0f45774f662862ca0009b1ce3a049e28c3d4ba5943cf5b86abf6d7059cc105bee9517c7b193d990958220fb12730698000242f552f80406db3489fe5453dbfe5e2c00d9a58d5920865ea58c8da8731fe37a74989b56dc3e60009b1ce3a049e2b36380b2eb455059ebeb74a6c8ad15dc26b4af0d8a96214a7d5a15fd4aad071d400242f552f80059a5424030284a2643df3e9a3dc27a4e92418f7d2863b8c4d44413bf747d8eb6b4a00201200203020402012002050206009b1ce3a049e29d2e7ed3f13cb1197f263ad7fec58f54496bdd346fad2cb34895c9f1d0a9ac60400242f552f7fd4a24435e1b49423dd16a326044b7c0af9dc8d51fb43bfc21a6e0edcf011820843820009b1ce3a049e299b362fdb5c454281bbc1e482ac76e6fb90aaf66aa9ad1a17c31a3f1eafbd1a1800242f552f7e6a11b28de42ca52a505d1c22619285238fff02d7b6fb8c96e62f7b7a465ef7b444460009b1ce3a049e2b3b43afdbea626465366facdc3ed69eb9380833b21e5e483a014cb89d940bab8800242f552e7e60a07d88a02253d6d6538c80a6d2083fe31c60f28bbde53e3aa1afbb68ebe8645db20009b1ce3a049e2b416c5c217a2fceef680b4c576bb448346ae9a7ea1b4dd1eb2032529d1212d8200022f64aa62e758861ea29453572e3376d806c49c80fc3f1bf871f69227bdf8413c4479036033d5a00201200209020a020120020f0210020120020b020c020120020d020e009b1ce3a049e2ac653e12d96d59da40bdc82a3d3a76e9e9d1ac9183ad48de2d72d2531610473d00022f5c82d8538a987ee340235f5a8975b70d9330b6dbae735efc3c36109bb53143abc134da125ea0009b1ce3a049e29dd92cdf5fd041190809e8e883534e42de4406040bbb1e90ce9a293648d4f569c0022dd05b1debdd01894d7dd51f484773b9a020f2a4731cc0bea996959772f0026844aed6d0b459a0009b1ce3a049e2b3a200ea14da3be6ca9ec1404e668d241e9076e85a57106bdf41197583fa6714c00226b96cf4cab40ce67a68d27ba3c67fe1590ab9df0a8837b33e5873aec114dc432e30a986bfe8a0009b1ce3a049e28fd06a504918be966e1c76573621bb14efd2f211731650d46900dceb9ca269b7c0021e3d5e5dcf223c107ef3afcbeb159ee00deb0da381cf8eaf7ee3c54258ecb9fe354cfb3d9f8d200201200211021202012002130214009b1ce3a049e28977bc2b04ba18816525cc7d36bc2a34c62d19796553eec6345665ddfd9e0cad4002122282755cb06183e3467b8107ade8d739831136c871851b1714017416f7471676f8f45bad8920009b1ce3a049e2b98bd1978eda7a008763f1db4b66897ecf0ccc43ec189503107d84527a7376680001fa8d8ee61d6f57eec3f9b0e8ec4f7252197b59249072ed20a89cb36c7864d28212ee858d6ed9a0009b1ce3a049e2889e0e480e26ed6a2609a2c81de043ecedc5214762ac611526790dfb73e69c1cc001f8b5ed9c02ba46d31d2170d3bb67765785fe00cab6380beb648993790c6b62f6d6f9aa8653d660009b1ce3a049e2bb9f8b807a2e73ed1e053d62dd5b833eca6a3708d5871e7d54f1c96dc859debd8001efa6d7bf9d08a5fe10377345d60992f0c173a8ee2383d821c494cc3c9c95f069d8b51855d473e00000e6a644f623ea1b52bbff0500560000003b2ae94a34f0d327bb836d78c1b78c03ab8cadb71468e065b0a83749a2b165a54072797778278d31665bb585169b91a64a1e761a78eb702729a111415ff3eb4d264cdb545631315cf815be2db6c2249f81251e56cb7968bfb17773591ffa89c40800000068b499bb22ac9bcc137c70c37ef8a8cdbe4862edbe04de0cd6fe1059a44823f640bcc36c85e929a6c70f383847df4c2bfdf2d04a41d42e482530e6bfe3add0cdf844b731d7891efb8a0ed10e4164fc54b8818626c3a7c482a7548156e7b036f9080000003ed3a45b7b15dcf5a3a24a31f228ff2800c5786c64f84f79c699981db4e456a94067cac8253681a6c4a6f32f0091e3bc963a7414c440ab650689718cd68ae9ba52cb4f84317bbc9d3368cd4db6cefb4f504e429115c91bc71758a332b1563e1a0c00000024c3344f5235d9fe398c6ac3ee3e6373883a903e0ae38192335b1e3b886c906540dcc8def5fda17d8189a9f727d62efd5da565501c8bf910708dc9c05abd839014346b0e395a18c2079d42835e5699803deb2e6b3da3fa09d05f5cddef51525e020000003e892a73582493e4d05afe52d9d80c288597c8f26d97939158363793e06982e1405b0e6a10bac2e7a0f51892b491e2a73e9991be86374e39b6152c976fa8bcb7d16bba4807e2caaeef7ae229c71af617c8834799cb512a4d642fb7752d1df5650c000000f6e602c6c3a4567a847d9bcdca04e2b5d43c8620d6d4878cad55b26933f4e78340a6c0a725ac19833344cc6e56fe3db94b90b2565f52301f2dc9998a54352b964790b144728299677d1724356330877973ff3619cc46a065c1b369ac73bae26900000000a39014f8daffe23a0cd0b4bae45d1adef9b00d7c42d250a41d11a9a69ae4695140e71c399f15c03842eaa1b7adf3b82f270b3dd2dd16ab62de9d296a978d9e67fa831ab8ab1ea929eb1ad1bedc18bff8e7fcfa0a5890bf489087af17b10c39f90e000000de93466468f615267f57d7c97c26c7314a5cbf278e239eba2928a069d5d2eced4036c3212b7619c385120415aef09b81b125d5dee2588795169aa73915226c56d63fa4cc4077db8297b37d64996eb2de287e0691f5342f16da2d369df43d94330a000000335b1dfee02c5bbb22993926dd58afdcb7a5b9f9054a99c099a32d63e0d0f7ad4012fa3d87dda0a2ff9e0fb6bd8903ea20d15813ea76f47c31b4f31ec8d5848ab627d7b58ed34279a74bb97b2b24c45ce53c3a3860200645222018b22100dc570a000000e329bbe537bb159f3425601078e1c98df7eec51f74df884fd081b93ec515e57440ccdc82e1afc818ff60eef8e427f73255df5dd4884a138ae3fdc838e3894e560be6d4c2f2a144dabb5e2b92367ef2c95057d2213265832701216060409f0cf20c00000017a3405c398add8ebd327eda4ed241cde78822da634431e0d5c53822f4485f1640f5b2f4f6602346b081492dcb082414a1f6afc88864500ecb22d5cbe43fa7bfa256fb267abc6b95aff2646b44d371f71ffd1083b06d0088d0123c95d5aac7fc060000008d881f732cb8d25e019c55d5fce34a41955a0430a3fdc993e4428c2b53eb1d874046d73782a8582d8d8687ce2af8b5d934f72a7f110723712c67ae46d5f84971d1eacbfc8616ceafe5b5f9e6ba289d71a5de83fce1a7926f5a649dd80b714b5308000000f214349abfceb2970bb490df26be9fec994a98968b8f5b23e61618763c6ae667405726cb88860e5c847974aedc3ef2a28be5044e95fcc8209196a55de9f032f3413ef9d9362a7e8678285d4afd9f4d8df034c493c13f2da967254070e2b3951e000000000f8dd8c2da1ea87c389a01260b367e99427390398d8080ca00ef1139b07aed324016cf1e7449b7c98d4708d7cee39520469c1d1b651e52979bfdb0a71592b3fa8451f8e54053b3dc9e2be130014950c8856db297e3303b072ac8ab1075007e5e03000000de9f68bf62d27fce2c462374759d1f742f7ee9d6bd88140973ca0d41b383ad6a402002cd4b19f80df7eb9aa52cf4ebe9699cf675e49b0ccec2b5556cc61884c98538af85983195ab06a5a60dc2a0cb24f1f534d7640b15ebf020479eba44852c0d000000e48b217ae2377be5df2a832385730101cf3aa7a05b58120f31ec3c03d264c7ee404d17ccdb807482f04068243e53feca91142e6aea44cf4b2a199da733e4cc5588d1bcb6675785269987d3edd5bf78cf1b06e6bdf44db10f6b7dc2796777ea0f08000000aa94543630729b9a1da494577f2198e608d8644a6a6a9dee0feb24f34a7044ce40400f348af662640c29b0448ea5127fc94e0f77a662d29e11a9ba0e8b3e9eda6d3274e9835cc255401373208b5c7f9edfddbc3e25d1766375160930fb3f84c9090000005bce0a71110aa02de4f13d6d14bd6c4d6edf5391ecb7f3af4b64cce612e8cd7f40002f296d02f00aa7e92ad96825151fac7e98b8c85cf68dd0bb97b312bdf2b0a5b24132b6e5616644d809d1d31a92581807315a21cfb398fad8b7d1fbec32950e000000b948ea36f9e6f9c6894b2c115f2d917ef24420fef7ad28d49eafff19eb9ae3af404142cbd8fb0df5470898864eda704bdb429f8da40894946f2b94a12fa1aa003c9817d9c4b4846e42f97a63d91fc789f2df61a4004c8b59c2adbb207c52ca4f0900000007608fe3fd22d39501167160d1a90bdc08a7bcb77056bd7e3d8c1b12c3de780640366a10099e673a36d0108f71a5da5787c0dc87e1bf312c58550b557e2327562b127031a83ebf366d72fd67d3353100b4d839c55b38474e931bcfa46af8daf00a0000007980b3236ded8f680d6faa1a2cc88e3e38704738810a3cbb9827ba84ed5ade56409e4251be9451d25802a3c3b47102d0a477ea665ebb5eade428fa54cc3358860993cd0b04518b33ec3e4f7053e891859bd415e8cbf449588adbbb4c4f85dd31030000006e409305353c79252f70f4d9af057929862cf630f04c3593898c292a312175b140d7d65e4880b991adc5522121aaf623c6d63665122467776b54607eb7e4f1422dd32077589055ab36bf3facb1cac71911e28f7008bd714a82107f828080658e04000000bbb7f9eba2c8f72d05f0a81b9d68ef5c639486de7ccce195951acaaa17cbd62640152ce22fcb82acc83d5ee5ce33a98830848692eb4ecebea913cc0d3e127783ec954c3e66bfc68ee4f1fd4b035562f293871caae95218573728a38a072394ad03000000bd45713b20380f19dcef5c9f39ced0dd94f75e1edbd54283ada41c980907a9c840de7bda44aea52e6b0a1d4123b3ee8faff084904074ed1bdddc350c5e567e23dcbc04182eaa9a10f01607147d23a5c0ec46a71491675f481fe9d4b3afe589710f000000fd0af847835a0c395e1d65cb58e72f70e2c664b42cfeae46e4df4e878c5ca1c040667aa0c66f526ef37affb458de7a5a9eb01c60d1137a622f417c7afff758628d7d053fe447785c19bdf0a3ffc64b5e643780c4388398c837193e5deeda31cd09000000524ac46ab4f5652804dec5b9e9f701d9d4b09149c0bd35f74eed6c7dbe5c7448401c763cc9bfcee192d45d9033f8335027f1a5fd83d3137b14aefe4205f99d931163f7433cd06058b46aaa68fd11dd605caba04bb54f1926b68199894711d86406000000a9506a42272f71cba62dff6e90d4b0cf1d03d5207de2ec2cd958181d70c672a740d6a2817830948de60e8455d55dc1f2a38999586962f426525ed999136e2a0081a9f15e9826b789d6026adb3d96f30a69e000ba97d282d4ae1b09da29a03297070000001c5a3aaca35ad2941ec3a39398e959460f56dd358ebf1186472b284c509ad8c6405dd809d71ae3304ce9786da979d1fc137e85b566dc255587e093c2f9b8fe74c3538952c850be96ac276cc50bf6dbd3d98b03498e2c3b23dd690401af0dde460e0000005e3341cef4d4c7ae2474c238237cd0716a69ea1fc198bb62dc24eea4a5ee455440961258fba6ea43f8860ccfb3e312f6d65a31f23e9ac124c2503cdcd8593cde7e327ce62fadc649e138967e8976b71deca825ef376202793f7c6f34a14cefa80d0000003bafa36684009f88881911b807da85bc98e2ed15310aee8fea9757c297416b31406d2f18aaeed3885e65cf32adb84fc94c82c293bffb20ce7fc92553071aec937cb5d98cdf33d4074536a0cc237bf42b9ba6fe191dfdfd8680bf21aeefe3b6a7050000008812c4e7e4a1b27d5a9c6cc4a1e257aabf733d0a69d4a314b6a947a7638720354067216391e9a5d0f002360f5238e9747e665d132115c70db2505499ac223a2ca49a000c85f47fc1a92484f07e4a543b37577098a9ac4783939703025410c1f70200000004f59cd16b9cb15a398274f005545bf486200310294d7784f0e65773908a229240c84162198ceb716b812e65eb26987c0b0f5116c36d281b0dec33d159c9d8fee442e62c8d59c73ab4ed39d33dc62ba33e97375e3ee5d46929fb2c6d728af12305000000a3de1275b58cf7056a46046220bdaff36c96027f1c588cbcbb4e2991975b0e104070338923d92641005bf8ae162f7e2fca59f5e4e6584bea7f87e0eabd14c272221b32ce65ae9130cf96509d9fbca459e4f2143f5c577424b1ed4ee50c18a96808000000f8a29f22b3272624e2604ccde1dc1a4b29b6700c343409325cb1b3f5c9e5b81440e7505e5ad8382f87ec71d4d404ccbb156055262b388e036a4433e7de9c419e605640f22afe47ed8eb289a0747c2480f0120e47d4ce323d998839965488c335000000004c097744412a3a9ee6fc795a28ca66d8fc2b0279687f6e3b309cf89e3dd3cd7240aee66539ce0ffce02c1b25133c45a06d86302e926a8ea11be8dc4dc2dddf1f33161f775b1cf8766aed33fb845007fa3813f401dc1f5f2576c52264a942ec240b0000008a6923d06f7573b400761769737f6c5071c153825de0dc40081cce138a54c08740fef3f793fdf9fe4b3f0c341e78d6bffcb198e685e2321b9d703e1151dfa7786d1f2b9ecdb5618afcbb26e80d4c323dde3fd48a4d6cc684abd373a2276c8aa209000000201471dd478abad0bf438f85084a93be935713a66446640c6cdfbb26b39d455c4036469e6b611af92f773e1ec7202f89ca33a73fd9ca125886a24f86cd2a78cc40099672aba781d3cb2076c11921aaa8018d68466f16b513b81380e58986a30403000000984836df55e774d6e7e894c7f16aa153161e52ba66c609bfb3e81e1ee940f61940b2ba77baf0becdf964fd92ed4ff96f45fae763473e70df3f1fe7584c40c456ea9114f46cea3e20aa98b167c492cf21627b7135af699dbbdfd89a9d121cbbff0a000000330d875c470bb27104c192674d536871545571ad19ebd9c881b38397da383fbe403fe2646977631adc5d6f7e5c540e28b62c65419a59e8d25879f6625e9982c40595b631e65a8f0643bb3bab1a02b2566d184bfadd80836f916dec6552cb9da503000000be03abff1ac92c3e799025b5039c972d913cd3b5fee54680879dc3e4d720216940e41083cddf257b613da72a4a967a5701f9a3ba6f1b5a8991e2c60646c104b02f3ea2b4654b1e46fd305ae0ecd304c1f14985cf6e01d87146e0b18e81b7f5da07000000497f087530ee86814cda055ae6e55eb4a6b80e21de0da49842a848ced5fb808440d2b0d3ca3906427a799e70a617b16e965b603b9dc61075a719466d8e3e218a995a497210bd915b5340db4262ef029267e314f180fdd90bfbfaaec04f2c887d0d000000db40f4b76420f5919e8105d34a3d8fe8ee07ae213c7c1dd00cb519be5db0515e40819dae66fab4c176f70bb5c28e6bea8b64b2a016cde9578567f52a8dde44cbee65d879b04419b224d65bb21a05d156d43b5f864907e931417f9ad64cff5dee0f000000a1b97169e085eec0b535597972780a090eba5a840efc20cae909a64ca784b66040e990d5e685978bb1cbef492e574e38c74e5d7f581f13f01a26cc5484db66969d2a97fc95da4018ecacd6e92495ee36fcf075339ab27dc942b84681b09a4e8102000000f2952891e69b97ba70a18dfc6a0fd224b513a9d82773794a4be344905c3cd6ae4077f91be55ebff94fcc954f4a6b75cfc3a1c97dded8fa48596fea2a121f98ecf42c60323264f49ebadf400f05f3ae3655f228cc101b3aef88737a1cb74518200800000078670a4d617c449733b5dea469cef6bfb3ba70a462610493c48f25fa31df8fc340ae07794c7e9fb36772d53c18cd7850351aabc4966d9cccb11170d60d93c20256cf2aa7b9d56b3a73bfd4ca65ca00e2161bfd6efe79d4afe4245eaf0cd1987e06000000c5be0b72b2f4e0820d62d9a3e56bcdb84e12ecd8107e765d924daa11d6193ccb408591be8662fc8c431b54397c986bdf28d9155bad1cc6d0537ca10dd5a0c7288ab0602475cef902a8087cafced2af0172aaefb09f1a4c52ca5e15a501f298390f000000612f6377c951c046130f7ebc26695ddabc91dd83ecc9fbe10543c382e473a6fc40d400604fe7ef000c59dd4b2370348eceddc6fa62a0c5659507f63f4cc614c022d7110616a1fa7822fb5d7ad74b665d42fdba2e84263106b5f4da4f75f39ba10e000000dda6ed4b32798777096b4a4ed60572f6f0f5fa376ab4dc3f2ed51dab402f2bb7403233dc71317d985bf6c2d79030399c7cc71cfd353753963d741482d59efd54f144448210bfb44df3ffa751667d5fd42df5c0802d1d7d85135ae3e1957dc50f0a000000241b3dec0cfad11e1f626322a3843b669c56b81d4791647cfa6a07868ed04b53403c89c0a0f42b9b1cf719134990d5496881ca39c92fae0ef4fa8213f08d9c20a42384fdea7614ec99f537bddd6210f3acede9d001ae363ea99586fac4a289b2060000009bf4fb9576d3e4c1fdd99a538fca7acf2f1aaf770cf35b7863c4cdad583639894094155d251880e4562dd5e157739603f0eab20a209e68895d211262fa0e5152b8db92baf928fdb7c4d150ea4a957bccc6bb46a0e16855c1ab9ed6664702a45106000000194de2e9e678155a3dd15e4613ec0ab27becaf2e6eb07407f6726d5e3cb0579b40f73bec4b36b09ab3b22d121c260f8aa5e526268930b413a41ec1e166084c33df9197daeb81ccae1405c9665f41864cf6e4b4f75e43607afa8a2d088f7609b70d0000002d98d2f66bb3e2c81abaad9f709e3e259cb4add151b82db4c89a3292715e558840295bac5eeb329aeaea9ec30d62d287a43a710f0a1547c2223eeba01d6c07bcea64d4b984b311ada3c8f68cddb557a6a4baab18d77c6f11d48b153372261afd030000003bfd501401bd2aea78de3d91f82256378339c551443910a3c1803fa35cd04c2b40fe1746be822c675b24ebfbe7407f934148592fbc7c5b1dcc860fa700374c9245409f07d6871043bdd25831207e96cd83f1914e944686eaa2182ee2a6f858520f000000ee685271ddf3c91d5134e384b83e844d868a1f6fcdb0ed3da0fb4562fcb54af840e8dde901a93ba5ce13655834748fe50f5667134d839259134fe0f4d118e657440917c5d995a72b48341c313a8e9587ba721d9a791ec785ee17fdae221e36730d000000fd562f54394ea94e7b8919dadd936638923e06b92e8edefba10af94843b8b9044034d1d4bd1fc689808877f1c17d639007b8bdde47134f573b0fb890abaeeee67789185f2695e27ad7c2e453ce2efcd3e5fc10b13e9b3889c61a2afb90d5d82d07000000e42549100c88c71869b77aa619fdf9f7c260f9f5d0d6d3458091a240933a5775408a4d292a34596c687c5c350847a560e9ed99e9b4acb7486b1d16ad5504596105305c0cd55170eaa3f746b1e98577579cc42cd920d4f08236b5f07937ab75c104000000a03fac4036a89dc798e41c4280ad8c9ad24852cdb32da51062a91ff24aefd3494034c7b3302d2c5262a57b33a109f9afc2f37916cf6efb4ca558a5b6bf79f3b8f2e3fb201c063e8a04afd7327a578162f094898c553a1a11209e866eac44572607000000ca996d705d9f10fc3520401642c45b97f99f4e506c57aedab783a99e8c09264340ad800f43400de8f40ae766b632961b32532d8c613a5418fe132c7086e8add7d5d9170492edffc1e81e37b74b23f4fea43581cfd5d95f7f4696ac587e7f529a02000000a604d124f4878ecee70792dc0e813b02fa7c37d5cbb887cc941d87fe2132273e40579c0c19a0ead0a135dca8a68d7756b356a513fc73f805181a2deee69aa4d62ac6d82fec9fb5b79b7d309419f44d259c6c8ddf745f38cdceb9a370ead50a5502000000fd689db79b3fb0510b768d02e67d036a3e54bb9270c46eff8bad7a36c825f0e4408095ddcbd5c102580df6f9a547b98ce2fd5a679c20d808f39b340c30566ca3d3c60c8671bb66574cb8e4d6d72b7e10da80795d165a36f6a292732ba142aa630d0000008c41f6a075422e89ac3ff5511e42d31cd6fa1e5c8f07a0c652f7a631079b43174081408320cd179f3b010a0d3827ce9ac3964bd5b23ea96c540fd9aee0aa8b74349120a6d8f3571329911cec4d5b399d63961602145a211723958ba22bac91ac01000000a9b687a275cdb0e13bdd92aeb73782cb7c7e1b4077d27d30303fd0e9d96a3edf4001292f7ef17fb6942949d52386c7f8818a0ee18387821db300a3ae51b7e7606062be33b33b3580ff0cf71147e7f5a46b119fdb585d80f825de9e67d674d51d0c0000000f16c6a0ecfc8e1a042185d94d0c58d9ef9b8072f98b027eb88a036218fd717640aea626108227e51cade5a9b6e1507c6c102dcb4d08f384077cdcc49be157893a18f4b56bbb35bded57b323ececd004fda4ac779faca99ca7cd5c8fa238d7a00c000000acaa98b6925e302f693b30230951e3eadf45eabf0b51d9fd285b541fb4c1704e407674d650dcac000611561b3e45251a2151109d8021bca61a058c9c7edee13eccbd6c98f834243dab4465736ec0ea4dec2a5cec674706f3f1c0751f94f2442c04000000bab698a2f314d90ac2fec5cbc64289d602fba17eb57386a249d8e5428efef9a0403ba33d8263c17a91ebaa606e72df7e0f3f06a861333221b21aa3d55a349d6abea69e5444ecfc1de4eb8d3ab9ff1537dce9056316c6488298102e71083fe13a03000000f072709960294193b266b0c7dc9b6515c90f182664f4d18e7c875bc5a6e8cc434005d5e8f1b57ed16117a3b726f9a464f5d662fb3dea05c421ea9fa1819ebf65da3ee7cb39a2c906002dc09a54fee7954f8bd7ffbf2de2e7aa4e512fff6330130d000000a6f67d64dc6eea9159917f835bacdf4b9b9a6db7d2b07fccb50d20d0b9f16cc2407236809e842ad1167fdb930e377a57fe009554b39395866f84636463ea618812d385c24a66242b4f2ece1e009d1a60a644d6727c0717131f5acc083c071dcb020000002563107dc396456d2607921b413ec44d79e7cd120c4b7726ae3b774636049bb5401fd0d88452afec975fe3dce208192f1087908fa2ccb6ac3d6aef1ad64a5288e63e2d76382d6b5d1ef75eb74f59a43e1ac0e82e2e29604993a0958d42c2c18b0600000045641bb328831c0a95cf805efb55afdbb857571e970b4f83b6f39b686ccfb2794034f06449395b2d9bfd4e0ca0be884f2a846fe398f331b4135ef8c99d71b65ea8f4f8990efafb143545e7707b53183d65f2140e3bd7bae4f721e95ff9b86f5403000000dcea147e1c9e3e8fb0b228700b3f1c95a0d323fb264f87bfc673c085964b0b3b40ee6100f619d78df0ecee48d48e04e70fc24a2c562a94594e1de5b76b7e8c7346fd3bc5c22dc4d003ee6ccd5b5bd96ab03c9461b4a16fe704694b9733f3a8f40a000000a087d994ccb1c49b73136d0ee4cb0bd6202a49cb7bc00634ba8d05ec6c4da7ae4061c1c3b3cf80e9a67cc2f04c91fd8779d94403c89903712762b2d90d90f8f2998f10c0b6bc638364440f217fd8e11c61306d3a7eee32c94069a96daefcbf8e0b000000711325352231c77d0680f1f6b4134c57028ea040ce8c20a3f7c7db42a7f614a940dd1a0ebfbf6654ac41aa1bbf04c061e345c1bc89b196cccf4f4820c6b6ecc973f9b533e16b048a0ca3a61b52ab5d6f19f8e6ffb14fe60d38686c3a5f626fc10a000000d15fe8c9b32fc2d5375dbc51b11389ebf405b0ac92d0fb629ca857c2075e05d9405f75176ee29f7c2a609c6a55692f98054c6343ac7d64ed5c42b02992db6a79a7704f325aa75ce42a4bf4432c1b28d93a68d5d7050c7447de33a523de992e1b08000000aab17958b72088e196163826ebdeeab54b044bf7900f7281ecc4f484944fe5e940e827c0ca5994e4fc69ff47050b1bec8beb70d8cd1c027a436aac6e9d6425af58221f757cd8f21f0f78ecbb880c42f694d33d1015bc3167615028afc5a3e56804000000a439cbd4e7d7467ad0c107ac11c987d652202ca95128354f954470587cf8d15c40e6418968c67eb3ec7e888cef492b6e44160384c26717a9c3a8882d52c041969eb8991950944e4a1707e4a546df2be2d521b240b4ad106d2c2d3d9afd7ac32d01000000185055d276c761c8b8b081ca16edc4511f35ba7f7692a7b097dd8cd550242f5d4086ad3b78175c0c1713cb655731965df675ef72f77d7cd8b6f4d39e561f7b9f6ef29325a6f00c3040dda92d734e978ffcebfc6637ec9633d5133e572ebb9af1020000009555b1de4b45d96ea77e5baed3d10b8807c50f3e548896b02927070dfb52e8df4023e4c1ca395378d6143c6932775c0d6b6779c8877b62a089064bac43bd7a164daf0aa553a4d92f123ae4cc7493944cb65eb06630260d719815760a2baca3ac0a000000c7266089880fac531a9da0cab0dc1547c74a5b007b223fba3e1ff3c875180ba240621ef47bbb1da9a1d146557ef03946b9e3f0168e3683b2d17c5cfc1edf5a439be4f28774ca59f0029832d1cae054c0ae6b7e9fa97730c8bc6e601335e4bedc060000007177e86e43748d1cdbcad08df5e03b14ebc4e39e7ee13b28e60fcabf0bd182c0409890716e062fd50f25e404934001d93932a9d33ff56ff587443bf11a243f535d451e6590ae1605b247bb9143d305af50e1c9cecdcad72a557302238f743dcb0700000093ef819afc6034bd2c90170137533f65078bc8373a382a3b1c9d2d635184e15c40f851fe68dadcff04817b0bcbccfa1d598ee2812cdd051d0d1e3b1dfd4be48ef4e536235de03d2177e12c98a1d073e03933fe8b7c01cfdf034e1725329b4a2d02000000f2e460120201cced4edf848e7ea0aace63f1bd097fa85d3aeea405dc5afccdaa404f5e63d0dd303c56811fda563f1e746ce9b84e2ef4638b576dbc410b0b78c1703169fd481578793ea4a5e3893fb88c3a74679470da287417a434870f17b95802000000de20f19e769b36b05a702faf804fa6b330720892e28c81ec2654aec5734560aa40211dba27a350a5df6e9f21426904446c415f12c613cd1cca170d307db5e65c25ca4cc96ef7b5e468d6b82a0c408f1695b778aa515c00d2e76fc9ab5d3dfba6000000003ca8b990235231575516d889e4facc8b4d81796a3caf37cfe55f726f5f4da8f540976fb511edb37313ad26fd5eaf42f54eb1e9a6de98ba8fb9d1e60fa3a67dd2b9f8e40d00c97f3cd5ccff9bfa1bd19c3972d6ff71e7d57198ada4d9a37b837b0b0000009addb23da660855380833f471bf959aad4a66b6411b3dc5223134fee4fa8da3a4004779036371e025ffcefeb317ae1c4d76057facb7707cd533389a55fdf37cb9df84a2e8dc861576b7b36b8836d3accc03102bcd9d58b201422509b984bd35707000000131e17c95b75c24cff1ab822bb60223c4cc34d6b23301615f225519090614f5c40495c509bdd1860a5337e5e37bbd8bc2504c45dacac66efae6abfbe52bbfd24362f7af3dc05aa6ff749388c7bf5112de4cea2c488ee054857709622d37ac46f0c0000009c30331800d3847732d2a4cb7bc02371043bbb823f50ab3c2f5ce6322fc9b63a407d06280d7be8e16a6c0c65577033044083d76c84e843339ea41e08ecb582e4630198c1958110d1c3455b4c1e640e3abc525d4dd6d499f8db4b0b85a2e4d526050000001cce0f52b5757299ffffffff0000000000000080ee4993013b565f7396c34846f1724eeeb2696e0a78198dca059d7e7bd9dc3053e584407443f119cf0670d63cc74cd50941a062e2be74f32934e5afbc530cb30da33677ffffffffff000000000000008077889301242455403f7ddc896101e21944d2637f9280cfd0dd02f8448a93ae07459dceb427e4c4af9ddcf7a1be4f06204530cfbf0c1f328fc7800b62cbb2da5e3f2e22a2fe530100b5ee9c720102070100014700094603242455403f7ddc896101e21944d2637f9280cfd0dd02f8448a93ae07459dceb4002101241011ef55aaffffff110203040501a09bc7a987000000000601019388770000000100ffffffff000000000000000063bcda1300001f3dc524f64000001f3dc524f64713cd7016000600a101938874019349eec400000003000000000000002e0628480101019a69cc0affc1bc635b7884c5b9cfb05acdb8615b9bc5f1e7cc6c19814b24810003284801016dcfc4fddc15b330509824d000ff45fa2b7ae3e11eea86e00f7170404eaf363c0020284801014976920027f3ae58c5b32deb20a478b37b2c90fb721b20d6b6b9aaffd92e60f20014009800001f3dc515b4040193887660886f821513865dfac46f1e84a2f7bc725b09e12ad5d09ad59adc6109021ad505f2ddbc0bec043107832e9ec6193a0fa478f83fe1df5fd1f688c6395cd52ccb00fe0a5700b5ee9c720202020b0001000056fa00000946033b565f7396c34846f1724eeeb2696e0a78198dca059d7e7bd9dc3053e584407400190001241011ef55aaffffff11000200030004000501a09bc7a987000000000601019349ee0000000100ffffffff000000000000000063bbfa1700001f39b955b9c000001f39b955b9c4521bea230005ffbb019349ec019340f3c400000003000000000000002e000628480101e5d3fa4cb4ae119b0d5956a8a3af93b8c690f3ba0ac82ff353a2a5d76215d6740003284801018f2490e263452d94f758cbcd1649387a79f822134a73ee4300b24c7ff1697e09001824894a33f6fd41f68b0eebca385dc8219292d158c136c7a336582f5c23d3d906c19cbd21be755e1472f1b49b2c072f2e7030f84a7115adb6b478fa2fd86762d66ffc30ead2b7c0000700080009000a009800001f39b9373544019349ed5d405866062d6b79e7467e5ca14811feee93843f959ab2e67178302de597f1712a6eaed15f76e6741824f6b7ddab503661499005a7249e244b8d7bd726615d712848010194c80f5228f350058ed3561caa92537b251835145a250774b61375ccffcf0df5000400010228480101c4fd1848ac4965ceb883f534ba47697738dfa474f8cf0411f4649194d877cd0400072457cca5e9018fe6f04773594002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac000b000c000d000e2848010157ab0d4a41f3713802fe878c66d1dde01b80c2bae377acea1505c423b95e65280002003fb000000000400000000000000024063f9bc11dcd650009018fe6f04773594004210150000f2201200010001128480101d93c273a6a9c140d24970729805321a527b5839bbb582d5a11ec0632ad336da900032202d8001200132848010124d21cf7ae96b1c55a1230e823db0317ce24ec33e3bf2585c79605684304faf200072201200014001528480101fd78695ffd58402e209cb0b060c95b1a8a83dae389c7eac9554a3c086e52b8980007220120001600172201ce002100222848010114265b804cdb772e1c9a48d1dd67ad6e9315495151d6f49bf5f203b2b883ae7c000c2201200018001928480101ff9fb607464434b8240b30817c4e6c358ad723c3ddeed45b2b82d45b9fb0f6210004220120001a001b2848010135495972e4dffc56ffc325d2abeaa6db04e07d832cc8b8847ae195158fd724d20002220120001c001d220120001e001f28480101ab446ae5250a0e5acbf42540f12f69bc49e22d74782881442954471a01c67d6c0005010120002028480101e1e66c22df500de6499c055de17ff3d1216fe5f15247186dde0708e01c52526300010024c201000000fa000000fa000003e800000017284801017c026098fc23990f80f62428d2782ca53befea92f36506c0fb73d65725e66f22000a0101480023012b1263bbfa1363bcfa1300f400640fffffffffffff78c000240202c80025002602012000270028020120002d002e0201200029002a020120002b002c020120003300340201200071007202012000af00b002012000ed00ee020120002f003002012000310032020120012b012c0201200169016a02012001a701a802012001e501e6020120003500360201200053005402012000370038020120004500460201200039003a020120003f0040020120003b003c020120003d003e009b1ce3a049e2bfbfabe94b6c307e716a4cf61fdd00bcd9aa1d0432de6885fdaacd8ce3bc0ff7c00649c5de58ea983ba04c54d49d0c2a248697f32eaba92097fd5d726fa4e91f749e61f55e1b37d460009b1ce3a049e2981a2876b715a55a36d26b2dab7a47ea4b5237cfea37e25287b8e3717de9c54f000649c5de58ea98034c8f378c65a7a2f837c86a9c061d6afb43bb893755048ae64876e99d2b0c2da0009b1ce3a049e28e8aa6def5a316ecfe4c0c5c9a5e06eae8ca20e45bec5a52781e4c6f84fadf26c00647d183c09117fc27cd80b3fd0e46b373e778d9de40a15bdd34327d709724c56d12e679830b3c60009b1ce3a049e2a4a4ab4d4c8ecbf8fc5a67236850259d98753fe59aabda84f8fd6ed7c3d1253b40064090f9681699a58127502a6c4d42b201970a44a30069fa999390d4df8425368c992461161f47600201200041004202012000430044009b1ce3a049e2ade6a963029e6a706cbf0580d7891acaac78f3456d5d6d56f616634f0482ad650006407fe3c4b6f04116118ca6141513385bce13e34d6854fac170cba9d216efc5f71c1423d3ca8e60009b1ce3a049e29c0e573c761f46d847fa6958c383c2fdc9fa46f545e858c2f69338141415dafc0006407817737f1da427283ea0bd92891d48b32f4464f1489fae9684ef47e15bc33d865089bc8da720009b1ce3a049e2af4304cf017a08cbca02be556b85271628476118ffd40daf34689b83d81c5717c0063f58db110638dffa7efe55a1b9a55e20d9a0d5b34ddda9cc8fb15cd3810480f41b5fabcb599a20009b1ce3a049e2ad87dcfa51ce6370fe5c1226e31d20f2f934f172b18dba8f05bd60459f79ab6840063eccba44b06ac7a104cc175cff079e7ddc767de7c18945406ae521e14ab5093ddc4ed618175e2002012000470048020120004d004e0201200049004a020120004b004c009b1ce3a049e29d0ba13ce0ff1c238995eb190ba015690a4e7399ed6e123e3fd67994431efe29c0062568fafb332d518743ced0ce2f84909844c1b90f000a3ec96c66896d5a2ef71c3cfab5f2125fa0009b1ce3a049e2a647e76f279863fd368286343be55f99773cecb94fbc36528531a8da8f46f4d00006050569b83344b4a6303ed5565e9878c5b727902d93cdac1a9c9c3531c56a42db05aaabb7a25220009b1ce3a049e29979fd88d016226b2458eeefd40ae09d63553750837d2dbd5b10fdfc333dba7ec00605028c942eefe325a469419b77eb341c7cb49b14545c1ee06df4301a0ac566bdda425e82e883a0009b1ce3a049e29f2377621d93900f14fc2f0d7acb4655e04614553e32aa642f1e95690ff7746e400605023c25dd04c83b4199504264abb17d1db2b27514b626c70d308431230755e346d1aa0a902220020120004f005002012000510052009b1ce3a049e2a49763987d1545bf3157cd1a10edbfdb8c79b4428e63b8591b4b0b86649e4f72c006047f60bd66fb6b820f19876b593dcd332fd692fb7ce62f133d69afd1538ddaed2d10df2ed32720009b1ce3a049e2b1bf388cb5de96d6ad61c7c3df51ca4e6c054b0d405be8518458f2f458a23cb04006047f60b02a14f52accf8f07d56050efd8fb3e0ac9ada86b58d4526bf3694237f3d4f77bd27a860009b1ce3a049e2af027b902f015aff007a0ef9d4002c9d2861e11c1e6d6eb47a7be218908ca1150005c3d704deb320b18e28452aad9bd641f98e55d7744039595724c1ae5286a6a26ac2917414715c20009b1ce3a049e2a7a2a5197645bf694e0775604e12f5dd6d2e89bc3af62866cc0b6bb5d7219b8a8005c3ad0824fe4905e0cfa335d13c8bdc2cb6c84c534419d6a4a0d1d2427f5f7c6b3d52e5377ffae0020120005500560201200063006402012000570058020120005d005e0201200059005a020120005b005c009b1ce3a049e2aeb63c4bd36e768626287b9cddfaafa337c62fb9f89d74ecd67210a9b2b0273e0005c39e1588f0f4fe141a8cd5031943574478d98f63ac3454492ad47adb30c1b3531c8cc349a7ad20009b1ce3a049e2afa59b55fc9ba5d606331cf8665fdc52e2d4f924b29fff2fd40db42751a0d1604005c2b424c59a0e0a73ab24af4170e8a646f6faf62520a9e70ae02f66a8faa8d739ef087bfc7e5ea0009b1ce3a049e2a50a1b14e4c51539c0c63da7493a8bbb61dbad98633e5ab1edb9beea744b311c0005c2b4249f0258c27b0096de4bc955d34d0aec0615701d8a028e921f17a53bb9348a002f13d86fe0009b1ce3a049e291c14224828bf8549314f8daad6a029d9a8c41c356b810d01c5d72563b79b33f8005c2aedb140ef90bbd302453127d952ee1de2b6eb1b4d3effa98ee8a6a66d2d1cf34f60a8adf4ee0020120005f006002012000610062009b1ce3a049e2aa6d659394fc2d9012c0e31e700fd2539f29fce42b9f6512e83a4d88a5cf23528005c235e8312c548dcdb94b5329e0ff38fb4327c57407542d0bcf751c201644c0ec7eb9dfc76c84a0009b1ce3a049e2b375c6dd93c25fbbbbc0627073fa918859f8e7c7ab2f932f0d1dc74b8f9977930005c234da652545678b4f2d833b5dfc6c48d222ade39fa4a96bc874e62b16ade02c50ac553929e920009b1ce3a049e2a74eb1fc34adf9d536fe60e73e43a107bf9ce538da1d60ae7ca270e1c9bcffc64005c234da5f1e8108491234782701a48ea4a5a886cf15f978781699d77e4c3f6bf2ea201b3ebab5a0009b1ce3a049e299efb8ee370812705cae734dab82254186e2cb5d409fc9e1e1094835ebbd77e6c005c22d4cf95d41d8a899164b1822d2e39dac978d93383eb78d0354004ae047083bd1275fa5323b6002012000650066020120006b006c020120006700680201200069006a009b1ce3a049e28816710fe00619ce48a25589d6918f956a933fefa0618505625fb4dfc12e30458005c22d4cf760f3e354621106c08ebc3e44c338088f0c135efbbc18605d7ddfab414ab0b88c4806e0009b1ce3a049e2bc9756113236b1365ab0bccaa7872d515e20f8926d5bbba6b124b10a7ee0e8930005c2274d78fd1024ccb3c8c877acf99513bd653d35def60e18fae62414b0b3be77073c36abc72760009b1ce3a049e2a7ffee64160d854d23aeba05b9abfb3ecd4a4d8977805198b71f1c0c3ccf8df28005a79b2646a1c6a778e76b5162b3acd0d538d0ce14f1f870abc0d7b4516106d364582e1e4bb31060009b1ce3a049e28ce32551a2549f63fc8174a24b1827d0258d9b45ae29787f1f0071dc0c668bfdc005a7984c89d8298df8da74fd965e4d1bb896131555669d612c644f8e8e2d51b91521ccc12a575d20020120006d006e020120006f0070009b1ce3a049e2934adc9685cbc995fc4cee34d3ec7165f46bdf0f3a5ab5513a1f004f60b72ff80005a5c44e2d1652c7d38e728dd85d6c10021deded0962c65c77f742201cf5e27d2382e3cd525f31a0009b1ce3a049e294abb4297e7c46c87434eefdb8083007a9821cd841055a02300ad07a18c3a69780059f111807cef46c585c80807a816a6d3ac84a149a069ede2c4aebb370439d8419e8e05c7dddfae0009b1ce3a049e2b9e02f19bbadc8bd39f1420a5099a280fb0f65d76e9d895ebe59605ddabdd76bc005906623694821e53e530f138dc23034ab3a93aa105beba7f3adfc8fac6756c6a41d3b17ec8c0520009b1ce3a049e2852218e042b7688af182801a48de790a6a5ff8a753b70894752c365f5c01f8c4c005889c0ea1cc63bc8f78839e5db3ad4221bd66f6d6180cf1184d5d96583bf2ed103649493e1168200201200073007402012000910092020120007500760201200083008402012000770078020120007d007e0201200079007a020120007b007c009b1ce3a049e2b67972fc0b9239a4ff95f0c2fb5eacd4448c3e4fc614bff64c0933fae65323e3400583677ff2cb56e4b8c2ebccf36bbbb976ebbcbeb7953d5946c815783d21c88131d32e40692dd220009b1ce3a049e28edd4d19fc55282c3de7c0d9686ddbfb9200d36eb1884f1ed7b458351cd80355400582b0d7b7dd1fb07c0bf6f11a135ee1c6c851d45a7348cb431f9172132ee32466b138b1525fa660009b1ce3a049e2b57f6552b17853f67d5615da956bd13755a03ef0ed30a02bde03fc2e1b71620fc00582511373ce0167a33cc15c7eb18478d558617106c49971e53fb44cefdcfd01def54676324c8aa0009b1ce3a049e296731a10201d25e380c2c19b989831b8eb748ac043da61f558aad0d451a38e6e00058015a6b99bf2dd6c2dc87c6cfb33d88ffd3b1f2f220f90092ee20f25a0cf94490b56b50cfee220020120007f008002012000810082009b1ce3a049e2bed73d7453e39f5e1583f570d95c22193c985b14ea3c5019cb1e7dbebca2aaefc0057fcfafbc5938f14cb33c7d6fe094c752529ee15ce9a43482d7e9cf6f76583ef338760706c84e20009b1ce3a049e296fd33494a5f2c3ff8a8367394f007fd48ef974df9f1b50bf205ea7635aacf22c0057f6f8b4e8ace27ecc28b733ac93e707cf11ab01189010d43e05211703894bac9a0f9f6b7e9d9e0009b1ce3a049e2930b5181bbb7095f21bdc0c6485758daa5be4eca783e91939866c8ec4bbeaa2740057e3cb97a4c9a5a3325d669b08511eda154caf8e2a894674119b58682a68c27e24f20ccdeb07660009b1ce3a049e2a31dd5d4345f15164ee373d667d615c2ec66f037f171330f5c68a5f09c4547c9c0057c5060febacad3fc4158940c46108797153c2e535b84c6d4fdf70f945f866d2bb19774a38d57e002012000850086020120008b008c020120008700880201200089008a009b1ce3a049e2a7f2e828ea9dc08b23a611e3d0d6ba6eb8fc1d1daad333a3de9ccbf8849aae79c0057a0cd353c588818dfd4152ff370f50ab0a7de08ede0cd56d266a28868d87b6099a40a45353c6e0009b1ce3a049e2b6a1c71e7770b457e3be2226ba4f6071fe71c803bfb0d7173587ece6fd3fd7c60005628f76c0349c688373683b06a1fcb1f2e01f2e650b9cd6f64e5df8e5826b646f4a4e8028df2ce0009b1ce3a049e28455c831e2e12da7b1c31ffe15be024af6885bcdd6f328ba88093850e7eefc8000056286382279e193cb7269341296477bfe73faa48d3b782a9d242932658b1fbc0dd9da4dd8eaf6a0009b1ce3a049e29e1a988a21a858a794e13cd335b1d91163afa1a580f2e24b146ce5bdd554423c80055ad4715d15e284c02af186d0d951f649d9091d98f7646afa8e1336f3c97523262947a2f7f66260020120008d008e020120008f0090009b1ce3a049e28eff9dc98bcca986285d7f1d4a936cd978c183c7c3252c7907455e59b8337986c0055890ee08e73cacb7250bf2fc6c9bc6f91dfb5151f1354900de181ddc4e471069af8c40c7d2c3a0009b1ce3a049e281c3f436f15ae96223c668bf80c5b5443fd3e21e892a70a6391c53e7353b13270005577da05cd46e2b0650a4773c4cb96e0d7674437b0084f8dbcdde8a5a06da4f55381027ee840760009b1ce3a049e2b36dc890805f1802c92fc0987f470b3ffd5192d4d30296895a2dc93b60bdfbca4005537e032dec8db6b90d0b43e4f4e2004fa75686da2228a063f2c36015dae01b3aba01233956c960009b1ce3a049e2975be864957588751091768d390ae4a07d7c46478e4b38b7e53ed6a44e5a703c400551c1e8dc9d1c1ee4b71ea37c53a39d78c22a7d5444337bcab1ea092bffc9f7bb7550d0fa929fe00201200093009402012000a100a202012000950096020120009b009c020120009700980201200099009a009b1ce3a049e2b0346f0de50db4fd37ab79ea4b4c5e6ae1d0e7f1feae170d03caeb211798a68340054c29105db04db6f9bd85d5b0016f6d5dfa99d23eb5ac4b1575af05db1dedd6a9a39f171313fc60009b1ce3a049e2b580c22cfe082ec83c1be2d72b22ce1e6c0a3d7cc2f0a4753feeff3aeef1f1d7c0054a7508c28dd80b2b2f620d8add53a175a14d651ce70897b905fa513c6c747fd62077c0ac132ae0009b1ce3a049e29347ab35477a47f7f8d89b748136042c53333a55ef4fd7f9e909921a1379c1e680054a7249fd226ab96ff9b8ad8c438eafc451fd474a77e974b1bfa3e3a53a5d549c84f365471a24e0009b1ce3a049e2b5f65f5ecc7b3ad10ec118be796b73d7086744c7972c232a2987dd2d78ad25dcc0054a0224ce8a94ae4e016f51815d3338ab8c29e0bd03890feab9e861f0fcb68ed8353d02b6b02460020120009d009e020120009f00a0009b1ce3a049e2ace7c02a719bc53e9f5ff390a5ee9a071511021859848eab28c0d21a2e3280ff800536051d6236cdbf95778029be79b4a96dfd0a7896c2f1b2303e461971d9ebea30943f4cbcbe40a0009b1ce3a049e28ac731301b57f9b6ce68f06d7455ce1a95cb5961bb9a1a664dc5d2816c7f104f000535b189af6ed72b045d350f2fc365eba43228e9c2f627dcd81169daab5f647006d9446a31d92760009b1ce3a049e28d7177f8f1ac62337769db2214fb6cdfff206adb97c04ef238ed42a7706fe46d80051cc3f5e78b61e8cfae9a113091b84c87afe09d9300d3b4a590b6e84e8bbfa27c08ca0ddebb6720009b1ce3a049e2ac05eac9302249fe064e5bb36126ca13f4ee6839a8c2a6413ca17e73834892fd80051b40a43f263243f8cc27a8677a5cd20d3e4b33240b9090ce216aff62f9818253029087709a50e002012000a300a402012000a900aa02012000a500a602012000a700a8009b1ce3a049e297a443f2149a052d59e1deb58d15f8a829224b767997e16dde5a044a5dd145ac80051b40a43f263242806043d2b147ad74636168f92c3439e9c855a7a62f1edc90ecb5decb849142a0009b1ce3a049e29b78ccd18a82161801d9616cb47d73c2e6d5b9af031ffda47ec3e38e4333723940051b40a43f263254004c7e2ba9f771c433eeaa2d643fd9385e196be675dab46443bddacb48dc51a0009b1ce3a049e2bd76a1241567c04581d274f884d5b7b279a4fb84e945e6768b60f743c09a8f9900051b403bdfd905207ca8ba58d1cd91d0a583a768112d51295d4efd9fe99259f0d4da5a3d6c3512a0009b1ce3a049e2be36664d9f074ef477ddce21705c91cd5f24cecd3704df3ea858b31daa8f5c8500051b403bdfd905382ef75f5d980998f3d6f972187346e03cc2cc1a6207322ad4c3bb3e94fc59cf6002012000ab00ac02012000ad00ae009b1ce3a049e2b18e3ffae8d1d12d1619efcf2295ff404ec7362fb9e74e1223b989c764e29a0700051b403bdfd90525e3286571c2422c4c6e8c4eab4ac0b8fcef57950bd2d5c7e041adbc16bc3697a0009b1ce3a049e28dfe855960b5892f8fcb7b2f940b5b09d66082faf5e1c901dfa0475a2cc9bcd880051b403bdfd90523be3bbc78d2197d05ff4cbb3ce4e02c3dc30c10ba97af39b20d40c2f11c356e20009b1ce3a049e28c77d1757302f3a270e5a3091dc7d638b57dd6663b01cb2d57a1662d95889bf2c0051b403bdfd90523f4b3e58ec64113979c30d1ba4b20a7ee74eb230dfa20b9049a81f585807151a0009b1ce3a049e299e8283be9c0baea02e7b042739da6a4a1260dfa93f33992c47d516a1cd0db6b40051b403bdfd9053c701fae1858c4ddc2e68a82e1e2bf6972164dbf247bc6b4dcfbd95f9edf7b99e002012000b100b202012000cf00d002012000b300b402012000c100c202012000b500b602012000bb00bc02012000b700b802012000b900ba009b1ce3a049e2a78c62d303e0eebd6ec74e854c0f9c2abebf544bffda6d7935814fa90a53057740051b403bdfd9053fef90ec059adf8005d61f1527de5a0e1b1d3ee63d607634c4d36ad2ebe63fd260009b1ce3a049e280af249743c4382a3f7125e0dbdb455fd48724f472d76d53a31b9e4fee724df840051b403bdfd90538a07b9eedba60c4a5720f4404eb2319d594ac01fcc097cb92bac153c0bc469be0009b1ce3a049e281ba8694957ca2e3d78eea40c13609eb100f88bb7347da92c87baf1bc1141ca000051b403bdfd905122fa60d66c60bc073efe50fadd0ddcc561272f2a7df8203747af16f19049a3da0009b1ce3a049e2a0f1179debf7ef95258fd8517af9e5c7c1b291a62b37f0d2d0d604e6efaa35d200051b403bdfd90522f24c67e44f32e9a475a7db1d8c9cf54de8f7da6e0411a2d76444feac8c67ae6002012000bd00be02012000bf00c0009b1ce3a049e29a75cad3cc81aa2e56c60199f3740635749262b991cddb224cb0fde00a4cd87000051b403bdfd90539b58444067d863896f5380ced22d5540b1c05fb6b2cee78bb6397b07e43d2c3a0009b1ce3a049e28f11e95972efb5c137be0222a8690db86d61023f5d228cc829da19510238673b80051b403bdfd905165ddff0dc24e96654a4397e037cdf84df73c7bf80088d8a4afcce8aef254ce360009b1ce3a049e29ec4146195a7451b33ef5c9b541ecc4f735ed366ab1994a56cd5a2d0beebd93180051b403bdfd9053c5edb843dffcbc92f656b36931a259a696ff945ea938b63ccb9230131b8de0c60009b1ce3a049e2a3398ccf058a2250516dc40eb13d0d06f6946d55d55115db8f1b05627ba2b54840050386aa25de5ef2b91def8b3e3c77a66db288991637f705e981aef30a18455d634d26513930cce002012000c300c402012000c900ca02012000c500c602012000c700c8009b1ce3a049e28c21d203c3b1fe2e1d5b8138faebc95cce65a69efd10ab254a256241853c828ec0050175df4fdd1e1cedd6eb17b65e5f17f4dc0adaa102c83f8c64aa3000dc42d836bff6ded8e1a160009b1ce3a049e296923cd22eff2babae8221c96450829b2fa5675cf948d05213b4e45b60a4679d0004ec4f8f8c5c090c243e0ab84c6ce8324939e1888aea6363bc3b081d6ad18eca492fb89a8125c9a0009b1ce3a049e2aedc6f4477134ac5d4f9d44297fed38953947169a3f1d32f8f5bec1b5b3f84924004ebfc639adc22b8b972b6a9871b613e1a8d863525ba82f6631e7b71e5abe6256e0bee0f2d99ae60009b1ce3a049e29277ffb74b17f2c2b058893858da3660825bbacf8346e45a39802ae11777eee5c004ebfc639adc229e07ef68daa54c13e081ad58d7d53812e9544b3ebfdde0940e36ee1414531ba6a002012000cb00cc02012000cd00ce009b1ce3a049e2abb474796f35ed9bee48d48547b7c5ec38e5b55c7ca2486e90051a193cae0a740004e8771506a218d9867e1d8c71f6175a5ea27ba5cfc9e1d27e6234e65fd7306a363e0a1de3c51120009b1ce3a049e288b8111575b2628a54acb9c5ad369799e083848d70f368855247b6c509b764e54004be34eb4ee909906a492cb59bef4c9ab52def25e140442bbe9f26e63e71ae787a9a7fbfa1aa8860009b1ce3a049e2af67a6229fd47b94357e97057aa00718ecd836bbb22ccd3f7b53b324732543a58004b99b7a2a4543faf9675e686c90fe2a02290d434d32e987beb21ecda88dc46dbbec0f2537f5e0e0009b1ce3a049e296986695e37e8a817aebad61ed2f1097a36ea1f21bc6ba56e181248ec5110f7cc004b4a2a15050c5f6802d2ba64eec84cad5b03ab06554b3f0e1e57ac20967e14ebc37106f31153ae002012000d100d202012000df00e002012000d300d402012000d900da02012000d500d602012000d700d8009b1ce3a049e2be2374eaee11c0ef37b28f335c35afd3cb747e430441ec33e51ceb33513af6fc8004aa71bb2637a4d8ada53fbe1b8204016a111b642c5c10b6efb15a9157ee01f73d1fc76ce6f42b20009b1ce3a049e29435a3117881a48c2e710736c2820f8ef7a7e56ca36a2fdf6a535679ce32e4154004aa71bb2637a4eb823314e26d653a3dce059977a0c83c970a98befcf5e75c937aa9db29d67feaa0009b1ce3a049e2ba88e32eae65f4bc90e177e8222dd3ce56f0f6bd3424049ebb57801c2e59e1e60004aa71bb2637a4f0e08c7ddf1bfc3c18fc59d5a8c49b262d4a98de685d888117d87e80e3688c12e0009b1ce3a049e2929582154f053093b02c97dea1f81124f3c4816173588a472fd4c7ac26f4142fc004aa71bb2637a4c264b4a58989a560db1e2b784ec64a2cd7f1e31f707785189844a455aa2f019da002012000db00dc02012000dd00de009b1ce3a049e2942c13a1a6c0369d96b314ee87d9f32b78d4b24606b570e8330c1461b7005aae4004aa71bb2637a4c200da27d131557afb6ca1c7542ed43c867320507d68f6595dd01e0bb32c471ae0009b1ce3a049e2bc1cfcdf4c86bf0297a5eb3560ce8dbf69013a3a4baf557d9917af5d316f66aec004aa71bb2637a4e22d3e8b9e0208c7324c00eaf69b7ea62df5ba4fa59714f465dee6a87953d8c420009b1ce3a049e2b88d31a7e297dd8e2981c27cb94600407d50fc44e9b1db850f74d9c3fb8b1f358004aa71bb2637a4c9b866bb0a015a1b9cb4a04259e75c2854e14017f653f3e42e34e3e2f87ebeb1e0009b1ce3a049e28b2d1d140dec63f6aa08fd705fd5dc2bb848de2206bc1b9b1a075b5287b9398b4004aa71bb2637a4ebc819c25d36ea49ec9b99cfdd3cfaf91d642ba9dc94ff8273ef4a7b4fd169022002012000e100e202012000e700e802012000e300e402012000e500e6009b1ce3a049e28eb4ec1cabc1b6b8cdceb9ca490cc6e02604ba54b9fc0d80a50bb5557504a45f8004aa71bb2637a4ffec45c828ddfd9fc9b3f6fcc0b358d37753667ccb44a8a5af094e0c9c6ec36060009b1ce3a049e2a8eb0759a8e1d401a575f009ee458fa0f7105c2c6b808f4eb883dcc3e2040e6b0004aa71bb2637a4cc9ba8487cda2ccc88d92c89a7c1459c7585459e44f942bb38fcf192199fbfba20009b1ce3a049e29f836ef5fa9559791cc887a5552f44acd627f628ed72d3da5452439ab8ba7f684004aa71bb2637a4dba3eccda1a1a67603cc4de6a8b3de4f6f42c68b481bb25667ad0f2a4882697e20009b1ce3a049e287bfa59bc8d74db020ff953c51b31f8b2118997ce13ea522577e3a0d4170ac3a4004aa71bb2637a4c82336dc9226ff3651616ad7d83224c1c7bfdfc647001283ccfeabb8a38e52612002012000e900ea02012000eb00ec009b1ce3a049e2ad6f51d9088891338f5657023736a8f342f955f52f29ba359d1d1a17a3839f474004aa71bb2637a4cc9c22d344f11ca4eb99dd0fbb543fc11dfb1e86e3206669bb76df787e1f02bbe0009b1ce3a049e29a81248fab4eb600e045a8e8ab3a3ac9e8fb34754087ea70f9988c8a1eaf91f48004aa71bb2637a4f32f2c478c701e91245aa3d88dd55817e44c73d0c42da9f2e84161d79c27c223a0009b1ce3a049e2bd8d0cbee6f742bbdc2f35b4122097ce20042ff71e8e1a819c9f78838f0157de0004aa71bb2637a4d2e07107e20b6685a7c898dec3007a9785808ed41d747c0d75078d63b7c76d0e60009b1ce3a049e2bada6a7305d1bf4b3dc69c4a8c5edcc8061d2f229839c50f37b9e9d46efb68fb0004aa71bb2637a4c51e74a504d562876807e239c6cb607461d858c47336791a1bbfa84f396435396002012000ef00f0020120010d010e02012000f100f202012000ff010002012000f300f402012000f900fa02012000f500f602012000f700f8009b1ce3a049e28098d05c17f4d5d4254db980b71c933f9668b69f8cf63d9d110f61d899a9c4bc8004aa71bb2637a4e158086f70a6e1366c4ddf33f82641fe760fed5c84a92fe68da8a3967be66b7760009b1ce3a049e28211245b36d55557826d0283e1b85a9c498171e456769d9dfbc4dbc6bc2d99878004aa71bb2637a4d6680c6a2a94f3515ee812cc8865a8cfb40ae24128c0f68230d7f03c9055c1dae0009b1ce3a049e28b65ed7add917a4fb7503c989defa1704e6ccf0b728347dc5e7cf0ca8323e3130004aa71bb2637a4e2a10b37bcb1ec1baed930bf99ce1842d6380c306b80fcb5ff2971f5fbaf3cd3e0009b1ce3a049e2bc22f6035ae050f08e5cf91e5659e80fefbd01a4f5ec39a33d36e48692cc1c2bc004aa71bb2637a4c940fa67fc37c020ba8a5ce7e7a9e40073034f2005e95432538a8f9d72a496b0e002012000fb00fc02012000fd00fe009b1ce3a049e282c6c1eb1ef40861ed0625b41f14828f6a270bc8cf840cdf1266b691b2f7ee9bc004a7a739e622907909342cba491b08507f8a25ba54c409ba6d10cf7b9cb58a3eaf5e464fd7bfe5e0009b1ce3a049e293aa6e0fa39af4e157079e1a1beb9457ec31f8a5eac1c5be4b91428ee7d61953c004a7a739e61ed7860dd58645d6b8d97fe4ba07286e084488fabb602c0872b5e57c6705ed9de64020009b1ce3a049e280020e7904915895dd148023df8303c0ad4d77450d10080b56094a188cb60c054004a7a739e61d9a81bed0b68ff4bf4108f22687b94f94b3a45c56a98c5a293986b062a2c72c4da460009b1ce3a049e29a7a90188d039c34db5e4a2bce4b221787eeb72fd2ce7c2e14f39a6f6ad3f52c0004a7a739e61cfb4bf783a061684fbe1608e701ea2c6f13371cf276862016b349ebc1150977c0536002012001010102020120010701080201200103010402012001050106009b1ce3a049e28a88395a706809dda5591719f1a1d4ff53f528d5982c3ebf195646256364e95f0004a7a739d5554e28ea011dc72f54b87e8b43c94a59c6d499c19394fa56f6d0df127a393d11b77da0009b1ce3a049e299921210ac517b5df1425cb7f7585a4692451b55afa785b3cac0632754ea23790004a7780ef86e41ca9cd2bf686dbe7ba6d440aaaf67f9be34e0b3d990749e7e700949d420578a8a60009b1ce3a049e28b08912b0a1a389c9ebb723fd8cd8b5cfec2ea9a570f188d8eb7b62b74148c74c004a3eeda391857424f830979f1ba394187d506e3dd3568fed7c2f320e5760c540b5393b590983f20009b1ce3a049e280fe57ff70f6296e4ae5683dc75436e8cbacc4f1d5995ab23dab9cd15d8edfc10004a3418582151bc23fef9cf49149b2e2a3fd7dec7dda3a1f0d120cdd262f6ced9b72be999785cb600201200109010a020120010b010c009b1ce3a049e2b24445019a5008759a7635a828be3efb54b17484efbb996aada974d8991a3fe68004a0a9704d2a7a864170278680894f6ea68ca69ed38d7c8004d9acc66269c52dcba495130bf58960009b1ce3a049e2b20c2d20d8601d10144a649cb57f57dc53198f9bafd248101d9e4dedad7e8f14c0049d60c3719f120424f5e283adc3e8da52c90a2dcbd07e311c826dbc4b63dd81990fb6cb7309bc60009b1ce3a049e2adb4d93dc864cbf7ce14408066274cd5de31c6b33735e5f5128d9de67108613e00049acba135fc6a2c0b948f616efdbdce362a389bdc2ff7c1596075ae4b69a6092b2a7535ff8c2360009b1ce3a049e29b0a7adb2f0f4abcb463eb4bde527c27577153f0551ee7a3d26bf8752c848b6480049857ec4bd3686dcc150c16fe0897241e80f4413339d2e0415efaa02a2c352173263a0a0b3e2760020120010f0110020120011d011e02012001110112020120011701180201200113011402012001150116009b1ce3a049e29c31e78e8ba590773032168ffe7fe919286fb58e6f37a009cef3843f18cb99f0000497a4c3243afcd60b8a7b21c57d27f0931e8e6cfdb7ddd6b4e5f2799f7d8ccab31d578cc667e420009b1ce3a049e2a346292db016c7c713f7b592c257480dda8660237f8086dd04a8437895dbbf9f80049755d8d235055559766f814cee12945ec3c4a16cd5fe28b8aa917aabc059569c0591e5ab8eee60009b1ce3a049e2af74bc21c13aea9440355aa4bfdf478f98f168e75609793b547f66a14729af908004878f10a8d180a9fe01ee4c98aa31c42d62389794ddae1692e08d60154e0b6a8674d7a46cfd6160009b1ce3a049e299bc23ea2203bf1cb171b3e347bb28e8db8037a71433071a61ec069da1923c19000484dea218ffb9ea3ea0c15b74bf9ca563a8cecb1faec9acdb620557a084a7c862e19df048f83ea00201200119011a020120011b011c009b1ce3a049e2b705b6a1f2c6f7b677ccfb9c1140f6ad6b051ebf17ad4118fd9c799e7b15cb6e40047cee5af801bdac7839a36d9c3a50549fe17f50cbb02e554a4b2c1d257004b4c9f707134a7c6e20009b1ce3a049e2ad7cc9a6e986fd9fd659860f2c2d9b5294e138993aaf77e53354421bcb20b89c40047aaa9b0228175e6d4bd93473ad1dc6b84176e07c834f1a1e10e2595739841ad9724a93503e1560009b1ce3a049e2ac8225185c6f66cd2cfd7b23f6b949be526d9726dde45d442a75b4d9d6a450ccc00476043fd8bd5805fa55f0aa07f8a913949529f844a6d4575c26fe919a23051ac8ba288dadf10e20009b1ce3a049e29340ec2a0a0ece1a49333efe08b311c6f55ea9da8190d27c7030fe4fb4d38a1fc004754f06f86bbe5528e1f2a08f6c977deb5e1ba1eabecda6ce4b2ee114eb8f678ca2918f77b615e0020120011f0120020120012501260201200121012202012001230124009b1ce3a049e298a8098864da24e606503ff28fa88f60e1c57ed80b4e82d4af67891e07f8fd3dc004754b9bdda9a22495ebb678b36f86245c959728e2166f3600d364b3843284667a297061efb9b060009b1ce3a049e281f7172c2fab41d3878234a3abe0cb18dd373b4b0cf1ad1b1978a79f6dbc5d94c0047525ecfa166fa923f7fbb1c77f24be5deabda8e6b8930675d0751aa2d8335dc8d710cb929842e0009b1ce3a049e2925a942ea5735506e600f3a635d77efab585d6b85e02f9fbde5d377613469fec4004751a04ec215c295ae334a41002a3acb6bd81cee5ef4258f7c1003c7d2f7f4c3b9b385c711968e0009b1ce3a049e2bdc8d1719a0e2f0a66e96193a8b1f25bae8f8e7f8dfa86300e6c551b1b8d1102400470634c114bc83ce1db1c705c494511a33bffd387a79d10f195d0ba82653325f88a7d52b8ee7260020120012701280201200129012a009b1ce3a049e2a785e148cce8ba32b6caa57bc0765527572dabfbbd578f890a003cf5cff8143e40047024668d7698a8b43081357b4885f7d6a67a762a88101e31026031cf6ec6bc1fe92976035cd8a0009b1ce3a049e28ca3887b551e63f4763d34abe0ebef3e28e187f20046f77f2f2804d3f7e0dc6180046e16231077efcd3a5c152504a1ce49bbd0c5f022169be07c1f530da7255c17855a8bd810dde7e0009b1ce3a049e2a5a799b6fd3c4742a405c1c2b532759546e36a12298fb616a966501fff2a57d6800468079c103ace59a28a87acfaff5de1c222cf4af07dc11e8e3fa4aadef5dab7ce01c114e5b9f6a0009b1ce3a049e2a39ed24243d616a5260395c575474392ad44814ba97337cf578260632a6ca31200046085bcb9381d525ea341585947baa0194b1406662fccc2693dd8932211203a1326a59f50ce64a0020120012d012e020120014b014c020120012f0130020120013d013e02012001310132020120013701380201200133013402012001350136009b1ce3a049e28502a5f6ec5b9bfe38434b658b767bb757690a2714d94a604ab4882d5a1df08300046085bcb27988798c7b95f42a89c2a5ed53d6ae8dc665a1ae424ef1e961bac85be227ae5dfce5e0009b1ce3a049e2a4b7e66da3b41673a743a00d3d6c8451f92cc7ce1c6e6634da81c27f8cb6a00980046085bcad96bcee53147ee1c9a4d4900c0c292df9fee569b02e0554c91ea3774f861af81fc3c960009b1ce3a049e297b6f408b9dcf14159c1b836382b32b292fb558259245cff6a8f07553b8a042740046085bcaa8054ed16d52d1d34af75b70c1a1c7363abfc373cf7fbf3229cc8be80276825670bff20009b1ce3a049e28880c3f339b846b28b3eff3d7bab0582e19c2418d0c44df2de299238c55f66fc40046027f6cca21cf23623fe37a6a77b0547345396708c9363518d18af94528b92014a6d7950fe9b200201200139013a020120013b013c009b1ce3a049e28e559da93c6a34c2000538b5c88b4cd966de685465e16d27891e72e3e0dc7c94c0046027f67fb7f8e8dec11592e433234901611fce32fadd47e24f7536ac942b81c5ef7c26d979dae0009b1ce3a049e2b14eae36c59069498c775fabe93cc8f9dd61eb4376506c1958f5c14050ab4f9240045ad10309eae2fd9b69681f6a2d635073aeaad83c2107fde9639331762bbdc489662d80881fa460009b1ce3a049e2a3363ceba2bc90c42c98bf1245c8145384d901310e244981d7ccae333b6dd3c980045ad10309eae2fb08339ae393d96b9a5c519258e1c62c12c65bd32222ad5c45d8f201fa7c8d29e0009b1ce3a049e29e4884548da1994680c26abefdbb126a04c49e9be69ed59b643b310bad7cc8bb8004584703bd874a5d1dac2c9fa11b7233fb8fed809b60b2242e804da5c370c791909130c6f635d1a0020120013f0140020120014501460201200141014202012001430144009b1ce3a049e288fd4db448421419fe3bce5f0b37e4d722956f8654100e1a4580188102da54aac0044c17cd76036c62bae4ce9ca3b27c4b57c5bfd4c91ed11f604df3803cf0beddb4437b63c7ccfb60009b1ce3a049e284bdb5d80c5ab6256a59a06a7dcebdb7c206a3a7b59a891fe5594e3f0f73ab184004482a285bf62f9a13f11ff3180a7b3dd16e833c3a411c9cd17c8859c0c288098c80fa80b47b67a0009b1ce3a049e288c03f17d25488a2d183f3f34b69741d955f683cb828dcf2b29b1a12cc14a763c00447179c305b2e8848cc771bbc8361d86f381187db7bb35f83fe8ad8241d33b8c2c9acaf59723b60009b1ce3a049e2987ad2fb79e206f32e138dd88afb0a6baeef07f3e99ddfab70b42da96d74ba840004431a58bae754ca82e510b4d9f501503c4769c8f05cc7f25236f156f00aacdee9b7e06eb07ed820020120014701480201200149014a009b1ce3a049e2927c4c39de793313ce038e4c7b0096c8e2553fa76cdd9a76f604d421e4d9c73600044155413d48a0eb3ff15b5771e8aa82e713e2ff3943969629e0f64e0ddb68165d190c2557ce5b60009b1ce3a049e2898a9eeae26c730d3bd7daa2e9c5e42bac719ad2cc9030552eb9b9d7797da1388004389d227ae239c6095072f6eb127007e98b0c2c855151bac6b94c20700df1f544969a2a7f853460009b1ce3a049e2a10fee4a352e8da354a3d702862d748ae6de8baeadd3cc641af1523b514a7344c00430f4046dad9f3b41318996d6e8ce34927a5ab553a01ea365fc17998486465516d4fd420aa885a0009b1ce3a049e2a95c265972d7fee90509db48837a9d2a0131b36009357fd6c097fddf34db1f9a0004275c2e0255d2a220f165e4717e1f52cecafc84e487107c80ec6b4b65d993b9262347297dd74ae0020120014d014e020120015b015c020120014f0150020120015501560201200151015202012001530154009b1ce3a049e2b07b7564053b005a0a5f8703bfeac35d4643825b694efc542cc01a994eba521480041d70a78db27583943525f8161f8aec2fb535335fc2bbb1ab0b47681903cb447cca69824f1b9ce0009b1ce3a049e28760515967bd2d43ef7af5d9f1e85ac4c4527287212e66152afc3b9a3f989e3280041bd3018117d3c0be1e2bdb47318045ffe1bb6e79f6bdbd0bb5413fa37fc222bfbcdfee2e857a20009b1ce3a049e2a82a83667b928c30921cd939469d600cf30beb795602873ccebda1a76927d282000413e3698f7bb11caa4bcbf367d2792c146c8a9c357b1677ee671cb561a979e4aafd0a5aec21ab60009b1ce3a049e291742081213a1a37fe8b73d2ad1a62dfe4bdb89c945207a6c14ef286ac42227a000413e3698f6739fe6fb39fa18008021f69cf749ebd9830bafe10e67757265e392706ee3c38acd6e0020120015701580201200159015a009b1ce3a049e2836375a1e8cc46ff7aef134981881165060bc6a2341502d3c6fc09ab20234a17c00413e36978808729944ac68574578f8ed0bddfca72d4ff96126182d0aba84e1eec9c49d3719eaba0009b1ce3a049e28eea4e69ed76f71464e8c3bb785de0030d96992b040d800b24de75963438413a00040ee3a1ea9079c5d2496398d7959f433a2c366c5656ef64a8b1e04f32f4b49c4156665ec1a258a0009b1ce3a049e2ad6d628cea83794c7fb4010e5cdc4f4568a01b92c6e9b401ea334e6ae619ab3780040dc50435a1c203536dae1af1fc09513176aff7c79d638ee99ae975fd964bf942db7d0fb91b77a0009b1ce3a049e2b375dd6a7aad71ae621a316dc506575a6ec7e2c03133e49c2d95df326665f89780040c14d99a1336c48921455da5b253bf0a0373e940dab1f62c33db1b6c38e2c2509e90b18d6d8b60020120015d015e02012001630164020120015f016002012001610162009b1ce3a049e297f7fa34988c90b9f4c22befd9c3fef4df4b6833cd0f521f51f2ebffc89632300003f6d4e167cfce63a49af7f589fe5c368507b67a2fbbdf28486af9372c42a64f913017cd699bfa20009b1ce3a049e2adb1282a8d0b3ee5761c91ec81664eba8d07010a17ec6abc981cebef37c54ecf4003ef67ba7bd46d563dd94a980935e004b618f63008b1227557d464cc7cf26e705a8a109108c4efe0009b1ce3a049e28d9f36bbfcb4e5654f0283dbcc61b639c0b918fa3de5644d4693b094ca33999f4003ee84a320e9673a152ab83b747d20af6cae343449237c3b902628861aff74ba65a90133c0e489e0009b1ce3a049e29efafad36263a065325fe71dab789b440b9580be5780c3230a3e7570b9c4709c4003e64523229af9c3c44edb7d681a9eefb9ee72b66ec874c2dcdbbefef4f9cd0ec9131c6e32ba04200201200165016602012001670168009b1ce3a049e28fbc5a57c26efe893feb1f51a34a51708d48e936fb8e39444a9741ef08219c0cc003e40cb2e5440f3aaa83f00bd051fbb5536517bb5a916537bcc03e27a87a7ec0af1943fa239f3420009b1ce3a049e29f4b4a896bf2769f57e653ca2af4d799477b9b6b72427977dbe7848303bbc1468003d0e760be19f5f81055db64e196e3396ede7bea28437c1d49f6db06acff8689eb73b13ea3f53420009b1ce3a049e2aa277472e4e662a4208a42a8fedce7dad0e28f3d01a3a009d479957f748d8f6c8003ceaa8db389b3a763a6c36379ecbe3bd2c9d80028a02c67b03e5e663eb0a06339ab1fb7caecfa60009b1ce3a049e294f39aa016bd13272bed07aa6a5f174997370844e234a3d7dc6aad149cd3f8040003c0b1c3c3c0c88feac07f0e4bc11320a8da8b1b3a66462b53c494a4e14e76c238f26664fffe24e0020120016b016c0201200189018a020120016d016e020120017b017c020120016f0170020120017501760201200171017202012001730174009b1ce3a049e28b2ebde07b6c5f4e5fe7ddced01fb254fef2f4355396342912596dd79b8613504003bfd257c28c58230b8e5463bb6f4bae077e1956a261234d3f1df5317559c2c0cd5f4b8057f475e0009b1ce3a049e28ad5bbe79e2db635789044059392372d35b1b26e528fb5aa45aeebe1bf3b68904003bbf3bc7d8d5cdd347c45cc9b3c30a240a3994be6e75f39126d0d63cf6a853769ef998ca6d590a0009b1ce3a049e2b947daec5a741a38362a32f702ec92aaa13b4e460c42ed04cc5ea3855c51be71c003ad38c400b20389a0aba445a362a7aa7b5be60b52a9885315a3c192b5313e881d68322578e79a60009b1ce3a049e2802fcf3557ffa4a39cd74fbc3127e45cef95fed824bc53e954e0721f8426e0a44003ad38c400b203a6ba35a67d878b9ce8cd176458a2afbf5b8d642531b3f489a9fde93f24a1ec7120020120017701780201200179017a009b1ce3a049e2abbcaffa0c0ae715a8f451dd7ebc6c3fdf7afbe47d869b831634d0a40936fe774003a579b1465a05c7a27dbb19ba353b571991f65bffe5aed1f4760ec1b5e2ffb23dc9430e3a0be220009b1ce3a049e2aed71b54198a9165d28b7f3c5ecdeab21e2cbc0c25a7c99f5432eabb4131dd5b4003a3e4d79bfe450e5b6248ae957819c53195463dd7a29277835a5b27323db64cea1c0b8712907ae0009b1ce3a049e28058fb69baa6bed33e2d7725bb9aaeda22acfb7a9407d59bf9dcc2c4363c7d52c003a0c5bdf51d56d63653295d7a0ab3ffe70a8e39b431046c93e5a51976ec30f17c81151a28b62420009b1ce3a049e2a0bfda75c4e2ed887dff76724ffb961367aec5f6115f6feaed84c3dd7bf0b0c380039fe85bd06ac74303963b55830d2d2853361134b7618ab43528bbdaf687a69d26867141792ffca0020120017d017e02012001830184020120017f018002012001810182009b1ce3a049e29a52ca489b49dd312f1cf5013ccc795910fb6856ba3c7eed1ce0708a2e410f4200039883635bb2ae2648a634deee5132ed07cc454c7e774e25efa5b427d89aa80656253524aa9f8de0009b1ce3a049e2bef2d496f9c8cf45ae0996eb08ed484fc012e6503ad9f26588e612fe670088c3c00385f790bc384f51f36a9b75b9687f793dec216c606e3f7c6bd8abbe1afa40a288e30de2950ef1e0009b1ce3a049e2acbd67054c78a6353984da6917a62e5e1d2d48f30181ebf898c7cd818c3140fe800382a2c1776c2c5eb73d6117661e38f086a8631096061f73baa8ca5181082177fe773edeae06cd20009b1ce3a049e2bcfb763cab2d1fb83ed8c553568373e502f288e64f707fd3fed303516d6839a140037d78aec8ad8627242fbe7fc4774f4d3dab3613e7cafa7b079fa124a33a6fc90ca96baa69704c200201200185018602012001870188009b1ce3a049e2975606bd1cea98c10d69328ce9345dd9c8524afdca3eed6d217e34c6923de9a84003733919674720b751d7dee28e7a37b1e3572a62abd33af2ca3f86d1858a0cce6ff60bda6e3459e0009b1ce3a049e2889ceb11357304ba3256a9477b450d51a21e469903d16cb841ac5d2c21200a6f40036bed62559d1f306d5026994fa04e5b710b4e68c4429a9e705ce1a95c7c0813127b2a8fe381ea20009b1ce3a049e2b720a15bb85a06fe193ac265b6748c39892da32ad2083dac99f2c5de6b0241cdc00363d6819b2a2581894d7dd51f484773b9a020f2a4731cc0bea996959772f0026844aed6d0b459a0009b1ce3a049e281f5abd5e6d68c1584a5f60b0cf73924c3cdbddac6bf935a1e7a77f6492f99b9c0034b462491c49443117a1436555507b67b126b413f84b55c58482661f7a5e81105ba616ba26df720020120018b018c0201200199019a020120018d018e02012001930194020120018f019002012001910192009b1ce3a049e2bcd8874dc23ccaa2375ee8ad4da53bf94fec9a96d350ec2a20940e897eb5faf280034b2c751dc67de1ea43d67ab725691048a03b4a4b10be18c03fc4447238864ebfbe528e9afafa60009b1ce3a049e2bcb02785ec59a4a133f8a54b3700a9cf49ce0e246f81526be47382077e0b3a0f40034322a321ff321a023d9beb6ee16304988b5dc61e3ebc7d0911b35becc2bdf617c284de350d93e0009b1ce3a049e2b6af4cf852a40d61566af1fa4b986025880f442c3f9c4d2f37071007740916de80032f19f5a260a5fd812c697eae700ac388711e6f6732690f3232914d4ed8050d0c4a89e7aa035960009b1ce3a049e28add60c797ec3db48ebc7d59c88d83817251ab0c98da11e27c7506d1b6df4f17c0032b136fe8f3248932130f044374de6c5cbd9e723044aec3af3f77b18de54c9b9f7cf43290db89e00201200195019602012001970198009b1ce3a049e2a8a0b8dfdde8ebfb9e15301b7f4ac73ee24312dbf9299f741185825710b93150000324dbf3b3ab2b9660031191e56dde5e0ca9fac0a7adb0422ea50b5a77769ce6754124760a0c9320009b1ce3a049e29dbdd30197e6f6351c58b14713279acbc5c0749c6b47e2306b3eb7ad45595b7380031f51c4252f39d6d40d6f38e60cb6b302febdb408fcaa67fff8c3271a40929b1ea0274b2e730260009b1ce3a049e296f868299226dd45a381df09656ec614bcbe166c3b76ab32d3cfe8dabb62ce9ec0031c4baf4f0b5eff09a1ca5182f7a1832d9964fdae6786d148544642138d9c1d91c3660a3bca58e0009b1ce3a049e29f5994570c1f99dae799e67ec16a8221ef0d08f1cc29d6108c9fe7520a90ef90c003191c46c41b66a9d32e6213ac7ee6541c7691835955b5c383bf1e277aca1dba4825d8b8e5b09e20020120019b019c02012001a101a2020120019d019e020120019f01a0009b1ce3a049e2982fdf713320a063ed59afe1cff7cad79c8f7177aa7ae21198330fb7ae38ec55000307d6b97badd7ac196c5b1cb6bc04add46eb9eb075aa93d31826c69b548eff130b118aa1f09d260009b1ce3a049e28e05fccd03623a121766904b7f28e710bee9b086ea0ae3206ce02d31c60b1e0a8002ec848f2afbd17a48075ecd741d50fee154318dc3c16bda368046babcf4d0ae90619e10a3b27be0009b1ce3a049e2a9b84c208e9f470b322644a91cff4ae52d814b50721d65ca54ece82a8687b6920002e514e0bbc4c2a517e02c8ac346b58789397d3a6037f74656cd72e1ec4b6567992d58e07d98d9a0009b1ce3a049e2b1b93d0d9b5d8c9c84da7238058f9e864a072f7fd724a003dd11f5ee430b48310002d38e0bda8de54dbc32e7f98f5f18ddf0847960f69dc56903cb7924ff0bd4232512ea170108e66002012001a301a402012001a501a6009b1ce3a049e2a7aaeaf49bc972532e078c9398306ae0593771087c36e59c61f1470ca0421b20c002d322c6708e67f85c1cfdc020bd8aa220810902f1bb066557e3927968850f219267da0bed3d52e0009b1ce3a049e2a028340d1cab67bb0523b112568504b0c8f435eafeebb82dee30e3a6c8cb70130002cbdca62b63d8e9ea2d14b979198992f73ff458a40d76fe3157ee74c5a780e1d0cc1e93f3260520009b1ce3a049e286655d20848c65a33fc51d80afdcc89e7c8d54d34bad8f87777d43f80b0e10864002c46f88f94e6da56d776e804f4c2763599d0bf0b586833ba8e36c474f43238da2169b0746157620009b1ce3a049e2bd1ad6715595b82aea665417b6999d82c77b77c52008d1653041cc3de4a7bb9d8002c01fd9880b07b5d219533d6a9d383f0a19caf6dd415e9c444edf0a7739081733c5669a72c94ea002012001a901aa02012001c701c802012001ab01ac02012001b901ba02012001ad01ae02012001b301b402012001af01b002012001b101b2009b1ce3a049e29e73b7a46c7031f0934e28d89ae70ce54c11732d27ef6d5bd61206c30b34a1c18002be9d5dd5ee747e6f8d83ea8942b09d61d60366fc0fcdedb5415ac13f4d2cd690136d3d02d26ae0009b1ce3a049e2874afc9d74e2b1751491cbc522972eaf039f6ded4468ea4eeef766537e3e99eec002b4f26b57c9bc57a22a2bbc6f1a3b88e34d3ec3226408f6df3caff6d30785d07bd1501961a0d4a0009b1ce3a049e2bb667b967c133c4a5a824d66e7fc7f052332c10d6334aa7e7dd5c9ec0fe98fcf8002b482c0aa31011ee9c4e215c1203ad0f95cd8dc58bfbc667801c1ec68886d16573346915867b620009b1ce3a049e2b005366cdff1135d395043a889ec3313e99ef0e13714cb334d660895ef5d3c5bc002ac125840eed855805a66889fc09b433eb1cac810c5975500818e12c8e0ae0e3bdc0974768e9ea002012001b501b602012001b701b8009b1ce3a049e2aa384d9f838372fd76db85d08320fad5d0245da9254325fb6238da5c3c764d4a4002aacf21ad86d675302e6519d43cdfff5af212c987ba369df8c801054a5e11436f41e09cdf9b3660009b1ce3a049e2a8c820e84b3e15152afe5062d0b2c89067379304d638e2c95d46ec33cb8498a78002a63aef9b8b1c6d2dca6096524a35a32e685ba71cca426b0e3cf91c3269cd6eeb73671b7134e960009b1ce3a049e285c8df60d30d21d1abbaee6d9f3608d05d90ea898aaffa9036ed5b5a8cb0cc5e4002a06acd82af85629141b26bd203d751782e5ec505807ca9574e9c73296495de83d5b39b51523fa0009b1ce3a049e2bc588f6a8011be6d680e18a1dd1479da3fdded7ee8fe15233710f498a3a67d9cc0029f08e554e2cc73be7af211d13b1637d8ac7086c5f4ee0faa764f3d951943ee00ef5468c76617a002012001bb01bc02012001c101c202012001bd01be02012001bf01c0009b1ce3a049e2b740335a8b844c5c844a1520b60214586d4d2bd9563979f7e59fef6dddedbefe40029660183ffe6ec9e744c630804d331bc19d8ea9526071fb66743a527259298eb9b175e2c4a49de0009b1ce3a049e294805e93a3f3c089afa010e093f5fafb7e83df4dead8ae2eceafd25916d00ccd400292436b89c7403f0d9d05277ea1c26ab95ec012c57d5a12090749eb1ad9f3149bc6b670786cdd20009b1ce3a049e29fbc5a097d889c4fe773e5f04ccf5b025b3f8c48f2aa3ce8d3de1b55c527d202800288b9996e965fd87f135d6440bd6a79964873da81d2c0b7b376a26f07254059187ce262d485c0a0009b1ce3a049e2859ec42c2681ff5c2dafa9dba7aa2cc870a7e5a97f227bfc87f07817b2693380c00284422b6b29bc1a17d1d73ddd00cba98a4cf38b3ac649bb9e6ce7064d651c825b650ef7e5e005a002012001c301c402012001c501c6009b1ce3a049e2996b80999a429bffa5962c150d65ee54b565f60867f8510c22dbb4a4fb700070400282c4325ac208d67339f65d1a206965adb6c3f41c0332f0408ab3b37eb1a1e5030776b0cbef34e0009b1ce3a049e2bae6398afe25e33a871a70591fe41470c26625746b87a70fefb79bc3db10546500027e220eaa003a3b1f366ec8202d0d1dd0f7428a8f2368678939775dfd43322e3caafd2f9a69ac60009b1ce3a049e28d31f53ba046ac183b54772c64cb6aef93106a36b8f5b6aee85cea30a00066fc80027c11e7a4cb9cf8286f75181e77418494c8b18c5b3d9056703d5650263c2aa0f45774f662862ca0009b1ce3a049e29e788f48e25fa741aabd13c229342ad96a84097d867eef7ee8f59a15fac85bec00027c11e7a4c92125424030284a2643df3e9a3dc27a4e92418f7d2863b8c4d44413bf747d8eb6b4a002012001c901ca02012001d701d802012001cb01cc02012001d101d202012001cd01ce02012001cf01d0009b1ce3a049e2b541edbe47c91fa17ef287ff86c1a48c133d3ff75afd8a4bd4cd8b346ca77afa80027c11e7a4c7e624435e1b49423dd16a326044b7c0af9dc8d51fb43bfc21a6e0edcf011820843820009b1ce3a049e2b6fb901eafd5b2db7517adfafa60037014cdde83ff413d0b3353bc8ca716622b40027c11e7a4c076b808b604c0ce8b366048d6d932d77b0dc270dd59287dd9cae58c5c599887fb83e0009b1ce3a049e29222bf8997b7d5f1a13d09a993f1e3047e6793cc8d46fbd085db3428e7107665c0027c11e7a4bd5d5b28de42ca52a505d1c22619285238fff02d7b6fb8c96e62f7b7a465ef7b444460009b1ce3a049e2a8627031a106d48441ce51e5cf31159ea9c3f0eff43bb2406033fe838c0ad02a40027c11e7a4b9055b3489fe5453dbfe5e2c00d9a58d5920865ea58c8da8731fe37a74989b56dc3e6002012001d301d402012001d501d6009b1ce3a049e28da08ada1974ad10a4cbe4c81aeb3f73673ceebd74607106a5669b0f5c042b1d40027c11e7a4b0590452f31ee76d4c83a5ebdc65266998b956d7c77e963593e84acc384cf8b48689e0009b1ce3a049e2b33a9ce398669ec209d95fc51382417cf3126ea018508fe56fa390be82b5541c00027c11e7a4a8e638e30bccbc20b0da660bcdc106ceb249da6953cbd33d6713e6a4d16a42100e2620009b1ce3a049e2a6ba03ebb07d146507e57ea0231af926240dc5e21d9ed3f43862ff88f159c27440027c11e7a49e5db713e6329c1e0f7355ae0667f209856d13e7efc9fe21d87c8016e2e0c83aadc7a0009b1ce3a049e28281cfd6c917433e1599ad6e355ad5d79e710974f0473ab0549f3671a060a4d240027c11e7a491f897d57ae37657359404c1e94e5ae5d51fea8bfdd72801c75fff533c325915f25d2002012001d901da02012001df01e002012001db01dc02012001dd01de009b1ce3a049e2bf703143501e11e1f5b5fe518a61e302929256a77274808297caedf196d927df00027c11e7a48bc45a547d83c93830cbde24bf104cd2a3ae9610c458ec80c1a30a2a0dcc48367724a0009b1ce3a049e2b55df5e2c54fce216d91677e957e09c96fd2c2fa31ca7f75206981f63d27b8e5c0027c11e7a4876e2df18ff6b9ec3586138047fde2a25860445693fda2306c2e05c14512b598f232e0009b1ce3a049e2b347e12efadc7a1f85e27e7ef69531afe5a500ec16e9e3f148295a8325cf607340027c11e7a4876e079ea4eacc9d314d9f1aae3a9dde43bda77e6bd4d95eaa76a20c8e004ea9f00ea0009b1ce3a049e2846839e3456000af29a6d659cc5484bfe8f949bbda15e1405289f8c2d92fcdd2c0027c11e7a485938c356490435d8b26734a3e8523ddf06685aa2b3f48031952beb28e88b19587c42002012001e101e202012001e301e4009b1ce3a049e28a909600d946b9727f4ddeee0f7198b3c04e48df836645e47ef24fd7293d0e18c0027c11e7a484f47d67baa0a2ec93ba4a924e50bf0815259cad58a0e0e8a47d0a7feb3f19bb256be0009b1ce3a049e2b0653bd103afee3a6021392ca951cacfe482e1079ab015fac0c2593eed4479c080027c11e7a44aaef3d42bc06e3a77fba211c4e8ffbfba78655fd20a3624c29e42cb03a94459242960009b1ce3a049e287f3ac6a8a8983afc83a25f9312574ef75f528044eda66d86f07325e8a9dfc7640027c11e7941230c7d88a02253d6d6538c80a6d2083fe31c60f28bbde53e3aa1afbb68ebe8645db20009b1ce3a049e29c4d49d19eff5695a5001b589d5a4193aae8126441f8dedb69f76eb834ee039e0002779b8585d9a78cb07efad3a6a6b2b17df9688981b3b75ceacc5bc448fd9e5dcf567933d474eda002012001e701e80201620205020602012001e901ea02012001f701f802012001eb01ec02012001f101f202012001ed01ee02012001ef01f0009b1ce3a049e2aad33e9d50408e140e10d7cbca670d3a47d6909f60a3de7942523bb49812be68400275e1e3630b44fb88705d8a1a927b941511fa4dc9dc5d50d0da4cf7fbb48496bf1a962df4ce1d20009b1ce3a049e2bea9f86f8037d3862cef9e60e86360d0d54232d773d8d6d2a59041e3e232b617c0026e55755eb437dfe968e6748584d4833998ab0f2118fc101699e06d3b0659322cef4c666802ebe0009b1ce3a049e2b17100e9f4969b512a4ce998e588ffdc65de46d22163524799922f66bb5409694002699182659e9dbe11c57246e6770c27b5507791009d09e3912f7c16e08bda5e5ef9506c4694e560009b1ce3a049e2b652dc9de8f14c005365c2955774333087716780af45a57b2dd565c788d0fada00026947542d679258324d3181966a141c514523c202e2a22d8aed2506b06ebd09b6abe0dfff3ffd6002012001f301f402012001f501f6009b1ce3a049e28b2175fc18f4e6222a4d953e5e87dafe69f715b983754ce1b1a8a38cebbb25500002668efabbc33206dee48b7d754cb10756ee56e24b1f947b72bb5d6c4dd820300e1a254e716ddb60009b1ce3a049e2978b87a9225010fe26a2f8b7ba73e1de6e6943986a4bbaefe6e3f7c9f58dc5ea8002660fee0b736f5a24819b16ef4e614fff38afa70fa7d6f7a68b75728272b882e324f5680cb623a0009b1ce3a049e288563725c6eaf9508888d4776c5ebc6e1845534a2ab2f06d0e497de756b68b7580025f6b524013ec73de3900acaa1c1d147728ab1a4274054f1e3e7870d5a30dbe53d31bf2e559e7e0009b1ce3a049e2a27ce03bb3609d73435e6ac7c94c580df85c25031ad8b97f134399b78646a3cc800259d537542457f1fd43f1e6c98cb9c0d8c3b59274e1026378fdc0dbdb50eb1d801cab3747f5ffa002012001f901fa02012001ff020002012001fb01fc02012001fd01fe009b1ce3a049e2a10d40dc7789458688851b12926c82ffff34c5b56f220027abaf5dfa6978420d000259b92c016e98f58225a84ba60e141b1a49f40e964bf444a9135d940fab32e8a3cc9ae2836eb7a0009b1ce3a049e28a0f7e7af58f4e148c94ec8b69230f0793278ff01f3774ba9aab3acf3fc5f768400254447265e0d1805ab8bbe1c5e2e3b1e546636910d34eb91b232b31e21ba0b3b2162e599de997a0009b1ce3a049e2b31472e42084963be67b4a712b9cc7700be79746fb491d975e910f272025cba3c002536bf4b8cc5ee758a1cf665f267e2c057047cd643bcdbbddfa2d43aa470886dd9898f9fefb6d20009b1ce3a049e2b4545a373974b5171f347e6e93a31122bdf678c5c1902521c2dd12aea218437f40024e5e243e793e8cb8a8fbb84820193b4d204821beac23c58cb8ec2ac314ff35ed535aee0078fae00201200201020202012002030204009b1ce3a049e28052e8db0779ca6ee83fd938b3d03e0d9eccb9b38e501c99ec6deaa92acb961080024418fbd9863f20d011e830eeaf39b99ed78f7c7e91e0914678ca4a7c6edec4be7ab6a18ffaea20009b1ce3a049e2897cf57e6b2ddb4a68b895b44658be51bd49fb590001b0ec3faf0373677b9dea40023f3ff637b7cea2146cf7c9dd9e666392a3c3f6b4d3032b13332abc5b3f83e047c4a556a8a380e0009b1ce3a049e2bbf9b04282ca862f661df4988421f058ed779701f2684ab3f0ab91de5c3ccc6140023628c71c9d93061ea29453572e3376d806c49c80fc3f1bf871f69227bdf8413c4479036033d5a0009b1ce3a049e2bedd19ff6da2286f09b6497d309b7b764535cf97ce78fbc6f1fdc2c7e3b09f7fc0023628850d25dcd87ee340235f5a8975b70d9330b6dbae735efc3c36109bb53143abc134da125ea0020120020702080201200209020a009b1ce3a049e2ab2d6b9491b1ff7f3a85f35b93570d18f2f256dfa33df3e66864de888ea3381240022e3bf632738d2abaafe477aaec7b83921ba90cf18dd33ff4f03e2f7b35bc4a4e9c582722763860009b1ce3a049e294eca65fcd370fcccd5f5de7402a0d0cde22ce428affd5970db703dc023aca6540022759ffb974af504ceefb39cc1209d689bc4c761581b3f27d9cc7c1fd281b36c58013fe7f1d1d20009b1ce3a049e285ba13e83f8c0074d7b420a345d62db8897f9e89f67cf6abc4c6be8c198aa72300021eff8c3b2efe2f7222a228ac5c6afc0ce82e4f2b06c03fcc2ccc11f18f74102de79e527e3db320009b1ce3a049e2818206600bb033f73b11875a7be983c5db1a2abd7a37d51b8bf79e501a8deac9c00218974a1da3882183e3467b8107ade8d739831136c871851b1714017416f7471676f8f45bad89200000e6a644f61670cd13a100060056000000d7290bbae1e1df0901e841c471505f18ecff60292d40ad85ddd17f88f60f743b401573b167b91e3b29c171f760aedfebab08d92dc06f4003a6db81fdf18182a830dec43642dd70bf968e46e71b974e290273d8f519620b0ee1dbd4be7a2c8d9401000000a29942ac80d63f71f6fccced0e610fab91a3eb7d698ec5b9c724664872908e3040b82971e93b961271009e2ea4949e2c1fb2bb6af84830c308b41c26abb4f3e17a3ac1c5616dd0c867769ea4b796d69b0c1440758f96953a1ad9146de33c28c90300000007f32e2abc489668fdba6e43c147c989fae89a954c563559599672021c07a5844071ae092a4645bdb969328af0a3889da393efb5a747e417b2dbc5f710954e64a1fcdee259f9922e387f25422234f2c46c72b383c19220fa262a25e825ed33370e0000002d3550f5aabfcd8fd63aa4b3b5ae0b9b16d8e287161657af6f885d03f9d8bf6f40a6d098676220f2c4a7130d710e88add6fd80c2c7bbeef2949d74ef984bfea988db5132db4f3acb099da19235c0fc6238530ab858f03c9fd993ed864fd58ed600000000fcf77b2067add75776327ec71c38887d5088a3abb0f0cd2c6892cc71afdf9462406e436b1aab1b0f6b86c3278b79bdb38b1454d77fc1cc33d6edcfa7d25560314ffcc73ec00350b3df3b550ba14b8329e9b4f568b16c3a0034aa6921073a80d60b00000010692e36a474794a5191ccb14b344062990552614e95737e91ca97c3cf658b44402a326f13c31647d8d09bf7e3a20b77b09d09114a61a79be6afd026f1973ac0753f74366135f273370130128fb5df417400a328b1020182d48eaedb6859746c05000000e2f3bdb704795a82d606a551120e85389701b73ee76db7f781a7fb0981e251254072447e068a56db5922e2c2679d9a86ff3255f6b3c0ff2e32fbc1d5205b1a98eef3abd7f5250d0ea84ff5783f6af1fcf81dc9303c1096ab1e5e3d14ac85a9ac0a000000117ffd1d09ea4806589c08b200269df4629cce2ed673e04bdddc26dafd80dc8f40b8285aae94e6349b3521e3bd6c723972191ebe798da986bd8da1879001eb9cf7636454f00d66e73340f0d08faaaa19a311e25ba573e214f509d5d0d05065bb0600000052f307bf4855348c07c5815e03261c44ab7b8ebe1b55240483f146b08337cee6407738d474c04c1d72b78271d2cbd5ea3a9a09f47466578684e5c8ea0513cf2aab81170e5d7bdf587850bc90cc539cd71a9bfb7e84eb593ea1bfe833ce323be2070000006717280e681dbd5661a03ef3cc17ccc886dea78e34cfb6e732d12c142f75201740af16fc71a041693076ee62c1af07c26b5e74c35303e1d84337bdef0dd99ac84c254c559a92515ba67c8655e120e19ee1f4cf8818058b1d98391d010035943200000000bb6b28e6fa003445f898b1c8f2199f6982ec7eb03ef9d120e0888b83dcbdcac44084af014229c3cf06d86cdd17ca2d8bcf2a766b33b26a3fd9ff0ee2ebfb5f2fea91ec8c46d9e7b0c31e3433a7da930f2feb9cec2632f11e1c3aa2502cb44a1305000000a1dc2c7e2180d94a3c69bec7b9e04248c0430f9768cc942140d37613f44c85ad402e0a12b07941c73c657e0269a913628788b3d246c3a02e3c5405521ee8d89b25f7bc3d4d18b9280c4d07577340c2c31a2de90f01a015a3aba0bfa05db3722204000000efe0bf5bd0c904d6fc98b3e4428d5838eea34d3b395204a4956bbd2daf4e3d5e401160dfb22fc3b7648c84446ded639ff3e263a68e9e3f4da691572543680b14955f5d38da5c44fb100d46519fb94d3d95230fa581e15f1ee4b9dcd8a98f1f8602000000f22e5c02bc6706833a7046f754f842c3bb48e5eafb92879504fac83d5c21735b40c3ce16f853045b789769d920dc68bc4ab0d25ebfd5dd8310ca1b6a3a81eabaf4edc9c4738f224a880abdcc8ca0f9cbc9599f206ad4d4ddd082eb5e40232bf905000000ebcb7007cfec913c990d477d7cb5c6ecdc621ac8a4d621df567d9d3138d392b1401e51e2a57cab6c18be9c852f304bcc4f4eb7617598d2b0578efc5b92d83f975094a4acdc5cc8544fb98d08389c1869d735b597f954322c51da251922a6ef420f000000beb5fb040c84ab11ff0fd924a54e1c91a8cfecf604e0c0208a51629d62e18db44044ba64ac03549e59a679b70ef665973b7fca1e8b9d97a261b5b7c142849666c9c6c969d7a5903327b0735f1d451f210b517df713ad900490368896d6e08f13070000004008c9e2c6ca1fb0158f24972ebcc6624aba3063f9618dd63ae5db939985486b401772ffaa0401ad85e9f67f1d91d7fad189305481f17662551f132f1a297aff8c7419beadf907e065fefc1b307d81d28dd280370eab25ddbfe3ccac384db6410e000000bc5e56dc6dfd8f4181edec81a120769ecfba4883966d594eb520e0997d2ebe1b4071d3b5190a4cc50465a0b349c53ec67ee8b7f06a901f2286d622f8f187d0cb98689636b83bbe93d3f1a73fc81fd3298f8d9334a75adce4370cff4f7ee29b2b06000000a3b5cb542028a9f02fed37a493a6522faadcda4cd07a6ed943ff90366199051d40a9cfe22dfdacc13b51cf1834648315988405f8462ccbae40d6177ca0d4617c9883afcc8090ee0bc13f39dad4418b40a45430c2452be92b526fb69399b213e807000000b21f98b277881faf6638fa7c634a9a4080a2feeec832b43a00d5f6d1df5acd0e40759ce94ef40f4404be3a98ac13624ce50e7e6d274de925a5a76abf16375dc92caf4603e0346727117b2119d2c20c9bfdd013a971065e6f25d6d24ea55eb4f60000000062e22d2460bf1537f4a89ab87bc13d6aaf1f4337c67be91d3552fceeb34cf5d2405c6ed526d5ec481b89a7e25b3d929eb9598f6be07dda8c0244496fafae9f91d116d5e565ff14bd612869acd86836ed3cf9e125aef79cce6170810aa086ee7c03000000416b0c8fefa3e2c19db91711ba4ae8a907d2e65a10023f3aacd14f6ada4943ec40bbae48c7fa4bb3073a1c2efe2c27cff91cdd7fac94d5d4e56f48e831c5c3d6faa0e78454a9bd99279b07701323d6890d3b501085b45bbdf2b7a0b7a1f54b730c0000005ee8c167e49618de77382099989aee6271ee46cfcc4850724d030c537cdccbb7409259241d150db52c51a6847ecb4c926550f10ef8124239dafb543495e2dc2c22a2c945fc0c661bbdf45d8fd3b2ffbd42938f4bd89398ea03b1a2a7868698580d000000dcbf31665866a2e6c1de51fdb989f432fe82159bc193a29be3e9162643211dfe40d4e705e1dcb6108a7cbdee10d9739c3626d856acc61d71ccea5b1a8a88da2d14736aa897e14b2a2499f6d48d8378df22c42e142816723601f3bc132cc26f24070000001f80f333a44441436b774b052ddf599fc5637ef5bebcc1d43e9ea7a5a560648d40d753972c56d1a6153476ce4e82cfa0d4c8b4158aa81facb09bfdadc9529f1cf4c7558c3ead396d66f2bf485ed4766fe7d487986e6d4976d2ec9796048891890d000000e6883bb9b749ae5a2c3cc052d835e2cd57b0df1824e6abb6b97809260ebeac9640d2f46575f90b89701e25c646c68942fce431ef1cdc88181f38d22c7a69349bc5bc370895a4593da790728cd7783c47997381a4e4b6cfffdf90859bd92787040000000040826ed7134c3e787ac5e51d9a50e4ceecce96c435fd6afba08f86f149d70bc740c91895e0f33a7c4e01e3bd8f3494e86bbc12ea08d930579851e429577b816f8b54613c866a50d736c8d80ff98a360cd4013956512802213dafe04140b3a32505000000dfc266daea825d8fb20354640dee8606bf2632d5608f798570667c23090d33a84093b0cd6273025f9b47cbccbb067b006d9ebc1ea2bc80ce1fd8df489fbc929e25d19987c5c17bc2cb91745b92f582c073d1218571ed5f0bb8398c940798b5f90b000000c482351cc4849ea721827a83f6436ad23b882c8830febf6ce8f7bbaee9ba473840a723912105d99a4b6efc816573e56832b537fdca12c5d56af0677ce6b2cc1fbd9d0382097e9f106cc9961a0dd3b344eee8422142d21defd2e4d950ec09453b0b000000b89737b6e229877e70740400a781454e7d16e9ebf54fefb2880ac4b83b56324d409d196ad05fc00fdd7f1d8af1f08614ad57f2b48f5cd66acc288a6d5a98afbc220cc4f134afeaf26d455a541f2a78b0e3e2b402c5270a31ddce4b4ad9f0ceac0d0000003962b091b441242536c864341d2f647e803d47ad9b6c288ae60d446eae6667d140961ac9a3bf910c564798d774ed942b8abcca91b794788e0dcbefe35a442c40cb49fe078c1666932688c21f8e7040542168b5ae9530bb6f8817bc3ae2b758ae0f0000007b81e0224e3eb3e7a3d4dbcde8e29014cf9ab1b4c99ca5750c422359546b0043405e682bcc9133b4be6242bc29c51b3fcf62871ded01e0612938f4f6d6297a583870b7ab7faf7f2cf94afe439af6d9fb7242affbc2d26c4342de460a4d9eb8240200000064e95900da558bd30db8700316f62ca44f8bf0d2525dce6e1619eb94ac63eacf402477ce686bca5e679d8c45a3fb424d797d42dae20346f5a3adda2c3fd0c2e1a717c2ca6c6d81de899b8686074a7d76b1fe702099c020e3727ae1838b32c4290000000034e56c99eacde22d003a7788aefecf0d7a78b687d6ace76cc83af2aa5f1ef80640c7c3ebfafde662188a1a77da11f9d7799028c050bb75175882a503fe1896093582fe5331b7f9c2de690e27f5144225e295b885034d0c3b9cbd5260d9f6f6ef0a000000724a70e7a32532c4c6939bfe78eda005d97b7d7116fd9153f4477010a45663ba404efd7ccacc48f90b11769caabc1f98f29c5a7969945dc79e96f7a104a09873495e96380156b83cd1ba2c21a4eee60bc81251b617538dda5865f22742fe80fb0f000000b3226f0a358fcf84d0717c8655566a1aa4b6240e2e2de4f4c2de9d2a3608e21240df29ec6da54bec9d0d0729888ccf944a013151f0a65362d05641cfe11ee29801c7859cf392176e4a8e26de9c95709fadba85ef80526c976441285c53723ee80f0000009ecfe26549aaf19bd426003eb3f4b07f846511aa0bdb3fc327a834d8998a491a40677f9587ee2ed15d8280a8b9713a1b76b00323d8a1bda55a01f7386212f31d1d58daca88bed169c2785232a1457645b27fc02e16cf2cad2929ea0aa6e979c501000000c374110313e352df4b244440514449f36872850f01369ed2f883a1ab270a1fa9402d92419ca677328e34b6bd1059dbefc6df62bd72c9acd2a2afb249974d9ed9a03e6853f22d5151aed934ba73dbe8bc4147bf8b1ca5bbba6456fe1c04abe2820b000000b96c79a4bb5b680481855aa45ad7ce2ab1ec455e1c12b016a039e4893047164840687f6db915c4608a8c53bf226557ab690b2dcdb3a0b93f314ebbc28d8825ca550b4abb7692e3f58c57e45930088c4f8cfde2cfe31d110fd55e9624ecf194bc0c0000000bee90029a8417150aff7e4832fba9da1bcd43ae0c228c71f4eaa9f31d40715740c6500e01e4cbbf5897d5927b764c78c258d4eaf7df32194503a0e4ffa976ab62a93639dd8d7c4725469694beab9b2394b89b38621229445b1760ac3a812cac05000000f4012537e285ad6bc15c2d0c8fdf15650be7ba4493a89364ecd99a521a0b84524082939ec15155e30d5ca1ebdac174ae2953aba29ae20df0d9adefc35066a6c515353e33b054078e52e5344152dc0cb50ed60830ce3ec7b112bd0783c87d8c9902000000a4bf36303bf09e669957d70a30c5e7e71b2d799fe282e9e600b2176ecc7b439d402579b5f35791dc840c850ab2ea97a5561aa75a5391a38f498e82ff53cff632424aec67639a4a95e0d81b82d77151100226506c8983dbf14f2c1611d3458f91000000007a5b45a279ebcbdfb886fa25a43e7c7a820e74c6aca3ffc34299e88a1fd3ecae4004b601e330d36654f9464033d573012936c47c639fe8cf0a1619edbd3757fa87e9dd25ade6ac7ffe6d8f1dd7a6646aca99cc0a673d8c6c65d728d81335cc6d0c0000008f3fd1a53bcc3e2bca1b4028cc037140e1b440b3b07e753ac905fd1b01342f03409dfc67afa79c0c81d2a2d2df1c6303b6a26c51657586a5ce5e95cc6b453c8ddc3130d8813e2f6db8b8c19dfc4d59a14eab080cb496659f1acdc2cdddee7d8c0f0000007d50a1108c85c9c05bb5f5b934e97148b4cb366bddf0ff225569e0a1f63482c040f70c988e6fe9173bbbb286a88c7f5acab7e0a30668f814b1d497907fd90a87145fad87e37cf3ee778f6ea6721936a07b0841a72fe6721143e285ba9621815b0100000027924de54d1257fe0ed80a80308359cc0cab902968ae51153f62c1e5edfcd28b402e0294319218fa786c927c76ebde8e5dcdc69270dfaa2961f7554508f7857405491d3e342c13dc1a0fd307505cd090b6789bb48d87781418372120514a33ff0b000000b6143fb6d94aa15b6d0d3fd05ccc1e077b659c46c449995568d6d1d6408ee2a840f2bc2e5100f882921cecaa20c7c4b27059dfbaa2addf3cf849d9af86f8125e8f474deeb280620be627acb8ed54f9acf2bbf6ddcc617c16c79d191321ad102809000000f5f91d6c1b816a83e18116f4dc7a849a083f79d2b351a548ae051076099c22284080dbcf5cef5e46135281dbed5e29e9d63a0abf257ed70a70ce1d7289fc07bc4103c6ea181888c94687948aa48a6192bbecf6bf5fe713e008f015cdd2869ad00c000000797c73fe50485d8e10e375a366d6bee359582b93804aebe8d64a6c76d31f6acc40359c2c454b5e79dfc9a37590602b1833b753985ec53d9be6230112486cef246b6c0db34e87115b28425a7898224740dd788fcc68490c24f6c1c450f22fd0630a00000078787873e03ec225f265b9bd440a7f2889ac36954f3826ab9a86afd2d6b9c2d5400e5fdb38523a634854ec8126e843be407c04d1bf6c60bdfaecc24f7ba76c26185a730f85c9dc42d8dbe35853ab7702cf58e718731f1909f88d5353a7e81bea05000000d50849cae62d862733843588c6db63e9db71c01540c6fea04a710390580c7f5b405cc68b53d995431a4915c6a2dd73fdd51d9580140bdd35f38ea06d3fdf76cfad32bae0f7fefcf6cdc582633b95d354f06b3fe6b2651ef89925bd84976ec2100c000000c0379187b2402518f5852a7f5627ae4e064cc3bd2af7f06f716da7d22cfcb1ff40e601fe0f00142058aaf5a2dedf6c3738f58afa8bce6005beb001307eb4416899e1e9c6d0be539d0e7aaac7449a0110a7d6933729c69e19669474203849298900000000816d2f4cdb26b473294c6b22db12ea7f861588154c741f8509736a805a9a6abe40abb0ad7192d8440cda9db1f2fbee3abf7db3590ac98b2198a9001259881ece56b1ccf45640ea46f767acd4e94045ba684d741b3af7a3452c97445bdd8ab5700300000017e3bcbe7ea912442dcbf33b427c9d33ba1fab0dd3eaa8555fd9065376a7c4f940694d2baf55fbea6e2fa043d189f56ee4a5396bf438339fc743ce2c9ca311c7a7eec6b4dbf12318bb0fe93dc0e0088b5164760742198b24c9b5408da88261920000000051217894a40038473f7683456e456c95fe783af578c49816121980df8fc86e46403ec632b45a2aea7173ae36f33e55e753a7533cbda509cb7c99be928cdcc4f6fcb137acdbfa46462e60b4abda0ad04f1cd69b92a5c8662d101adb8300092b560a00000049dfb69872fae3f58a7cbd2e1f950c84ec58a2696e5838546a4c3713046cd2e9405a801ff2963a6b4adab2c4cd312afcc283e4021a76b9ec2ccd6eaa6510c2b67e80aed195f9eac2d977501a14579c6488d96154dbc1b9e8e014bd4cc969d79c020000001341107ce0b6714e61299f733dba03b2077cb1b482a0a4dc4b9b2bfe4d477942400dd423731ae38021ef07b85054bb88c6e224071fc1db5b85d1e8bf9c76049b2410ca7fca5d0c6f12cab59bd0d54bce4dfa83260573d7eff9903732273457100f0000003bf02b1230f9ef96fe584a5475422fdc336366f1bb6787cef90b099539c9736040feef6cd70f950a32f34bd82d9d9f4e8f8e13eeedfd98f8a9571dc69e09edcdf7141574f85987dfe1d290b1532f0443ed2a0702d52ccb9f3ea4a12fc8eb354c080000002bf1497c106ad88db52cbbaac0fbead13ee35a9548d731a77be327d6c24f56c54041b929b8cc12ac38b5af7dfbea027f6e44667b98025078e2d777711349ae8f6c5328f75c26746cfc66a3f9e731c5f2e73d7ba0595d3a42537dbb51145a46c30e0000008dce88dd6515deb248ab3741aae457268739eb1d7f17c78846770a2155dfad7b4010370af688290c69cf8084e440da3649d323d4630b570a1a226e94abf22a952d1e3130d99c1ba29cf830962c1e945033ae1c4b8ed5e9e5e1c0348d138172310900000090fb19ae644df1569400aa31b646ffd9c22d75b8e5a5916ac7680b8be0330bda40fe4484c56f0c49cc4c78cbee4222e7448064239a7db3deb2fcbd05cf5671fe13a8446b48fb685f7ae6606712750274b0ae366576eeaa1c6c4247c2b23edbbc05000000b1b6e8b62aedc743b82ae6a6599710263887484c2bf1a1fd573f83e3eeab3e01407e08cda125b64eacb1c8a68ac3b52994c5cfc6ca1db7a95300b0bf13ea99d728195dc0e6ffef16e78c1dca6e5dc3a7b16fff3d8f5f5ffde6781819fd6035050000000068b4001f5f3f2013180b023075f919466ce69cefbdb22ebdac2b3a5efba56bc04029e28090d7985aafd24d76a394134be6acfd4b9eb2eb74929d899576484ccba30c2a2d07e5e5a409ec4340c00fcec0264a3cea46e032a7c96e71f476f8a06a0700000054bdbcc384517a9934e55f7f78aa05e68cd645ea4f7c8804789ebc47853157c5404a77a17a5d561471a96ddf434988be92b4dbaf2af6b018e88da92506759c2217a27c8a3ea9c316d955e59aa942ca31af6d2ff6c141f2f5caea3f86b36558f009000000c25eb1108043f23bb464c624961a51bf29727ddb4d0c550b23658fc1e148a47a401b949c19652e0fc633bbcf11c005cb415bd61b4610f899ae2bd19daa753df5aed5d3524d2c9a7edba78f3ee58529605d09619c2df6e3bb31e66759a875e0b80b000000542c3b5975161423813328566f6978d0790ee305ba9840f8cf16e06fa9e9d76640257d54b4292717e268c64bf07bc9f46e83f43fa735492fde5f5601355ea360d2525791130a8c4fdaa67d609e815bcf597a6b26b27300dc02bee4638b47cff307000000fa51edfb83cdb21a5c96d9bafa030fd6afd974c621588eb436c5f0ab9a6e1aab404521ac29671a884c2be119d69dabf39759d6ab3ce88758e220be800239fd49e5e2de742719f514635e423415c07b5cfc89dc436acb09ff197998fe46fd06e0030000004df361e3e212c17228c87ff56d8552f37e6f988713f593883863408d3d2f45c140d30ac3d4854e5fd0a7a0cb894e527d1c421e9cc615f306d32aef3b481c30b010f7617d56c16cdf05d29d4c12aa4849c70e34acf3cde62f2c998eda9282003607000000780e7827dbd7b543ba5c9d904911350eba322903b4cff135ac1701c88647b22940ea237cd6fb396cc4d55029a3e8a2d17f7df24eb61d50264bbd0fc2ae7e254055e612c3771befef09c3d37a333928e1f88766ebe8b08ee8c0c840af4f17da5408000000db1268a26e4a63c9b4483dd3c796ca39e1e831e437c36586e65de0de6032f570407bc05b353ac454cb8a4072194c1079d46021e58a91cf5101fd9331116e5992a778885d036d3fb81d56fccbdf3ba2f016833e29dc0bf226e827ec09dae5113a00000000b977be72773dc478a8d933868008d5df36c321dbdfba68256a7c89371abc0dcc405fa5f5bc104ce83d1f88e384a8ca318bd45e436ec3bbdf26cf628d56a37d4de995806e2da98afdbf507761c19ffc84bf385f3b95fabbeed035802ffb6ee61103000000b26c35f666b1f61c3da8453ab70ca641effd477f272f8aba75ce41d6812ad7a840e18bad648e96615ff4788cfdb62eaed50596259ead085067756857a7c87fdd5018a1c776fc4b5482a49575ac6dbad67511550a10c5a8fb49609103ebaea20f07000000df7cbf1a0377aa0067bd2ea7e64160660f05e644588ce6b3ec3373175b8242054031cfc68ce6b23c7394cae206a29a2c505bfc7b2e4d45877a5e6586db82a20869b865ff9f93b6941fb923b25c672b78e1e6e4939a48e3a02128795427fea76509000000b3cbc76ca75102daab62ce2b3cd78597a7d18e2e7648e878879af2d6816b6ef040c45368a63f3d8deac1b8fd4e8a5e2276fa721fa90f51eb26b473fee962ae3c4a43a58ba6102826cbfb0f481e3e186ec975b6054a0f4fbb669701963bec31e90200000071208014412d1c2a86da8f48bcde38f200d67958e389fd5cc6a32f2118d9614540a6f304a903a53126e44f6e11a1d1c9a0038ce8883f6b66eaa28aed40cff3b62674595749b968620187b8c9587ac81bdf46249c08550ccd3e82acfb15f7a501060000005d99692d26fd99772e30abfc1e0b3fdc1ed6937062d0f2276c704307182204594062a84e9d770631ab14a02930acb2d48e174b0a75382027d267b4c060dd38408ff2d02f3f88d47a7550b50b11e8d613e29fbfece0f57ec6969c1b73e8e5b4bc0d000000a2b3657e169d774ff45962cbe60f797cdc6ea9387e4469f6af354250199f2007405f48cb270927d00eaa867fd3f34592b1037d2a3a7b287138e1d010088eedfc1e42d0207f24afe0586e8c9d3ab5a6eeb5bb100c26ca36cc29766be8e39b3f1f0d000000b69680f5afc056dcd2eadb9b61edc7c7a463ef035ff81f31a4e2c1c420e9519b404e198a7c165e8099ba54bc821243f4d8c62b1f854f8dc80a50609ca6aa3dd8a5180f656d31047996c09ccae61a4f3232b99745848bc487adc93db3ef55589e0600000012e20f8728a386572a58b4464c6a9eedd81dc5ce1b3fd51cd0d3d1fda0285d7f4076ec3cc621e2f8f2d81f2abe74b0b5cd71afb5c10527e7727cc6e7f1546a57593707237ac5b1d5d47512ac7204db797b3838af6751b0a8cc678b6de9ee356f01000000c1fb48bcd3ec56ef2197faa359d74b5355fb876eb739a51bd9d988ccbf694562406fe997456dc0f5f56137a04e78b514e071a3bed9431a4b698be0910e6c24ae461bbcba541c6943da9954407b3b28572ac5b4ed77efbf991285ca75809549510c000000b39164cd5c63956f4740d32a08d2622e7898e8fb196b7baadd50a0b2255626b44007cc417789f99200efe8873d1a002241e1c6c70572a53ba8a1197e0fe710526ea47c56490b6941cb9a0d78fb1174ba901b0b0f6855a753619c3b015da91a9b0b000000119e17a1e2a4efba0112056086ae1e1ebd5e14da0df59b3774c54f1219a2de8540f7c77efa14ab7fc1783d060bb8d92d7c42e8c5b507890d9cdaf6601e1846277a94d0ebfc0f7689e6c10167048340584c7722a17ddc1fd57ec390ef6e62f6d100000000bceeadc773ae7f8ea634379b1662b6ea47b44d65811dc0b35f7fb2bc72a691f040f44c951c0e53269230e5de902be6305be1bc80156bbc88c18c2ddf897d9b26ab72dfec00a830f12bf49c69bf457388aa6cb463aad9fbe209324a00ca275bbb01000000e5d01d53a3e55134a107e8ec2c2f1b622b0fa6c81e8d662f8afec4c973bd6b2640c389b1a6fb37a4a4047faca7bfbd70f13cfde0a5c1ca3a86d26dd1df54b21eabf5edf7c49bc9d6de6bea4b54a49a7e3232e718b866e9f910be346f8c3fec3a0c00000056fe4be6973b93324ea998811aab693535f8da3f831b3d3ea28b362957a0898640c93ac19b5d46ef1e2b6c5e247426931f6c6d298cfc2f3f5c97774e978ddd41a4a0c1747a4e733e9beaa3bbbe65b558b97f9ecb1831a77838426a1c115bad4901000000edf79bdf7af61ec9aef32a7e169a08a8957e381110d0a0731329023e5fe51cdd40e82d4a01438b53f05b9c8c432878d41ae29801d01fbb2769780d4d0381a7e726f731c22ac33c3d113cd71915df4290540d5e713ef6793ee5fee240bf520de203000000 \ No newline at end of file From fbf7ea78ad88b0f6cae1d5fd00f09b3d7e6a2ead Mon Sep 17 00:00:00 2001 From: Vladimir Lebedev Date: Wed, 20 Mar 2024 21:16:30 +0700 Subject: [PATCH 04/28] work on encoding to use with tokio-tower --- Cargo.lock | 130 ++++++++++++++++++++++++++++++++++++++ liteapi/Cargo.toml | 4 +- liteapi/examples/time.rs | 9 +-- liteapi/src/client.rs | 4 +- liteapi/src/encoding.rs | 39 ++++++++++++ liteapi/src/lib.rs | 3 +- liteapi/src/server.rs | 37 ----------- liteapi/src/tl/adnl.rs | 4 +- liteapi/src/tl/mod.rs | 2 +- liteapi/src/tl/request.rs | 2 +- 10 files changed, 185 insertions(+), 49 deletions(-) create mode 100644 liteapi/src/encoding.rs diff --git a/Cargo.lock b/Cargo.lock index b040e3c..9bcc467 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -293,6 +293,62 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" + [[package]] name = "crypto-common" version = "0.1.6" @@ -445,6 +501,23 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.52", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + [[package]] name = "futures-task" version = "0.3.30" @@ -458,9 +531,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-core", + "futures-macro", + "futures-sink", "futures-task", "pin-project-lite", "pin-utils", + "slab", ] [[package]] @@ -1083,6 +1159,15 @@ dependencies = [ "libc", ] +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + [[package]] name = "smallvec" version = "1.13.1" @@ -1256,6 +1341,37 @@ dependencies = [ "syn 2.0.52", ] +[[package]] +name = "tokio-tower" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4322b6e2ebfd3be4082c16df4341505ef333683158b55f22afaf3f61565d728" +dependencies = [ + "crossbeam", + "futures-core", + "futures-sink", + "futures-util", + "pin-project", + "tokio", + "tower", + "tower-service", + "tracing", +] + +[[package]] +name = "tokio-util" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + [[package]] name = "ton_liteapi" version = "0.1.0" @@ -1269,6 +1385,8 @@ dependencies = [ "thiserror", "tl-proto", "tokio", + "tokio-tower", + "tokio-util", "tower", "ureq", "x25519-dalek", @@ -1320,9 +1438,21 @@ checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ "log", "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.52", +] + [[package]] name = "tracing-core" version = "0.1.32" diff --git a/liteapi/Cargo.toml b/liteapi/Cargo.toml index a179198..708ad9e 100644 --- a/liteapi/Cargo.toml +++ b/liteapi/Cargo.toml @@ -5,13 +5,15 @@ edition = "2021" [dependencies] adnl = { git = "https://github.com/tonstack/adnl-rs", branch = "server", features = ["dalek"] } -tl-proto = { git = "https://github.com/hacker-volodya/tl-proto" } +tl-proto = { git = "https://github.com/hacker-volodya/tl-proto", features = ["bytes"] } derivative = "2.2.0" log = '0.4.14' hex = "0.4.3" thiserror = "1" tokio = { version = "1.36", features = ["net", "io-util"] } tower = { version = "0.4.13", features = ["make", "util"] } +tokio-util = { version = "0.7.10", features = ["codec"] } +tokio-tower = "0.6.0" rand = "0.8.5" [dev-dependencies] diff --git a/liteapi/examples/time.rs b/liteapi/examples/time.rs index c7fb16b..3aa4882 100644 --- a/liteapi/examples/time.rs +++ b/liteapi/examples/time.rs @@ -1,14 +1,15 @@ -use adnl::AdnlRawPublicKey; -use ton_liteapi::{client::SingleClient, tl::request::{Request, WrappedRequest}}; +use adnl::{AdnlPeer, AdnlRawPublicKey}; +use ton_liteapi::{client::SingleClient, encoding::LiteCodec, tl::request::{LiteQuery, Request, WrappedRequest}}; use x25519_dalek::StaticSecret; +use tokio_util::codec::Decoder; #[tokio::main] async fn main() -> Result<(), Box> { - // decode liteserver public key let server_public = AdnlRawPublicKey::try_from(&*base64::decode("JhXt7H1dZTgxQTIyGiYV4f9VUARuDxFl/1kVBjLSMB8=")?)?; - let ls_ip = "65.21.74.140"; let ls_port = 46427; + let adnl = AdnlPeer::connect(&server_public, (ls_ip, ls_port)).await?; + let (mut sink, input) = LiteCodec.framed(adnl).split(); let mut client = SingleClient::connect((ls_ip, ls_port), &StaticSecret::random_from_rng(rand::thread_rng()), &server_public).await?; let result = client.query(WrappedRequest { wait_masterchain_seqno: None, request: Request::GetTime }).await?; println!("{:?}", result); diff --git a/liteapi/src/client.rs b/liteapi/src/client.rs index a422ef6..6379999 100644 --- a/liteapi/src/client.rs +++ b/liteapi/src/client.rs @@ -1,7 +1,7 @@ use adnl::{AdnlBuilder, AdnlPeer, AdnlPrivateKey, AdnlPublicKey}; use tokio::{io::{AsyncReadExt, AsyncWriteExt}, net::ToSocketAddrs}; -use crate::{tl::{adnl::Message, common::Int256, request::{Query, WrappedRequest}, response::Response}, types::LiteError}; +use crate::{tl::{adnl::Message, common::Int256, request::{LiteQuery, WrappedRequest}, response::Response}, types::LiteError}; pub struct SingleClient { peer: AdnlPeer @@ -23,7 +23,7 @@ impl SingleClient { pub async fn query(&mut self, request: WrappedRequest) -> Result { let query_id = Int256::random(); - let query = Message::Query { query_id: query_id.clone(), query: Query { wrapped_request: request } }; + let query = Message::Query { query_id: query_id.clone(), query: LiteQuery { wrapped_request: request } }; self.peer.send(&mut tl_proto::serialize(query)).await.map_err(|e| LiteError::AdnlError(e))?; let mut answer = Vec::with_capacity(8192); self.peer.receive(&mut answer).await.map_err(|e| LiteError::AdnlError(e))?; diff --git a/liteapi/src/encoding.rs b/liteapi/src/encoding.rs new file mode 100644 index 0000000..8939266 --- /dev/null +++ b/liteapi/src/encoding.rs @@ -0,0 +1,39 @@ +use tl_proto::{TlError, TlWrite}; +use tokio_util::{bytes::BytesMut, codec::{Decoder, Encoder}}; + +use crate::tl::adnl::Message; + +pub struct LiteCodec; + +impl Decoder for LiteCodec { + type Item = Message; + type Error = TlCodecError; + + fn decode(&mut self, src: &mut BytesMut) -> Result, Self::Error> { + if src.len() == 0 { + return Ok(None) + } + Ok(Some(tl_proto::deserialize::(src).map_err(|e| TlCodecError::TlError(e))?)) + } +} + +impl Encoder for LiteCodec { + type Error = TlCodecError; + + fn encode(&mut self, item: Message, dst: &mut BytesMut) -> Result<(), Self::Error> { + item.write_to(dst); + Ok(()) + } +} + +#[derive(Debug)] +pub enum TlCodecError { + TlError(TlError), + IoError(std::io::Error), +} + +impl From for TlCodecError { + fn from(value: std::io::Error) -> Self { + TlCodecError::IoError(value) + } +} \ No newline at end of file diff --git a/liteapi/src/lib.rs b/liteapi/src/lib.rs index 8a5f0f6..f7483c7 100644 --- a/liteapi/src/lib.rs +++ b/liteapi/src/lib.rs @@ -1,4 +1,5 @@ pub mod tl; pub mod types; pub mod client; -pub mod server; \ No newline at end of file +pub mod server; +pub mod encoding; \ No newline at end of file diff --git a/liteapi/src/server.rs b/liteapi/src/server.rs index 5f946dc..46d99ff 100644 --- a/liteapi/src/server.rs +++ b/liteapi/src/server.rs @@ -21,43 +21,6 @@ impl Connection { } } -async fn handle_request(service: &mut LS, peer: &mut AdnlPeer) -> Result<(), Box> { - let mut buffer = Vec::with_capacity(8192); - let size = peer.receive(&mut buffer).await?; - let message = tl_proto::deserialize::(&buffer[..size])?; - if let Message::Query { query_id, query } = message { - let response = service.ready().await?.call(query.wrapped_request).await?; - let answer = Message::Answer { query_id, answer: response }; - peer.send(&mut tl_proto::serialize(answer)).await?; - Ok(()) - } - else { - Err(LiteError::UnexpectedMessage.into()) - } -} - -pub async fn serve(listener: TcpListener, make_service: M, private_key: &S) -> Result<(), Box> where M: MakeService, M::Service: LiteService, S: AdnlPrivateKey { - loop { - let (socket, remote_addr) = match tcp_accept(&listener).await { - Some(x) => x, - None => continue, - }; - poll_fn(|cx| make_service.poll_ready(cx)).await?; - - let service = match make_service.make_service(remote_addr).await { - Ok(service) => service, - Err(_) => continue, - }; - - tokio::spawn(async move { - let mut peer = AdnlPeer::handle_handshake(socket, private_key).await?; - loop { - handle_request(&mut service, &mut peer).await; - } - }); - } -} - fn is_connection_error(e: &io::Error) -> bool { matches!( e.kind(), diff --git a/liteapi/src/tl/adnl.rs b/liteapi/src/tl/adnl.rs index 3f88b93..664402c 100644 --- a/liteapi/src/tl/adnl.rs +++ b/liteapi/src/tl/adnl.rs @@ -1,7 +1,7 @@ use derivative::Derivative; use tl_proto::{TlRead, TlWrite}; -use super::request::Query; +use super::request::LiteQuery; use super::response::Response; use super::common::*; use super::utils::*; @@ -16,7 +16,7 @@ use super::utils::*; pub enum Message { /// adnl.message.query query_id:int256 query:bytes = adnl.Message; #[tl(id = "adnl.message.query")] - Query { query_id: Int256, #[tl(with = "struct_as_bytes")] query: Query }, + Query { query_id: Int256, #[tl(with = "struct_as_bytes")] query: LiteQuery }, /// adnl.message.answer query_id:int256 answer:bytes = adnl.Message; #[tl(id = "adnl.message.answer")] diff --git a/liteapi/src/tl/mod.rs b/liteapi/src/tl/mod.rs index 1560e56..9f208e9 100644 --- a/liteapi/src/tl/mod.rs +++ b/liteapi/src/tl/mod.rs @@ -19,7 +19,7 @@ mod tests { let raw = hex::decode("7af98bb435263e6c95d6fecb497dfd0aa5f031e7d412986b5ce720496db512052e8f2d100cdf068c7904345aad16000000000000")?; let constructed = tl_proto::serialize(Message::Query { query_id: Int256::from_hex("35263e6c95d6fecb497dfd0aa5f031e7d412986b5ce720496db512052e8f2d10")?, - query: request::Query { + query: request::LiteQuery { wrapped_request: WrappedRequest { request: Request::GetTime, wait_masterchain_seqno: None, diff --git a/liteapi/src/tl/request.rs b/liteapi/src/tl/request.rs index 83e27c4..8e40319 100644 --- a/liteapi/src/tl/request.rs +++ b/liteapi/src/tl/request.rs @@ -12,7 +12,7 @@ use super::utils::*; id = "liteServer.query", scheme_inline = r##"liteServer.query data:bytes = Object;"## )] -pub struct Query { +pub struct LiteQuery { #[tl(with = "struct_as_bytes")] pub wrapped_request: WrappedRequest, } From f424142b92352bfa65c3f25e1a99f70b8268a438 Mon Sep 17 00:00:00 2001 From: Vladimir Lebedev Date: Mon, 25 Mar 2024 20:25:27 +0700 Subject: [PATCH 05/28] upd tl --- Cargo.lock | 13 +- liteapi/Cargo.toml | 2 +- liteapi/src/tl/request.rs | 258 +++++++++++++++++---------- liteapi/src/tl/response.rs | 352 +++++++++++++++++++++++-------------- 4 files changed, 387 insertions(+), 238 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b040e3c..541b49b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1191,8 +1191,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tl-proto" -version = "0.4.4" -source = "git+https://github.com/hacker-volodya/tl-proto#83a9987a8d828528459914b56f4e0eec1c00c6e5" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4da430e55186abb18b4d1457a23eb0765af0dee66a9f741d652d6eaa476a8d7" dependencies = [ "bytes", "digest", @@ -1204,8 +1205,9 @@ dependencies = [ [[package]] name = "tl-proto-proc" -version = "0.4.3" -source = "git+https://github.com/hacker-volodya/tl-proto#83a9987a8d828528459914b56f4e0eec1c00c6e5" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3eaf6822a3ce34a40564dd3078a915d35c3c5fd1f6b3d81eab991e6d00a0fb" dependencies = [ "proc-macro2", "quote", @@ -1217,7 +1219,8 @@ dependencies = [ [[package]] name = "tl-scheme" version = "0.2.0" -source = "git+https://github.com/hacker-volodya/tl-proto#83a9987a8d828528459914b56f4e0eec1c00c6e5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfb36e00e1c6be44d5ed8b2be322667f8ad4955387375c0cf617c542e01a56" dependencies = [ "crc", "pest", diff --git a/liteapi/Cargo.toml b/liteapi/Cargo.toml index a179198..5e2667b 100644 --- a/liteapi/Cargo.toml +++ b/liteapi/Cargo.toml @@ -5,7 +5,7 @@ edition = "2021" [dependencies] adnl = { git = "https://github.com/tonstack/adnl-rs", branch = "server", features = ["dalek"] } -tl-proto = { git = "https://github.com/hacker-volodya/tl-proto" } +tl-proto = "0.4.5" derivative = "2.2.0" log = '0.4.14' hex = "0.4.3" diff --git a/liteapi/src/tl/request.rs b/liteapi/src/tl/request.rs index 83e27c4..b9a119c 100644 --- a/liteapi/src/tl/request.rs +++ b/liteapi/src/tl/request.rs @@ -38,6 +38,151 @@ pub struct WaitMasterchainSeqno { pub timeout_ms: i32, } +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct GetMasterchainInfoExt { + mode: u32 +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct GetBlock { + id: BlockIdExt, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct GetState { + id: BlockIdExt, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct GetBlockHeader { + id: BlockIdExt, + mode: u32, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct SendMessage { + body: Vec, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct GetAccountState { + id: BlockIdExt, + account: AccountId, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct RunSmcMethod { + mode: u32, + id: BlockIdExt, + account: AccountId, + method_id: i64, + params: Vec, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct GetShardInfo { + id: BlockIdExt, + workchain: i32, + shard: u64, + exact: bool, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct GetAllShardsInfo { + id: BlockIdExt, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct GetOneTransaction { + id: BlockIdExt, + account: AccountId, + lt: i64, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct GetTransactions { + count: i32, + account: AccountId, + lt: i64, + hash: Int256, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct LookupBlock { + #[tl(flags)] + mode: (), + id: BlockId, + #[tl(flags_bit = "mode.1")] + lt: Option, + #[tl(flags_bit = "mode.2")] + utime: Option, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct ListBlockTransactions { + id: BlockIdExt, + #[tl(flags)] + mode: (), + count: i32, + #[tl(flags_bit = "mode.7")] + after: Option, + #[tl(flags_bit = "mode.6")] + reverse_order: Option<()>, + #[tl(flags_bit = "mode.5")] + want_proof: Option<()>, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct GetBlockProof { + #[tl(flags)] + mode: (), + known_block: BlockIdExt, + #[tl(flags_bit = "mode.0")] + target_block: Option, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct GetConfigAll { + mode: i32, + id: BlockIdExt, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct GetConfigParams { + mode: i32, + id: BlockIdExt, + param_list: Vec, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct GetValidatorStats { + #[tl(flags)] + mode: (), + id: BlockIdExt, + limit: i32, + #[tl(flags_bit = "mode.0")] + start_after: Option, + #[tl(flags_bit = "mode.2")] + modified_after: Option, +} + #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] #[tl(boxed)] @@ -48,9 +193,7 @@ pub enum Request { /// liteServer.getMasterchainInfoExt mode:# = liteServer.MasterchainInfoExt; #[tl(id = 0x70a671df)] - GetMasterchainInfoExt { - mode: u32, - }, + GetMasterchainInfoExt(GetMasterchainInfoExt), /// liteServer.getTime = liteServer.CurrentTime; #[tl(id = 0x16ad5a34)] @@ -62,142 +205,65 @@ pub enum Request { /// liteServer.getBlock id:tonNode.blockIdExt = liteServer.BlockData; #[tl(id = 0x6377cf0d)] - GetBlock { - id: BlockIdExt, - }, + GetBlock(GetBlock), /// liteServer.getState id:tonNode.blockIdExt = liteServer.BlockState; #[tl(id = 0xba6e2eb6)] - GetState { - id: BlockIdExt, - }, + GetState(GetState), /// liteServer.getBlockHeader id:tonNode.blockIdExt mode:# = liteServer.BlockHeader; #[tl(id = 0x21ec069e)] - GetBlockHeader { - id: BlockIdExt, - mode: u32, - }, + GetBlockHeader(GetBlockHeader), /// liteServer.sendMessage body:bytes = liteServer.SendMsgStatus; #[tl(id = 0x690ad482)] - SendMessage { - body: Vec, - }, + SendMessage(SendMessage), /// liteServer.getAccountState id:tonNode.blockIdExt account:liteServer.accountId = liteServer.AccountState; #[tl(id = 0x6b890e25)] - GetAccountState { - id: BlockIdExt, - account: AccountId, - }, + GetAccountState(GetAccountState), /// liteServer.runSmcMethod mode:# id:tonNode.blockIdExt account:liteServer.accountId method_id:long params:bytes = liteServer.RunMethodResult; #[tl(id = 0x5cc65dd2)] - RunSmcMethod { - mode: u32, - id: BlockIdExt, - account: AccountId, - method_id: i64, - params: Vec, - }, + RunSmcMethod(RunSmcMethod), /// liteServer.getShardInfo id:tonNode.blockIdExt workchain:int shard:long exact:Bool = liteServer.ShardInfo; #[tl(id = 0x46a2f425)] - GetShardInfo { - id: BlockIdExt, - workchain: i32, - shard: u64, - exact: bool, - }, + GetShardInfo(GetShardInfo), /// liteServer.getAllShardsInfo id:tonNode.blockIdExt = liteServer.AllShardsInfo; #[tl(id = 0x74d3fd6b)] - GetAllShardsInfo { - id: BlockIdExt, - }, + GetAllShardsInfo(GetAllShardsInfo), /// liteServer.getOneTransaction id:tonNode.blockIdExt account:liteServer.accountId lt:long = liteServer.TransactionInfo; #[tl(id = 0xd40f24ea)] - GetOneTransaction { - id: BlockIdExt, - account: AccountId, - lt: i64, - }, + GetOneTransaction(GetOneTransaction), /// liteServer.getTransactions count:# account:liteServer.accountId lt:long hash:int256 = liteServer.TransactionList; #[tl(id = 0x1c40e7a1)] - GetTransactions { - count: i32, - account: AccountId, - lt: i64, - hash: Int256, - }, + GetTransactions(GetTransactions), /// liteServer.lookupBlock mode:# id:tonNode.blockId lt:mode.1?long utime:mode.2?int = liteServer.BlockHeader; #[tl(id = 0xfac8f71e)] - LookupBlock { - #[tl(flags)] - mode: (), - id: BlockId, - //#[tl(skip, flags_bit = "mode.0")] - //trash: Option, - #[tl(flags_bit = "mode.1")] - lt: Option, - #[tl(flags_bit = "mode.2")] - utime: Option, - }, + LookupBlock(LookupBlock), /// liteServer.listBlockTransactions id:tonNode.blockIdExt mode:# count:# after:mode.7?liteServer.transactionId3 reverse_order:mode.6?true want_proof:mode.5?true = liteServer.BlockTransactions; #[tl(id = 0xadfcc7da)] - ListBlockTransactions { - id: BlockIdExt, - #[tl(flags)] - mode: (), - count: i32, - #[tl(flags_bit = "mode.7")] - after: Option, - #[tl(flags_bit = "mode.6")] - reverse_order: Option<()>, - #[tl(flags_bit = "mode.5")] - want_proof: Option<()>, - }, + ListBlockTransactions(ListBlockTransactions), /// liteServer.getBlockProof mode:# known_block:tonNode.blockIdExt target_block:mode.0?tonNode.blockIdExt = liteServer.PartialBlockProof; #[tl(id = 0x8aea9c44)] - GetBlockProof { - #[tl(flags)] - mode: (), - known_block: BlockIdExt, - #[tl(flags_bit = "mode.0")] - target_block: Option, - }, + GetBlockProof(GetBlockProof), /// liteServer.getConfigAll mode:# id:tonNode.blockIdExt = liteServer.ConfigInfo; #[tl(id = 0x911b26b7)] - GetConfigAll { - mode: i32, - id: BlockIdExt, - }, + GetConfigAll(GetConfigAll), /// liteServer.getConfigParams mode:# id:tonNode.blockIdExt param_list:(vector int) = liteServer.ConfigInfo; #[tl(id = 0x2a111c19)] - GetConfigParams { - mode: i32, - id: BlockIdExt, - param_list: Vec, - }, + GetConfigParams(GetConfigParams), /// liteServer.getValidatorStats#091a58bc mode:# id:tonNode.blockIdExt limit:int start_after:mode.0?int256 modified_after:mode.2?int = liteServer.ValidatorStats; #[tl(id = 0xe7253699)] - GetValidatorStats { - #[tl(flags)] - mode: (), - id: BlockIdExt, - limit: i32, - #[tl(flags_bit = "mode.0")] - start_after: Option, - #[tl(flags_bit = "mode.2")] - modified_after: Option, - }, + GetValidatorStats(GetValidatorStats), } \ No newline at end of file diff --git a/liteapi/src/tl/response.rs b/liteapi/src/tl/response.rs index 3ac4025..71c63dc 100644 --- a/liteapi/src/tl/response.rs +++ b/liteapi/src/tl/response.rs @@ -4,203 +4,283 @@ use tl_proto::{TlRead, TlWrite}; use super::common::*; use super::utils::*; +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct MasterchainInfo { + last: BlockIdExt, + state_root_hash: Int256, + init: ZeroStateIdExt, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct MasterchainInfoExt { + #[tl(flags)] + mode: (), + version: i32, + capabilities: i64, + last: BlockIdExt, + last_utime: i32, + now: i32, + state_root_hash: Int256, + init: ZeroStateIdExt, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct CurrentTime { + now: i32, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct Version { + mode: i32, + version: i32, + capabilities: i64, + now: i32, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct BlockData { + id: BlockIdExt, + data: Vec, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct BlockState { + id: BlockIdExt, + root_hash: Int256, + file_hash: Int256, + data: Vec, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct BlockHeader { + id: BlockIdExt, + mode: i32, + header_proof: Vec, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct SendMsgStatus { + status: i32, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct AccountState { + id: BlockIdExt, + shardblk: BlockIdExt, + #[derivative(Debug(format_with = "fmt_bytes"))] + shard_proof: Vec, + #[derivative(Debug(format_with = "fmt_bytes"))] + proof: Vec, + #[derivative(Debug(format_with = "fmt_bytes"))] + state: Vec, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct RunMethodResult { + #[tl(flags)] + mode: (), + id: BlockIdExt, + shardblk: BlockIdExt, + #[tl(flags_bit = "mode.0")] + shard_proof: Option>, + #[tl(flags_bit = "mode.0")] + proof: Option>, + #[tl(flags_bit = "mode.1")] + state_proof: Option>, + #[tl(flags_bit = "mode.3")] + init_c7: Option>, + #[tl(flags_bit = "mode.4")] + lib_extras: Option>, + exit_code: i32, + #[tl(flags_bit = "mode.2")] + result: Option>, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct ShardInfo { + id: BlockIdExt, + shardblk: BlockIdExt, + shard_proof: Vec, + shard_descr: Vec, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct AllShardsInfo { + id: BlockIdExt, + proof: Vec, + data: Vec, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct TransactionInfo { + id: BlockIdExt, + proof: Vec, + transaction: Vec, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct TransactionList { + ids: Vec, + transactions: Vec, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct TransactionId { + #[tl(flags)] + mode: (), + #[tl(flags_bit = "mode.0")] + account: Option, + #[tl(flags_bit = "mode.1")] + lt: Option, + #[tl(flags_bit = "mode.2")] + hash: Option, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct BlockTransactions { + id: BlockIdExt, + req_count: i32, + incomplete: bool, + ids: Vec, + proof: Vec, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct PartialBlockProof { + complete: bool, + from: BlockIdExt, + to: BlockIdExt, + steps: Vec, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct ConfigInfo { + #[tl(flags)] + mode: (), + id: BlockIdExt, + state_proof: Vec, + config_proof: Vec, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct ValidatorStats { + #[tl(flags)] + mode: (), + id: BlockIdExt, + count: i32, + complete: bool, + state_proof: Vec, + data_proof: Vec, +} + +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct Error { + code: i32, + #[derivative(Debug(format_with = "String::fmt"))] + message: String, +} + #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] #[tl(boxed)] pub enum Response { /// liteServer.masterchainInfo last:tonNode.blockIdExt state_root_hash:int256 init:tonNode.zeroStateIdExt = liteServer.MasterchainInfo; #[tl(id = 0x85832881)] - MasterchainInfo { - last: BlockIdExt, - state_root_hash: Int256, - init: ZeroStateIdExt, - }, + MasterchainInfo(MasterchainInfo), /// liteServer.masterchainInfoExt mode:# version:int capabilities:long last:tonNode.blockIdExt last_utime:int now:int state_root_hash:int256 init:tonNode.zeroStateIdExt = liteServer.MasterchainInfoExt; #[tl(id = 0xa8cce0f5)] - MasterchainInfoExt { - #[tl(flags)] - mode: (), - version: i32, - capabilities: i64, - last: BlockIdExt, - last_utime: i32, - now: i32, - state_root_hash: Int256, - init: ZeroStateIdExt, - }, + MasterchainInfoExt(MasterchainInfoExt), /// liteServer.currentTime now:int = liteServer.CurrentTime; #[tl(id = 0xe953000d)] - CurrentTime { - now: i32, - }, + CurrentTime(CurrentTime), /// liteServer.version mode:# version:int capabilities:long now:int = liteServer.Version; #[tl(id = 0x5a0491e5)] - Version { - mode: i32, - version: i32, - capabilities: i64, - now: i32, - }, + Version(Version), /// liteServer.blockData id:tonNode.blockIdExt data:bytes = liteServer.BlockData; #[tl(id = 0xa574ed6c)] - BlockData { - id: BlockIdExt, - data: Vec, - }, + BlockData(BlockData), /// liteServer.blockState id:tonNode.blockIdExt root_hash:int256 file_hash:int256 data:bytes = liteServer.BlockState; #[tl(id = 0xabaddc0c)] - BlockState { - id: BlockIdExt, - root_hash: Int256, - file_hash: Int256, - data: Vec, - }, + BlockState(BlockState), /// liteServer.blockHeader id:tonNode.blockIdExt mode:# header_proof:bytes = liteServer.BlockHeader; #[tl(id = 0x752d8219)] - BlockHeader { - id: BlockIdExt, - mode: i32, - header_proof: Vec, - }, + BlockHeader(BlockHeader), /// liteServer.sendMsgStatus status:int = liteServer.SendMsgStatus; #[tl(id = 0x3950e597)] - SendMsgStatus { - status: i32, - }, + SendMsgStatus(SendMsgStatus), /// liteServer.accountState id:tonNode.blockIdExt shardblk:tonNode.blockIdExt shard_proof:bytes proof:bytes state:bytes = liteServer.AccountState; #[tl(id = 0x7079c751)] - AccountState { - id: BlockIdExt, - shardblk: BlockIdExt, - #[derivative(Debug(format_with = "fmt_bytes"))] - shard_proof: Vec, - #[derivative(Debug(format_with = "fmt_bytes"))] - proof: Vec, - #[derivative(Debug(format_with = "fmt_bytes"))] - state: Vec, - }, + AccountState(AccountState), /// liteServer.runMethodResult mode:# id:tonNode.blockIdExt shardblk:tonNode.blockIdExt shard_proof:mode.0?bytes proof:mode.0?bytes state_proof:mode.1?bytes init_c7:mode.3?bytes lib_extras:mode.4?bytes exit_code:int result:mode.2?bytes = liteServer.RunMethodResult; #[tl(id = 0xa39a616b)] - RunMethodResult { - #[tl(flags)] - mode: (), - id: BlockIdExt, - shardblk: BlockIdExt, - #[tl(flags_bit = "mode.0")] - shard_proof: Option>, - #[tl(flags_bit = "mode.0")] - proof: Option>, - #[tl(flags_bit = "mode.1")] - state_proof: Option>, - #[tl(flags_bit = "mode.3")] - init_c7: Option>, - #[tl(flags_bit = "mode.4")] - lib_extras: Option>, - exit_code: i32, - #[tl(flags_bit = "mode.2")] - result: Option>, - }, + RunMethodResult(RunMethodResult), /// liteServer.shardInfo id:tonNode.blockIdExt shardblk:tonNode.blockIdExt shard_proof:bytes shard_descr:bytes = liteServer.ShardInfo; #[tl(id = 0x9fe6cd84)] - ShardInfo { - id: BlockIdExt, - shardblk: BlockIdExt, - shard_proof: Vec, - shard_descr: Vec, - }, + ShardInfo(ShardInfo), /// liteServer.allShardsInfo id:tonNode.blockIdExt proof:bytes data:bytes = liteServer.AllShardsInfo; #[tl(id = 0x098fe72d)] - AllShardsInfo { - id: BlockIdExt, - proof: Vec, - data: Vec, - }, + AllShardsInfo(AllShardsInfo), /// liteServer.transactionInfo id:tonNode.blockIdExt proof:bytes transaction:bytes = liteServer.TransactionInfo; #[tl(id = 0x0edeed47)] - TransactionInfo { - id: BlockIdExt, - proof: Vec, - transaction: Vec, - }, + TransactionInfo(TransactionInfo), /// liteServer.transactionList ids:(vector tonNode.blockIdExt) transactions:bytes = liteServer.TransactionList; #[tl(id = 0x6f26c60b)] - TransactionList { - ids: Vec, - transactions: Vec, - }, + TransactionList(TransactionList), /// liteServer.transactionId mode:# account:mode.0?int256 lt:mode.1?long hash:mode.2?int256 = liteServer.TransactionId; #[tl(id = 0xb12f65af)] - TransactionId { - #[tl(flags)] - mode: (), - #[tl(flags_bit = "mode.0")] - account: Option, - #[tl(flags_bit = "mode.1")] - lt: Option, - #[tl(flags_bit = "mode.2")] - hash: Option, - }, + TransactionId(TransactionId), /// liteServer.blockTransactions id:tonNode.blockIdExt req_count:# incomplete:Bool ids:(vector liteServer.transactionId) proof:bytes = liteServer.BlockTransactions; #[tl(id = 0xbd8cad2b)] - BlockTransactions { - id: BlockIdExt, - req_count: i32, - incomplete: bool, - ids: Vec, - proof: Vec, - }, + BlockTransactions(BlockTransactions), /// liteServer.partialBlockProof complete:Bool from:tonNode.blockIdExt to:tonNode.blockIdExt steps:(vector liteServer.BlockLink) = liteServer.PartialBlockProof; #[tl(id = 0x8ed0d2c1)] - PartialBlockProof { - complete: bool, - from: BlockIdExt, - to: BlockIdExt, - steps: Vec, - }, + PartialBlockProof(PartialBlockProof), /// liteServer.configInfo mode:# id:tonNode.blockIdExt state_proof:bytes config_proof:bytes = liteServer.ConfigInfo; #[tl(id = 0xae7b272f)] - ConfigInfo { - #[tl(flags)] - mode: (), - id: BlockIdExt, - state_proof: Vec, - config_proof: Vec, - }, + ConfigInfo(ConfigInfo), /// liteServer.validatorStats mode:# id:tonNode.blockIdExt count:int complete:Bool state_proof:bytes data_proof:bytes = liteServer.ValidatorStats; #[tl(id = 0xb9f796d8)] - ValidatorStats { - #[tl(flags)] - mode: (), - id: BlockIdExt, - count: i32, - complete: bool, - state_proof: Vec, - data_proof: Vec, - }, + ValidatorStats(ValidatorStats), /// liteServer.error code:int message:string = liteServer.Error; #[tl(id = 0xbba9e148)] - Error { - code: i32, - #[derivative(Debug(format_with = "String::fmt"))] - message: String, - } + Error(Error), } \ No newline at end of file From b4434ec0ed86bd4d0c25bcc3963cf5086db0b32d Mon Sep 17 00:00:00 2001 From: Vladimir Lebedev Date: Mon, 25 Mar 2024 20:28:17 +0700 Subject: [PATCH 06/28] upd --- Cargo.lock | 109 +++++++++++++++++++++++++++---------- liteapi/Cargo.toml | 4 +- liteapi/examples/client.rs | 28 ++++++++++ liteapi/examples/server.rs | 44 +++++++++++++++ liteapi/examples/time.rs | 17 ------ liteapi/src/client.rs | 47 ---------------- liteapi/src/lib.rs | 5 +- liteapi/src/peer.rs | 77 ++++++++++++++++++++++++++ liteapi/src/server.rs | 57 ------------------- liteapi/src/tl/common.rs | 10 ++-- liteapi/src/tl/mod.rs | 26 +-------- liteapi/src/tl/tests.rs | 26 +++++++++ liteapi/src/tl/utils.rs | 9 ++- liteapi/src/types.rs | 8 +-- 14 files changed, 277 insertions(+), 190 deletions(-) create mode 100644 liteapi/examples/client.rs create mode 100644 liteapi/examples/server.rs delete mode 100644 liteapi/examples/time.rs delete mode 100644 liteapi/src/client.rs create mode 100644 liteapi/src/peer.rs delete mode 100644 liteapi/src/server.rs create mode 100644 liteapi/src/tl/tests.rs diff --git a/Cargo.lock b/Cargo.lock index 9bcc467..c7e3dad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -34,17 +34,21 @@ dependencies = [ [[package]] name = "adnl" version = "1.0.0" -source = "git+https://github.com/tonstack/adnl-rs?branch=server#96e4391815661126e0b0e9c185d7d2a1491b0cb7" +source = "git+https://github.com/tonstack/adnl-rs?branch=server#28bf4c2ec90c7704a2fd7e8a5113ff2b92bfcc60" dependencies = [ "aes", "ctr", "curve25519-dalek", + "futures", + "hex", "log", + "pin-project", "rand", "rand_core", "sha2", "thiserror", "tokio", + "tokio-util", "x25519-dalek", ] @@ -61,9 +65,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -102,9 +106,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "95d8e92cac0961e91dbd517496b00f7e9b92363dbe6d42c3198268323798860c" dependencies = [ "addr2line", "cc", @@ -392,7 +396,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -466,9 +470,9 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1676f435fc1dadde4d03e43f5d62b259e1ce5f40bd4ffb21db2b42ebe59c1382" +checksum = "c007b1ae3abe1cb6f85a16305acd418b7ca6343b953633fee2b76d8f108b830f" [[package]] name = "flate2" @@ -495,12 +499,54 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + [[package]] name = "futures-core" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + [[package]] name = "futures-macro" version = "0.3.30" @@ -509,7 +555,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -530,10 +576,13 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ + "futures-channel", "futures-core", + "futures-io", "futures-macro", "futures-sink", "futures-task", + "memchr", "pin-project-lite", "pin-utils", "slab", @@ -826,7 +875,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -842,22 +891,22 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -1052,9 +1101,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ede67b28608b4c60685c7d54122d4400d90f62b40caee7700e700380a390fa8" +checksum = "868e20fada228fefaf6b652e00cc73623d54f8171e7352c18bb281571f2d92da" [[package]] name = "rustls-webpki" @@ -1102,7 +1151,7 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -1170,9 +1219,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" @@ -1215,9 +1264,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.52" +version = "2.0.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" +checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" dependencies = [ "proc-macro2", "quote", @@ -1256,7 +1305,7 @@ checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -1295,7 +1344,7 @@ dependencies = [ "proc-macro2", "quote", "rustc-hash", - "syn 2.0.52", + "syn 2.0.53", "tl-scheme", ] @@ -1338,7 +1387,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -1379,8 +1428,10 @@ dependencies = [ "adnl 1.0.0", "base64 0.13.1", "derivative", + "futures", "hex", "log", + "pin-project", "rand", "thiserror", "tl-proto", @@ -1450,7 +1501,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -1562,7 +1613,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", "wasm-bindgen-shared", ] @@ -1584,7 +1635,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1805,5 +1856,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] diff --git a/liteapi/Cargo.toml b/liteapi/Cargo.toml index 708ad9e..9df92ad 100644 --- a/liteapi/Cargo.toml +++ b/liteapi/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -adnl = { git = "https://github.com/tonstack/adnl-rs", branch = "server", features = ["dalek"] } +adnl = { git = "https://github.com/tonstack/adnl-rs", branch = "server" } tl-proto = { git = "https://github.com/hacker-volodya/tl-proto", features = ["bytes"] } derivative = "2.2.0" log = '0.4.14' @@ -15,6 +15,8 @@ tower = { version = "0.4.13", features = ["make", "util"] } tokio-util = { version = "0.7.10", features = ["codec"] } tokio-tower = "0.6.0" rand = "0.8.5" +futures = "0.3" +pin-project = "1" [dev-dependencies] ureq = "2.4.0" diff --git a/liteapi/examples/client.rs b/liteapi/examples/client.rs new file mode 100644 index 0000000..25e5b5b --- /dev/null +++ b/liteapi/examples/client.rs @@ -0,0 +1,28 @@ +use adnl::{AdnlPeer, AdnlRawPublicKey}; +use tokio_tower::multiplex; +use ton_liteapi::peer::LitePeer; +use ton_liteapi::tl::request::{LiteQuery, Request, WrappedRequest}; +use tower::{Service, ServiceExt}; + +#[tokio::main] +async fn main() -> Result<(), Box> { + let server_public = AdnlRawPublicKey::try_from(&*hex::decode("691a14528fb2911839649c489cb4cbec1f4aa126c244c0ea2ac294eb568a7037")?)?; + let ls_ip = "127.0.0.1"; + let ls_port: u16 = 8080; + let adnl = AdnlPeer::connect(&server_public, (ls_ip, ls_port)).await?; + let lite = LitePeer::new(adnl); + let mut client = multiplex::Client::<_, tokio_tower::Error<_, _>, _>::new(lite); + let message = ton_liteapi::tl::adnl::Message::Query { + query: LiteQuery { + wrapped_request: WrappedRequest { wait_masterchain_seqno: None, request: Request::GetTime } + }, + query_id: Default::default(), + }; + let result = client.ready().await?.call(message.clone()).await?; + println!("{:?}", result); + let result = client.ready().await?.call(message.clone()).await?; + println!("{:?}", result); + let result = client.ready().await?.call(message.clone()).await?; + println!("{:?}", result); + Ok(()) +} \ No newline at end of file diff --git a/liteapi/examples/server.rs b/liteapi/examples/server.rs new file mode 100644 index 0000000..d6652c2 --- /dev/null +++ b/liteapi/examples/server.rs @@ -0,0 +1,44 @@ +use std::{env, error::Error}; + +use adnl::{AdnlPeer, AdnlPrivateKey, AdnlPublicKey}; +use tokio::net::TcpListener; +use tokio_tower::pipeline::Server; +use ton_liteapi::{peer::LitePeer, tl::{adnl::Message, response}, types::LiteError}; +use x25519_dalek::StaticSecret; + +async fn handler(req: Message) -> Result { + let (query_id, req) = match req { + Message::Query { query_id, query } => (query_id, query), + _ => return Err(LiteError::UnexpectedMessage) + }; + println!("Received frame: {:?}, tag = {}", &req, query_id); + + let response = Message::Answer { query_id, answer: response::Response::CurrentTime { now: 1234 } }; + Ok(response) +} + +#[tokio::main] +async fn main() -> Result<(), Box> { + // ADNL: get private key from environment variable KEY or use default insecure one + let private_key_hex = env::var("KEY").unwrap_or_else(|_| "f0971651aec4bb0d65ec3861c597687fda9c1e7d2ee8a93acb9a131aa9f3aee7".to_string()); + let private_key_bytes: [u8; 32] = hex::decode(private_key_hex)?.try_into().unwrap(); + let private_key = StaticSecret::from(private_key_bytes); + + let listener = TcpListener::bind(&"127.0.0.1:8080").await?; + + // ADNL: print public key and adnl address associated with given private key + println!("Public key is: {}", hex::encode(private_key.public().edwards_repr())); + println!("Address is: {}", hex::encode(private_key.public().address().as_bytes())); + + loop { + let (socket, _) = listener.accept().await?; + let private_key = private_key.clone(); + tokio::spawn(async move { + // ADNL: handle handshake + let adnl = AdnlPeer::handle_handshake(socket, &private_key).await.expect("handshake failed"); + // liteapi: wrap raw bytes into lite messages and spawn handler for them + let lite = LitePeer::new(adnl); + Server::new(lite, tower::service_fn(handler)).await.expect("server failed"); + }); + } +} \ No newline at end of file diff --git a/liteapi/examples/time.rs b/liteapi/examples/time.rs deleted file mode 100644 index 3aa4882..0000000 --- a/liteapi/examples/time.rs +++ /dev/null @@ -1,17 +0,0 @@ -use adnl::{AdnlPeer, AdnlRawPublicKey}; -use ton_liteapi::{client::SingleClient, encoding::LiteCodec, tl::request::{LiteQuery, Request, WrappedRequest}}; -use x25519_dalek::StaticSecret; -use tokio_util::codec::Decoder; - -#[tokio::main] -async fn main() -> Result<(), Box> { - let server_public = AdnlRawPublicKey::try_from(&*base64::decode("JhXt7H1dZTgxQTIyGiYV4f9VUARuDxFl/1kVBjLSMB8=")?)?; - let ls_ip = "65.21.74.140"; - let ls_port = 46427; - let adnl = AdnlPeer::connect(&server_public, (ls_ip, ls_port)).await?; - let (mut sink, input) = LiteCodec.framed(adnl).split(); - let mut client = SingleClient::connect((ls_ip, ls_port), &StaticSecret::random_from_rng(rand::thread_rng()), &server_public).await?; - let result = client.query(WrappedRequest { wait_masterchain_seqno: None, request: Request::GetTime }).await?; - println!("{:?}", result); - Ok(()) -} \ No newline at end of file diff --git a/liteapi/src/client.rs b/liteapi/src/client.rs deleted file mode 100644 index 6379999..0000000 --- a/liteapi/src/client.rs +++ /dev/null @@ -1,47 +0,0 @@ -use adnl::{AdnlBuilder, AdnlPeer, AdnlPrivateKey, AdnlPublicKey}; -use tokio::{io::{AsyncReadExt, AsyncWriteExt}, net::ToSocketAddrs}; - -use crate::{tl::{adnl::Message, common::Int256, request::{LiteQuery, WrappedRequest}, response::Response}, types::LiteError}; - -pub struct SingleClient { - peer: AdnlPeer -} - -impl SingleClient { - pub fn from_adnl(peer: AdnlPeer) -> Self { - Self { peer } - } - - pub async fn connect_over_transport(transport: T, client_private: &S, server_public: &P) -> Result where S: AdnlPrivateKey, P: AdnlPublicKey { - let peer = AdnlBuilder::with_random_aes_params(&mut rand::rngs::OsRng) - .perform_ecdh(client_private, server_public) - .perform_handshake(transport) - .await - .map_err(|e| LiteError::AdnlError(e))?; - Ok(Self::from_adnl(peer)) - } - - pub async fn query(&mut self, request: WrappedRequest) -> Result { - let query_id = Int256::random(); - let query = Message::Query { query_id: query_id.clone(), query: LiteQuery { wrapped_request: request } }; - self.peer.send(&mut tl_proto::serialize(query)).await.map_err(|e| LiteError::AdnlError(e))?; - let mut answer = Vec::with_capacity(8192); - self.peer.receive(&mut answer).await.map_err(|e| LiteError::AdnlError(e))?; - let message = tl_proto::deserialize::(&answer).map_err(|e| LiteError::TlError(e))?; - if let Message::Answer { answer: response, query_id: recv_query_id } = message { - if query_id != recv_query_id { - return Err(LiteError::UnexpectedMessage); - } - Ok(response) - } else { - Err(LiteError::UnexpectedMessage) - } - } -} - -impl SingleClient { - pub async fn connect(addr: A, client_private: &S, server_public: &P) -> Result where A: ToSocketAddrs, P: AdnlPublicKey, S: AdnlPrivateKey { - let tcp = tokio::net::TcpStream::connect(addr).await.map_err(|e| LiteError::IoError(e))?; - Self::connect_over_transport(tcp, client_private, server_public).await - } -} \ No newline at end of file diff --git a/liteapi/src/lib.rs b/liteapi/src/lib.rs index f7483c7..a2d6523 100644 --- a/liteapi/src/lib.rs +++ b/liteapi/src/lib.rs @@ -1,5 +1,4 @@ pub mod tl; pub mod types; -pub mod client; -pub mod server; -pub mod encoding; \ No newline at end of file +pub mod encoding; +pub mod peer; \ No newline at end of file diff --git a/liteapi/src/peer.rs b/liteapi/src/peer.rs new file mode 100644 index 0000000..6add688 --- /dev/null +++ b/liteapi/src/peer.rs @@ -0,0 +1,77 @@ +use std::task::Poll; + +use adnl::AdnlError; +use futures::{Sink, Stream}; +use pin_project::pin_project; +use tokio_tower::multiplex::TagStore; +use tokio_util::bytes::Bytes; + +use crate::{tl::{adnl::Message, common::Int256}, types::LiteError}; + +#[pin_project] +pub struct LitePeer { + #[pin] + inner: T, +} + +impl LitePeer { + pub fn new(inner: T) -> Self { + Self { inner } + } +} + +impl Sink for LitePeer where T: Sink { + type Error = LiteError; + + fn poll_ready(self: std::pin::Pin<&mut Self>, cx: &mut std::task::Context<'_>) -> std::task::Poll> { + self.project().inner.poll_ready(cx).map_err(|e| LiteError::TransportError(e)) + } + + fn start_send(self: std::pin::Pin<&mut Self>, item: Message) -> Result<(), Self::Error> { + let data = tl_proto::serialize(item).into(); + self.project().inner.start_send(data).map_err(|e| LiteError::TransportError(e.into())) + } + + fn poll_flush(self: std::pin::Pin<&mut Self>, cx: &mut std::task::Context<'_>) -> std::task::Poll> { + self.project().inner.poll_flush(cx).map_err(|e| LiteError::TransportError(e)) + } + + fn poll_close(self: std::pin::Pin<&mut Self>, cx: &mut std::task::Context<'_>) -> std::task::Poll> { + self.project().inner.poll_close(cx).map_err(|e| LiteError::TransportError(e)) + } +} + +impl Stream for LitePeer where T: Stream> { + type Item = Result; + + fn poll_next(self: std::pin::Pin<&mut Self>, cx: &mut std::task::Context<'_>) -> std::task::Poll> { + let inner = self.project().inner.poll_next(cx); + match inner { + Poll::Ready(Some(Ok(bytes))) => { + let decoded = tl_proto::deserialize(&bytes); + Poll::Ready(Some(decoded.map_err(|e| LiteError::TlError(e)))) + }, + Poll::Ready(Some(Err(e))) => Poll::Ready(Some(Err(LiteError::TransportError(e)))), + Poll::Ready(None) => Poll::Ready(None), + Poll::Pending => Poll::Pending, + } + } +} + +impl TagStore for LitePeer { + type Tag = Int256; + + fn assign_tag(self: std::pin::Pin<&mut Self>, r: &mut Message) -> Self::Tag { + match r { + Message::Answer { query_id, .. } => { *query_id = Int256::random(); query_id.clone() }, + Message::Query { query_id, .. } => { *query_id = Int256::random(); query_id.clone() }, + } + } + + fn finish_tag(self: std::pin::Pin<&mut Self>, r: &Message) -> Self::Tag { + match r { + Message::Answer { query_id, .. } => query_id.clone(), + Message::Query { query_id, .. } => query_id.clone(), + } + } +} \ No newline at end of file diff --git a/liteapi/src/server.rs b/liteapi/src/server.rs deleted file mode 100644 index 46d99ff..0000000 --- a/liteapi/src/server.rs +++ /dev/null @@ -1,57 +0,0 @@ -use std::{convert::Infallible, error::Error, future::poll_fn, net::SocketAddr, time::Duration}; - -use adnl::{AdnlError, AdnlPeer, AdnlPrivateKey}; -use log::error; -use tokio::{io::{self, AsyncReadExt, AsyncWriteExt}, net::{TcpListener, TcpStream}}; -use tower::{Service, MakeService, ServiceExt}; - -use crate::{tl::{adnl::Message, request::{Request, WrappedRequest}, response::Response}, types::{LiteError, LiteService}}; - -pub struct Connection { - peer: AdnlPeer -} - -impl Connection { - pub fn from_adnl(peer: AdnlPeer) -> Self { - Self { peer } - } - - pub async fn from_transport(transport: T, server_private: &S) -> Result where S: AdnlPrivateKey { - Ok(Self { peer: AdnlPeer::handle_handshake(transport, server_private).await? }) - } -} - -fn is_connection_error(e: &io::Error) -> bool { - matches!( - e.kind(), - io::ErrorKind::ConnectionRefused - | io::ErrorKind::ConnectionAborted - | io::ErrorKind::ConnectionReset - ) -} - -async fn tcp_accept(listener: &TcpListener) -> Option<(TcpStream, SocketAddr)> { - match listener.accept().await { - Ok(conn) => Some(conn), - Err(e) => { - if is_connection_error(&e) { - return None; - } - - // [From `hyper::Server` in 0.14](https://github.com/hyperium/hyper/blob/v0.14.27/src/server/tcp.rs#L186) - // - // > A possible scenario is that the process has hit the max open files - // > allowed, and so trying to accept a new connection will fail with - // > `EMFILE`. In some cases, it's preferable to just wait for some time, if - // > the application will likely close some files (or connections), and try - // > to accept the connection again. If this option is `true`, the error - // > will be logged at the `error` level, since it is still a big deal, - // > and then the listener will sleep for 1 second. - // - // hyper allowed customizing this but axum does not. - error!("accept error: {e}"); - tokio::time::sleep(Duration::from_secs(1)).await; - None - } - } -} \ No newline at end of file diff --git a/liteapi/src/tl/common.rs b/liteapi/src/tl/common.rs index 66bef96..5279827 100644 --- a/liteapi/src/tl/common.rs +++ b/liteapi/src/tl/common.rs @@ -1,5 +1,5 @@ use core::fmt; -use std::str::FromStr; +use std::{fmt::Display, str::FromStr}; use derivative::Derivative; use hex::FromHex; @@ -34,7 +34,7 @@ impl String { /// int256 8*[ int ] = Int256; #[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] +#[derivative(Debug, Clone, PartialEq, Eq, Default)] pub struct Int256(#[derivative(Debug(format_with = "fmt_bytes"))] pub [u8; 32]); impl FromStr for Int256 { @@ -44,9 +44,9 @@ impl FromStr for Int256 { type Err = hex::FromHexError; } -impl ToString for Int256 { - fn to_string(&self) -> std::string::String { - hex::encode(self.0) +impl Display for Int256 { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(&self.to_hex()) } } diff --git a/liteapi/src/tl/mod.rs b/liteapi/src/tl/mod.rs index 9f208e9..5e22188 100644 --- a/liteapi/src/tl/mod.rs +++ b/liteapi/src/tl/mod.rs @@ -5,28 +5,4 @@ pub mod response; pub mod utils; #[cfg(test)] -mod tests { - use std::error::Error; - - use tests::{adnl::Message, common::Int256, request::WrappedRequest}; - - use crate::tl::*; - - use self::request::Request; - - #[test] - fn test_time() -> Result<(), Box> { - let raw = hex::decode("7af98bb435263e6c95d6fecb497dfd0aa5f031e7d412986b5ce720496db512052e8f2d100cdf068c7904345aad16000000000000")?; - let constructed = tl_proto::serialize(Message::Query { - query_id: Int256::from_hex("35263e6c95d6fecb497dfd0aa5f031e7d412986b5ce720496db512052e8f2d10")?, - query: request::LiteQuery { - wrapped_request: WrappedRequest { - request: Request::GetTime, - wait_masterchain_seqno: None, - } - } - }); - assert_eq!(raw, constructed); - Ok(()) - } -} +mod tests; diff --git a/liteapi/src/tl/tests.rs b/liteapi/src/tl/tests.rs new file mode 100644 index 0000000..235c319 --- /dev/null +++ b/liteapi/src/tl/tests.rs @@ -0,0 +1,26 @@ +use std::error::Error; + +use tests::{adnl::Message, common::Int256, request::WrappedRequest}; + +use crate::tl::*; + +use self::request::Request; + +#[test] +fn test_time() -> Result<(), Box> { + let raw = hex::decode("7af98bb435263e6c95d6fecb497dfd0aa5f031e7d412986b5ce720496db512052e8f2d100cdf068c7904345aad16000000000000")?; + let message = Message::Query { + query_id: Int256::from_hex("35263e6c95d6fecb497dfd0aa5f031e7d412986b5ce720496db512052e8f2d10")?, + query: request::LiteQuery { + wrapped_request: WrappedRequest { + request: Request::GetTime, + wait_masterchain_seqno: None, + } + } + }; + let constructed = tl_proto::serialize(message.clone()); + assert_eq!(raw, constructed); + let deserialized = tl_proto::deserialize::(raw.as_slice())?; + assert_eq!(deserialized, message); + Ok(()) +} \ No newline at end of file diff --git a/liteapi/src/tl/utils.rs b/liteapi/src/tl/utils.rs index f05d81d..ba245e2 100644 --- a/liteapi/src/tl/utils.rs +++ b/liteapi/src/tl/utils.rs @@ -1,7 +1,14 @@ use tl_proto::{TlRead, TlResult}; pub fn lossy_read<'tl, T: TlRead<'tl>>(packet: &'tl [u8], offset: &mut usize) -> TlResult> { - Ok(T::read_from(packet, offset).ok()) + let orig_offset = *offset; + let result = T::read_from(packet, offset); + if let Ok(x) = result { + Ok(Some(x)) + } else { + *offset = orig_offset; + Ok(None) + } } pub fn fmt_string(bytes: &[u8], f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { diff --git a/liteapi/src/types.rs b/liteapi/src/types.rs index c2388c2..8e4272f 100644 --- a/liteapi/src/types.rs +++ b/liteapi/src/types.rs @@ -3,7 +3,7 @@ use thiserror::Error; use tl_proto::TlError; use tower::Service; -use crate::tl::{request::{Request, WrappedRequest}, response::Response}; +use crate::tl::{request::WrappedRequest, response::Response}; #[derive(Debug, Error)] pub enum LiteError { @@ -13,10 +13,8 @@ pub enum LiteError { TlError(TlError), #[error("Unexpected TL message")] UnexpectedMessage, - #[error("ADNL error")] - AdnlError(AdnlError), - #[error("IO error")] - IoError(std::io::Error), + #[error("Transport error")] + TransportError(AdnlError), } pub trait LiteService: Service{} \ No newline at end of file From 0467eab176b0e2854660157730b47bc92804308e Mon Sep 17 00:00:00 2001 From: Vladimir Lebedev Date: Mon, 25 Mar 2024 20:34:58 +0700 Subject: [PATCH 07/28] remove codec --- liteapi/Cargo.toml | 2 +- liteapi/src/encoding.rs | 39 --------------------------------------- liteapi/src/lib.rs | 1 - 3 files changed, 1 insertion(+), 41 deletions(-) delete mode 100644 liteapi/src/encoding.rs diff --git a/liteapi/Cargo.toml b/liteapi/Cargo.toml index 3f90063..495b0c7 100644 --- a/liteapi/Cargo.toml +++ b/liteapi/Cargo.toml @@ -12,7 +12,7 @@ hex = "0.4.3" thiserror = "1" tokio = { version = "1.36", features = ["net", "io-util"] } tower = { version = "0.4.13", features = ["make", "util"] } -tokio-util = { version = "0.7.10", features = ["codec"] } +tokio-util = { version = "0.7.10" } tokio-tower = "0.6.0" rand = "0.8.5" futures = "0.3" diff --git a/liteapi/src/encoding.rs b/liteapi/src/encoding.rs deleted file mode 100644 index 8939266..0000000 --- a/liteapi/src/encoding.rs +++ /dev/null @@ -1,39 +0,0 @@ -use tl_proto::{TlError, TlWrite}; -use tokio_util::{bytes::BytesMut, codec::{Decoder, Encoder}}; - -use crate::tl::adnl::Message; - -pub struct LiteCodec; - -impl Decoder for LiteCodec { - type Item = Message; - type Error = TlCodecError; - - fn decode(&mut self, src: &mut BytesMut) -> Result, Self::Error> { - if src.len() == 0 { - return Ok(None) - } - Ok(Some(tl_proto::deserialize::(src).map_err(|e| TlCodecError::TlError(e))?)) - } -} - -impl Encoder for LiteCodec { - type Error = TlCodecError; - - fn encode(&mut self, item: Message, dst: &mut BytesMut) -> Result<(), Self::Error> { - item.write_to(dst); - Ok(()) - } -} - -#[derive(Debug)] -pub enum TlCodecError { - TlError(TlError), - IoError(std::io::Error), -} - -impl From for TlCodecError { - fn from(value: std::io::Error) -> Self { - TlCodecError::IoError(value) - } -} \ No newline at end of file diff --git a/liteapi/src/lib.rs b/liteapi/src/lib.rs index a2d6523..7518031 100644 --- a/liteapi/src/lib.rs +++ b/liteapi/src/lib.rs @@ -1,4 +1,3 @@ pub mod tl; pub mod types; -pub mod encoding; pub mod peer; \ No newline at end of file From cc927dea1315919633d616edd51010aaec2be9cc Mon Sep 17 00:00:00 2001 From: Vladimir Lebedev Date: Tue, 26 Mar 2024 15:46:31 +0700 Subject: [PATCH 08/28] upd --- Cargo.lock | 1 + liteapi/Cargo.toml | 2 +- liteapi/examples/server.rs | 33 ++++---- liteapi/src/layers/mod.rs | 0 liteapi/src/lib.rs | 3 +- liteapi/src/server.rs | 59 ++++++++++++++ liteapi/src/tl/request.rs | 94 +++++++++++----------- liteapi/src/tl/response.rs | 156 ++++++++++++++++++------------------- liteapi/src/types.rs | 8 +- 9 files changed, 207 insertions(+), 149 deletions(-) create mode 100644 liteapi/src/layers/mod.rs create mode 100644 liteapi/src/server.rs diff --git a/Cargo.lock b/Cargo.lock index a65c3b2..0d264be 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1467,6 +1467,7 @@ dependencies = [ "pin-project", "pin-project-lite", "tokio", + "tokio-util", "tower-layer", "tower-service", "tracing", diff --git a/liteapi/Cargo.toml b/liteapi/Cargo.toml index 495b0c7..765dc84 100644 --- a/liteapi/Cargo.toml +++ b/liteapi/Cargo.toml @@ -11,7 +11,7 @@ log = '0.4.14' hex = "0.4.3" thiserror = "1" tokio = { version = "1.36", features = ["net", "io-util"] } -tower = { version = "0.4.13", features = ["make", "util"] } +tower = { version = "0.4.13", features = ["make", "util", "buffer"] } tokio-util = { version = "0.7.10" } tokio-tower = "0.6.0" rand = "0.8.5" diff --git a/liteapi/examples/server.rs b/liteapi/examples/server.rs index d6652c2..7267851 100644 --- a/liteapi/examples/server.rs +++ b/liteapi/examples/server.rs @@ -1,9 +1,13 @@ -use std::{env, error::Error}; +use std::env; +use std::error::Error; -use adnl::{AdnlPeer, AdnlPrivateKey, AdnlPublicKey}; -use tokio::net::TcpListener; -use tokio_tower::pipeline::Server; -use ton_liteapi::{peer::LitePeer, tl::{adnl::Message, response}, types::LiteError}; +use adnl::{AdnlPrivateKey, AdnlPublicKey}; +use ton_liteapi::server::serve; +use ton_liteapi::types::LiteError; +use ton_liteapi::tl::response::CurrentTime; +use ton_liteapi::tl::adnl::Message; +use ton_liteapi::tl::response::Response; +use tower::{buffer::Buffer, make::Shared, service_fn}; use x25519_dalek::StaticSecret; async fn handler(req: Message) -> Result { @@ -13,7 +17,7 @@ async fn handler(req: Message) -> Result { }; println!("Received frame: {:?}, tag = {}", &req, query_id); - let response = Message::Answer { query_id, answer: response::Response::CurrentTime { now: 1234 } }; + let response = Message::Answer { query_id, answer: Response::CurrentTime(CurrentTime { now: 1234 }) }; Ok(response) } @@ -24,21 +28,12 @@ async fn main() -> Result<(), Box> { let private_key_bytes: [u8; 32] = hex::decode(private_key_hex)?.try_into().unwrap(); let private_key = StaticSecret::from(private_key_bytes); - let listener = TcpListener::bind(&"127.0.0.1:8080").await?; - // ADNL: print public key and adnl address associated with given private key println!("Public key is: {}", hex::encode(private_key.public().edwards_repr())); println!("Address is: {}", hex::encode(private_key.public().address().as_bytes())); - loop { - let (socket, _) = listener.accept().await?; - let private_key = private_key.clone(); - tokio::spawn(async move { - // ADNL: handle handshake - let adnl = AdnlPeer::handle_handshake(socket, &private_key).await.expect("handshake failed"); - // liteapi: wrap raw bytes into lite messages and spawn handler for them - let lite = LitePeer::new(adnl); - Server::new(lite, tower::service_fn(handler)).await.expect("server failed"); - }); - } + let buffer = Buffer::new(service_fn(handler), 100); + + serve(&("127.0.0.1", 8080), private_key, Shared::new(buffer)).await?; + Ok(()) } \ No newline at end of file diff --git a/liteapi/src/layers/mod.rs b/liteapi/src/layers/mod.rs new file mode 100644 index 0000000..e69de29 diff --git a/liteapi/src/lib.rs b/liteapi/src/lib.rs index 7518031..3f13264 100644 --- a/liteapi/src/lib.rs +++ b/liteapi/src/lib.rs @@ -1,3 +1,4 @@ pub mod tl; pub mod types; -pub mod peer; \ No newline at end of file +pub mod peer; +pub mod server; \ No newline at end of file diff --git a/liteapi/src/server.rs b/liteapi/src/server.rs new file mode 100644 index 0000000..94126d4 --- /dev/null +++ b/liteapi/src/server.rs @@ -0,0 +1,59 @@ + +use std::future::poll_fn; +use std::io::ErrorKind; +use std::net::SocketAddr; +use std::time::Duration; + +use adnl::AdnlPeer; +use adnl::AdnlPrivateKey; +use log::error; +use tokio::net::TcpListener; +use tokio::net::ToSocketAddrs; +use tokio_tower::multiplex::Server; +use tower::MakeService; +use tower::Service; + +use crate::peer::LitePeer; +use crate::tl::adnl::Message; +use crate::types::LiteError; + +pub async fn serve(addr: &A, private_key: S, mut service_maker: M) -> Result<(), Box> + where A: ToSocketAddrs, + M: MakeService + Send, + M::Error: std::fmt::Debug, + M::MakeError: std::error::Error, + M::Service: Send + 'static, + >::Future: Send, + S: AdnlPrivateKey + Clone + Send + Sync + 'static { + let listener = TcpListener::bind(addr).await?; + + loop { + let (socket, addr) = match listener.accept().await { + Ok((socket, addr)) => (socket, addr), + Err(e) => { + // [From `hyper::Server` in 0.14](https://github.com/hyperium/hyper/blob/v0.14.27/src/server/tcp.rs#L186) + // + // > A possible scenario is that the process has hit the max open files + // > allowed, and so trying to accept a new connection will fail with + // > `EMFILE`. In some cases, it's preferable to just wait for some time, if + // > the application will likely close some files (or connections), and try + // > to accept the connection again. If this option is `true`, the error + // > will be logged at the `error` level, since it is still a big deal, + // > and then the listener will sleep for 1 second. + if !matches!(e.kind(), ErrorKind::ConnectionRefused | ErrorKind::ConnectionAborted | ErrorKind::ConnectionReset) { + error!("accept error: {e}"); + tokio::time::sleep(Duration::from_secs(1)).await; + } + continue; + } + }; + poll_fn(|cx| service_maker.poll_ready(cx)).await.expect("polling service maker failed"); + let service = service_maker.make_service(addr).await.expect("making service failed"); + let private_key = private_key.clone(); + tokio::spawn(async move { + let adnl = AdnlPeer::handle_handshake(socket, &private_key).await.expect("handshake failed"); + let lite = LitePeer::new(adnl); + Server::new(lite, service).await.expect("server failed"); + }); + } +} \ No newline at end of file diff --git a/liteapi/src/tl/request.rs b/liteapi/src/tl/request.rs index d818269..41a8f92 100644 --- a/liteapi/src/tl/request.rs +++ b/liteapi/src/tl/request.rs @@ -41,146 +41,146 @@ pub struct WaitMasterchainSeqno { #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct GetMasterchainInfoExt { - mode: u32 + pub mode: u32 } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct GetBlock { - id: BlockIdExt, + pub id: BlockIdExt, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct GetState { - id: BlockIdExt, + pub id: BlockIdExt, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct GetBlockHeader { - id: BlockIdExt, - mode: u32, + pub id: BlockIdExt, + pub mode: u32, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct SendMessage { - body: Vec, + pub body: Vec, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct GetAccountState { - id: BlockIdExt, - account: AccountId, + pub id: BlockIdExt, + pub account: AccountId, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct RunSmcMethod { - mode: u32, - id: BlockIdExt, - account: AccountId, - method_id: i64, - params: Vec, + pub mode: u32, + pub id: BlockIdExt, + pub account: AccountId, + pub method_id: i64, + pub params: Vec, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct GetShardInfo { - id: BlockIdExt, - workchain: i32, - shard: u64, - exact: bool, + pub id: BlockIdExt, + pub workchain: i32, + pub shard: u64, + pub exact: bool, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct GetAllShardsInfo { - id: BlockIdExt, + pub id: BlockIdExt, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct GetOneTransaction { - id: BlockIdExt, - account: AccountId, - lt: i64, + pub id: BlockIdExt, + pub account: AccountId, + pub lt: i64, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct GetTransactions { - count: i32, - account: AccountId, - lt: i64, - hash: Int256, + pub count: i32, + pub account: AccountId, + pub lt: i64, + pub hash: Int256, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct LookupBlock { #[tl(flags)] - mode: (), - id: BlockId, + pub mode: (), + pub id: BlockId, #[tl(flags_bit = "mode.1")] - lt: Option, + pub lt: Option, #[tl(flags_bit = "mode.2")] - utime: Option, + pub utime: Option, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct ListBlockTransactions { - id: BlockIdExt, + pub id: BlockIdExt, #[tl(flags)] - mode: (), - count: i32, + pub mode: (), + pub count: i32, #[tl(flags_bit = "mode.7")] - after: Option, + pub after: Option, #[tl(flags_bit = "mode.6")] - reverse_order: Option<()>, + pub reverse_order: Option<()>, #[tl(flags_bit = "mode.5")] - want_proof: Option<()>, + pub want_proof: Option<()>, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct GetBlockProof { #[tl(flags)] - mode: (), - known_block: BlockIdExt, + pub mode: (), + pub known_block: BlockIdExt, #[tl(flags_bit = "mode.0")] - target_block: Option, + pub target_block: Option, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct GetConfigAll { - mode: i32, - id: BlockIdExt, + pub mode: i32, + pub id: BlockIdExt, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct GetConfigParams { - mode: i32, - id: BlockIdExt, - param_list: Vec, + pub mode: i32, + pub id: BlockIdExt, + pub param_list: Vec, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct GetValidatorStats { #[tl(flags)] - mode: (), + pub mode: (), id: BlockIdExt, - limit: i32, + pub limit: i32, #[tl(flags_bit = "mode.0")] - start_after: Option, + pub start_after: Option, #[tl(flags_bit = "mode.2")] - modified_after: Option, + pub modified_after: Option, } #[derive(TlRead, TlWrite, Derivative)] diff --git a/liteapi/src/tl/response.rs b/liteapi/src/tl/response.rs index 71c63dc..d1f87b3 100644 --- a/liteapi/src/tl/response.rs +++ b/liteapi/src/tl/response.rs @@ -7,197 +7,197 @@ use super::utils::*; #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct MasterchainInfo { - last: BlockIdExt, - state_root_hash: Int256, - init: ZeroStateIdExt, + pub last: BlockIdExt, + pub state_root_hash: Int256, + pub init: ZeroStateIdExt, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct MasterchainInfoExt { #[tl(flags)] - mode: (), - version: i32, - capabilities: i64, - last: BlockIdExt, - last_utime: i32, - now: i32, - state_root_hash: Int256, - init: ZeroStateIdExt, + pub mode: (), + pub version: i32, + pub capabilities: i64, + pub last: BlockIdExt, + pub last_utime: i32, + pub now: i32, + pub state_root_hash: Int256, + pub init: ZeroStateIdExt, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct CurrentTime { - now: i32, + pub now: i32, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct Version { - mode: i32, - version: i32, - capabilities: i64, - now: i32, + pub mode: i32, + pub version: i32, + pub capabilities: i64, + pub now: i32, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct BlockData { - id: BlockIdExt, - data: Vec, + pub id: BlockIdExt, + pub data: Vec, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct BlockState { - id: BlockIdExt, - root_hash: Int256, - file_hash: Int256, - data: Vec, + pub id: BlockIdExt, + pub root_hash: Int256, + pub file_hash: Int256, + pub data: Vec, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct BlockHeader { - id: BlockIdExt, - mode: i32, - header_proof: Vec, + pub id: BlockIdExt, + pub mode: i32, + pub header_proof: Vec, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct SendMsgStatus { - status: i32, + pub status: i32, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct AccountState { - id: BlockIdExt, - shardblk: BlockIdExt, + pub id: BlockIdExt, + pub shardblk: BlockIdExt, #[derivative(Debug(format_with = "fmt_bytes"))] - shard_proof: Vec, + pub shard_proof: Vec, #[derivative(Debug(format_with = "fmt_bytes"))] - proof: Vec, + pub proof: Vec, #[derivative(Debug(format_with = "fmt_bytes"))] - state: Vec, + pub state: Vec, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct RunMethodResult { #[tl(flags)] - mode: (), - id: BlockIdExt, - shardblk: BlockIdExt, + pub mode: (), + pub id: BlockIdExt, + pub shardblk: BlockIdExt, #[tl(flags_bit = "mode.0")] - shard_proof: Option>, + pub shard_proof: Option>, #[tl(flags_bit = "mode.0")] - proof: Option>, + pub proof: Option>, #[tl(flags_bit = "mode.1")] - state_proof: Option>, + pub state_proof: Option>, #[tl(flags_bit = "mode.3")] - init_c7: Option>, + pub init_c7: Option>, #[tl(flags_bit = "mode.4")] - lib_extras: Option>, - exit_code: i32, + pub lib_extras: Option>, + pub exit_code: i32, #[tl(flags_bit = "mode.2")] - result: Option>, + pub result: Option>, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct ShardInfo { - id: BlockIdExt, - shardblk: BlockIdExt, - shard_proof: Vec, - shard_descr: Vec, + pub id: BlockIdExt, + pub shardblk: BlockIdExt, + pub shard_proof: Vec, + pub shard_descr: Vec, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct AllShardsInfo { - id: BlockIdExt, - proof: Vec, - data: Vec, + pub id: BlockIdExt, + pub proof: Vec, + pub data: Vec, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct TransactionInfo { - id: BlockIdExt, - proof: Vec, - transaction: Vec, + pub id: BlockIdExt, + pub proof: Vec, + pub transaction: Vec, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct TransactionList { - ids: Vec, - transactions: Vec, + pub ids: Vec, + pub transactions: Vec, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct TransactionId { #[tl(flags)] - mode: (), + pub mode: (), #[tl(flags_bit = "mode.0")] - account: Option, + pub account: Option, #[tl(flags_bit = "mode.1")] - lt: Option, + pub lt: Option, #[tl(flags_bit = "mode.2")] - hash: Option, + pub hash: Option, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct BlockTransactions { - id: BlockIdExt, - req_count: i32, - incomplete: bool, - ids: Vec, - proof: Vec, + pub id: BlockIdExt, + pub req_count: i32, + pub incomplete: bool, + pub ids: Vec, + pub proof: Vec, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct PartialBlockProof { - complete: bool, - from: BlockIdExt, - to: BlockIdExt, - steps: Vec, + pub complete: bool, + pub from: BlockIdExt, + pub to: BlockIdExt, + pub steps: Vec, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct ConfigInfo { #[tl(flags)] - mode: (), - id: BlockIdExt, - state_proof: Vec, - config_proof: Vec, + pub mode: (), + pub id: BlockIdExt, + pub state_proof: Vec, + pub config_proof: Vec, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct ValidatorStats { #[tl(flags)] - mode: (), - id: BlockIdExt, - count: i32, - complete: bool, - state_proof: Vec, - data_proof: Vec, + pub mode: (), + pub id: BlockIdExt, + pub count: i32, + pub complete: bool, + pub state_proof: Vec, + pub data_proof: Vec, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct Error { - code: i32, + pub code: i32, #[derivative(Debug(format_with = "String::fmt"))] - message: String, + pub message: String, } #[derive(TlRead, TlWrite, Derivative)] diff --git a/liteapi/src/types.rs b/liteapi/src/types.rs index 8e4272f..0b86cbf 100644 --- a/liteapi/src/types.rs +++ b/liteapi/src/types.rs @@ -7,8 +7,8 @@ use crate::tl::{request::WrappedRequest, response::Response}; #[derive(Debug, Error)] pub enum LiteError { - #[error("Liteserver error with code {code}: {message}")] - ServerError { code: i32, message: String }, + #[error("Liteserver error")] + ServerError(crate::tl::response::Error), #[error("TL parsing error")] TlError(TlError), #[error("Unexpected TL message")] @@ -17,4 +17,6 @@ pub enum LiteError { TransportError(AdnlError), } -pub trait LiteService: Service{} \ No newline at end of file +pub trait LiteService {} + +impl LiteService for T where T: Service {} \ No newline at end of file From c5b7ed191060b177599766e52a538aa4d82150b0 Mon Sep 17 00:00:00 2001 From: Vladimir Lebedev Date: Tue, 26 Mar 2024 21:21:44 +0700 Subject: [PATCH 09/28] update adnl, add layers --- Cargo.lock | 144 +++++++++++++++++++++++++++------- liteapi/Cargo.toml | 5 +- liteapi/examples/client.rs | 21 +++-- liteapi/examples/server.rs | 10 ++- liteapi/src/layers/mod.rs | 156 +++++++++++++++++++++++++++++++++++++ liteapi/src/lib.rs | 3 +- liteapi/src/peer.rs | 12 +-- liteapi/src/server.rs | 3 +- liteapi/src/tl/common.rs | 6 ++ liteapi/src/types.rs | 6 +- 10 files changed, 310 insertions(+), 56 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0d264be..279541c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -34,7 +34,7 @@ dependencies = [ [[package]] name = "adnl" version = "1.0.0" -source = "git+https://github.com/tonstack/adnl-rs?branch=server#28bf4c2ec90c7704a2fd7e8a5113ff2b92bfcc60" +source = "git+https://github.com/tonstack/adnl-rs?branch=server#19394279b93f3bb25735b35dd095f0540361b24b" dependencies = [ "aes", "ctr", @@ -87,6 +87,54 @@ dependencies = [ "libc", ] +[[package]] +name = "anstream" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" + +[[package]] +name = "anstyle-parse" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + [[package]] name = "atty" version = "0.2.14" @@ -100,15 +148,15 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" [[package]] name = "backtrace" -version = "0.3.70" +version = "0.3.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95d8e92cac0961e91dbd517496b00f7e9b92363dbe6d42c3198268323798860c" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" dependencies = [ "addr2line", "cc", @@ -154,9 +202,9 @@ checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" [[package]] name = "bytes" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "cc" @@ -247,7 +295,7 @@ dependencies = [ "base64 0.13.1", "chrono", "clap", - "env_logger", + "env_logger 0.9.3", "hex", "log", "pretty-hex", @@ -258,6 +306,12 @@ dependencies = [ "ureq", ] +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + [[package]] name = "core-foundation-sys" version = "0.8.6" @@ -396,7 +450,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -455,6 +509,16 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "env_filter" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea" +dependencies = [ + "log", + "regex", +] + [[package]] name = "env_logger" version = "0.9.3" @@ -468,6 +532,19 @@ dependencies = [ "termcolor", ] +[[package]] +name = "env_logger" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b35839ba51819680ba087cd351788c9a3c476841207e0b8cee0b04722343b9" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "humantime", + "log", +] + [[package]] name = "fiat-crypto" version = "0.2.7" @@ -555,7 +632,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -714,9 +791,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" @@ -875,7 +952,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -906,7 +983,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -1022,9 +1099,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.3" +version = "1.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" dependencies = [ "aho-corasick", "memchr", @@ -1087,9 +1164,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.22.2" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41" +checksum = "99008d7ad0bbbea527ec27bddbc0e432c5b87d8175178cee68d2eec9c4a1813c" dependencies = [ "log", "ring", @@ -1151,14 +1228,14 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] name = "serde_json" -version = "1.0.114" +version = "1.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" dependencies = [ "itoa", "ryu", @@ -1264,9 +1341,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.53" +version = "2.0.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" +checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0" dependencies = [ "proc-macro2", "quote", @@ -1305,7 +1382,7 @@ checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -1346,7 +1423,7 @@ dependencies = [ "proc-macro2", "quote", "rustc-hash", - "syn 2.0.53", + "syn 2.0.55", "tl-scheme", ] @@ -1390,7 +1467,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -1431,6 +1508,7 @@ dependencies = [ "adnl 1.0.0", "base64 0.13.1", "derivative", + "env_logger 0.11.3", "futures", "hex", "log", @@ -1505,7 +1583,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -1584,6 +1662,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + [[package]] name = "version_check" version = "0.9.4" @@ -1617,7 +1701,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", "wasm-bindgen-shared", ] @@ -1639,7 +1723,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1860,5 +1944,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] diff --git a/liteapi/Cargo.toml b/liteapi/Cargo.toml index 765dc84..2be442d 100644 --- a/liteapi/Cargo.toml +++ b/liteapi/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" adnl = { git = "https://github.com/tonstack/adnl-rs", branch = "server" } tl-proto = { version = "0.4.5", features = ["bytes"] } derivative = "2.2.0" -log = '0.4.14' +log = { version = "0.4.14", features = ["max_level_trace"] } hex = "0.4.3" thiserror = "1" tokio = { version = "1.36", features = ["net", "io-util"] } @@ -22,4 +22,5 @@ pin-project = "1" ureq = "2.4.0" base64 = "0.13.0" x25519-dalek = { version = "2.0.1", features = ["static_secrets"] } -tokio = { version = "1.36", features = ["full"] } \ No newline at end of file +tokio = { version = "1.36", features = ["full"] } +env_logger = "0.11.3" \ No newline at end of file diff --git a/liteapi/examples/client.rs b/liteapi/examples/client.rs index 25e5b5b..8429551 100644 --- a/liteapi/examples/client.rs +++ b/liteapi/examples/client.rs @@ -1,28 +1,27 @@ use adnl::{AdnlPeer, AdnlRawPublicKey}; use tokio_tower::multiplex; +use ton_liteapi::layers::WrapMessagesLayer; use ton_liteapi::peer::LitePeer; use ton_liteapi::tl::request::{LiteQuery, Request, WrappedRequest}; -use tower::{Service, ServiceExt}; +use tower::{Service, ServiceBuilder, ServiceExt}; #[tokio::main] async fn main() -> Result<(), Box> { + env_logger::init(); let server_public = AdnlRawPublicKey::try_from(&*hex::decode("691a14528fb2911839649c489cb4cbec1f4aa126c244c0ea2ac294eb568a7037")?)?; let ls_ip = "127.0.0.1"; let ls_port: u16 = 8080; let adnl = AdnlPeer::connect(&server_public, (ls_ip, ls_port)).await?; let lite = LitePeer::new(adnl); - let mut client = multiplex::Client::<_, tokio_tower::Error<_, _>, _>::new(lite); - let message = ton_liteapi::tl::adnl::Message::Query { - query: LiteQuery { - wrapped_request: WrappedRequest { wait_masterchain_seqno: None, request: Request::GetTime } - }, - query_id: Default::default(), - }; - let result = client.ready().await?.call(message.clone()).await?; + let mut service = ServiceBuilder::new() + .layer(WrapMessagesLayer) + .service(multiplex::Client::<_, Box, _>::new(lite)); + let message = WrappedRequest { wait_masterchain_seqno: None, request: Request::GetTime }; + let result = service.ready().await?.call(message.clone()).await?; println!("{:?}", result); - let result = client.ready().await?.call(message.clone()).await?; + let result = service.ready().await?.call(message.clone()).await?; println!("{:?}", result); - let result = client.ready().await?.call(message.clone()).await?; + let result = service.ready().await?.call(message.clone()).await?; println!("{:?}", result); Ok(()) } \ No newline at end of file diff --git a/liteapi/examples/server.rs b/liteapi/examples/server.rs index 7267851..2151ab3 100644 --- a/liteapi/examples/server.rs +++ b/liteapi/examples/server.rs @@ -2,12 +2,13 @@ use std::env; use std::error::Error; use adnl::{AdnlPrivateKey, AdnlPublicKey}; +use ton_liteapi::layers::WrapErrorLayer; use ton_liteapi::server::serve; use ton_liteapi::types::LiteError; use ton_liteapi::tl::response::CurrentTime; use ton_liteapi::tl::adnl::Message; use ton_liteapi::tl::response::Response; -use tower::{buffer::Buffer, make::Shared, service_fn}; +use tower::{make::Shared, ServiceBuilder}; use x25519_dalek::StaticSecret; async fn handler(req: Message) -> Result { @@ -32,8 +33,11 @@ async fn main() -> Result<(), Box> { println!("Public key is: {}", hex::encode(private_key.public().edwards_repr())); println!("Address is: {}", hex::encode(private_key.public().address().as_bytes())); - let buffer = Buffer::new(service_fn(handler), 100); + let service = ServiceBuilder::new() + .buffer(100) + .layer(WrapErrorLayer) + .service_fn(handler); - serve(&("127.0.0.1", 8080), private_key, Shared::new(buffer)).await?; + serve(&("127.0.0.1", 8080), private_key, Shared::new(service)).await?; Ok(()) } \ No newline at end of file diff --git a/liteapi/src/layers/mod.rs b/liteapi/src/layers/mod.rs index e69de29..84462ee 100644 --- a/liteapi/src/layers/mod.rs +++ b/liteapi/src/layers/mod.rs @@ -0,0 +1,156 @@ +use std::task::{Context, Poll}; + +use futures::future::{self, BoxFuture}; +use futures::FutureExt; +use tower::{Layer, Service}; + +use crate::tl::common::Int256; +use crate::tl::request::LiteQuery; +use crate::tl::response::Error; +use crate::{tl::{adnl::Message, request::WrappedRequest, response::Response}, types::LiteError}; + +pub struct WrapMessagesLayer; + +impl Layer for WrapMessagesLayer { + type Service = WrapService; + + fn layer(&self, service: S) -> Self::Service { + WrapService { + service + } + } +} + +pub struct WrapService { + service: S, +} + +impl Service for WrapService +where + S: Service, + S::Error: Into, + S::Response: Into, + S::Future: Send + 'static, +{ + type Response = Response; + type Error = LiteError; + type Future = BoxFuture<'static, Result>; + + fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { + self.service.poll_ready(cx).map_err(Into::into) + } + + fn call(&mut self, request: WrappedRequest) -> Self::Future { + let fut = self.service.call(Message::Query { + query_id: Int256::default(), + query: LiteQuery { + wrapped_request: request, + } + }); + Box::pin(async move { + let response = fut.await.map_err(Into::into)?.into(); + + match response { + Message::Answer { answer, .. } => Ok(answer), + _ => Err(LiteError::UnexpectedMessage) + } + }) + } +} + +pub struct UnwrapMessagesLayer; + +impl Layer for UnwrapMessagesLayer { + type Service = UnwrapService; + + fn layer(&self, service: S) -> Self::Service { + UnwrapService { + service + } + } +} + +pub struct UnwrapService { + service: S, +} + +impl Service for UnwrapService +where + S: Service, + S::Error: Into, + S::Response: Into, + S::Future: Send + 'static, +{ + type Response = Message; + type Error = LiteError; + type Future = BoxFuture<'static, Result>; + + fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { + self.service.poll_ready(cx).map_err(Into::into) + } + + fn call(&mut self, request: Message) -> Self::Future { + let request = match request { + Message::Query { query: LiteQuery { wrapped_request }, .. } => wrapped_request, + _ => return Box::pin(future::err(LiteError::UnexpectedMessage)) + }; + let fut = self.service.call(request); + Box::pin(async move { + let response = fut.await.map_err(Into::into)?.into(); + Ok(Message::Answer { query_id: Int256::default(), answer: response }) + }) + } +} + +pub struct WrapErrorLayer; + +impl Layer for WrapErrorLayer { + type Service = WrapErrorService; + + fn layer(&self, service: S) -> Self::Service { + WrapErrorService { + service + } + } +} + +pub struct WrapErrorService { + service: S, +} + +impl Service for WrapErrorService +where + S: Service, + S::Error: Into, + S::Response: Into, + S::Future: Send + 'static, +{ + type Response = Message; + type Error = LiteError; + type Future = BoxFuture<'static, Result>; + + fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { + self.service.poll_ready(cx).map_err(Into::into) + } + + fn call(&mut self, request: Message) -> Self::Future { + let query_id = match &request { + Message::Query { query_id, .. } => query_id, + Message::Answer { query_id, .. } => query_id, + }.clone(); + let fut = self.service.call(request); + Box::pin(async move { + let response = fut.await; + match response { + Ok(x) => Ok(x.into()), + Err(e) => Ok(Message::Answer { + query_id, + answer: Response::Error(Error { + code: 500, + message: format!("{:?}", e.into()).as_str().into(), + }) + }) + } + }) + } +} \ No newline at end of file diff --git a/liteapi/src/lib.rs b/liteapi/src/lib.rs index 3f13264..e5a9ea3 100644 --- a/liteapi/src/lib.rs +++ b/liteapi/src/lib.rs @@ -1,4 +1,5 @@ pub mod tl; pub mod types; pub mod peer; -pub mod server; \ No newline at end of file +pub mod server; +pub mod layers; \ No newline at end of file diff --git a/liteapi/src/peer.rs b/liteapi/src/peer.rs index 6add688..baae2b9 100644 --- a/liteapi/src/peer.rs +++ b/liteapi/src/peer.rs @@ -24,20 +24,21 @@ impl Sink for LitePeer where T: Sink { type Error = LiteError; fn poll_ready(self: std::pin::Pin<&mut Self>, cx: &mut std::task::Context<'_>) -> std::task::Poll> { - self.project().inner.poll_ready(cx).map_err(|e| LiteError::TransportError(e)) + self.project().inner.poll_ready(cx).map_err(|e| LiteError::AdnlError(e.into())) } fn start_send(self: std::pin::Pin<&mut Self>, item: Message) -> Result<(), Self::Error> { + log::debug!("Sending TL message: {:?}", item); let data = tl_proto::serialize(item).into(); - self.project().inner.start_send(data).map_err(|e| LiteError::TransportError(e.into())) + self.project().inner.start_send(data).map_err(|e| LiteError::AdnlError(e.into())) } fn poll_flush(self: std::pin::Pin<&mut Self>, cx: &mut std::task::Context<'_>) -> std::task::Poll> { - self.project().inner.poll_flush(cx).map_err(|e| LiteError::TransportError(e)) + self.project().inner.poll_flush(cx).map_err(|e| LiteError::AdnlError(e.into())) } fn poll_close(self: std::pin::Pin<&mut Self>, cx: &mut std::task::Context<'_>) -> std::task::Poll> { - self.project().inner.poll_close(cx).map_err(|e| LiteError::TransportError(e)) + self.project().inner.poll_close(cx).map_err(|e| LiteError::AdnlError(e.into())) } } @@ -49,9 +50,10 @@ impl Stream for LitePeer where T: Stream> match inner { Poll::Ready(Some(Ok(bytes))) => { let decoded = tl_proto::deserialize(&bytes); + log::debug!("Received TL message: {:?}", decoded); Poll::Ready(Some(decoded.map_err(|e| LiteError::TlError(e)))) }, - Poll::Ready(Some(Err(e))) => Poll::Ready(Some(Err(LiteError::TransportError(e)))), + Poll::Ready(Some(Err(e))) => Poll::Ready(Some(Err(LiteError::AdnlError(e.into())))), Poll::Ready(None) => Poll::Ready(None), Poll::Pending => Poll::Pending, } diff --git a/liteapi/src/server.rs b/liteapi/src/server.rs index 94126d4..eaa1aa9 100644 --- a/liteapi/src/server.rs +++ b/liteapi/src/server.rs @@ -15,7 +15,6 @@ use tower::Service; use crate::peer::LitePeer; use crate::tl::adnl::Message; -use crate::types::LiteError; pub async fn serve(addr: &A, private_key: S, mut service_maker: M) -> Result<(), Box> where A: ToSocketAddrs, @@ -51,7 +50,7 @@ pub async fn serve(addr: &A, private_key: S, mut service_maker: M) -> R let service = service_maker.make_service(addr).await.expect("making service failed"); let private_key = private_key.clone(); tokio::spawn(async move { - let adnl = AdnlPeer::handle_handshake(socket, &private_key).await.expect("handshake failed"); + let adnl = AdnlPeer::handle_handshake(socket, |_| Some(private_key.clone())).await.expect("handshake failed"); let lite = LitePeer::new(adnl); Server::new(lite, service).await.expect("server failed"); }); diff --git a/liteapi/src/tl/common.rs b/liteapi/src/tl/common.rs index 5279827..a8a6a9a 100644 --- a/liteapi/src/tl/common.rs +++ b/liteapi/src/tl/common.rs @@ -26,6 +26,12 @@ impl fmt::Display for String { } } +impl From<&str> for String { + fn from(s: &str) -> Self { + Self(s.as_bytes().to_vec()) + } +} + impl String { pub fn new(str: std::string::String) -> Self { Self(str.into_bytes()) diff --git a/liteapi/src/types.rs b/liteapi/src/types.rs index 0b86cbf..431ccf8 100644 --- a/liteapi/src/types.rs +++ b/liteapi/src/types.rs @@ -13,8 +13,10 @@ pub enum LiteError { TlError(TlError), #[error("Unexpected TL message")] UnexpectedMessage, - #[error("Transport error")] - TransportError(AdnlError), + #[error("ADNL error")] + AdnlError(#[from] AdnlError), + #[error("Unknown error")] + UnknownError(#[from] Box) } pub trait LiteService {} From cc9b97153f2e948217cdaa91c112de9bfe430cd8 Mon Sep 17 00:00:00 2001 From: Vladimir Lebedev Date: Wed, 27 Mar 2024 12:33:20 +0700 Subject: [PATCH 10/28] Update Cargo.toml --- liteapi/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/liteapi/Cargo.toml b/liteapi/Cargo.toml index 2be442d..eb6a8da 100644 --- a/liteapi/Cargo.toml +++ b/liteapi/Cargo.toml @@ -10,7 +10,7 @@ derivative = "2.2.0" log = { version = "0.4.14", features = ["max_level_trace"] } hex = "0.4.3" thiserror = "1" -tokio = { version = "1.36", features = ["net", "io-util"] } +tokio = { version = "1", features = ["net", "io-util"] } tower = { version = "0.4.13", features = ["make", "util", "buffer"] } tokio-util = { version = "0.7.10" } tokio-tower = "0.6.0" @@ -23,4 +23,4 @@ ureq = "2.4.0" base64 = "0.13.0" x25519-dalek = { version = "2.0.1", features = ["static_secrets"] } tokio = { version = "1.36", features = ["full"] } -env_logger = "0.11.3" \ No newline at end of file +env_logger = "0.11.3" From 447cb32e3c2103f31882f2f548331486da5e894f Mon Sep 17 00:00:00 2001 From: Vladimir Lebedev Date: Wed, 27 Mar 2024 12:40:40 +0700 Subject: [PATCH 11/28] Update Cargo.toml --- liteapi/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/liteapi/Cargo.toml b/liteapi/Cargo.toml index eb6a8da..d7d074c 100644 --- a/liteapi/Cargo.toml +++ b/liteapi/Cargo.toml @@ -5,7 +5,7 @@ edition = "2021" [dependencies] adnl = { git = "https://github.com/tonstack/adnl-rs", branch = "server" } -tl-proto = { version = "0.4.5", features = ["bytes"] } +tl-proto = { version = "0.4", features = ["bytes"] } derivative = "2.2.0" log = { version = "0.4.14", features = ["max_level_trace"] } hex = "0.4.3" From 71986251f53eedcfa136dac854d2509291741c47 Mon Sep 17 00:00:00 2001 From: Vladimir Lebedev Date: Wed, 27 Mar 2024 19:21:27 +0700 Subject: [PATCH 12/28] Add getBlockHeader flags --- liteapi/src/tl/request.rs | 13 ++++++++++++- liteapi/src/tl/response.rs | 13 ++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/liteapi/src/tl/request.rs b/liteapi/src/tl/request.rs index 41a8f92..c84c7be 100644 --- a/liteapi/src/tl/request.rs +++ b/liteapi/src/tl/request.rs @@ -60,7 +60,18 @@ pub struct GetState { #[derivative(Debug, Clone, PartialEq)] pub struct GetBlockHeader { pub id: BlockIdExt, - pub mode: u32, + #[tl(flags)] + pub mode: (), + #[tl(flags_bit = "mode.0")] + pub with_state_update: Option<()>, + #[tl(flags_bit = "mode.1")] + pub with_value_flow: Option<()>, + #[tl(flags_bit = "mode.4")] + pub with_extra: Option<()>, + #[tl(flags_bit = "mode.5")] + pub with_shard_hashes: Option<()>, + #[tl(flags_bit = "mode.6")] + pub with_prev_blk_signatures: Option<()>, } #[derive(TlRead, TlWrite, Derivative)] diff --git a/liteapi/src/tl/response.rs b/liteapi/src/tl/response.rs index d1f87b3..2e2e71c 100644 --- a/liteapi/src/tl/response.rs +++ b/liteapi/src/tl/response.rs @@ -61,7 +61,18 @@ pub struct BlockState { #[derivative(Debug, Clone, PartialEq)] pub struct BlockHeader { pub id: BlockIdExt, - pub mode: i32, + #[tl(flags)] + pub mode: (), + #[tl(flags_bit = "mode.0")] + pub with_state_update: Option<()>, + #[tl(flags_bit = "mode.1")] + pub with_value_flow: Option<()>, + #[tl(flags_bit = "mode.4")] + pub with_extra: Option<()>, + #[tl(flags_bit = "mode.5")] + pub with_shard_hashes: Option<()>, + #[tl(flags_bit = "mode.6")] + pub with_prev_blk_signatures: Option<()>, pub header_proof: Vec, } From f5f34cf68bff49889f05d16df04fa69519abdadd Mon Sep 17 00:00:00 2001 From: Vladimir Lebedev Date: Sat, 30 Mar 2024 02:09:48 +0700 Subject: [PATCH 13/28] Add more logging --- liteapi/src/peer.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/liteapi/src/peer.rs b/liteapi/src/peer.rs index baae2b9..ce8edeb 100644 --- a/liteapi/src/peer.rs +++ b/liteapi/src/peer.rs @@ -50,7 +50,7 @@ impl Stream for LitePeer where T: Stream> match inner { Poll::Ready(Some(Ok(bytes))) => { let decoded = tl_proto::deserialize(&bytes); - log::debug!("Received TL message: {:?}", decoded); + log::debug!("Decoded to TL message:\n{:?}\n{:?}", bytes, decoded); Poll::Ready(Some(decoded.map_err(|e| LiteError::TlError(e)))) }, Poll::Ready(Some(Err(e))) => Poll::Ready(Some(Err(LiteError::AdnlError(e.into())))), From 452ac444155a197b5f6c560a7fb45a52e8f3a7d9 Mon Sep 17 00:00:00 2001 From: Vladimir Lebedev Date: Mon, 15 Apr 2024 23:10:38 +0700 Subject: [PATCH 14/28] Add tcp.ping message type, make error wrapper work with request/response services instead of message --- liteapi/examples/client.rs | 2 +- liteapi/examples/server.rs | 21 ++++++++++----------- liteapi/src/layers/mod.rs | 37 +++++++++++++++---------------------- liteapi/src/peer.rs | 21 ++++++++++++++++----- liteapi/src/tl/adnl.rs | 18 +++++++++++------- 5 files changed, 53 insertions(+), 46 deletions(-) diff --git a/liteapi/examples/client.rs b/liteapi/examples/client.rs index 8429551..ff9ca66 100644 --- a/liteapi/examples/client.rs +++ b/liteapi/examples/client.rs @@ -2,7 +2,7 @@ use adnl::{AdnlPeer, AdnlRawPublicKey}; use tokio_tower::multiplex; use ton_liteapi::layers::WrapMessagesLayer; use ton_liteapi::peer::LitePeer; -use ton_liteapi::tl::request::{LiteQuery, Request, WrappedRequest}; +use ton_liteapi::tl::request::{Request, WrappedRequest}; use tower::{Service, ServiceBuilder, ServiceExt}; #[tokio::main] diff --git a/liteapi/examples/server.rs b/liteapi/examples/server.rs index 2151ab3..05917f1 100644 --- a/liteapi/examples/server.rs +++ b/liteapi/examples/server.rs @@ -2,24 +2,22 @@ use std::env; use std::error::Error; use adnl::{AdnlPrivateKey, AdnlPublicKey}; -use ton_liteapi::layers::WrapErrorLayer; +use ton_liteapi::layers::{UnwrapMessagesLayer, WrapErrorLayer}; use ton_liteapi::server::serve; +use ton_liteapi::tl::request::{Request, WrappedRequest}; use ton_liteapi::types::LiteError; use ton_liteapi::tl::response::CurrentTime; -use ton_liteapi::tl::adnl::Message; use ton_liteapi::tl::response::Response; use tower::{make::Shared, ServiceBuilder}; use x25519_dalek::StaticSecret; -async fn handler(req: Message) -> Result { - let (query_id, req) = match req { - Message::Query { query_id, query } => (query_id, query), - _ => return Err(LiteError::UnexpectedMessage) - }; - println!("Received frame: {:?}, tag = {}", &req, query_id); - - let response = Message::Answer { query_id, answer: Response::CurrentTime(CurrentTime { now: 1234 }) }; - Ok(response) +async fn handler(req: WrappedRequest) -> Result { + println!("Received frame: {:?}", &req); + if let Request::GetTime = req.request { + Ok(Response::CurrentTime(CurrentTime { now: 1234 })) + } else { + Err(LiteError::UnexpectedMessage) + } } #[tokio::main] @@ -35,6 +33,7 @@ async fn main() -> Result<(), Box> { let service = ServiceBuilder::new() .buffer(100) + .layer(UnwrapMessagesLayer) .layer(WrapErrorLayer) .service_fn(handler); diff --git a/liteapi/src/layers/mod.rs b/liteapi/src/layers/mod.rs index 84462ee..ca531f5 100644 --- a/liteapi/src/layers/mod.rs +++ b/liteapi/src/layers/mod.rs @@ -1,7 +1,6 @@ use std::task::{Context, Poll}; use futures::future::{self, BoxFuture}; -use futures::FutureExt; use tower::{Layer, Service}; use crate::tl::common::Int256; @@ -90,14 +89,15 @@ where } fn call(&mut self, request: Message) -> Self::Future { - let request = match request { - Message::Query { query: LiteQuery { wrapped_request }, .. } => wrapped_request, + let (query_id, request) = match request { + Message::Query { query_id, query: LiteQuery { wrapped_request } } => (query_id, wrapped_request), + Message::Ping { random_id } => return Box::pin(future::ok(Message::Pong { random_id })), _ => return Box::pin(future::err(LiteError::UnexpectedMessage)) }; let fut = self.service.call(request); Box::pin(async move { - let response = fut.await.map_err(Into::into)?.into(); - Ok(Message::Answer { query_id: Int256::default(), answer: response }) + let answer = fut.await.map_err(Into::into)?.into(); + Ok(Message::Answer { query_id, answer }) }) } } @@ -118,38 +118,31 @@ pub struct WrapErrorService { service: S, } -impl Service for WrapErrorService +impl Service for WrapErrorService where - S: Service, + S: Service, S::Error: Into, - S::Response: Into, + S::Response: Into, S::Future: Send + 'static, { - type Response = Message; + type Response = Response; type Error = LiteError; - type Future = BoxFuture<'static, Result>; + type Future = BoxFuture<'static, Result>; fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { self.service.poll_ready(cx).map_err(Into::into) } - fn call(&mut self, request: Message) -> Self::Future { - let query_id = match &request { - Message::Query { query_id, .. } => query_id, - Message::Answer { query_id, .. } => query_id, - }.clone(); + fn call(&mut self, request: WrappedRequest) -> Self::Future { let fut = self.service.call(request); Box::pin(async move { let response = fut.await; match response { Ok(x) => Ok(x.into()), - Err(e) => Ok(Message::Answer { - query_id, - answer: Response::Error(Error { - code: 500, - message: format!("{:?}", e.into()).as_str().into(), - }) - }) + Err(e) => Ok(Response::Error(Error { + code: 500, + message: format!("{:?}", e.into()).as_str().into(), + })) } }) } diff --git a/liteapi/src/peer.rs b/liteapi/src/peer.rs index ce8edeb..48578c1 100644 --- a/liteapi/src/peer.rs +++ b/liteapi/src/peer.rs @@ -3,6 +3,7 @@ use std::task::Poll; use adnl::AdnlError; use futures::{Sink, Stream}; use pin_project::pin_project; +use rand::random; use tokio_tower::multiplex::TagStore; use tokio_util::bytes::Bytes; @@ -60,20 +61,30 @@ impl Stream for LitePeer where T: Stream> } } +#[derive(PartialEq, Eq)] +pub enum LiteTag { + Int256(Int256), + Long(u64), +} + impl TagStore for LitePeer { - type Tag = Int256; + type Tag = LiteTag; fn assign_tag(self: std::pin::Pin<&mut Self>, r: &mut Message) -> Self::Tag { match r { - Message::Answer { query_id, .. } => { *query_id = Int256::random(); query_id.clone() }, - Message::Query { query_id, .. } => { *query_id = Int256::random(); query_id.clone() }, + Message::Answer { query_id, .. } => { *query_id = Int256::random(); LiteTag::Int256(query_id.clone()) }, + Message::Query { query_id, .. } => { *query_id = Int256::random(); LiteTag::Int256(query_id.clone()) }, + Message::Ping { random_id } => { *random_id = random(); LiteTag::Long(random_id.clone()) }, + Message::Pong { random_id } => { *random_id = random(); LiteTag::Long(random_id.clone()) }, } } fn finish_tag(self: std::pin::Pin<&mut Self>, r: &Message) -> Self::Tag { match r { - Message::Answer { query_id, .. } => query_id.clone(), - Message::Query { query_id, .. } => query_id.clone(), + Message::Answer { query_id, .. } => LiteTag::Int256(query_id.clone()), + Message::Query { query_id, .. } => LiteTag::Int256(query_id.clone()), + Message::Ping { random_id } => LiteTag::Long(random_id.clone()), + Message::Pong { random_id } => LiteTag::Long(random_id.clone()), } } } \ No newline at end of file diff --git a/liteapi/src/tl/adnl.rs b/liteapi/src/tl/adnl.rs index 664402c..8b8e81e 100644 --- a/liteapi/src/tl/adnl.rs +++ b/liteapi/src/tl/adnl.rs @@ -8,17 +8,21 @@ use super::utils::*; #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] -#[tl( - boxed, - scheme_inline = r##"adnl.message.query query_id:int256 query:bytes = adnl.Message; - adnl.message.answer query_id:int256 answer:bytes = adnl.Message;"## -)] +#[tl(boxed)] pub enum Message { /// adnl.message.query query_id:int256 query:bytes = adnl.Message; - #[tl(id = "adnl.message.query")] + #[tl(id = 0xb48bf97a)] Query { query_id: Int256, #[tl(with = "struct_as_bytes")] query: LiteQuery }, /// adnl.message.answer query_id:int256 answer:bytes = adnl.Message; - #[tl(id = "adnl.message.answer")] + #[tl(id = 0x0fac8416)] Answer { query_id: Int256, #[tl(with = "struct_as_bytes")] answer: Response }, + + /// tcp.ping random_id:long = tcp.Pong; + #[tl(id = 0x4d082b9a)] + Ping { random_id: u64 }, + + /// tcp.pong random_id:long = tcp.Pong; + #[tl(id = 0xdc69fb03)] + Pong { random_id: u64 }, } \ No newline at end of file From f5ef8f0720bbc201b0b0f7819582bed4510598d8 Mon Sep 17 00:00:00 2001 From: Vladimir Lebedev Date: Wed, 24 Apr 2024 18:42:19 +0700 Subject: [PATCH 15/28] int -> uint for all fields which not require negative values --- liteapi/src/tl/request.rs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/liteapi/src/tl/request.rs b/liteapi/src/tl/request.rs index c84c7be..420117d 100644 --- a/liteapi/src/tl/request.rs +++ b/liteapi/src/tl/request.rs @@ -34,8 +34,8 @@ pub struct WrappedRequest { scheme_inline = r##"liteServer.waitMasterchainSeqno seqno:int timeout_ms:int = Object;"## )] pub struct WaitMasterchainSeqno { - pub seqno: i32, - pub timeout_ms: i32, + pub seqno: u32, + pub timeout_ms: u32, } #[derive(TlRead, TlWrite, Derivative)] @@ -93,7 +93,7 @@ pub struct RunSmcMethod { pub mode: u32, pub id: BlockIdExt, pub account: AccountId, - pub method_id: i64, + pub method_id: u64, pub params: Vec, } @@ -117,15 +117,15 @@ pub struct GetAllShardsInfo { pub struct GetOneTransaction { pub id: BlockIdExt, pub account: AccountId, - pub lt: i64, + pub lt: u64, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct GetTransactions { - pub count: i32, + pub count: u32, pub account: AccountId, - pub lt: i64, + pub lt: u64, pub hash: Int256, } @@ -136,9 +136,9 @@ pub struct LookupBlock { pub mode: (), pub id: BlockId, #[tl(flags_bit = "mode.1")] - pub lt: Option, + pub lt: Option, #[tl(flags_bit = "mode.2")] - pub utime: Option, + pub utime: Option, } #[derive(TlRead, TlWrite, Derivative)] @@ -147,7 +147,7 @@ pub struct ListBlockTransactions { pub id: BlockIdExt, #[tl(flags)] pub mode: (), - pub count: i32, + pub count: u32, #[tl(flags_bit = "mode.7")] pub after: Option, #[tl(flags_bit = "mode.6")] @@ -187,11 +187,11 @@ pub struct GetValidatorStats { #[tl(flags)] pub mode: (), id: BlockIdExt, - pub limit: i32, + pub limit: u32, #[tl(flags_bit = "mode.0")] pub start_after: Option, #[tl(flags_bit = "mode.2")] - pub modified_after: Option, + pub modified_after: Option, } #[derive(TlRead, TlWrite, Derivative)] @@ -277,4 +277,4 @@ pub enum Request { /// liteServer.getValidatorStats#091a58bc mode:# id:tonNode.blockIdExt limit:int start_after:mode.0?int256 modified_after:mode.2?int = liteServer.ValidatorStats; #[tl(id = 0xe7253699)] GetValidatorStats(GetValidatorStats), -} \ No newline at end of file +} From 9adac481bc05a43aef1f6e44a96ceca902cc44aa Mon Sep 17 00:00:00 2001 From: Vladimir Lebedev Date: Wed, 24 Apr 2024 18:46:27 +0700 Subject: [PATCH 16/28] int -> uint --- liteapi/src/tl/common.rs | 8 ++++---- liteapi/src/tl/response.rs | 26 +++++++++++++------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/liteapi/src/tl/common.rs b/liteapi/src/tl/common.rs index a8a6a9a..39c455d 100644 --- a/liteapi/src/tl/common.rs +++ b/liteapi/src/tl/common.rs @@ -110,7 +110,7 @@ pub struct AccountId { // #[tl(boxed, id = "liteServer.transactionId3", scheme_inline = r##"liteServer.transactionId3 account:int256 lt:long = liteServer.TransactionId3;"##)] pub struct TransactionId3 { pub account: Int256, - pub lt: i64, + pub lt: u64, } /// liteServer.signature node_id_short:int256 signature:bytes = liteServer.Signature; @@ -131,8 +131,8 @@ pub struct Signature { scheme_inline = r##"liteServer.signatureSet validator_set_hash:int catchain_seqno:int signatures:(vector liteServer.signature) = liteServer.SignatureSet;"## )] pub struct SignatureSet { - pub validator_set_hash: i32, - pub catchain_seqno: i32, + pub validator_set_hash: u32, + pub catchain_seqno: u32, pub signatures: Vec, } @@ -186,7 +186,7 @@ pub struct TransactionId { #[tl(flags_bit = "mode.0")] pub account: Option, #[tl(flags_bit = "mode.1")] - pub lt: Option, + pub lt: Option, #[tl(flags_bit = "mode.2")] pub hash: Option, } \ No newline at end of file diff --git a/liteapi/src/tl/response.rs b/liteapi/src/tl/response.rs index 2e2e71c..d84ddcb 100644 --- a/liteapi/src/tl/response.rs +++ b/liteapi/src/tl/response.rs @@ -17,11 +17,11 @@ pub struct MasterchainInfo { pub struct MasterchainInfoExt { #[tl(flags)] pub mode: (), - pub version: i32, - pub capabilities: i64, + pub version: u32, + pub capabilities: u64, pub last: BlockIdExt, - pub last_utime: i32, - pub now: i32, + pub last_utime: u32, + pub now: u32, pub state_root_hash: Int256, pub init: ZeroStateIdExt, } @@ -29,16 +29,16 @@ pub struct MasterchainInfoExt { #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct CurrentTime { - pub now: i32, + pub now: u32, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct Version { - pub mode: i32, - pub version: i32, - pub capabilities: i64, - pub now: i32, + pub mode: u32, + pub version: u32, + pub capabilities: u64, + pub now: u32, } #[derive(TlRead, TlWrite, Derivative)] @@ -79,7 +79,7 @@ pub struct BlockHeader { #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct SendMsgStatus { - pub status: i32, + pub status: u32, } #[derive(TlRead, TlWrite, Derivative)] @@ -157,7 +157,7 @@ pub struct TransactionId { #[tl(flags_bit = "mode.0")] pub account: Option, #[tl(flags_bit = "mode.1")] - pub lt: Option, + pub lt: Option, #[tl(flags_bit = "mode.2")] pub hash: Option, } @@ -166,7 +166,7 @@ pub struct TransactionId { #[derivative(Debug, Clone, PartialEq)] pub struct BlockTransactions { pub id: BlockIdExt, - pub req_count: i32, + pub req_count: u32, pub incomplete: bool, pub ids: Vec, pub proof: Vec, @@ -197,7 +197,7 @@ pub struct ValidatorStats { #[tl(flags)] pub mode: (), pub id: BlockIdExt, - pub count: i32, + pub count: u32, pub complete: bool, pub state_proof: Vec, pub data_proof: Vec, From 3059856754751d0b80b8213d87756b6949f40803 Mon Sep 17 00:00:00 2001 From: Vladimir Lebedev Date: Fri, 3 May 2024 20:50:14 +0700 Subject: [PATCH 17/28] Add Eq + Hash to BlockIdExt --- liteapi/src/tl/common.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/liteapi/src/tl/common.rs b/liteapi/src/tl/common.rs index 39c455d..f2da238 100644 --- a/liteapi/src/tl/common.rs +++ b/liteapi/src/tl/common.rs @@ -81,7 +81,7 @@ pub struct BlockId { /// tonNode.blockIdExt workchain:int shard:long seqno:int root_hash:int256 file_hash:int256 = tonNode.BlockIdExt; #[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq)] +#[derivative(Debug, Clone, PartialEq, Eq, Hash)] pub struct BlockIdExt { pub workchain: i32, pub shard: u64, @@ -189,4 +189,4 @@ pub struct TransactionId { pub lt: Option, #[tl(flags_bit = "mode.2")] pub hash: Option, -} \ No newline at end of file +} From 3d1889b1c1993337f7372508e472d6277153260c Mon Sep 17 00:00:00 2001 From: Vladimir Lebedev Date: Fri, 3 May 2024 21:11:40 +0700 Subject: [PATCH 18/28] impl Hash for Int256 --- liteapi/src/tl/common.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/liteapi/src/tl/common.rs b/liteapi/src/tl/common.rs index f2da238..0f3d8e2 100644 --- a/liteapi/src/tl/common.rs +++ b/liteapi/src/tl/common.rs @@ -40,7 +40,7 @@ impl String { /// int256 8*[ int ] = Int256; #[derive(TlRead, TlWrite, Derivative)] -#[derivative(Debug, Clone, PartialEq, Eq, Default)] +#[derivative(Debug, Clone, PartialEq, Eq, Default, Hash)] pub struct Int256(#[derivative(Debug(format_with = "fmt_bytes"))] pub [u8; 32]); impl FromStr for Int256 { From 2de33a69a0a2d0357fed18e62afe6032409cbad2 Mon Sep 17 00:00:00 2001 From: Vladimir Lebedev Date: Sat, 4 May 2024 01:40:09 +0700 Subject: [PATCH 19/28] Add seqno flag for LookupBlock --- liteapi/src/tl/request.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/liteapi/src/tl/request.rs b/liteapi/src/tl/request.rs index 420117d..7c8c262 100644 --- a/liteapi/src/tl/request.rs +++ b/liteapi/src/tl/request.rs @@ -135,6 +135,8 @@ pub struct LookupBlock { #[tl(flags)] pub mode: (), pub id: BlockId, + #[tl(flags_bit = "mode.0")] + pub seqno: Option<()>, #[tl(flags_bit = "mode.1")] pub lt: Option, #[tl(flags_bit = "mode.2")] From 18a2eae1ddc3b46e2ec7cd75c8b1685cbdd94876 Mon Sep 17 00:00:00 2001 From: Vladimir Lebedev Date: Mon, 6 May 2024 17:42:56 +0700 Subject: [PATCH 20/28] Add debug logs --- liteapi/src/server.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/liteapi/src/server.rs b/liteapi/src/server.rs index eaa1aa9..47b41ec 100644 --- a/liteapi/src/server.rs +++ b/liteapi/src/server.rs @@ -6,7 +6,6 @@ use std::time::Duration; use adnl::AdnlPeer; use adnl::AdnlPrivateKey; -use log::error; use tokio::net::TcpListener; use tokio::net::ToSocketAddrs; use tokio_tower::multiplex::Server; @@ -40,19 +39,21 @@ pub async fn serve(addr: &A, private_key: S, mut service_maker: M) -> R // > will be logged at the `error` level, since it is still a big deal, // > and then the listener will sleep for 1 second. if !matches!(e.kind(), ErrorKind::ConnectionRefused | ErrorKind::ConnectionAborted | ErrorKind::ConnectionReset) { - error!("accept error: {e}"); + log::error!("accept error: {e}"); tokio::time::sleep(Duration::from_secs(1)).await; } continue; } }; + log::debug!("[{addr:?}] Accepted socket"); poll_fn(|cx| service_maker.poll_ready(cx)).await.expect("polling service maker failed"); let service = service_maker.make_service(addr).await.expect("making service failed"); let private_key = private_key.clone(); tokio::spawn(async move { let adnl = AdnlPeer::handle_handshake(socket, |_| Some(private_key.clone())).await.expect("handshake failed"); + log::debug!("[{addr:?}] Handshake performed"); let lite = LitePeer::new(adnl); Server::new(lite, service).await.expect("server failed"); }); } -} \ No newline at end of file +} From 86a7cfa5228fd967e308be256a392f5a65ecd441 Mon Sep 17 00:00:00 2001 From: Vladimir Lebedev Date: Thu, 9 May 2024 23:43:07 +0700 Subject: [PATCH 21/28] Add block header modes for LookupBlock --- liteapi/src/tl/request.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/liteapi/src/tl/request.rs b/liteapi/src/tl/request.rs index 7c8c262..971b7c6 100644 --- a/liteapi/src/tl/request.rs +++ b/liteapi/src/tl/request.rs @@ -141,6 +141,16 @@ pub struct LookupBlock { pub lt: Option, #[tl(flags_bit = "mode.2")] pub utime: Option, + #[tl(flags_bit = "mode.4")] + pub with_state_update: Option<()>, + #[tl(flags_bit = "mode.5")] + pub with_value_flow: Option<()>, + #[tl(flags_bit = "mode.8")] + pub with_extra: Option<()>, + #[tl(flags_bit = "mode.9")] + pub with_shard_hashes: Option<()>, + #[tl(flags_bit = "mode.10")] + pub with_prev_blk_signatures: Option<()>, } #[derive(TlRead, TlWrite, Derivative)] From 8a93445c47152b1817161128369faa8679df07f5 Mon Sep 17 00:00:00 2001 From: Vladimir Lebedev Date: Fri, 21 Jun 2024 23:35:03 +0700 Subject: [PATCH 22/28] Add GetConfigParams, GetConfigAll, ConfigInfo modes --- liteapi/src/tl/request.rs | 34 ++++++++++++++++++++++++++++++++-- liteapi/src/tl/response.rs | 14 ++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/liteapi/src/tl/request.rs b/liteapi/src/tl/request.rs index c84c7be..19d33cc 100644 --- a/liteapi/src/tl/request.rs +++ b/liteapi/src/tl/request.rs @@ -169,16 +169,46 @@ pub struct GetBlockProof { #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct GetConfigAll { - pub mode: i32, + #[tl(flags)] + pub mode: (), pub id: BlockIdExt, + #[tl(flags_bit = "mode.0")] + pub with_state_root: Option<()>, + #[tl(flags_bit = "mode.1")] + pub with_libraries: Option<()>, + #[tl(flags_bit = "mode.2")] + pub with_state_extra_root: Option<()>, + #[tl(flags_bit = "mode.3")] + pub with_shard_hashes: Option<()>, + #[tl(flags_bit = "mode.6")] + pub with_accounts_root: Option<()>, + #[tl(flags_bit = "mode.7")] + pub with_prev_blocks: Option<()>, + #[tl(flags_bit = "mode.15")] + pub extract_from_key_block: Option<()>, } #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct GetConfigParams { - pub mode: i32, + #[tl(flags)] + pub mode: (), pub id: BlockIdExt, pub param_list: Vec, + #[tl(flags_bit = "mode.0")] + pub with_state_root: Option<()>, + #[tl(flags_bit = "mode.1")] + pub with_libraries: Option<()>, + #[tl(flags_bit = "mode.2")] + pub with_state_extra_root: Option<()>, + #[tl(flags_bit = "mode.3")] + pub with_shard_hashes: Option<()>, + #[tl(flags_bit = "mode.6")] + pub with_accounts_root: Option<()>, + #[tl(flags_bit = "mode.7")] + pub with_prev_blocks: Option<()>, + #[tl(flags_bit = "mode.15")] + pub extract_from_key_block: Option<()>, } #[derive(TlRead, TlWrite, Derivative)] diff --git a/liteapi/src/tl/response.rs b/liteapi/src/tl/response.rs index 2e2e71c..95b0834 100644 --- a/liteapi/src/tl/response.rs +++ b/liteapi/src/tl/response.rs @@ -189,6 +189,20 @@ pub struct ConfigInfo { pub id: BlockIdExt, pub state_proof: Vec, pub config_proof: Vec, + #[tl(flags_bit = "mode.0")] + pub with_state_root: Option<()>, + #[tl(flags_bit = "mode.1")] + pub with_libraries: Option<()>, + #[tl(flags_bit = "mode.2")] + pub with_state_extra_root: Option<()>, + #[tl(flags_bit = "mode.3")] + pub with_shard_hashes: Option<()>, + #[tl(flags_bit = "mode.6")] + pub with_accounts_root: Option<()>, + #[tl(flags_bit = "mode.7")] + pub with_prev_blocks: Option<()>, + #[tl(flags_bit = "mode.15")] + pub extract_from_key_block: Option<()>, } #[derive(TlRead, TlWrite, Derivative)] From c3d8bb69b33ef62d02158537b1c9c9cda10b2652 Mon Sep 17 00:00:00 2001 From: Vladimir Lebedev Date: Fri, 28 Jun 2024 09:57:54 +0700 Subject: [PATCH 23/28] Update config flags --- liteapi/src/tl/request.rs | 16 ++++++++++++++++ liteapi/src/tl/response.rs | 8 ++++++++ 2 files changed, 24 insertions(+) diff --git a/liteapi/src/tl/request.rs b/liteapi/src/tl/request.rs index 0c17b3c..6008ef7 100644 --- a/liteapi/src/tl/request.rs +++ b/liteapi/src/tl/request.rs @@ -192,10 +192,18 @@ pub struct GetConfigAll { pub with_state_extra_root: Option<()>, #[tl(flags_bit = "mode.3")] pub with_shard_hashes: Option<()>, + #[tl(flags_bit = "mode.4")] + pub with_validator_set: Option<()>, + #[tl(flags_bit = "mode.5")] + pub with_special_smc: Option<()>, #[tl(flags_bit = "mode.6")] pub with_accounts_root: Option<()>, #[tl(flags_bit = "mode.7")] pub with_prev_blocks: Option<()>, + #[tl(flags_bit = "mode.8")] + pub with_workchain_info: Option<()>, + #[tl(flags_bit = "mode.9")] + pub with_capabilities: Option<()>, #[tl(flags_bit = "mode.15")] pub extract_from_key_block: Option<()>, } @@ -215,10 +223,18 @@ pub struct GetConfigParams { pub with_state_extra_root: Option<()>, #[tl(flags_bit = "mode.3")] pub with_shard_hashes: Option<()>, + #[tl(flags_bit = "mode.4")] + pub with_validator_set: Option<()>, + #[tl(flags_bit = "mode.5")] + pub with_special_smc: Option<()>, #[tl(flags_bit = "mode.6")] pub with_accounts_root: Option<()>, #[tl(flags_bit = "mode.7")] pub with_prev_blocks: Option<()>, + #[tl(flags_bit = "mode.8")] + pub with_workchain_info: Option<()>, + #[tl(flags_bit = "mode.9")] + pub with_capabilities: Option<()>, #[tl(flags_bit = "mode.15")] pub extract_from_key_block: Option<()>, } diff --git a/liteapi/src/tl/response.rs b/liteapi/src/tl/response.rs index ec9adcf..be84e4d 100644 --- a/liteapi/src/tl/response.rs +++ b/liteapi/src/tl/response.rs @@ -197,10 +197,18 @@ pub struct ConfigInfo { pub with_state_extra_root: Option<()>, #[tl(flags_bit = "mode.3")] pub with_shard_hashes: Option<()>, + #[tl(flags_bit = "mode.4")] + pub with_validator_set: Option<()>, + #[tl(flags_bit = "mode.5")] + pub with_special_smc: Option<()>, #[tl(flags_bit = "mode.6")] pub with_accounts_root: Option<()>, #[tl(flags_bit = "mode.7")] pub with_prev_blocks: Option<()>, + #[tl(flags_bit = "mode.8")] + pub with_workchain_info: Option<()>, + #[tl(flags_bit = "mode.9")] + pub with_capabilities: Option<()>, #[tl(flags_bit = "mode.15")] pub extract_from_key_block: Option<()>, } From 480b758271f1cd8004cb6c7845e5376de7105cc8 Mon Sep 17 00:00:00 2001 From: Vladimir Lebedev Date: Mon, 1 Jul 2024 19:40:30 +0700 Subject: [PATCH 24/28] Add flags for GetBlockProof --- liteapi/src/tl/request.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/liteapi/src/tl/request.rs b/liteapi/src/tl/request.rs index 6008ef7..8853220 100644 --- a/liteapi/src/tl/request.rs +++ b/liteapi/src/tl/request.rs @@ -176,6 +176,10 @@ pub struct GetBlockProof { pub known_block: BlockIdExt, #[tl(flags_bit = "mode.0")] pub target_block: Option, + #[tl(flags_bit = "mode.1")] + pub allow_weak_target: Option<()>, + #[tl(flags_bit = "mode.12")] + pub base_block_from_request: Option<()>, } #[derive(TlRead, TlWrite, Derivative)] From 9bdac8dfd1e2a51877d1ad90aaaf2da1473bb751 Mon Sep 17 00:00:00 2001 From: Dmitrii Korchagin Date: Wed, 21 Aug 2024 08:56:18 +0200 Subject: [PATCH 25/28] Support getLibraries --- liteapi/src/tl/common.rs | 8 ++++++++ liteapi/src/tl/request.rs | 10 ++++++++++ liteapi/src/tl/response.rs | 10 ++++++++++ 3 files changed, 28 insertions(+) diff --git a/liteapi/src/tl/common.rs b/liteapi/src/tl/common.rs index 0f3d8e2..fef82ce 100644 --- a/liteapi/src/tl/common.rs +++ b/liteapi/src/tl/common.rs @@ -190,3 +190,11 @@ pub struct TransactionId { #[tl(flags_bit = "mode.2")] pub hash: Option, } + +/// liteServer.libraryEntry hash:int256 data:bytes = liteServer.LibraryEntry; +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct LibraryEntry { + pub hash: Int256, + pub data: Vec, +} diff --git a/liteapi/src/tl/request.rs b/liteapi/src/tl/request.rs index 8853220..79f1f9e 100644 --- a/liteapi/src/tl/request.rs +++ b/liteapi/src/tl/request.rs @@ -256,6 +256,12 @@ pub struct GetValidatorStats { pub modified_after: Option, } +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct GetLibraries { + pub library_list: Vec, +} + #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] #[tl(boxed)] @@ -339,4 +345,8 @@ pub enum Request { /// liteServer.getValidatorStats#091a58bc mode:# id:tonNode.blockIdExt limit:int start_after:mode.0?int256 modified_after:mode.2?int = liteServer.ValidatorStats; #[tl(id = 0xe7253699)] GetValidatorStats(GetValidatorStats), + + /// liteServer.getLibraries library_list:(vector int256) = liteServer.LibraryResult; + #[tl(id = 0xd122b662)] + GetLibraries(GetLibraries), } diff --git a/liteapi/src/tl/response.rs b/liteapi/src/tl/response.rs index be84e4d..6ea60b0 100644 --- a/liteapi/src/tl/response.rs +++ b/liteapi/src/tl/response.rs @@ -225,6 +225,12 @@ pub struct ValidatorStats { pub data_proof: Vec, } +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct LibraryResult { + pub result: Vec, +} + #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct Error { @@ -313,6 +319,10 @@ pub enum Response { #[tl(id = 0xb9f796d8)] ValidatorStats(ValidatorStats), + /// liteServer.libraryResult result:(vector liteServer.libraryEntry) = liteServer.LibraryResult; + #[tl(id = 0x117ab96b)] + LibraryResult(LibraryResult), + /// liteServer.error code:int message:string = liteServer.Error; #[tl(id = 0xbba9e148)] Error(Error), From 42a0342646d8098eea3f389d3dab839a4e2980df Mon Sep 17 00:00:00 2001 From: Dmitrii Korchagin Date: Wed, 21 Aug 2024 11:08:36 +0200 Subject: [PATCH 26/28] Update github-ci --- .github/workflows/ci.yml | 52 ++++------------------------------------ 1 file changed, 4 insertions(+), 48 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 139a5f2..5a41c12 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,8 +3,8 @@ on: [push, pull_request] name: Continuous integration jobs: - check: - name: Check + build: + name: Build liteapi runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 @@ -15,50 +15,6 @@ jobs: override: true - uses: actions-rs/cargo@v1 with: - command: check + command: build + args: --manifest-path=liteapi/Cargo.toml -# test: -# name: Test Suite -# runs-on: ubuntu-latest -# steps: -# - uses: actions/checkout@v2 -# - uses: actions-rs/toolchain@v1 -# with: -# profile: minimal -# toolchain: stable -# override: true -# - uses: actions-rs/cargo@v1 -# with: -# command: test - - fmt: - name: Rustfmt - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: stable - override: true - - run: rustup component add rustfmt - - uses: actions-rs/cargo@v1 - with: - command: fmt - args: --all -- --check - - clippy: - name: Clippy - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: stable - override: true - - run: rustup component add clippy - - uses: actions-rs/cargo@v1 - with: - command: clippy - args: -- -D warnings From b1242daf9cf16e8fe00aa90543c3cdbb156b21bc Mon Sep 17 00:00:00 2001 From: Sild Date: Wed, 21 Aug 2024 12:08:42 +0200 Subject: [PATCH 27/28] Support getLibraries method (#6) * Support getLibraries * Update github-ci --------- Co-authored-by: Dmitrii Korchagin --- .github/workflows/ci.yml | 52 +++----------------------------------- liteapi/src/tl/common.rs | 8 ++++++ liteapi/src/tl/request.rs | 10 ++++++++ liteapi/src/tl/response.rs | 10 ++++++++ 4 files changed, 32 insertions(+), 48 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 139a5f2..5a41c12 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,8 +3,8 @@ on: [push, pull_request] name: Continuous integration jobs: - check: - name: Check + build: + name: Build liteapi runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 @@ -15,50 +15,6 @@ jobs: override: true - uses: actions-rs/cargo@v1 with: - command: check + command: build + args: --manifest-path=liteapi/Cargo.toml -# test: -# name: Test Suite -# runs-on: ubuntu-latest -# steps: -# - uses: actions/checkout@v2 -# - uses: actions-rs/toolchain@v1 -# with: -# profile: minimal -# toolchain: stable -# override: true -# - uses: actions-rs/cargo@v1 -# with: -# command: test - - fmt: - name: Rustfmt - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: stable - override: true - - run: rustup component add rustfmt - - uses: actions-rs/cargo@v1 - with: - command: fmt - args: --all -- --check - - clippy: - name: Clippy - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: stable - override: true - - run: rustup component add clippy - - uses: actions-rs/cargo@v1 - with: - command: clippy - args: -- -D warnings diff --git a/liteapi/src/tl/common.rs b/liteapi/src/tl/common.rs index 0f3d8e2..fef82ce 100644 --- a/liteapi/src/tl/common.rs +++ b/liteapi/src/tl/common.rs @@ -190,3 +190,11 @@ pub struct TransactionId { #[tl(flags_bit = "mode.2")] pub hash: Option, } + +/// liteServer.libraryEntry hash:int256 data:bytes = liteServer.LibraryEntry; +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct LibraryEntry { + pub hash: Int256, + pub data: Vec, +} diff --git a/liteapi/src/tl/request.rs b/liteapi/src/tl/request.rs index 8853220..79f1f9e 100644 --- a/liteapi/src/tl/request.rs +++ b/liteapi/src/tl/request.rs @@ -256,6 +256,12 @@ pub struct GetValidatorStats { pub modified_after: Option, } +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct GetLibraries { + pub library_list: Vec, +} + #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] #[tl(boxed)] @@ -339,4 +345,8 @@ pub enum Request { /// liteServer.getValidatorStats#091a58bc mode:# id:tonNode.blockIdExt limit:int start_after:mode.0?int256 modified_after:mode.2?int = liteServer.ValidatorStats; #[tl(id = 0xe7253699)] GetValidatorStats(GetValidatorStats), + + /// liteServer.getLibraries library_list:(vector int256) = liteServer.LibraryResult; + #[tl(id = 0xd122b662)] + GetLibraries(GetLibraries), } diff --git a/liteapi/src/tl/response.rs b/liteapi/src/tl/response.rs index be84e4d..6ea60b0 100644 --- a/liteapi/src/tl/response.rs +++ b/liteapi/src/tl/response.rs @@ -225,6 +225,12 @@ pub struct ValidatorStats { pub data_proof: Vec, } +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct LibraryResult { + pub result: Vec, +} + #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct Error { @@ -313,6 +319,10 @@ pub enum Response { #[tl(id = 0xb9f796d8)] ValidatorStats(ValidatorStats), + /// liteServer.libraryResult result:(vector liteServer.libraryEntry) = liteServer.LibraryResult; + #[tl(id = 0x117ab96b)] + LibraryResult(LibraryResult), + /// liteServer.error code:int message:string = liteServer.Error; #[tl(id = 0xbba9e148)] Error(Error), From c4ab144ab7d0647be7dff4c29feaccc8bdee4175 Mon Sep 17 00:00:00 2001 From: Dmitrii Korchagin Date: Thu, 29 Aug 2024 21:47:18 +0200 Subject: [PATCH 28/28] support liteServer.getLibrariesWithProof --- liteapi/src/tl/request.rs | 13 +++++++++++++ liteapi/src/tl/response.rs | 15 +++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/liteapi/src/tl/request.rs b/liteapi/src/tl/request.rs index 79f1f9e..2af5185 100644 --- a/liteapi/src/tl/request.rs +++ b/liteapi/src/tl/request.rs @@ -262,6 +262,15 @@ pub struct GetLibraries { pub library_list: Vec, } +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct GetLibrariesWithProof { + pub id: BlockIdExt, + #[tl(flags)] + pub mode: (), + pub library_list: Vec, +} + #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] #[tl(boxed)] @@ -349,4 +358,8 @@ pub enum Request { /// liteServer.getLibraries library_list:(vector int256) = liteServer.LibraryResult; #[tl(id = 0xd122b662)] GetLibraries(GetLibraries), + + /// liteServer.getLibrariesWithProof id:tonNode.blockIdExt mode:# library_list:(vector int256) = liteServer.LibraryResultWithProof; + #[tl(id = 0xd97693bd)] + GetLibrariesWithProof(GetLibrariesWithProof), } diff --git a/liteapi/src/tl/response.rs b/liteapi/src/tl/response.rs index 6ea60b0..99f982d 100644 --- a/liteapi/src/tl/response.rs +++ b/liteapi/src/tl/response.rs @@ -231,6 +231,17 @@ pub struct LibraryResult { pub result: Vec, } +#[derive(TlRead, TlWrite, Derivative)] +#[derivative(Debug, Clone, PartialEq)] +pub struct LibraryResultWithProof { + pub id: BlockIdExt, + #[tl(flags)] + pub mode: (), + pub result: Vec, + pub state_proof: Vec, + pub data_proof: Vec, +} + #[derive(TlRead, TlWrite, Derivative)] #[derivative(Debug, Clone, PartialEq)] pub struct Error { @@ -323,6 +334,10 @@ pub enum Response { #[tl(id = 0x117ab96b)] LibraryResult(LibraryResult), + /// liteServer.libraryResult result:(vector liteServer.libraryEntry) = liteServer.LibraryResult; + #[tl(id = 0x10a927bf)] + LibraryResultWithProof(LibraryResultWithProof), + /// liteServer.error code:int message:string = liteServer.Error; #[tl(id = 0xbba9e148)] Error(Error),