diff --git a/l1-contracts/src/core/Rollup.sol b/l1-contracts/src/core/Rollup.sol index d24069514c8..3a2693ab453 100644 --- a/l1-contracts/src/core/Rollup.sol +++ b/l1-contracts/src/core/Rollup.sol @@ -27,6 +27,7 @@ contract Rollup is IRollup { uint256 public immutable VERSION; bytes32 public rollupStateHash; + uint256 public lastBlockTs; constructor(IRegistry _registry) { VERIFIER = new MockVerifier(); @@ -63,6 +64,7 @@ contract Rollup is IRollup { } rollupStateHash = newStateHash; + lastBlockTs = block.timestamp; // @todo (issue #605) handle fee collector // @todo: (issue #624) handle different versions @@ -77,14 +79,14 @@ contract Rollup is IRollup { } function _constrainGlobals(bytes calldata _l2Block) internal view { - // @todo issue #830 Constrain timestamp - uint256 chainId; uint256 version; + uint256 ts; // block number already constrained by start state hash assembly { chainId := calldataload(_l2Block.offset) version := calldataload(add(_l2Block.offset, 0x20)) + ts := calldataload(add(_l2Block.offset, 0x60)) } if (block.chainid != chainId) { @@ -94,5 +96,17 @@ contract Rollup is IRollup { if (version != VERSION) { revert Errors.Rollup__InvalidVersion(version, VERSION); } + + if (ts > block.timestamp) { + revert Errors.Rollup__TimestampInFuture(); + } + + // @todo @LHerskind consider if this is too strict + // This will make multiple l2 blocks in the same l1 block impractical. + // e.g., the first block will update timestamp which will make the second fail. + // Could possibly allow multiple blocks if in same l1 block + if (ts < lastBlockTs) { + revert Errors.Rollup__TimestampTooOld(); + } } } diff --git a/l1-contracts/src/core/libraries/Errors.sol b/l1-contracts/src/core/libraries/Errors.sol index feecc3b0e0b..5b6fe9df773 100644 --- a/l1-contracts/src/core/libraries/Errors.sol +++ b/l1-contracts/src/core/libraries/Errors.sol @@ -43,4 +43,6 @@ library Errors { error Rollup__InvalidProof(); // 0xa5b2ba17 error Rollup__InvalidChainId(uint256 expected, uint256 actual); // 0x37b5bc12 error Rollup__InvalidVersion(uint256 expected, uint256 actual); // 0x9ef30794 + error Rollup__TimestampInFuture(); // 0xbc1ce916 + error Rollup__TimestampTooOld(); // 0x72ed9c81 } diff --git a/l1-contracts/test/Rollup.t.sol b/l1-contracts/test/Rollup.t.sol index aa79dc2360a..05f30bf468d 100644 --- a/l1-contracts/test/Rollup.t.sol +++ b/l1-contracts/test/Rollup.t.sol @@ -44,7 +44,7 @@ contract RollupTest is DecoderTest { assertEq(rollup.rollupStateHash(), endStateHash, "Invalid rollup state hash"); } - function testInvalidChainId() public { + function testRevertInvalidChainId() public { bytes memory block_ = block_empty_1; assembly { mstore(add(block_, 0x20), 0x420) @@ -54,7 +54,7 @@ contract RollupTest is DecoderTest { rollup.process(bytes(""), block_); } - function testInvalidVersion() public { + function testRevertInvalidVersion() public { bytes memory block_ = block_empty_1; assembly { mstore(add(block_, 0x40), 0x420) @@ -64,6 +64,28 @@ contract RollupTest is DecoderTest { rollup.process(bytes(""), block_); } + function testRevertTimestampInFuture() public { + bytes memory block_ = block_empty_1; + + uint256 ts = block.timestamp + 1; + assembly { + mstore(add(block_, 0x80), ts) + } + + vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__TimestampInFuture.selector)); + rollup.process(bytes(""), block_); + } + + function testRevertTimestampTooOld() public { + bytes memory block_ = block_empty_1; + + // Overwrite in the rollup contract + vm.store(address(rollup), bytes32(uint256(1)), bytes32(uint256(block.timestamp))); + + vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__TimestampTooOld.selector)); + rollup.process(bytes(""), block_); + } + function testMixBlock() public override(DecoderTest) { (,, bytes32 endStateHash,, bytes32[] memory l2ToL1Msgs, bytes32[] memory l1ToL2Msgs) = helper.decode(block_mixed_1); diff --git a/yarn-project/end-to-end/src/integration_l1_publisher.test.ts b/yarn-project/end-to-end/src/integration_l1_publisher.test.ts index 21586fa5ee1..fac0fdb7d00 100644 --- a/yarn-project/end-to-end/src/integration_l1_publisher.test.ts +++ b/yarn-project/end-to-end/src/integration_l1_publisher.test.ts @@ -267,12 +267,11 @@ describe('L1Publisher integration', () => { await makeBloatedProcessedTx(128 * i + 96), await makeBloatedProcessedTx(128 * i + 128), ]; - // @todo @LHerskind fix time. const globalVariables = new GlobalVariables( new Fr(config.chainId), new Fr(config.version), new Fr(1 + i), - Fr.ZERO, + new Fr(await rollup.read.lastBlockTs()), ); const [block] = await builder.buildL2Block(globalVariables, txs, l1ToL2Messages); @@ -363,7 +362,7 @@ describe('L1Publisher integration', () => { new Fr(config.chainId), new Fr(config.version), new Fr(1 + i), - Fr.ZERO, + new Fr(await rollup.read.lastBlockTs()), ); const [block] = await builder.buildL2Block(globalVariables, txs, l1ToL2Messages); diff --git a/yarn-project/noir-contracts/src/examples/schnorr_account_contract.json b/yarn-project/noir-contracts/src/examples/schnorr_account_contract.json index 34f71c1ef9f..2e29cb3f7e5 100644 --- a/yarn-project/noir-contracts/src/examples/schnorr_account_contract.json +++ b/yarn-project/noir-contracts/src/examples/schnorr_account_contract.json @@ -91,7 +91,7 @@ } ], "returnTypes": [], - "bytecode": "edbd07945555b6fd4dedbd4f51a4a224271111115191222711101010909c4552912449ce39678a1c447214949c04111111ef462427111151319341c56fadebebefdf8fd7bd30ccea5ec3c11befecf7ba67bbfa9c5fed9a75ee5af39e33c5c7ec3a9d6cc7a037cab46bdafca5321d7b96efd6a1f9334ddbb51bb4b846e9aacf969b14ef22043190c448492c1425888525b188241695c46292585c124b48e253925852129f96c45292585a12cb48e23392585612cb496279497c56122b48624549ac2489cf49626549ac22895525f17949ac2689d525b18624d694c45a92585b12eb48625d49ac2789f525b181243694c44692f882243696c41725b189243695c46692d85c125b48629c24b694c45692d85a12db48625b497c4912db49627b49ec20891d25b19324be2c899d25b18b247695c46e92d85b12fb48625f49ec2789fd2571802486068aea20511d2caa434475a8a80e13d5e1a23a4254478aea28511d2daa634475aca88e13d5f1a23a4154278aea24518d17d5c9a23a4554a78aea34519d2eaa33447566d4a015a53bb7e9daba7d5cd736cd274f9c1c7fa254febc85f217882b9c2f2e367f6cd3bcf98a362b52306f8182cd0a15892d125bb048c116f98ae4cf1f57a44091c2459b152d9cb7686c81fc71b12d0b16cddf326ff87f624333a848be96850afca522337f3b93bf5224af8ffce844a9bc7ff17ffe25203eadd83f7d6dd3fe51a4c55f00341d02e8600202e2d3cafba7ae6dca3f17c9fb27014d85003a94c080f8b48afce16b8bbfa348d1967f02d06408a0c3ff0140745a055afea16b9bf8af8a14fe83802641001df9cf000a9f56c1df7d6de3ff5d91027f00d00408a0a3ff41407c5a797fd7b58d958ae4fd9d80c641001dfb0f03e2d36a7ed76b1b7db722857f07a0311040c7ff0b80f8b4f289d736f2f714297c1740a320804efc9700f16915feb7d736fcf716292c001a010174f2bf08884fabc8bfbcb6a17fa448917f03681804d0a9ff32203eadbcffe7da06ffc122855afe0b404320804e2b00c4a795f77f5ddbc03f5324df1d800641007dac04109f56be7f5c5bff3f5ba3c0ffe3330082e78c223cf9e35ab6e4338bedfb976afc86a71f04cf270981e72f168ca59f1aa4ca2710446775223a0da9f23104d1a73a119d8454390541744e27a2e3902a2720883ed389e828a4ca3108a2f33a111d8654390241f4b94e440721550e41105dd0764f447745b17d20803e8200fa42e71eba00a9f20504d1973a119d8754f91c82e82b9d88ce41aa7c0641745127a2b3902a9f42107dad13d1454895af2188bed189e84b4895af2088bed588a83be0d27a43207fa773077d03a9f22d640721102d2fdba6735cf3ae6dbac70d5a5eab63e5b81a4d5bb4e93979f2c44988cdf4d7cfef74a26cbdfbf4edd77f4068606850687068486868685868786844686468546874684c686c685c687c684268626852283e343934253435342d343d342334d34724922241b3c4c0d06c519d23aaaf88ea5c517d5554e789ea7c515d20aa0b457591a82e16d525a2ba54549789ea72515d21aa2b45f535515d25aaab45f575517d4354d788ea5a515d27aaeb457583a86e14d54da2ba5954b72444686f3322b4b70561e08953a80ced6d4484f636410045ab0cedad4784f6364000a55419da5b8b08edad83008a5119da7b0311da5b0301749fcad0de6a4468ef7508a0542a437baf21427bab208052ab0cedad4084f6564200a55119da5b8608ed2d87004aab32b4b70411da5b0a01944e65686f1122b4b7180228bdcad0de0244686f2104500695a1bd7988d0de7c08a08c1a437ba1b980d45ee85508a04c1a637ba13980dc5ee81508a0cc2a3bd6893341aa648620caa213510648958c1044f7eb44940e52253d0451569d88d240aaa485207a4027a254902aa92188b2e9441403a9721f04d1833a114543aaa48420caae31b8179a0d21940242e8219d9b283ba4ca431044397422ca06a9f22004d1c33a1165855479008228a74e44592055ee87207a4427a29c902a8f4010e5d2892807a4cac310448f6a44d4037069a15910cab9756ea15c902a8f42b6506ee5d1bd1e90e85e68566876684ee895d0dcd0aba179a1f9a105a185a145a1c5a125a1a5a165a1e5a115a195a1d742ab42ab43af87de08ad09ad0dad0bad0f6d086d0c6d0a6d0e6db94b806fab181eda26aa6f8aea7651dd21aa6f89ea4e517d5b547789ea3ba2ba5b54df15d53da2fa9ea8ee15d5f745759fa87e20aa2151f5a2ba5f543f14d503a2fa91a81e14d543a27a58548f88ea51513d26aac745f5444204f88e23027c90efc726aea832c0771411e0837c3b3671259501bec388001fe4bbb1899f5319e03b8808f041be199bb8b2ca00df0144800ff2cdd8c4555406f8f623027c1f4200555519e00b21027c1e02e8799501be7d8800df071040d55406f8f622027cef4300555719e0db8308f0bd0701544365806f3722c0f72e04504d9501be5d8800df3b1040b55406f87622027c6f4300d55619e0db8108f0bd050154476580ef4d44806f3b04505d9d7deb3a902a752188eae944540b52a53604517d9d886a40aad484206aa01351354895ea10440d7522aa0aa9f23c0451239d882a43aa5481207a4127a24a902acf4110355619e0db0621541142e8459d9ba831a4ca8b10444d74226a04a9f2020451539d881a40aa3484206aa613513d4895fa1044cd75226a06a9d21c82a8854e444d20559a4210c56944d41311e0db0aa1dc52e7166a01a91207d9422d9507f87a62027c5b43db426f86b6877684de0aed0cbd1dda157a27b43bf46e684fe8bdd0ded0fba17da10f42a1900fed0f7d183a10fa2874307428743874247434742c743c74e22e01be936278e894a89e16d58f45f58ca87e22aa6745f553513d27aa9f89ea7951fd5c542f88ea17a2faa5a87e25aa1745f56b51fd4654bf15d5ef44f57b51fd41547f14d54ba27a5954af88ea5551bd26aad745f586a8de4c8800df0d4480ef26c4c687a90cf05d4304f8ae43000d5719e0bb8208f05d85001aa132c0770911e0bb0c0134526580ef074480ef4708a0512a037cdf21027cdf43008d5619e0fb0611e0833c083cf1189501be8b88001fe4750489c7aa0cf07d8908f0415e4690789cca00df0544800ff2729dc4e35506f8ce23027c9057eb249ea032c0770e11e083bc5827f1449501beb388001fe4b53a8927a90cf09d4104f820af3d4d1caf32c0771a11e083bcf434f1649d7deb784895c910445374229a08a932098268aa4e44e321552640104dd389682ca4ca3808a2e93a118d8654190341344327a291902aa3208866ea44341c52650404d12c9501be531042c3208466ebdc4498870dcd86209aa313d10c4895991044afe844340d52653a04d15c9d88a640aa4c85207a5527a2b9902a9807edcfd389680ea40ae651fbf33522423c73397412427981ce2d340f5205f3be8f05ca037cf761027c2743a742a7431f87ce843e099d0d7d1a3a17fa2c743ef479e842e88bd097a1af4217435f87be097d1bfa2ef47de887d08fa14ba1cba12ba1aba16ba1eba11ba19b7709f0dd12c3433f89eacfa2fa8ba8de16d55f2595ae48962364d9c8b2956527cb812c47ca7262598e92e524b29c549693c97272594e21cbd1b29c52966364f93e594e25cba965398d2ca795e574b29c5e9633c872c60488f6d17f2920db47e706b1f8b73586fbe8a70a48f7d10f1f826897c6781ffdda00f27df4db0541f48ec6801ff91220e147f60541b45b63c48f8c1f90f1a3bf0f1044ef6a0cf9d15f5640ca8ffe004310edd118f3a35b1740ce8fee702088ded318f4a37b4340d28f6e212188f66a8cfad1cd3720eb47f7e81044ef6b0cfbd1a71b40da8f3e044110edd318f7a38f8f80bc1f7dca8420fa4063e08f3e9f03127ff4311e8228a431f2470d1040e68ffa2410445e65e8ef3622f4f72b04d07e95a1bf9f11a1bf5f20803ed4d9ebde0fa9827902f6019d8842902a9867607fa413d13e4815cc53b00fea44b4175205f31cec433a11ed8154c13c09fbb04e44bb215530cfc23ea213d12e4815ccd3b08faa0cfdfd042184791cf6319d9be828a40ae6e544c775223a0ca982793dd1099d880e42aa605e50745227a203902a9857149dd2890893b53a0541745a27a2e3902a9897ed7dac11512a44e8ef1684f2199d5be834a40ae60ba2679487fe5261427fb7423f857e0efd12ba1dfa95babdd4aaa5b638f5b4697e40cd7f1ab4d094842652344ea2d11dcddd68c649034a1a06d32497a6e634f2f611a97c446a1f91c647a4f511e97c447a1f91c1476494e3803e22931c39ca2ccb5964f97e59ce2acb0fc87236597e5096b3cbf243b29c43961f96e59cb2fc882ce792e5476539b72c3f26cb8fcbf213b29c47969f94e5bcb21c2bcbf96439bf2c1790e582b25c48960bcb7211592e9a20a1c02290506051c89f805f7486020b4142818521886eeb0c05168084020b4210fdaa3314980f120acc8f401495486728302f2414180b4114a133149807120a7c1282c8e80c053e0e09053e014164758602734342818f4110399da1c05c9050e0a3104481ce50604e4828f01108a2489da1c01c9050e0c3104489758602b34342810f411045e90c05668384021f84204aa23114481d26402a901a5110444935c602a98507c80552a70f822899ca7e7854524815c89725a292eb441405a902f9b244540a9d88222155205f96888ad689c841aa40be2c119552272203a902f9b244548c4e44892055205f9688ba4fe784f736a40ae4eb1251a934060369f2094104f9c244546a9dbf68a92055205f688f4aa313510ca40ae40bed516975228a8654817ca13d2a9d4e44c92155205f688f4aaf13513a4815c8235aa232e84494065205f28896a88c1a1141fe1245648260cea4730f658054813c2c0a822821a381a921d140da5074334a7d3a6ab2514393ba91d4f9a5b62db5c8a9bf4db3041a04d0d0852626349da2d1128df1680647f34e1a56d26098a6ba3441a7f1b78fc8e723f2fb88023ea2a08f28e4230afb88223ea2e8dd0282c5e4f85171592e21cb4fc97249597e5a964bc97269592e23cbcfc87259592e27cbe565f95959ae20cb1565b9922c3f27cb9565b98a2c5795e5e765b99a2c5797e51ab25c53966bc9726d59ae23cb7565b99e2cd74f9080603d4840b03ee40f41519d01c13a9080605d08a2623a0382b52001c1da1044c57506046b4002823521884ae80c0856830404ab43103da53320581512107c1e82a8a4ce8060654840b00a04d1d33a0382952001c1e720884ae90c08568004042b421095d619102c0f09083e0b4154466740b02c2420580e82e8199d01c1329080e0331044657506044b410282a52188cae90c08968404049f86202aaf3320580212107c0a82e8599d5df1f2902a98bf681574222a0ba982f98b565127a232902a98bf689574222a05a982f98bf69c4e44252155307fd12aeb4454025205f317ad8a4e44c520558a431055d519102c0e4104794442d4f33a77515548154cd7b19a4e44952155305dc7ea3a11558254c1741d6be84454015205d375aca913510d4815cc1cad964e44d520553073b4da1a11a581040431f7567574eea15a902a98897e1de501c134a0806031ba19a53e1d35d9a8a149dd48eafc52db965ae4d4dfa659020d0268e84213139a4ed16889c6783483a379270d2b69304c535d9aa0d3f8db47d4f011357d442d1f51db47d4f111757d443d1f51ff6e01c10672fca8a12c3792e51764b9b12cbf28cb4d64b9a92c3793e5e6b2dc4296e364b9a52cb792e5d6b2dc4696dbcaf24bb2dc4e96dbcb720759ee28cb9d64f96559ee2ccb5d64b9ab2c7793e5eeb2dc43967bca72af040908f68404047b41fe1074d31910ec0e0908f68020eaae3320d8151210ec0641d4436740b0332420d80582a8a7ce8060274840f06508a25e3a03821d2001c18e1044bd750604db410282ed2188fae80c08b68504045f8220eaab3320d81a12106c0341d44f6740b0252420d80a82a8bfce80600b4840300e826880ce8060334840b03904d1409d01c1269080605308a2413a03828d2101c117218806eb0c08368204045f80201aa2b32b3e1852650804d1509d880642aa0c82201aa613517f4895011044c37522ea0ba9d20f8268844e44bd2155fa40108dd489a827a40aa6773d4a27a2ee902a98def5689d01c186104498def5189dbb6834a4ca1808a2b13a118d8454190541344e27a2e1902a232088c6eb44341452651804d1049d88c643aa4c80209aa813d1584895711044933422823c1c31a2010473bcce3d3411526512640fc52b0f08a60505041bd0cd28f5e9a8c9460d4dea4652e797dab6d422a7fe36cd1268104043179a98d0748a464b34c6a3191ccd3b69584983619aead2049dc6df3ea2b38fe8e223bafa886e3ea2bb8fe8e1237afa885e770b08f696e3477d64b9af2cf793e5feb23c409607caf220591e2ccb436479a82c0f93e5e1b23c429647caf228591e2dcb636479ac2c8f93e5f1b23c419627caf224598e97e5c9b23c4596a7caf234599e2ecb336479668204046740028233217f08d6e80c084e830404a74310add519109c0209084e85205aa73320180f09084e86205aaf332038111210c4dc946ed019101c0f0908623e1e6fd419101c0b0908623e1e6fd219101c0d0908621abe9b750604474202829886ef169d01c1e1908020a6e1bb556740702824208869f86ed319101c0c09086242396fea0c080e84040431a19ced3a0382fd2101414c286787ce80605f48401013ca794b67577c07a4ca5b10443b75227a1352653b04d1db3a116d8554d90641b44b27a2cd902a5b2088ded1896823a4ca2608a2dd3a11ad8754d90041f4ae4e446b2155d64110edd11910ec0341b40682e83d9dbb680fa4ca7b10447b7522da0da9f22e04d1fb3a11ed8254790782689f4e443b2155de8620fa4027a27d902a1f4010857422da0ba9f23e0491d788281d242088f90acf7e9d7b2804a9e2217b68bff280603a5040b037dd8c529f8e9a6cd4d0a46e24757ea96d4b2d72ea6fd32c8106013474a189094da768b444633c9ac1d1bc9386953418a6a92e4dd069fced2338e6e423a6f888a93e629a8f98ee2366f88899770b08ce92e347b365798e2cbf22cb7365f955599e27cbf36579812c2f94e545b2bc589697c8f252595e26cbcb6579852caf94e5d76479952caf96e5d765f90d595e23cb6b65799d2caf97e50db2bc519637c9f26659de922001c1cd908020a655f7adce80e046484010d3aafb4e6740703d24208869d57daf3320b8161210c4b4ea7ed019107c031210c4b4ea7ed419105c0d0908be0e4174496740f0354840701504d1659d01c1159080e04a08a22b3a0382cb2001c1e5104457750604974002824b2188aee90c082e8204041743105dd719105c0009082e8420baa13320380f12109c0f4174536740702e2420f82a04d12d9d01c1399080e02b10443fe9ec8adf8254f90982e8679d886e40aadc8420fa4527a26b902ad721886eeb44740552e52a04d1af3a115d8254b98c409424914e443f40aafc084114a113d177902adf4310199d01c1d91044df42105995bb28898154b110444e27a244902a111044814e2fba0da9f22b0451a44e443f43aafc02419458e72f5a24a44a6208a2289d881ca44a0041944423a2f49080e02c08e6a43af75014a44a12c81e4aaa3c20981e14109c4537a3d4a7a3261b3534a91b499d5f6adb528b9cfadb344ba041000d5d686242d3291a2dd1188f667034efa461250d8669aa4b13741a7ffb88b53e629d8f58ef2336f8888d3e62938fd8ec23b6dc2d20b8558e1f6d93e5376579bb2cef90e5b76479a72cbf2dcbbb64f91d59de2dcbefcaf21e597e4f96f7caf2fbb2bc4f963f90e5902c7b59de2fcb1fcaf20159fe48960fcaf221593e2ccb4764f9a82c1f93e5e3b27c22410282c72101c113903f048fea0c081e8504048f4110e5d619103c0c09081e81207a4c6740f0202420780882e8719d01c1039080e04710444fe80c08ee8704043f8420caa333201882040421df7d4af2a4ce80e03e484010f22dcc2479750604f7420282906f612689d51910dc030908429e2b90249fce80e06e484010f25c8124f97506047741028290e70a2429a03320b8131210843c572049419d01c11d908020e4d96f490ae90c08be090908429efd96a4b0ceae78214895c210444574222a00a9521082a8a84e44f92055f2431015d389282fa44a2c0451719d88f240aa3c0941544227a2c721559e80207a4a27a2dc902a8f411095d41910dc0641f42804d1d33a7751494895a721884ae944540252e52908a2d23a11158354290e41544627a222902a4521889ed189a80ca4ca3310446575222a05a9521a82a89c464419200141c893e29394d7b987ca42aa9483eca1f2ca0382194001c1ad74334a7d3a6ab2514393ba91d4f9a5b62db5c8a9bf4db3041a04d0d0852626349da2d1128df1680647f34e1a56d26098a6ba3441a7f1b78f38e8230ef988c33ee2888f38ea238ef988e33ee2c4dd028227e5f8d129593e2dcb1fcbf21959fe4496cfcaf2a7b27c4e963f93e5f3b2fcb92c5f90e52f64f94b59fe4a962fcaf2d7b2fc8d2c7f2bcbdfc9f2f7b2fc832cff28cb9764f9b22c5f91e5abb27c4d96afcbf20d59be992001c11b908020e41be149e2740604af410282906f842769a9332078051210847c233c492b9d01c14b908020e61be1ad7506047f80040431df086fa33320f81d242088f946785b9d01c16f200141cc37c25fd21910bc0809087e0d41d44e6740f04b4840f02b08a2f63a0382172001c12f20883ae80c089e8704043f8720eaa83320780e1210fc0c82a893ce80e0594840f05308a297750604cf4002829f401075d619103c0d09087e0c41d4456757bc33a44a1708a2ae3a11758254791982a89b4e441d20553a421075d789a81da44a7b08a21e3a11b58554790982a8a74e44ad2155da4010f5d289a825a44a2b08a2de3a0382a72088e22088fae8dc4590972926e90341d45727a29e902abd2088fae944d41d52a50704517f9d88ba42aa7483201aa013517f4895011044037522ea0ba9d20f8268904644192101c19310cc8375eea181902a83207b68b0f28060465040f024dd8c529f8e9a6cd4d0a46e24757ea96d4b2d72ea6fd32c8106013474a189094da768b444633c9ac1d1bc9386953418a6a92e4dd069fced232ef988cb3ee28a8fb8ea23aef988eb3ee2868fb879b780e02d397ef4932cff2ccbbfc8f26d59fe55944d22598e906523cb56969d2c07b21c29cb8965394a9693c87252594e26cbc96539852c47cb724a598e91e5fb6439952ca796e534b29c5696d3c9727a59ce20cb19132220683220028206f21737c97c950141930e11103490c71a2759a0322068d2200282262d04d142950141930a111034a9218816a90c089a184440d0dc0741b4586540d044230282262504d112950141931c11103429208896aa0c089aa48880a0490641b44c6540d04421028206f388fde52a0382261211103498977dac501910340e11103498977dac541910340611103498d757bda63220681221028206f3faaa553a0382b7210141ccebab56eb0c08fe0c0908625e5ff5baceaef86a4895d72188ded089e83548955510446b74225a01a9b2128268ad4e44cb2055964310add3896809a4ca5208a2f53a112d8254590c41b44127a205902a0b218836ea0c08fe0441341f826893ce5db41152651304d1669d88d643aa6c8020daa213d15a48957510445b75227a0352650d04d1369d8830cf6ddb0641f4a64e449b2155b640106dd78828132420780b827987ce3df426a40ae67d133b94070433810282b7e86694fa74d464a386267523a9f34b6d5b6a91537f9b66093408a0a10b4d4c683a45a3251ae3d10c8ee69d34aca4c1304d7569824ee36f6f527993da9b34dea4f5269d37e9bdc9e04dc6bb04044d26397e945996b3c8f2fdb29c55961f90e56cb2fca02c6797e5876439872c3f2ccb3965f91159ce25cb8fca726e597e4c961f97e52764398f2c3f29cb7965395696f3c9727e592e20cb0565b9902c1796e522b25c3441028245200141cc43ad3fd619102c040908625e3c74466740b00024208879f1d0273a0382f9200141cc8b87ceea0c08e6850404312f1efa546740300f24208879f1d0399d01c1c7210141cc8b873ed31910cc0d0908625e3c745e6740301724208879f1d0e73a0382392101c14720882ee80c08e68004041f8620fa426740303b2420f81004d1973a0382d92001c1072188be5219103459110141f30004d1459501419305111034f743107dadb32b7e115205f364e56f7422fa125205f364e56f7522ba00a98279b2f2773a119d8754c13c59f97b9d88ce41aa609eacfc834e44672155304f56fe5127a233902a98272b5f52191034992188304f56beac73175d8254c1bcfde68a4e443f40aa60de7e735527a2ef2055306fbfb9a613d137902a98b7df5cd789e81aa40ae67d6e377422ba02a982799fdb4d8d8832232ecd648260bea5730fdd8054c1bc59f296f28060664c40d064a29b51ead351938d1a9ad48da4ce2fb56da9454efd6d9a25d02080862e3431a1e9148d96688c4733389a77d2b09206c334d5a5093a8dbfbdc9e74d7e6f0a7853d09b42de14f6a6883745ef16102c26c78f8acb7209597e4a964bcaf2d3b25c4a964bcb7219597e4696cbca7239592e2fcbcfca720559ae28cb9564f93959ae2ccb5564b9aa2c3f2fcbd564b9ba2cd790e59ab25c4b966bcb721d59ae2bcbf564b97e820404eb410282f5117f089266d41910ac030908d68520caa43320580b1210ac0d4194596740b0062420581382288bce8060354840b03a04d1fd3a0382552101c1e72188b2ea0c0856860404ab40103da03320580912107c0e82289bce8060054840b02204d1833a0382e52101c1672188b2eb0c0896850404cb41103da43320580612107c06822887ce8060294840b03404d1c33a0382252101c1a7218872ea0c08968004049f82207a4465573c694e481548e43d692e9d887240aa4022ef491fd589283ba40a24f29e34b74e44d920552091f7a48fe9449415520512794ffab84e445920552091f7a44fe84404196227850cd493e6d119102c0e4104798752d22775eea23c902a90af2527cdab13d1e3902a90af25278dd5892837a40ae46bc949f3e944940b5205f2b5e4a4f97522ca07a90279d046d2023a11e58554813c682369418d88b2400282c520980be9dc43052055208ffc81204ac88060165040b018dd8c529f8e9a6cd4d0a46e24757ea96d4b2d72ea6fd32c8106013474a189094da768b444633c9ac1d1bc9386953418a6a92e4dd069fced4d0d6f6a7a53cb9bdaded4f1a6ae37f5bca97fb7806003397ed450961bc9f20bb2dc58965f94e526b2dc54969bc97273596e21cb71b2dc52965bc9726b596e23cb6d65f925596e27cbed65b9832c7794e54eb2fcb22c7796e52eb2dc5596bbc9727759ee21cb3d65b9578204047b420282bd207f086aeb0c08768704047b4010d5d11910ec0a0908768320aaab3320d8191210ec0241544f6740b0132420f83204517d9d01c10e9080604708a2063a0382ed2001c1f610440d750604db4202822f411035d219106c0d0908b681207a416740b0252420d80a82a8b1ce80600b4840300e82e8459d01c1669080607308a2263a03824d2001c1a610444d7506041b4302822f421035d319106c040908be0041d45c6757bc19a40ac68b5ae844d4045205e345713a11358654c178514b9d881a41aa60bca8954e440d20551a4210b5d689a81ea40ae6cbed6d7422aa03a982f9727b5b9d01c1861044982fb7bfa47317b58554c1f48bdae944d41a5205d32f6aaf13514b48154cbfa8834e442d205530fda28e3a11758054c14c403ae944d40e5205330179592322c877420ce60ebdb3ce3dd4095205338bedac3c20783f2820d8806e46a94f474d366a685237923abfd4b6a51639f5b769964083001abad0c484a653345aa2311ecde068de49c34a1a0cd3549726e834fef6a6b3375dbce9ea4d376fba7bd3c39b9edef4ba5b40b0b71c3fea23cb7d65b99f2cf797e501b23c509607c9f260591e22cb436579982c0f97e511b23c529647c9f268591e23cb6365799c2c8f97e509b23c519627c972bc2c4f96e529b23c5596a7c9f274599e21cb33132420380312109c09f94330496740701a2420381d82285e6740700a242038158268b2ce80603c2420381982688ace80e0444840701204d1549d01c1f19080e00408a2693a0382632101c1711044d37506044743028263208866e80c088e840404474110cdd419101c0e09088e80209aa53320381412101c0641345b674070302420380482688ece80e0404840701004d12b3a0382fd2101c101104473750604fb420282fd20885ed5d9159f0ba9f22a04d13c9d88e640aabc0241345f27a259902ab3218816e84434035205d3755ca813d13448154cd771914e44532055305dc7c53a11c543aa60ba8e4b740604fb401061ba8e4b75eea225902a4b218896e944b40852653104d1729d881640aa2c84205aa113d13c4895f910442b75225a01a9b21282e8359d889641aa2c87205aa51151564840b03704f36a9d7be835489555903db45a7940302b2820d89b6e46a94f474d366a685237923abfd4b6a51639f5b769964083001abad0c484a653345aa2311ecde068de49c34a1a0cd3549726e834fef686634ede4cf166aa37d3bc99eecd0c6f66de2d20384b8e1fcd96e539b2fc8a2ccf95e55765799e2ccf97e505b2bc509617c9f262595e22cb4b6579992c2f97e515b2bc52965f93e555b2bc5a965f97e53764798d2caf95e575b2bc5e9637c8f24659de24cb9b65794b820404374302825b207f08bcce80e0464840701304d17e9d01c1f59080e00608a20f750604d7420282eb20880ee80c08be010908ae8120fa48674070352420f83a04d1419d01c1d7200141cc479b433a03822b2001414c93e5b0ce80e032484010d36439a23320b8041210c48c0d8eea0c082e820404316383633a03820b200141ccd8e0b8ce80e03c484010333638a1332038171210c444bb4eea0c08ce81040431d1ae533abbe22721554e41109dd689e838a4ca0908a28f75223a0aa9720c82e88c4e448721558e40107da213d14148954310446775223a00a9f21104d1a73a11ed8754f91082e89cce80e06c08220f41f499ce5d740e52e53308a2f33a119d8554f91482e8739d88ce40aa7c0241744127a2d3902a1f43107da113d10548952f2088bed489e83ca4cae710445f6944f400242088f922d8459d7be84b4895af207be8a2f280e003a080e02cba19a53e1d35d9a8a149dd48eafc52db965ae4d4dfa659020d0268e84213139a4ed16889c6783483a379270d2b69304c535d9aa0d3f8db9bb5deacf366bd371bbcd9e8cd266f367bb3e56e01c1ad72fc689b2cbf29cbdb6579872cbf25cb3b65f96d59de25cbefc8f26e597e5796f7c8f27bb2bc5796df97e57db2fc812c8764d9cbf27e59fe50960fc8f247b27c50960fc9f261593e22cb4765f9982c1f97e5130912103c0e0908421abec992e80c081e850404210ddf64497506040f43028290866fb2643a03820721014148c33759729d01c103908020a4e19b2c85ce80e07e484010d2f04d16ad332018820404210ddf6429750604f74102821f4010c5e80c08ee850404df8720ba4f6740700f2420f81e04512a9d01c1dd9080e0bb1044a975060477410282ef4010a5d11910dc090908be0d419456674070072420f81604513a9d01c1372101c1ed1044e95576c593a58354490f41944127a234902a69218832ea44940a5225350451269d88622055ee8320caac135134a44a4a08a22c3a1125875449014174bf4e4449215592411065d51910dc0641940482e8019dbb282ba40a2496912c9b4e4459205520efbe4cf6a04e4499205532431065d7892803a44a4608a2877422ca0ea9f21004510e9d88b241aa3c0841f4b04644d92001c1ad10cc3975eea11c902a0f43f6504ee501c16ca080e056ba19a53e1d35d9a8a149dd48eafc52db965ae4d4dfa659020d0268e84213139a4ed16889c6783483a379270d2b69304c535d9aa0d3f8db9b83de1cf2e6b03747bc39eacd316f8e7b73e26e01c19372fce8942c9f96e58f65f98c2c7f22cb6765f953593e27cb9fc9f27959fe5c962fc8f217b2fca52c7f25cb1765f96b59fe4696bf95e5ef64f97b59fe41967f94e54bb27c5996afc8f25559be26cbd765f9862cdf4c9080e00d4840f026e40f41399d01c16b9080e07508a2f23a0382572001c1ab1044cfea0c085e8204042f431055d01910fc011210fc1182a8a2ce80e0779080e0f7104495740604bf810404bf85207a4e6740f0222420f8350451659d01c12f210141c837e89255d11910bc00090842becb9bacaace80e079484010f25dde64cfeb0c089e830404214fa748564d6740f02c242008793a45b2ea3a038267200141c8d32992d5d019103c0d0908429e4e91aca6ceae780d48959a1044b57422aa06a9521d82a8b64e445521559e8720aaa313516548952a1044757522aa04a9f21c04513d9d882a40aa548420aaaf13517948956721881ae80c089e82202a0741d450e72e6a00a9d21082a8914e44f52055ea4310bda013511d4895ba10448d7522aa05a9521b82e8459d881a43aabc0841d44427a246902a2f401035d58808927d3490f70d246ba6730f358154690ad943cd9407041f0405044fd2cd28f5e9a8c9460d4dea4652e797dab6d422a7fe36cd1268104043179a98d0748a464b34c6a3191ccd3b69584983619aead2049dc6dfde5cf2e6b23757bcb9eacd356fae7b73c39b9b770b08de92e3473fc9f2cfb2fc8b2cdf96e55f45d92692e5085936b26c65d9c97220cb91b29c5896a36439892c2795e564b29c5c9653c872b42ca794e51859be4f9653c9726a594e23cb6965399d2ca797e50cb29c31210282360322206831df5919a4322068d321028216f35c81c12a0382360d22206831cf1518a23220685321028216f35c81a12a038236061110b498e70a0c531910b4d18880a0c53c5760b8ca80a04d8e08085acc730546a80c08daa48880a0c53c5760a4ca80a08d4204042de6b902a35406046d242220681343108d561910b40e1110b40104d1189501416b1001416b2188c6aa0c08da448880a08d80201aa73320781b1210fc158268bcce80e0cf9080e02f1044137476c5c743aa4c80209aa813d15848957110449374221a0da9320682285e27a291902aa3208826eb44341c52650404d1149d888642aa0c83209aaa13d1604895211044d37406047f82201a0441345de72e9a06a9321d8268864e44532055a64210cdd489281e52653204d12c9d882642aa4c82209aad1311e4c5aec9664310cdd1896806a4ca4c08a2573422ca0e0908de82609eab730fcd81547905b287e62a0f08660705046fd1cd28f5e9a8c9460d4dea4652e797dab6d422a7fe36cd1268104043179a98d0748a464b34c6a3191ccd3b69584983619aead2049dc6dfdea6f236b5b769bc4deb6d3a6fd37b9bc1db8c770908da4c72fc28b32c6791e5fb6539ab2c3f20cbd964f94159ce2ecb0fc9720e597e589673caf223b29c4b961f95e5dcb2fc982c3f2ecb4fc8721e597e5296f3ca72ac2ce793e5fcb25c40960bca7221592e2ccb4564b9688204048b40028245217f08b6eb0c08168204040b4310edd019102c0009081684207a4b6740301f2420981f8268a7ce80605e4840301682e86d9d01c13c9080e0931044bb7406041f8704049f80207a47674030372420f81804d16e9d01c15c9080e0a31044efea0c08e68404041f8120daa3332098031210c4bca8e13d9d01c1ec908020e695317b750604b34102829857c6bcaf322068b322028216f312b47d2a0382360b222068312f41fb4067577c1fa4ca071044219d88f642aabc0f41e47522da03a9f21e04d17e9d887643aabc0b41f4a14e44bb2055de81203aa013d14e4895b721883ed2896807a4ca5b1044075506046d6608a2ed10448774eea283902a8720880eeb44740052e52308a2233a11ed8754f91082e8a84e442148150f41744c27a2a3902ac720888eeb44741852e50804d1098d8820dd428b7965fa499d7be838a4ca09c81e3aa93c20f81026206833d1cd28f5e9a8c9460d4dea4652e797dab6d422a7fe36cd1268104043179a98d0748a464b34c6a3191ccd3b69584983619aead2049dc6dfdee6f336bfb705bc2de86d216f0b7b5bc4dba2770b081693e347c565b9842c3f25cb2565f969592e25cba565b98c2c3f23cb6565b99c2c9797e56765b9822c5794e54ab2fc9c2c5796e52ab25c55969f97e56ab25c5d966bc8724d59ae25cbb565b98e2cd795e57ab25c3f410282f5200141cca3d16fea0c08d6810404318f46bfa53320580b1210c43c1afd279d01c11a908020e6f5553feb0c085683040431afaffa456740b02a242088797dd56d9d01c1ca908020e6f555bfea0c085682040421afaf4a9e486740b002242008797d55f2089d01c1f2908020e4f555c98dce806059484010f2faaae4566740b00c2420f80c0491d319102c0509089686200a7406044b4202824f431045ea0c08968004049f82204aacb22b9e3c125205f24cdce4513a11394815c833719327d189c840aa409e899b3ca94e4489205520cfc44d9e4ce784ee36a40ae499b8c993eb44f433a40ae499b8c953e8448479cacd4f1044d13a0382c521886e4210a5d469d7d1902a90f796248fd1892839a40ae4bd25c9efd3892829a40ae4bd25c953e9441405a902796f49f2d43a11a5825481bc892b791a9d88622055206fe24a9e5623a21c9080603108e6743af7501a4815c83b012188123220980314102c4637a3d4a7a3261b3534a91b499d5f6adb528b9cfadb344ba041000d5d686242d3291a2dd1188f667034efa461250d8669aa4b13741a7f7b5bc3db9aded6f2b6b6b775bcadeb6d3d6febdf2d20d8408e1f3594e546b2fc822c3796e51765b9892c3795e566b2dc5c965bc8729c2cb794e556b2dc5a96dbc8725b597e4996dbc9727b59ee20cb1d65b9932cbf2ccb9d65b98b2c7795e56eb2dc5d967bc8724f59ee952001c19e9080602fc81f82823a0382dd2101c11e104485740604bb420282dd20880aeb0c0876860404bb401015d11910ec040908be0c4154546740b0032420d81182a898ce80603b4840b03d0451719d01c1b69080e04b1044257406045b4302826d20889ed219106c090908b682202aa93320d80212108c83207a5a6740b0192420d81c82a894ce8060134840b0290451699d01c1c69080e08b1044657406041b4102822f40103da3b32b5e06520513562eab13512948154c58b99c4e442521553061e5f23a11958054c184959fd58908337e2c0e41544127a222902a90b7df24afa81351214815c8db6f9257d219106c08410479fb4df2e774eea24a902a982f9456d689a802a40ae60ba55574222a0fa982f94269559d88ca42aa60be50fabc4e44552155208f48485e4d27a2ca902a90472424afae1111e4952cb60104730d9d7ba81aa40ae4612d10440919107c1814106c4037a3d4a7a3261b3534a91b499d5f6adb528b9cfadb344ba041000d5d686242d3291a2dd1188f667034efa461250d8669aa4b13741a7f7bdbd9db2ede76f5b69bb7ddbdede16d4f6f7bdd2d20d85b8e1ff591e5beb2dc4f96fbcbf200591e28cb836479b02c0f91e5a1b23c4c9687cbf208591e29cba36479b42c8f91e5b1b23c4e96c7cbf204599e28cb9364395e9627cbf214599e2acbd36479ba2ccf90e5990912109c010908ce84fc2178596740701a2420381d82a8b3ce80e0144840702a0451179d01c178484070320451579d01c1899080e02408a26e3a0382e32101c1091044dd750604c7420282e320887ae80c088e860404c74010f5d419101c0909088e8220eaa53320381c12101c0141d45b674070282420380c82a88fce80e0604840700804515f9d01c1819080e02008a27e3a0382fd2101c1011044fd750604fb420282fd208806e8ec8af78754c1eca2813a11f58554c1eca2413a11f58654e90341345827a29e902a98af250fd189a83ba40ae66bc9437522ea0aa982f95af2309d883a43aa60be963c5c6740b00f0411e66bc92374eea2e1902a984ffa2375221a0aa982f9a43f4a27a2c1902a984ffaa375221a08a982f9a43f4627a2d1902a98def5589d884642aa607ad7e33422ca090908623ee78dd7b987c642aa60a668e395070473820282bde96694fa74d464a386267523a9f34b6d5b6a91537f9b66093408a0a10b4d4c683a45a3251ae3d10c8ee69d34aca4c1304d7569824ee36f6f39e6e4ed146fa77a3bcddbe9decef076e6dd0282b3e4f8d16c599e23cbafc8f25c597e5596e7c9f27c595e20cb0b6579912c2f96e525b2bc549697c9f272595e21cb2b65f935595e25cbab65f975597e4396d7c8f25a595e27cbeb6579832c6f94e54db2bc5996b724484070332420b805f2876095ce80e0464840701304d16a9d01c1f59080e00608a2d7750604d7420282eb2088ded019107c0312105c0341b446674070352420f83a04d15a9d01c1d72001c1551044eb740604574002822b2188d6eb0c082e8304049743106dd019105c0209082e8520daa83320b80812105c0c41b449674070012420b8108268b3ce80e03c4840703e04d1169d01c1b99080e0ab10445b750604e7400282af40106dd3d915df0aa9b20d82e84d9d883643aa60fa45db7522da08a982e917edd089683da40aa65ff4964e446b215530fda29d3a11bd01a982e917bdad13d16a48154cbf6897ce80e06c08224cbfe81d9dbb6817a4ca3b1044bb7522da09a9f23604d1bb3a11ed8054790b82688f4e446f42aa6c87207a4f27a23d902aef4110edd5896837a4cabb1044ef6b44f4082420380b82799fce3db41752e57dc81edaa73c20f8082820388b6e46a94f474d366a685237923abfd4b6a51639f5b769964083001abad0c484a653345aa2311ecde068de49c34a1a0cd3549726e834fef676adb7ebbc5defed066f377abbc9dbcdde6eb95b4070ab1c3fda26cb6fcaf27659de21cb6fc9f24e597e5b9677c9f23bb2bc5b96df95e53db2fc9e2cef95e5f765799f2c7f20cb2159f6b2bc5f963f94e503b2fc912c1f94e543b27c58968fc8f251593e26cbc765f9448204048f43028227207f08bed219103c0a09081e8320baa83320781812103c0241f4b5ce80e0414840f01004d1373a0382072001c18f2088bed51910dc0f09087e0841f49dce8060081210f41044dfeb0c08ee8304043f8020fa416740702f242088f980fca3ce80e01e484010d3aabba43320b81b1210c4b4ea2eeb0c08ee82040431c3a72b3a03823b210141ccf0e9aace80e00e484010337cbaa63320f826242088193e5dd7d915bf06a9721d82e8864e44572055ae4210ddd489e812a4ca6508a25b3a11fd00a9f22304d14f3a117d07a9f23d04d1cf3a117d03a9f22d04d12f3a115d8454f91a82e8b6ce80e03608a2af20887ed5b98b6e43aafc8a409422914e443f43aafc024114a113d12d48959f20888c4e443720556e4210599588521848150b41e474224a04a9120141146844940b1210847c9d3045a4ce3de4205502c81e8a541e10cc050a086ea59b51ead351938d1a9ad48da4ce2fb56da9454efd6d9a25d02080862e3431a1e9148d96688c4733389a77d2b09206c334d5a5093a8dbfbd3de8ed216f0f7b7bc4dba3de1ef3f6b8b727ee16103c29c78f4ec9f26959fe5896cfc8f227b27c56963f95e573b2fc992c9f97e5cf65f9822c7f21cb5fcaf257b27c5196bf96e56f64f95b59fe4e96bf97e51f64f94759be24cb9765f98a2c5f95e56bb27c5d966fc8f2cd040908de80040431b7a40feb0c085e8304042163831439750604af40028290b1418a477406042f41028290b1418a5c3a03823f40028290b1418a47750604bf83040421638314b9750604bf810404216383148fe90c085e840404216383148feb0c087e09090842c606299ed01910bc0009087e014194476740f03c2420f83904d1933a0382e72001c1cf2088f2ea0c089e8504043f85208ad519103c0309087e0241944f6740f0342420f83104517e9d5df17c902af921880ae844941752251682a8a04e447920559e84202aa413d1e3902a4f401015d6892837a4ca631044457422ca05a9f2280451519d887242aa409eb893a298ce80e02908a28721888aebdc45c520558a431095d089a808a44a5108a2a774222a04a9521882a8a44e440520550a42103dad1351494895a721884ae944540252e52908a2d21a11416ef9ec4908e6323af750294895d2903d54467940f0515040f024dd8c529f8e9a6cd4d0a46e24757ea96d4b2d72ea6fd32c8106013474a189094da768b444633c9ac1d1bc9386953418a6a92e4dd069fceded256f2f7b7bc5dbabde5ef3f6bab737bcbd79b780e02d397ef4932cff2ccbbfc8f26d59fe55945d22598e906523cb56969d2c07b21c29cb8965394a9693c87252594e26cbc96539852c47cb724a598e91e5fb6439952ca796e534b29c5696d3c9727a59ce20cb19132220e8322002822e23e40f4153950141970e111074e921889aa90c08ba348880a04b0b41d45c6540d0a54204045d6a08a2162a03822e06111074f74110c5a90c08ba684440d0a584206aa93220e8922302822e0504512b9501419714111074c920885aab0c08ba284440d02581206aa33220e822110141971882a8adca80a0738880a0c37c0ff3259501416710014187f946783b9501419708111074986f84b7d71910bc0d0908629e71d2416740f067484010f38c938e3abbe21d20553a421075d289a81da44a7b08a29775226a0ba9f2120451679d885a43aab48120eaa213514b48955610445d75226a01a9120741d44d27a266902acd2188baeb0c08fe0441d41482a887ce5dd41d52a50704514f9d88ba42aa748320eaa513516748952e1044bd7522ea04a9f23204511f9d887a43aaf48120eaab13514f48955e1044fd3422ca0d0908429e889aa2bfce3dd41752a51f640ff5571e10cc0d0a08dea29b51ead351938d1a9ad48da4ce2fb56da9454efd6d9a25d02080862e3431a1e9148d96688c4733389a77d2b09206c334d5a5093a8dbfbd4be55d6aefd27897d6bb74dea5f72e837719ef12107499e4f8516659ce22cbf7cb7256597e4096b3c9f283b29c5d961f92e51cb2fcb02ce794e5476439972c3f2acbb965f931597e5c969f90e53cb2fca42ce795e55859ce27cbf965b9802c1794e542b25c58968bc872d10409081681040431df7c7a456740b010242088f9e6d35c9d01c102908020e69b4fafea0c08e6830404314fa798a7332098171210c43c9d62bece80601e484010f3748a053a03828f43028298a7532cd41910cc0d0908629e4eb14867403017242088793ac5629d01c19c908020e6e9144b7406047340028298a7532cd51910cc0e09083e0441b44c6740301b2420f82004d17295014197151110740f4010ad5019107459100141773f04d14a9d5df115902a2b21885ed3896819a4ca7208a2553a112d8154590a41b45a27a245902a8b21885ed7896801a4ca4208a23774229a07a9321f82688d4e447321555e85205aab3220e8324310bd0241b44ee72e5a0ba9b20e8268bd4e446f40aaac8120daa013d16a4895d7218836ea44f41aa4ca2a08a24d3a116d8454d90441b45927a2f5902a1b2088b6684404995cb84c10cc5b75eea1cd902a5b207b68abf280e0639880a0cb4437a3d4a7a3261b3534a91b499d5f6adb528b9cfadb344ba041000d5d686242d3291a2dd1188f667034efa461250d8669aa4b13741a7f7b97cfbbfcde15f0aea07785bc2bec5d11ef8ade2d20584c8e1f1597e512b2fc942c9794e5a765b9942c9796e532b2fc8c2c9795e572b25c5e969f95e50ab25c51962bc9f273b25c5996abc87255597e5e96abc9727559ae21cb3565b9962cd796e53ab25c5796ebc972fd040908d6830404eb43fe109cd01910ac030908d685203aa93320580b1210ac0d41744a6740b0062420581382e8b4ce8060354840b03a04d1c73a0382552101c1e72188cee80c0856860404ab40107da23320580912107c0e82e8acce8060054840b02204d1a73a0382e52101c1672188cee90c0896850404cb41107da63320580612107c0682e8bcce806029484010f3ba8fcf7506044b42028298170f5dd019102c010908625e3cf485ceaef80548952f2088bed489e83ca4cae710445fe944740e52e53308a28b3a119d8554f91482e86b9d88ce40aa7c0241f48d4e44a721553e8620fa562722cc6bf04e41107da73320581c82e80404d1f73a77d177902adf4310fda013d137902adf4210fda813d1454895af21882ee944f425a4ca571044977522ba04a9721982e88a4e443f40aafc0841745523a2c72101c16210ccd774eea12b902a57217be89af280e0e3a0806031ba19a53e1d35d9a8a149dd48eafc52db965ae4d4dfa659020d0268e84213139a4ed16889c6783483a379270d2b69304c535d9aa0d3f8dbbb1aded5f4ae9677b5bdabe35d5defea7957ff6e01c10672fca8a12c3792e51764b9b12cbf28cb4d64b9a92c3793e5e6b2dc4296e364b9a52cb792e5d6b2dc4696dbcaf24bb2dc4e96dbcb720759ee28cb9d64f96559ee2ccb5d64b9ab2c7793e5eeb2dc43967bca72af040908f6840404218f238e4eab3320d81d1210843c603f3a9dce806057484010f280fde8f43a03829d210141c803f6a333e80c0876820404210fd88fcea83320d801121084bc042d3a93ce80603b484010f212b4e8cc3a03826d210141c84bd0a2b3e80c08b6860404212f418bbe5f6740b02524200879095a74569d01c116908020e42568d10fe80c0836830404212f418bcea63320d804121084bc042dfa419d01c1c69080e08b1044d97506041b4102822f40103da4b22b1e9d1d5205f234d3e81c3a11658354813ccd34fa619d88b242aa409e661a9d5327a22c902a90a799463fa21311e4f924d199218872e944940152252304d1a33a11a58354490f41945b6740b02104515a08a2c774eea2dc902a90e736453fae13512e4815c81b27a29fd0892827a40ae48d13d1797422ca01a90279e344f4933a11e5815481bc43293aaf4e448f43aa40dea1141dab1111e4d25c0308e67c3af7505e4815c8dbdc2088123220f8042820d8806e46a94f474d366a685237923abfd4b6a51639f5b769964083001abad0c484a653345aa2311ecde068de49c34a1a0cd3549726e834fef6aeb3775dbcebea5d37efba7bd7c3bb9edef5ba5b40b0b71c3fea23cb7d65b99f2cf797e501b23c509607c9f260591e22cb436579982c0f97e511b23c529647c9f268591e23cb6365799c2c8f97e509b23c519627c972bc2c4f96e529b23c5596a7c9f274599e21cb33132420380312109c09f943505d6740701a2420381d82a886ce80e0144840702a04514d9d01c1784840703204512d9d01c1899080e02408a2da3a0382e32101c109104475740604c7420282e32088eaea0c088e860404c74010d5d319101c0909088e8220aaaf3320381c12101c0141d440674070282420380c82a8a1ce80e060484070080451239d01c1819080e02008a217740604fb4302820320881aeb0c08f6850404fb4110bda8b32bde18520513336da213512348154cccb4a94e4498c1514308a2663a11d5835481bcb724bab94e4475205520ef2d896ea113512d4815c87b4ba2e37422aa01a902796f49744b9d01c13e104490f79644b7d2b98b5a42aa60be0ad85a27a216902a98af02b6d189a819a40ae6ab806d75226a02a982f92ae04b3a11b58554c17cb9bd9d4e44ad2155305f6e6faf11511e4840b0370473079d7ba81da40ae6311b1d940704f3800282bde96694fa74d464a386267523a9f34b6d5b6a91537f9b66093408a0a10b4d4c683a45a3251ae3d10c8ee69d34aca4c1304d7569824ee36fef38e6e4dd14efa67a37cdbbe9decdf06ee6dd0282b3e4f8d16c599e23cbafc8f25c597e5596e7c9f27c595e20cb0b6579912c2f96e525b2bc549697c9f272595e21cb2b65f935595e25cbab65f975597e4396d7c8f25a595e27cbeb6579832c6f94e54db2bc5996b7244840703324200879d77cf4389d01c18d9080e02608a2f13a0382eb2101c10d104413740604d7420282eb208826ea0c08be010908ae81209aa43320b81a12107c1d82285e6740f0354840701504d1649d01c1159080e04a08a2293a0382cb2001c1e5104453750604974002824b2188a6e90c082e8204041743104dd719105c0009082e84209aa13320380f12109c0f4134536740702e2420f82a04d12c9d01c1399080e02b1044b37576c56741aacc86209aa313d10c4815cc174a5fd189681aa40ae60ba57375229a02a982f942e9ab3a11c543aa60be503a4f27a289902a982f94ced789683ca40ae60ba50b74060467431061be50ba50e72e5a00a982f98cb64827a279902a98cf688b75229a0ba982f98cb64427a239902a98cf684b75225a02a982e93a2ed3896811a40aa6ebb85c2322c8f3231da65bb042e71e5a06a982997fac501e107c1214109c4537a3d4a7a3261b3534a91b499d5f6adb528b9cfadb344ba041000d5d686242d3291a2dd1188f667034efa461250d8669aa4b13741a7f7bb7d6bb75deadf76e83771bbddbe4dd66efb6dc2d20b8558e1f6d93e5376579bb2cef90e5b76479a72cbf2dcbbb64f91d59de2dcbefcaf21e597e4f96f7caf2fbb2bc4f963f90e5902c7b59de2fcb1fcaf20159fe48960fcaf221593e2ccb4764f9a82c1f93e5e3b27c22410282c72101c113903f04efeb0c081e8504048f4110edd319103c0c09081e8120fa406740f020242078088228a4332078001210fc0882c8eb0c08ee8704043f8420daaf3320188204043d04d1873a0382fb2001c10f20880ee80c08ee850404df8720fa486740700f2420f81e04d1419d01c1dd9080e0bb10448774060477410282ef40101dd61910dc090908be0d417444674070072420f81604d1519d01c1372101c1ed1044c77476c58f42aa603ee91fd789e830a40ae693fe099d880e42aa603ee99fd489e800a40ae693fe299d88f643aa603ee99fd6892804a982f9a4ffb14e44fb2055309ff4cfe80c086e8320c27cd2ff44e72e3a03a9f20904d1599d884e43aa7c0c41f4a94e442721554e41109dd389e838a40a661afb994e44e720553e83203aaf13d15948954f21883ed788282f2420b81582f982ce3d741e52e573c81ebaa03c2098171410dc4a37a3d4a7a3261b3534a91b499d5f6adb528b9cfadb344ba041000d5d686242d3291a2dd1188f667034efa461250d8669aa4b13741a7f7b77d0bb43de1df6ee887747bd3be6dd71ef4edc2d2078528e1f9d92e5d3b2fcb12c9f91e54f64f9ac2c7f2acbe764f933593e2fcb9fcbf20559fe4296bf94e5af64f9a22c7f2dcbdfc8f2b7b2fc9d2c7f2fcb3fc8f28fb27c49962fcbf21559be2acbd764f9ba2cdf90e59b091210bc010908de44fc214819e80c085e830404af431045ea0c085e810404af421025d61910bc0409085e86208ad21910fc011210fc11822889ce80e0779080e0f7104449750604bf810404bf85204aa6332078111210fc1a8228b9ce80e0979080e0571044297406042f4002825f401045eb0c089e870404216d969429750604cf41028290866fca189d01c1b3908020a4e19bf23e9d01c1339080206484993295ce80e06948401032c24c995a65573c652a4895d410446974228a8154b90f8228ad4e44d1902a292188d2e944941c52250504517a9d889242aa248320caa0135114a44a1208a28c3a114542aa248620caa43320780a82288020caac7317658254c90c41944527a20c902a192188eed789281da44a7a08a2ac3a11a58154490b41f4804e445921551e8020caa61351164895fb21881ed4882816121084049e5366d7b987b241aa3c08d943d9950704634101c19374334a7d3a6ab2514393ba91d4f9a5b62db5c8a9bf4db3041a04d0d0852626349da2d1128df1680647f34e1a56d26098a6ba3441a7f1b77797bcbbecdd15efae7a77cdbbebdeddf0eee6dd0282b7e4f8d14fb2fcb32cff22cbb765f957510e12c972842c1b59b6b2ec643990e548594e2ccb51b29c449693ca7232594e2ecb2964395a9653ca728c2cdf27cba96439b52ca791e5b4b29c4e96d3cb720659ce981001c12003222018603ed8945619100cd221028201e6834d199501c1200d222018603ed83ca3322018a442040403ccf0a9acca8060108308080698e153399501c1201a11100c30c3a7f22a03824172444030c00c9f9e5519100c922202820166f854416540308842040403ccf0a9a2ca8060108908080698e153259501c1c02102820166f8f49cca8060601001c1c04210555619100c1221028241040451159d01c1db9080e0af1044557506047f8604047f81207a5e6757bc2aa4caf31044d57422aa0ca9520582a8ba4e449520559e8320aaa113510548958a10443575222a0fa9f22c04512d9d88ca42aa948320aaad1351194895672088eae80c08fe0441541a82a8aece5d540752a52e04513d9d886a41aad48620aaaf13510d48959a10440d7422aa06a9521d82a8a14e440d20551a421035d289a81ea44a7d08a2173422ca070908de82606eac730f3582547901b2871a2b0f08e60305046fd1cd28f5e9a8c9460d4dea4652e797dab6d422a7fe36cd1268104043179a98d0748a464b34c6a3191ccd3b69584983619aead2049dc6df3e48e583d43e48e383b43e48e783f43ec8e0838c7709080699e4f8516659ce22cbf7cb7256597e4096b3c9f283b29c5d961f92e51cb2fcb02ce794e5476439972c3f2acbb965f931597e5c969f90e53cb2fca42ce795e55859ce27cbf965b9802c1794e542b25c58968bc872d1040908168104048b42fe10f4d319102c040908168620eaaf3320580012102c084134406740301f2420981f8268a0ce80605e484010f2f5a09483740604f34002824f42100dd619107c1c12107c02826888ce80606e4840f03108a2a13a0382b92001c147218886e90c08e68404041f81201aae3320980312107c18826884ce8060764840f02108a2913a0382d9200141ccb77947a90c0806591101c100f35c81d12a03824116444030c03c57608cceaef86848953110446375221a09a9320a82689c4e44c321554640108dd7896828a4ca3008a2093a110d8654190241345127a281902a83208826e944d41f5265000451bcca8060901982a81f04d1649dbb281e52653204d1149d882642aa4c82209aaa13d1784895091044d374221a0ba9320e8268ba4e44d32055a64310cdd089680aa4ca5408a2991a1141a6a801e6b9bab374eea119902a33217b6896f280607e4c4030c84437a3d4a7a3261b3534a91b499d5f6adb528b9cfadb344ba041000d5d686242d3291a2dd1188f667034efa461250d8669aa4b13741a7ffb209f0ff2fba0800f0afaa0900f0afba0880f8ade2d20584c8e1f1597e512b2fc942c9794e5a765b9942c9796e532b2fc8c2c9795e572b25c5e969f95e50ab25c51962bc9f273b25c5996abc87255597e5e96abc9727559ae21cb3565b9962cd796e53ab25c5796ebc972fd040908d683040431df36d8a2332058071210c47c7f6eabce80602d484010f3fdb96d3a038235200141ccf7e7ded41910ac06090862be3fb75d6740b02a24208879c6c90e9d01c1ca908020e619276fe90c085682040431cf38d9a9332058011210c43ce3e46d9d01c1f2908020e61927bb740604cb42028298679cbca3332058061210c43ce364b7ce806029484010f38c93777506044b4202824f4310edd119102c0109083e0541f49eceaef81e4895f72088f6ea44b41b52e55d08a2f77522da05a9f20e04d13e9d887642aabc0d41f4814e443b2055de82200ae944f426a4ca760822af13d15648956d1044fb7506048b43106d8120fa50e72eda0fa9f22104d1019d8842902a1e82e8239d88f641aa7c0041745027a2bd902aef43101dd289e820a4ca2108a2c33a111d8054f90882e8884644052001c16210cc4775eea1c3902a47207be8a8f28060015040b018dd8c529f8e9a6cd4d0a46e24757ea96d4b2d72ea6fd32c8106013474a189094da768b444633c9ac1d1bc9386953418a6a92e4dd069fced831a3ea8e9835a3ea8ed833a3ea8eb837a3ea87fb7806003397ed450961bc9f20bb2dc58965f94e526b2dc54969bc97273596e21cb71b2dc52965bc9726b596e23cb6d65f925596e27cbed65b9832c7794e54eb2fcb22c7796e52eb2dc5596bbc9727759ee21cb3d65b9578204047b420282bd207f08aeea0c08768704047b40105dd31910ec0a0908768320baae3320d8191210ec024174436740b0132420f83204d14d9d01c10e9080604708a25b3a0382ed2001c1f610443fe90c08b68504045f8220fa596740b0352420d80682e8179d01c1969080602b08a2db3a03822d2001c13808a25f7506049b410282cd11886212e90c08368104049b421045e80c08368604045f8420323a03828d200141c84b6362accaae788c815481bcee3cc6e94494085205f2baf39840e76ce536a40ae475e731913a11fd0ca90279dd794c629d88302f30fb0982284a27a21b902a37218892e844740d52e53a0451529d01c186104457218892e9fca39f145225190451729d88a22055924010a5d08928125225310451b44e440e522580204aa9135134a44a4a08a2189d889243aaa48020ba4f2322c8abea02c8cbae6352e9dc4331902af741f6502ae501c182a0806003ba19a53e1d35d9a8a149dd48eafc52db965ae4d4dfa659020d0268e84213139a4ed16889c6783483a379270d2b69304c535d9aa0d3f8db079d7dd0c5075d7dd0cd07dd7dd0c3073d7dd0eb5f070497d4ac503a5fc142f1a7ddbcf8d0cda8f8d00d3aaed3718d8eab745ca1e3321d97e8f8918e1fe8f89e8eefe8f8968e6fe8f89a8e8b747c45c797747c41c7053a3ea7e33c1d9fd1718e8e4fe9384bc727749ca1e3633a4ed3718a8e9351f13e22232f197849cf4b3a5ed2f2928697d4bca4e2e53e5e627849c94b342f297849ce4b325e92f2928497285e12f312c94bc08be3c5f2627889e025119dc5af74dca6e3173a7ea6e3273a6eb158949722bc14e6a5102f057929c04b7e5ef2f112cb4b5e5e9ee4250f2f4ff0f2382f8ff1929b974779c9c5cb23bce4e4e5615e72f0f2102fd9797990976cbc3cc04b565eeee7250b2f9979c9c44b7d5eeaf15297973abcd4e6a5162f3579a9c14b755eaaf1f23c2f5579a9c24b655e9ee3a5122f1579a9c0cbb3bc94e7a51c2f657979869732bc94e6a5142f4ff3529297a77829c14b715e8af1d28b979ebcf4e0a53b2fdd78e9ca4b175e3af3f2322f9d78e9c84b075edaf3d28e97977869cb4b1b5e5af3d28a9796bcc4f1d28297e6bc34e3a5292f4d78799197c6bcbcc04b235e1af2d2809799bccce0653a2fd37899cacb145e26f312cfcb245e26f2328197f1bc8ce3652c2f637819cdcb285e46f2328297e1bc0ce365282f437819cccb205e06f2328097febcf4e3a52f2f7d78e9cdcb165e36f3b289978dbc6ce0653d2feb7859cbcb1a5edee0e5755e56f3b28a97d77859c9cb0a5e96f3b28c97a5bc2ce165312f8b7859c8cb025ee6f3328f97577999cbcb2bbccce165362fb37839c1cb715e8ef172949723bc1ce6e5102f0779f9889703bc7cc8cb7e5e3c2f215e3ee0651f2feff3b29797f778d9c3cbbbbcece6e51d5e76f1f2362f3b79798b971dbc6ce7e54d5eb6f1b295979bbcdce0e53a2fd778b9cacb155e2ef37289971f79f98197ef79f98e976f79f98697af79b9c8cb57bc7cc9cb17bc5ce0e5735ecef3f2192fe778f99497b3bc7cc2cb195e3ee6e5342fa77861e733ec7c869dcfb0f319763ec3ce67d8f90c3b9f61e733ec7c869dcfb0f319763ec3ce67d8f90c3b9f61e733ec7c869dcfb0f319763ec3ce67d8f90c3b9f61e733ec7c26119fc6afbcdce6e5175e7ee6e5275ed8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ff33ec7f86fdcfb0ff19f63fc3fe67d8ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fdcfb1ff39f63fc7fee7d8ff1cfb9f63ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f681015eebef7f6411f1ff4f5413f1ff4f7c1001f0cf4c1201f0cf6c1101f0cf5c1301f0cf7c1081f8cf4c1281f8cf6c1181f8cf5c1381f8cf7c1041f4cf4c1241f50c5c93e98e283a93e98e683e93e98e18399f8190de4750ac12cc8842656d9102b96979a7f153255a905c1934f119ed87ffc3fd5ff0a9effa952038227bf123cb1fffc2f9effb378fea94a35089e020af0c4def96f54f93378eea8521582a7e07f194fecbffa379ffba378fe4595ca103c85fe8b7862ff9d50f18fe0f937552a41f014fe2fe18995c4677f2f1ea14a05089e22ff053cb177ab58eef7e0b94b95f2103c45ffc378627f4fc567ee86e77754290bc153ec3f8827f6f7562c2de1f99d55ca40f014ff0fe189fd23159ffe7778fe409552103c25fe037862ff68c5a7fe159e3f58a52404cf53098c27f6cf54fc3f4f5bfe13554a40f0944c403cb17fb662d17fc6f327ab1483e0795a67ecb424a40ae4452f31a574222a01a90279d14b4c699d88208f6e8d290e41544627a222902a4521889ed189a810a44a6108a2b23a11158054817c1d23a69c4e44f92055f24310954f3044b17fbe22c6896221809ed5b987ca43aa405ec519534127a2b2902a905771c654d489a80ca40ae4559c319574222a05a902791567cc733a1155825481bc5c3aa6b24e44152055202f978ea992208862ff5ac5ffb9b3fe4b550a432057d5b9832a43aa405e72af1311e451e1c16c08a0f61ac32f5d00e197ae103c1d34865f5e06845f3a43f074d4187ee90808bf7482e0e9a431fcd21e107ee900c1f3b2c6f0cb4b80f04b3b089ece1ac32f6d00e197b6103c5d34865f5a01c22fad2178ba6a0cbfc401c22f2d2178ba690cbf3407845f5a40f074d7187e690a08bf3483e0e9a131fcf22220fcd20482a7a7c6f0cb0b80f04b63089e5e1ac32f0d01e19746103cbd35865fea03c22f0d2078fae8ecfaf48654e90341d45727a29e902a90d715c6f4d389a83ba40ae4758531fd7522ea0aa902e941c60cd089a833a40ae4758531037522ea04a902795d61cc209d883a40aa405e5718335863f8a51e0410e46585314374eea1c1902a43208886ea44341052651004d1309d88fa43aa0c80201aae13515f48957e10442374221a0ea932028268a44e444321558641108dd2187ea90308bfd485401ead73078d84541905d9410844fff7a1ebab6a366fdda163e7ce75e23ab769d96b6abc0f66856ed33a3b74fb74a252f1a11951f1a1e9744ca3632a1d53e8984c473c1d93e89848c7043ac6d3318e8eb1748ca163341da3e81849c7083a86d3318c8ea1740ca163301d83e81818153f202abe7f547cbfa8f8be51f17da2e27bd3bfbb998e4d746ca463031debe95847c75a3ad6d0f1061dafd3b19a8e5574bc46c74a3a56d0b19c8e65742ca563091d8be95844c7423a16d0319f8e7974bc4ac75c3a5ea1630e1db3e99845c7713a8ef1737888023fef2be0277f05fc0cb0809f0616f073c1027e4258c0cf0a0bf8a961013f3f2ce0278905fc4cb1809f2e16f073c6027ee258c0cf1e0bf82964013f8f2ce0279305fc8cb2809f5616f073cb027e8259c0cf320bf8a966013fdf2ce0279d05fcccb3809f7e16f073d0027e225ac0cf460b6646f960ceffdef3f188dd1acc81e4995ef9eb45062d2dd3b94dbb766d5a4d9d346849cd361d5ab58bc3bc24217c767ff577297c4eed3bb58bf3c1dc8953062dafd4ad7da78a2dab76ec1a9fc80e5afc4cc70e5dbac6474cfaeb273b685599361d9a76ee55be4d5cbb16cf779a926861d936dd23122daad9b563a7c9132702fe0bfe790f4d9a0cc14b4c303fa85701db2841aeefd589e8bf587a8025d4ef5d7ee86fddbc7bbf75ff0b2e11c16ca1f90a7fe7e8eae6237ee3feffad3d59ddd6c69e10e231788b4b77eedcb4d7e94431985302bc7f0b7322a9b49c486a2d279246cb89a4d57222e9b49c487a2d279241cb8964d4722299b49c48662d279245cb89dcafe544b26a399107b49c4836c4a7807fdc9a50a761810f16fa60910f16fb60890f96fa60990f96fb60850f56fae0351facf2c16a1fbcee83377cb0c6076b7db0ce07eb7db0c1071b7db0c9079b7db0c5075b7db0cd076ffa60bb0f76f8e02d1fecf4c1db3ed8e583777cb0db07effa608f0fdef3c15e1fbcef837d3ef8c007211f781fecf7c1873e38e0838f26ce1ab4b04ac7eef1d6fcf67f4dc46fff3722d13f3e9e24facb1f4f62f30e5a59be63e7b836ad3a700f6ff2bae6b456ebdca67bd3ae71dcd8ebdaa6638749839657886bda298c29dee59d3c68558db8566dba748deb5cb1438bb89e1177fc6bf3cfff711bf3db3907ee7fce3d18b4883f684d8afaed5f278af89fcf419320ada2f9804f53fff44ecd65d5bb75ecda26ae43d7a9a8cfd48b10bf3a7ffdd34b3e1f1cf2c1c19dffa28bbbb846e9aacf969b446dc18311a27c28f40beec5f5ffef47b808c2f9603c8411f615adf8edb458cd763ae283c3f2763a2c6fa72309b39d1643381f866ca723dab7d37235dbe9980f8ecadbe9a8bc9d8e25cc765a0ee17c14b29d8e69df4e2bd46ca7133e382e6fa7e3f2763a9130db690584f371c8763aa17d3bad54b39d4ef9e0a4bc9d4ecadbe954c26ca79510ce2721dbe994f6edf4919aedf4b10f4ecbdbe9b4bc9d3e4e98edf41184f369c876fa5863aa07f2fcc26001a4ca19e4480b9e9238039dd77e726f5e7b075e6282f9419d559992a0eb3b0b4f49c4635a4e902a9faadc5667e9c4208db998e52a4399a01fde3948b473b9ea98db39a8817f76cfc0efc04b4c303fa8f32a0d9caeefbcd2981b1a18c49a200f7e0e1642aa7caefacef273a8315db8674c77e02526981fd4172a8d89aeef8bbff59de5972ab7d5177462983bcb957fe73bcbaf2077962b55df597e0535f08bf70cfc0ebcc404f383fa5aa581d3f57dadf4cef26bd5bf77a7a1bf77dfdcfbbdbb032f31c1fca0be55f97b47d7f7eddffac6e93b95dbea5b3a31cc8dd3aabff38dd3f7901ba755aa0dfc7ba881ff70cfc0efc04b4c303fa81f551a385ddf8f4a6f9c7e54fd7b7714fa7b77e9deefdd1d788909e6077559e5ef1d5ddfe5bff58dd31595dbea329d18e6c6e9f5bff38dd355c88dd3ebaa0dfc2ad4c0afdd33f03bf01213cc0feaba4a03a7ebbbaef4c6e9baeadfbbe3d0dfbb1bf77eefeec04b4c303fa89b2a7fefe8fa6efead6f9c6ea9dc5637e9c430374e6bfece374e3f416e9cd6a836f09fa006fef33d03bf032f31c1fca07e5169e0747dbf28bd71fa45f5efdd49e8efdded7bbf7777e02526981fd4af2a7fefe8fa7efd3bdf38452652b9ad7ea513c3dc38adfb1bdf384546406e9cd66936f0c808a481479a7b067e075e6282f941598d06ced76775de384180fddfafb62eab16d722ae7397b80e9327c7fb6061f831e207c3ebe1d0ed44f13ed2f9c840fce74e277a8cfed34bc2ffccd2f0ba2cbc1e0dafc7c3ebc9f0fa5a785d155e5787d7d7c3eb1be1754d785d1b5ed785d7f5e1754378dd185e3785d7cde1754b78dd1a5eb785d737c3ebf6f0ba23bcbe155e7786d7b7c3ebaef0fa4e78dd1d5edf0daf7bc2eb7be1756f787d3fbcee0baf1f84d75078f5e1757f78fd30bc1ef88d54a48f4c7c57c20bf89f8874e135f2b77f2eca4726d1fb173f29c08712caee0b40cd3ed93db3ff5f708908c6b9922bb47ababae49a9f4d0cd8dad813caa7efd9c40f6a793a62762d27f2909613c9a1e5441ed6722239b59cc8235a4e249796137954cb89e4d672228f693991c7b59cc8135a4e248f96137952cb89e4c53d9b78b68f4ce123a37d644a1f19e323eff391a97c646a1f99c647a6f591e97c64faffc6a382b7c47578b95b5cb7b86add9ab56bd3fc1f0f0b66e97f3f303899e20706f38780bffa834ed0a79445a6d4f294b2c88c3e3283f894b2c80ce253ca223326c853ca225342386788873052fed0bbc81835db29b38fcc246fa74cf276ca9c30db2906c23913643b65d6be9dd2a8d94ef7fbc82cf276ca226fa7fb13663ba58170ce02d94ef76bdf4e69d56ca7077c6456793b6595b7d30309b39dd2423867856ca707b46fa7746ab6d3833e329bbc9db2c9dbe9c184d94ee9209cb341b6d3831a430e0520985340aa64d7fc1c2ec4d9fdd3d4eba17b53af3bf01213cc0f2a87ca88035d5f0e9d19b5c8e4902a0fabdc5639e8c43019b50d2a336aa01f5e4e48466d83ea8c5a4ea8813f72cfc0efc04b4c303fa85c2a0d9cae2f97d28c5a2e8d4f78cd0731a66848954755df593e0a35a6dcf78ce90ebcc404f3837a4ca531d1f53df6b7beb37c5ce5b67a8c4e0c7367b9e9ef7c67f904e4ce7293ea3bcb27a0069ee79e81df819798607e504faa3470babe2795de593ea9faf72e0bf4f72eefbddfbb3bf01213cc0f2a56e5ef1d5d5fecdffac6299fca6d45ff9b0f73e3b4e5ef7ce3941f72e3b445b581e7871a78817b067e075e6282f941155469e0747d0595de381554fd7b9715fa7b57e8deefdd1d788909e6075558e5ef1d5d5fe1bff58d531195dbaa309d18e6c669dbdff9c6a928e4c6699b6a032f0a35f062f70cfc0ebcc404f3832aaed2c0e9fa8a2bbd712aaefaf72e1bf4f7aec4bddfbb3bf01213cc0fea2995bf77747d4ffdad6f9c4aaadc564fd189616e9cb6ff9d6f9c9e86dc386d576de04f430dbcd43d03bf032f31c1fca04aab3470babed24a6f9c4a27fc83ca22a3c30fd0ca105e33fdf618ad323ef299ff7b397fdd8cca2604e5bf7e5ae5749e56799da7f5acced3aaa0f3b42aea3cad4a3a4feb399da75559e76955d1795a55759ed6f33a4fab9aced3aaaef3b46ae83cad9a3a4fab96ced3aaadf3b4eae83cadba3a4fab9eced3aaaff3b41ae83cad863a4fab91ced37a41e76935d6795a2fea3cad263a4faba9ced36aa6f3b49aeb3cad163a4f2b4ee769b5d4795aad749e566b9da7d546e769b5d5795a2fe93cad763a4fabbdced3eaa0f3b43a024e4b7e394d7e1a0ddd179e13a50aafa9c36b96f09a35bc660bafe9c36bd9f05a2ebc960fafcf86d70ae1b56278ad145e9f0baf95c36b95f05a35bc3e1f5eab85d7eae1b54678ad195e6b85d7dae1b54e78ad1b5eeb85d7fae1b541786d185e1b85d717c26be3f0fa62786d125e9b86d766e1b579786d115ee3c26bcbf0da2abcb60eaf6dc26bdbf0fa52786d175edb87d70ee1b5e36fd3b44e3ef2e5bb4ee15284ff8932e1b5d36fff5c671fd9456f2aa4abca5975948f4c8af975ea06fe2dd7767dddffce91a51ee0cd09b2e89e3aff72f4d2795abd759e561f9da7d557e769f5d3795afd759ed6009da73550e7690dd2795a83759ed6109da73554e7690dd3795ac3759ed68804ffec19431f887a863f1df50aafbdc36b9ff0da37bcf60baffdc3eb80f03a30bc0e0aaf83c3eb90f03a34bc0e0bafc3c3eb88df3e718df491a31202cf689d3fb5313a4f6bacced31aa7f3b4c6eb3cad093a4f6ba2ced39aa4f3b4e2759ed6649da73545e7694dd5795ad3749ed6749da73543e769cdd4795ab354f66e9353d315f38dc5b7545e5f576a9a63ae6f67427c23f3af6fabd990ef52be05a9b253e76fde1c9da7f58aced39aabf2f798e68e3d30d7f7aa4eecf3749ed67c9da7b540e7692dd4795a8b1262acfa577fa7232097b658e3a519c8a52dd178691672694b355e9a835cda328d9716402e6db9c64b8b845cda0a8d97463d7ac8c5add47971632017f79ace8b1b0bb9b8553a2f6e1ce4e256ebbcb8f1908b7b5de7c54d805cdc1b3a2f6e22e4e2d6e8bc38cc2781b53a2f0e13d35ca7f3e2307dbef53a2f6e0ae4e236e8bcb8a9908bdba8f3e2a6412e6e93ce8b9b0eb9b8cd3a2f6e06e4e2b6e8bcb899908bdbaaf3e266412e6e9bce8b9b0db9b837755edc1cc8c56dd77971af402e6e87ce8b9b0bb9b8b7745edcab908bdba9f3e2e6412eee6d9d17371f7271bb745edc02c8c5bda3f3e216422e6eb7ce8b5b04b9b877355e5c62c8a5edd1786951904b7b4fe3a525815cda5e8d9796147269ef6bbcb464904bdba7f1d2305f06ff40e3a5a5805c5a48e3a545432ecd6bbcb494904bdbaff1d2622097f6e15fbfb4d3897a4518eb82c8c4514992264b9e223a65cc7da952a7499b2e7d868c993267b93feb03d91eccfe508e87733e92ebd1dc8f3dfe449e27f3c6e6cb5fa060a1c2458a162b5ee2a9924f972a5de699b2e5ca3f5ba162a5e72a57a9fa7cb5ea356ad6aa5da76ebdfa0d1a367aa1f18b4d9a366bde22ae65abd66ddabed4ae7d878e9d5eeedca56bb7ee3d7af63a9de8311fb9d8472ef1914b7de4321fb9dc47aea0a93ecdbe69424c73549a36d24c8e265734dfa12908cd0aa8a34e7d67eace520f933a7dd40fa3ae11f556a803419fd3e9d32c7de6a34f46f4f981eeb2e95e94eed8e8ce86ee00e82f25fd4521e72587a2df64daf1b43388e0ff07", + "bytecode": "edbd07945555b6fd4dedbd4f51a4a224271111115191222711101010909c4552912449ce39678a1c447214949c04111111ef462427111151319341c56fadebebefdf8fd7bd30ccea5ec3c11befecf7ba67bbfa9c5fed9a75ee5af39e33c5c7ec3a9d6cc7a037cab46bdafca5321d7b96efd6a1f9334ddbb51bb4b846e9aacf969b14ef22043190c448492c1425888525b188241695c46292585c124b48e253925852129f96c45292585a12cb48e23392585612cb496279497c56122b48624549ac2489cf49626549ac22895525f17949ac2689d525b18624d694c45a92585b12eb48625d49ac2789f525b181243694c44692f882243696c41725b189243695c46692d85c125b48629c24b694c45692d85a12db48625b497c4912db49627b49ec20891d25b19324be2c899d25b18b247695c46e92d85b12fb48625f49ec2789fd2571802486068aea20511d2caa434475a8a80e13d5e1a23a4254478aea28511d2daa634475aca88e13d5f1a23a4154278aea24518d17d5c9a23a4554a78aea34519d2eaa33447566d4a015a53bb7e9daba7d5cd736cd274f9c1c7fa254febc85f217882b9c2f2e367f6cd3bcf98a362b52306f8182cd0a15892d125bb048c116f98ae4cf1f57a44091c2459b152d9cb7686c81fc71b12d0b16cddf326ff87f624333a848be96850afca522337f3b93bf5224af8ffce844a9bc7ff17ffe25203eadd83f7d6dd3fe51a4c55f00341d02e8600202e2d3cafba7ae6dca3f17c9fb27014d85003a94c080f8b48afce16b8bbfa348d1967f02d06408a0c3ff0140745a055afea16b9bf8af8a14fe83802641001df9cf000a9f56c1df7d6de3ff5d91027f00d00408a0a3ff41407c5a797fd7b58d958ae4fd9d80c641001dfb0f03e2d36a7ed76b1b7db722857f07a0311040c7ff0b80f8b4f289d736f2f714297c1740a320804efc9700f16915feb7d736fcf716292c001a010174f2bf08884fabc8bfbcb6a17fa448917f03681804d0a9ff32203eadbcffe7da06ffc122855afe0b404320804e2b00c4a795f77f5ddbc03f5324df1d800641007dac04109f56be7f5c5bff3f5ba3c0ffe3330082e78c223cf9e35ab6e4338bedfb976afc86a71f04cf270981e72f168ca59f1aa4ca2710446775223a0da9f23104d1a73a119d8454390541744e27a2e3902a2720883ed389e828a4ca3108a2f33a111d8654390241f4b94e440721550e41105dd0764f447745b17d20803e8200fa42e71eba00a9f20504d1973a119d8754f91c82e82b9d88ce41aa7c0641745127a2b3902a9f42107dad13d1454895af2188bed189e84b4895af2088bed588a83be0d27a43207fa773077d03a9f22d640721102d2fdba6735cf3ae6dbac70d5a5eab63e5b81a4d5bb4e93979f2c44988cdf4d7cfef74a26cbdfbf4edd77f4068606850687068486868685868786844686468546874684c686c685c687c684268626852283e343934253435342d343d342334d34724922241b3c4c0d06c519d23aaaf88ea5c517d5554e789ea7c515d20aa0b457591a82e16d525a2ba54549789ea72515d21aa2b45f535515d25aaab45f575517d4354d788ea5a515d27aaeb457583a86e14d54da2ba5954b72444686f3322b4b70561e08953a80ced6d4484f636410045ab0cedad4784f6364000a55419da5b8b08edad83008a5119da7b0311da5b0301749fcad0de6a4468ef7508a0542a437baf21427bab208052ab0cedad4084f6564200a55119da5b8608ed2d87004aab32b4b70411da5b0a01944e65686f1122b4b7180228bdcad0de0244686f2104500695a1bd7988d0de7c08a08c1a437ba1b980d45ee85508a04c1a637ba13980dc5ee81508a0cc2a3bd6893341aa648620caa213510648958c1044f7eb44940e52253d0451569d88d240aaa485207a4027a254902aa92188b2e9441403a9721f04d1833a114543aaa48420caae31b8179a0d21940242e8219d9b283ba4ca431044397422ca06a9f22004d1c33a1165855479008228a74e44592055ee87207a4427a29c902a8f4010e5d2892807a4cac310448f6a44d4037069a15910cab9756ea15c902a8f42b6506ee5d1bd1e90e85e68566876684ee895d0dcd0aba179a1f9a105a185a145a1c5a125a1a5a165a1e5a115a195a1d742ab42ab43af87de08ad09ad0dad0bad0f6d086d0c6d0a6d0e6db94b806fab181eda26aa6f8aea7651dd21aa6f89ea4e517d5b547789ea3ba2ba5b54df15d53da2fa9ea8ee15d5f745759fa87e20aa2151f5a2ba5f543f14d503a2fa91a81e14d543a27a58548f88ea51513d26aac745f5444204f88e23027c90efc726aea832c0771411e0837c3b3671259501bec388001fe4bbb1899f5319e03b8808f041be199bb8b2ca00df0144800ff2cdd8c4555406f8f623027c1f4200555519e00b21027c1e02e8799501be7d8800df071040d55406f8f622027cef4300555719e0db8308f0bd0701544365806f3722c0f72e04504d9501be5d8800df3b1040b55406f87622027c6f4300d55619e0db8108f0bd050154476580ef4d44806f3b04505d9d7deb3a902a752188eae944540b52a53604517d9d886a40aad484206aa01351354895ea10440d7522aa0aa9f23c0451239d882a43aa5481207a4127a24a902acf4110355619e0db0621541142e8459d9ba831a4ca8b10444d74226a04a9f2020451539d881a40aa3484206aa613513d4895fa1044cd75226a06a9d21c82a8854e444d20559a4210c56944d41311e0db0aa1dc52e7166a01a91207d9422d9507f87a62027c5b43db426f86b6877684de0aed0cbd1dda157a27b43bf46e684fe8bdd0ded0fba17da10f42a1900fed0f7d183a10fa2874307428743874247434742c743c74e22e01be936278e894a89e16d58f45f58ca87e22aa6745f553513d27aa9f89ea7951fd5c542f88ea17a2faa5a87e25aa1745f56b51fd4654bf15d5ef44f57b51fd41547f14d54ba27a5954af88ea5551bd26aad745f586a8de4c8800df0d4480ef26c4c687a90cf05d4304f8ae43000d5719e0bb8208f05d85001aa132c0770911e0bb0c0134526580ef074480ef4708a0512a037cdf21027cdf43008d5619e0fb0611e0833c083cf1189501be8b88001fe4750489c7aa0cf07d8908f0415e4690789cca00df0544800ff2729dc4e35506f8ce23027c9057eb249ea032c0770e11e083bc5827f1449501beb388001fe4b53a8927a90cf09d4104f820af3d4d1caf32c0771a11e083bcf434f1649d7deb784895c910445374229a08a932098268aa4e44e321552640104dd389682ca4ca3808a2e93a118d8654190341344327a291902aa3208866ea44341c52650404d12c9501be531042c3208466ebdc4498870dcd86209aa313d10c4895991044afe844340d52653a04d15c9d88a640aa4c85207a5527a2b9902a9807edcfd389680ea40ae651fbf33522423c73397412427981ce2d340f5205f3be8f05ca037cf761027c2743a742a7431f87ce843e099d0d7d1a3a17fa2c743ef479e842e88bd097a1af4217435f87be097d1bfa2ef47de887d08fa14ba1cba12ba1aba16ba1eba11ba19b7709f0dd12c3433f89eacfa2fa8ba8de16d55f2595ae48962364d9c8b2956527cb812c47ca7262598e92e524b29c549693c97272594e21cbd1b29c52966364f93e594e25cba965398d2ca795e574b29c5e9633c872c60488f6d17f2920db47e706b1f8b73586fbe8a70a48f7d10f1f826897c6781ffdda00f27df4db0541f48ec6801ff91220e147f60541b45b63c48f8c1f90f1a3bf0f1044ef6a0cf9d15f5640ca8ffe004310edd118f3a35b1740ce8fee702088ded318f4a37b4340d28f6e212188f66a8cfad1cd3720eb47f7e81044ef6b0cfbd1a71b40da8f3e044110edd318f7a38f8f80bc1f7dca8420fa4063e08f3e9f03127ff4311e8228a431f2470d1040e68ffa2410445e65e8ef3622f4f72b04d07e95a1bf9f11a1bf5f20803ed4d9ebde0fa9827902f6019d8842902a9867607fa413d13e4815cc53b00fea44b4175205f31cec433a11ed8154c13c09fbb04e44bb215530cfc23ea213d12e4815ccd3b08faa0cfdfd042184791cf6319d9be828a40ae6e544c775223a0ca982793dd1099d880e42aa605e50745227a203902a9857149dd2890893b53a0541745a27a2e3902a9897ed7dac11512a44e8ef1684f2199d5be834a40ae60ba2679487fe5261427fb7423f857e0efd12ba1dfa95babdd4aaa5b638f5b4697e40cd7f1ab4d094842652344ea2d11dcddd68c649034a1a06d32497a6e634f2f611a97c446a1f91c647a4f511e97c447a1f91c1476494e3803e22931c39ca2ccb5964f97e59ce2acb0fc87236597e5096b3cbf243b29c43961f96e59cb2fc882ce792e5476539b72c3f26cb8fcbf213b29c47969f94e5bcb21c2bcbf96439bf2c1790e582b25c48960bcb7211592e9a20a1c02290506051c89f805f7486020b4142818521886eeb0c05168084020b4210fdaa3314980f120acc8f401495486728302f2414180b4114a133149807120a7c1282c8e80c053e0e09053e014164758602734342818f4110399da1c05c9050e0a3104481ce50604e4828f01108a2489da1c01c9050e0c3104489758602b34342810f411045e90c05668384021f84204aa23114481d26402a901a5110444935c602a98507c80552a70f822899ca7e7854524815c89725a292eb441405a902f9b244540a9d88222155205f96888ad689c841aa40be2c119552272203a902f9b244548c4e44892055205f9688ba4fe784f736a40ae4eb1251a934060369f2094104f9c244546a9dbf68a92055205f688f4aa313510ca40ae40bed516975228a8654817ca13d2a9d4e44c92155205f688f4aaf13513a4815c8235aa232e84494065205f28896a88c1a1141fe1245648260cea4730f658054813c2c0a822821a381a921d140da5074334a7d3a6ab2514393ba91d4f9a5b62db5c8a9bf4db3041a04d0d0852626349da2d1128df1680647f34e1a56d26098a6ba3441a7f1b78fc8e723f2fb88023ea2a08f28e4230afb88223ea2e8dd0282c5e4f85171592e21cb4fc97249597e5a964bc97269592e23cbcfc87259592e27cbe565f95959ae20cb1565b9922c3f27cb9565b98a2c5795e5e765b99a2c5797e51ab25c53966bc9726d59ae23cb7565b99e2cd74f9080603d4840b03ee40f41519d01c13a9080605d08a2623a0382b52001c1da1044c57506046b4002823521884ae80c0856830404ab43103da53320581512107c1e82a8a4ce8060654840b00a04d1d33a0382952001c1e720884ae90c08568004042b421095d619102c0f09083e0b4154466740b02c2420580e82e8199d01c1329080e0331044657506044b410282a52188cae90c08968404049f86202aaf3320580212107c0a82e8599d5df1f2902a98bf681574222a0ba982f98b565127a232902a98bf689574222a05a982f98bf69c4e44252155307fd12aeb4454025205f317ad8a4e44c520558a431055d519102c0e4104794442d4f33a77515548154cd7b19a4e44952155305dc7ea3a11558254c1741d6be84454015205d375aca913510d4815cc1cad964e44d520553073b4da1a11a581040431f7567574eea15a902a98897e1de501c134a0806031ba19a53e1d35d9a8a149dd48eafc52db965ae4d4dfa659020d0268e84213139a4ed16889c6783483a379270d2b69304c535d9aa0d3f8db47d4f011357d442d1f51db47d4f111757d443d1f51ff6e01c10672fca8a12c3792e51764b9b12cbf28cb4d64b9a92c3793e5e6b2dc4296e364b9a52cb792e5d6b2dc4696dbcaf24bb2dc4e96dbcb720759ee28cb9d64f96559ee2ccb5d64b9ab2c7793e5eeb2dc43967bca72af040908f68404047b41fe1074d31910ec0e0908f68020eaae3320d8151210ec0641d4436740b0332420d80582a8a7ce8060274840f06508a25e3a03821d2001c18e1044bd750604db410282ed2188fae80c08b68504045f8220eaab3320d81a12106c0341d44f6740b0252420d80a82a8bfce80600b4840300e826880ce8060334840b03904d1409d01c1269080605308a2413a03828d2101c117218806eb0c08368204045f80201aa2b32b3e1852650804d1509d880642aa0c82201aa613517f4895011044c37522ea0ba9d20f8268844e44bd2155fa40108dd489a827a40aa6773d4a27a2ee902a98def5689d01c186104498def5189dbb6834a4ca1808a2b13a118d8454190541344e27a2e1902a232088c6eb44341452651804d1049d88c643aa4c80209aa813d1584895711044933422823c1c31a2010473bcce3d3411526512640fc52b0f08a60505041bd0cd28f5e9a8c9460d4dea4652e797dab6d422a7fe36cd1268104043179a98d0748a464b34c6a3191ccd3b69584983619aead2049dc6df3ea2b38fe8e223bafa886e3ea2bb8fe8e1237afa885e770b08f696e3477d64b9af2cf793e5feb23c409607caf220591e2ccb436479a82c0f93e5e1b23c429647caf228591e2dcb636479ac2c8f93e5f1b23c419627caf224598e97e5c9b23c4596a7caf234599e2ecb336479668204046740028233217f08d6e80c084e830404a74310add519109c0209084e85205aa73320180f09084e86205aaf332038111210c4dc946ed019101c0f0908623e1e6fd419101c0b0908623e1e6fd219101c0d0908621abe9b750604474202829886ef169d01c1e1908020a6e1bb556740702824208869f86ed319101c0c09086242396fea0c080e84040431a19ced3a0382fd2101414c286787ce80605f48401013ca794b67577c07a4ca5b10443b75227a1352653b04d1db3a116d8554d90641b44b27a2cd902a5b2088ded1896823a4ca2608a2dd3a11ad8754d90041f4ae4e446b2155d64110edd11910ec0341b40682e83d9dbb680fa4ca7b10447b7522da0da9f22e04d1fb3a11ed8254790782689f4e443b2155de8620fa4027a27d902a1f4010857422da0ba9f23e0491d788281d242088f90acf7e9d7b2804a9e2217b68bff280603a5040b037dd8c529f8e9a6cd4d0a46e24757ea96d4b2d72ea6fd32c8106013474a189094da768b444633c9ac1d1bc9386953418a6a92e4dd069fced2338e6e423a6f888a93e629a8f98ee2366f88899770b08ce92e347b365798e2cbf22cb7365f955599e27cbf36579812c2f94e545b2bc589697c8f252595e26cbcb6579852caf94e5d76479952caf96e5d765f90d595e23cb6b65799d2caf97e50db2bc519637c9f26659de922001c1cd908020a655f7adce80e046484010d3aafb4e6740703d24208869d57daf3320b8161210c4b4ea7ed019107c031210c4b4ea7ed419105c0d0908be0e4174496740f0354840701504d1659d01c1159080e04a08a22b3a0382cb2001c1e5104457750604974002824b2188aee90c082e8204041743105dd719105c0009082e8420baa13320380f12109c0f4174536740702e2420f82a04d12d9d01c1399080e02b10443fe9ec8adf8254f90982e8679d886e40aadc8420fa4527a26b902ad721886eeb44740552e52a04d1af3a115d8254b98c409424914e443f40aafc084114a113d177902adf4310199d01c1d91044df42105995bb28898154b110444e27a244902a111044814e2fba0da9f22b0451a44e443f43aafc02419458e72f5a24a44a6208a2289d881ca44a0041944423a2f49080e02c08e6a43af75014a44a12c81e4aaa3c20981e14109c4537a3d4a7a3261b3534a91b499d5f6adb528b9cfadb344ba041000d5d686242d3291a2dd1188f667034efa461250d8669aa4b13741a7ffb88b53e629d8f58ef2336f8888d3e62938fd8ec23b6dc2d20b8558e1f6d93e5376579bb2cef90e5b76479a72cbf2dcbbb64f91d59de2dcbefcaf21e597e4f96f7caf2fbb2bc4f963f90e5902c7b59de2fcb1fcaf20159fe48960fcaf221593e2ccb4764f9a82c1f93e5e3b27c22410282c72101c113903f048fea0c081e8504048f4110e5d619103c0c09081e81207a4c6740f0202420780882e8719d01c1039080e04710444fe80c08ee8704043f8420caa333201882040421df7d4af2a4ce80e03e484010f22dcc2479750604f7420282906f612689d51910dc030908429e2b90249fce80e06e484010f25c8124f97506047741028290e70a2429a03320b8131210843c572049419d01c11d908020e4d96f490ae90c08be090908429efd96a4b0ceae78214895c210444574222a00a9521082a8a84e44f92055f2431015d389282fa44a2c0451719d88f240aa3c0941544227a2c721559e80207a4a27a2dc902a8f411095d41910dc0641f42804d1d33a7751494895a721884ae944540252e52908a2d23a11158354290e41544627a222902a4521889ed189a80ca4ca3310446575222a05a9521a82a89c464419200141c893e29394d7b987ca42aa9483eca1f2ca0382194001c1ad74334a7d3a6ab2514393ba91d4f9a5b62db5c8a9bf4db3041a04d0d0852626349da2d1128df1680647f34e1a56d26098a6ba3441a7f1b78f38e8230ef988c33ee2888f38ea238ef988e33ee2c4dd028227e5f8d129593e2dcb1fcbf21959fe4496cfcaf2a7b27c4e963f93e5f3b2fcb92c5f90e52f64f94b59fe4a962fcaf2d7b2fc8d2c7f2bcbdfc9f2f7b2fc832cff28cb9764f9b22c5f91e5abb27c4d96afcbf20d59be992001c11b908020e41be149e2740604af410282906f842769a9332078051210847c233c492b9d01c14b908020e61be1ad7506047f80040431df086fa33320f81d242088f946785b9d01c16f200141cc37c25fd21910bc0809087e0d41d44e6740f04b4840f02b08a2f63a0382172001c12f20883ae80c089e8704043f8720eaa83320780e1210fc0c82a893ce80e0594840f05308a297750604cf4002829f401075d619103c0d09087e0c41d4456757bc33a44a1708a2ae3a11758254791982a89b4e441d20553a421075d789a81da44a7b08a21e3a11b58554790982a8a74e44ad2155da4010f5d289a825a44a2b08a2de3a0382a72088e22088fae8dc4590972926e90341d45727a29e902abd2088fae944d41d52a50704517f9d88ba42aa7483201aa013517f4895011044037522ea0ba9d20f8268904644192101c19310cc8375eea181902a83207b68b0f28060465040f024dd8c529f8e9a6cd4d0a46e24757ea96d4b2d72ea6fd32c8106013474a189094da768b444633c9ac1d1bc9386953418a6a92e4dd069fced232ef988cb3ee28a8fb8ea23aef988eb3ee2868fb879b780e02d397ef4932cff2ccbbfc8f26d59fe55944d22598e906523cb56969d2c07b21c29cb8965394a9693c87252594e26cbc96539852c47cb724a598e91e5fb6439952ca796e534b29c5696d3c9727a59ce20cb19132220683220028206f21737c97c950141930e11103490c71a2759a0322068d2200282262d04d142950141930a111034a9218816a90c089a184440d0dc0741b4586540d044230282262504d112950141931c11103429208896aa0c089aa48880a0490641b44c6540d04421028206f388fde52a0382261211103498977dac501910340e11103498977dac541910340611103498d757bda63220681221028206f3faaa553a0382b7210141ccebab56eb0c08fe0c0908625e5ff5baceaef86a4895d72188ded089e83548955510446b74225a01a9b2128268ad4e44cb2055964310add3896809a4ca5208a2f53a112d8254590c41b44127a205902a0b218836ea0c08fe0441341f826893ce5db41152651304d1669d88d643aa6c8020daa213d15a48957510445b75227a0352650d04d1369d8830cf6ddb0641f4a64e449b2155b640106dd78828132420780b827987ce3df426a40ae67d133b94070433810282b7e86694fa74d464a386267523a9f34b6d5b6a91537f9b66093408a0a10b4d4c683a45a3251ae3d10c8ee69d34aca4c1304d7569824ee36f6f527993da9b34dea4f5269d37e9bdc9e04dc6bb04044d26397e945996b3c8f2fdb29c55961f90e56cb2fca02c6797e5876439872c3f2ccb3965f91159ce25cb8fca726e597e4c961f97e52764398f2c3f29cb7965395696f3c9727e592e20cb0565b9902c1796e522b25c3441028245200141cc43ad3fd619102c040908625e3c74466740b00024208879f1d0273a0382f9200141cc8b87ceea0c08e6850404312f1efa546740300f24208879f1d0399d01c1c7210141cc8b873ed31910cc0d0908625e3c745e6740301724208879f1d0e73a0382392101c14720882ee80c08e68004041f8620fa426740303b2420f81004d1973a0382d92001c1072188be5219103459110141f30004d1459501419305111034f743107dadb32b7e115205f364e56f7422fa125205f364e56f7522ba00a98279b2f2773a119d8754c13c59f97b9d88ce41aa609eacfc834e44672155304f56fe5127a233902a98272b5f52191034992188304f56beac73175d8254c1bcfde68a4e443f40aa60de7e735527a2ef2055306fbfb9a613d137902a98b7df5cd789e81aa40ae67d6e377422ba02a982799fdb4d8d8832232ecd648260bea5730fdd8054c1bc59f296f28060664c40d064a29b51ead351938d1a9ad48da4ce2fb56da9454efd6d9a25d02080862e3431a1e9148d96688c4733389a77d2b09206c334d5a5093a8dbfbdc9e74d7e6f0a7853d09b42de14f6a6883745ef16102c26c78f8acb7209597e4a964bcaf2d3b25c4a964bcb7219597e4696cbca7239592e2fcbcfca720559ae28cb9564f93959ae2ccb5564b9aa2c3f2fcbd564b9ba2cd790e59ab25c4b966bcb721d59ae2bcbf564b97e820404eb410282f5117f089266d41910ac030908d68520caa43320580b1210ac0d4194596740b0062420581382288bce8060354840b03a04d1fd3a0382552101c1e72188b2ea0c0856860404ab40103da03320580912107c0e82289bce8060054840b02204d1833a0382e52101c1672188b2eb0c0896850404cb41103da43320580612107c06822887ce8060294840b03404d1c33a0382252101c1a7218872ea0c08968004049f82207a4465573c694e481548e43d692e9d887240aa4022ef491fd589283ba40a24f29e34b74e44d920552091f7a48fe9449415520512794ffab84e445920552091f7a44fe84404196227850cd493e6d119102c0e4104798752d22775eea23c902a90af2527cdab13d1e3902a90af25278dd5892837a40ae46bc949f3e944940b5205f2b5e4a4f97522ca07a90279d046d2023a11e58554813c682369418d88b2400282c520980be9dc43052055208ffc81204ac88060165040b018dd8c529f8e9a6cd4d0a46e24757ea96d4b2d72ea6fd32c8106013474a189094da768b444633c9ac1d1bc9386953418a6a92e4dd069fced4d0d6f6a7a53cb9bdaded4f1a6ae37f5bca97fb7806003397ed450961bc9f20bb2dc58965f94e526b2dc54969bc97273596e21cb71b2dc52965bc9726b596e23cb6d65f925596e27cbed65b9832c7794e54eb2fcb22c7796e52eb2dc5596bbc9727759ee21cb3d65b9578204047b420282bd207f086aeb0c08768704047b4010d5d11910ec0a0908768320aaab3320d8191210ec0241544f6740b0132420f83204517d9d01c10e9080604708a2063a0382ed2001c1f610440d750604db4202822f411035d219106c0d0908b681207a416740b0252420d80a82a8b1ce80600b4840300e82e8459d01c1669080607308a2263a03824d2001c1a610444d7506041b4302822f421035d319106c040908be0041d45c6757bc19a40ac68b5ae844d4045205e345713a11358654c178514b9d881a41aa60bca8954e440d20551a4210b5d689a81ea40ae6cbed6d7422aa03a982f9727b5b9d01c1861044982fb7bfa47317b58554c1f48bdae944d41a5205d32f6aaf13514b48154cbfa8834e442d205530fda28e3a11758054c14c403ae944d40e5205330179592322c877420ce60ebdb3ce3dd4095205338bedac3c20783f2820d8806e46a94f474d366a685237923abfd4b6a51639f5b769964083001abad0c484a653345aa2311ecde068de49c34a1a0cd3549726e834fef6a6b3375dbce9ea4d376fba7bd3c39b9edef4ba5b40b0b71c3fea23cb7d65b99f2cf797e501b23c509607c9f260591e22cb436579982c0f97e511b23c529647c9f268591e23cb6365799c2c8f97e509b23c519627c972bc2c4f96e529b23c5596a7c9f274599e21cb33132420380312109c09f94330496740701a2420381d82285e6740700a242038158268b2ce80603c2420381982688ace80e0444840701204d1549d01c1f19080e00408a2693a0382632101c1711044d37506044743028263208866e80c088e840404474110cdd419101c0e09088e80209aa53320381412101c0641345b674070302420380482688ece80e0404840701004d12b3a0382fd2101c101104473750604fb420282fd20885ed5d9159f0ba9f22a04d13c9d88e640aabc0241345f27a259902ab3218816e84434035205d3755ca813d13448154cd771914e44532055305dc7c53a11c543aa60ba8e4b740604fb401061ba8e4b75eea225902a4b218896e944b40852653104d1729d881640aa2c84205aa113d13c4895f910442b75225a01a9b21282e8359d889641aa2c87205aa51151564840b03704f36a9d7be835489555903db45a7940302b2820d89b6e46a94f474d366a685237923abfd4b6a51639f5b769964083001abad0c484a653345aa2311ecde068de49c34a1a0cd3549726e834fef686634ede4cf166aa37d3bc99eecd0c6f66de2d20384b8e1fcd96e539b2fc8a2ccf95e55765799e2ccf97e505b2bc509617c9f262595e22cb4b6579992c2f97e515b2bc52965f93e555b2bc5a965f97e53764798d2caf95e575b2bc5e9637c8f24659de24cb9b65794b820404374302825b207f08bcce80e0464840701304d17e9d01c1f59080e00608a20f750604d7420282eb20880ee80c08be010908ae8120fa48674070352420f83a04d1419d01c1d7200141cc479b433a03822b2001414c93e5b0ce80e032484010d36439a23320b8041210c48c0d8eea0c082e820404316383633a03820b200141ccd8e0b8ce80e03c484010333638a1332038171210c444bb4eea0c08ce81040431d1ae533abbe22721554e41109dd689e838a4ca0908a28f75223a0aa9720c82e88c4e448721558e40107da213d14148954310446775223a00a9f21104d1a73a11ed8754f91082e89cce80e06c08220f41f499ce5d740e52e53308a2f33a119d8554f91482e8739d88ce40aa7c0241744127a2d3902a1f43107da113d10548952f2088bed489e83ca4cae710445f6944f400242088f922d8459d7be84b4895af207be8a2f280e003a080e02cba19a53e1d35d9a8a149dd48eafc52db965ae4d4dfa659020d0268e84213139a4ed16889c6783483a379270d2b69304c535d9aa0d3f8db9bb5deacf366bd371bbcd9e8cd266f367bb3e56e01c1ad72fc689b2cbf29cbdb6579872cbf25cb3b65f96d59de25cbefc8f26e597e5796f7c8f27bb2bc5796df97e57db2fc812c8764d9cbf27e59fe50960fc8f247b27c50960fc9f261593e22cb4765f9982c1f97e5130912103c0e0908421abec992e80c081e850404210ddf64497506040f43028290866fb2643a03820721014148c33759729d01c103908020a4e19b2c85ce80e07e484010d2f04d16ad332018820404210ddf6429750604f74102821f4010c5e80c08ee850404df8720ba4f6740700f2420f81e04512a9d01c1dd9080e0bb1044a975060477410282ef4010a5d11910dc090908be0d419456674070072420f81604513a9d01c1372101c1ed1044e95576c593a58354490f41944127a234902a69218832ea44940a5225350451269d88622055ee8320caac135134a44a4a08a22c3a1125875449014174bf4e4449215592411065d51910dc0641940482e8019dbb282ba40a2496912c9b4e4459205520efbe4cf6a04e4499205532431065d7892803a44a4608a2877422ca0ea9f21004510e9d88b241aa3c0841f4b04644d92001c1ad10cc3975eea11c902a0f43f6504ee501c16ca080e056ba19a53e1d35d9a8a149dd48eafc52db965ae4d4dfa659020d0268e84213139a4ed16889c6783483a379270d2b69304c535d9aa0d3f8db9b83de1cf2e6b03747bc39eacd316f8e7b73e26e01c19372fce8942c9f96e58f65f98c2c7f22cb6765f953593e27cb9fc9f27959fe5c962fc8f217b2fca52c7f25cb1765f96b59fe4696bf95e5ef64f97b59fe41967f94e54bb27c5996afc8f25559be26cbd765f9862cdf4c9080e00d4840f026e40f41399d01c16b9080e07508a2f23a0382572001c1ab1044cfea0c085e8204042f431055d01910fc011210fc1182a8a2ce80e0779080e0f7104495740604bf810404bf85207a4e6740f0222420f8350451659d01c12f210141c837e89255d11910bc00090842becb9bacaace80e079484010f25dde64cfeb0c089e830404214fa748564d6740f02c242008793a45b2ea3a038267200141c8d32992d5d019103c0d0908429e4e91aca6ceae780d48959a1044b57422aa06a9521d82a8b64e445521559e8720aaa313516548952a1044757522aa04a9f21c04513d9d882a40aa548420aaaf13517948956721881ae80c089e82202a0741d450e72e6a00a9d21082a8914e44f52055ea4310bda013511d4895ba10448d7522aa05a9521b82e8459d881a43aabc0841d44427a246902a2f401035d58808927d3490f70d246ba6730f358154690ad943cd9407041f0405044fd2cd28f5e9a8c9460d4dea4652e797dab6d422a7fe36cd1268104043179a98d0748a464b34c6a3191ccd3b69584983619aead2049dc6dfde5cf2e6b23757bcb9eacd356fae7b73c39b9b770b08de92e3473fc9f2cfb2fc8b2cdf96e55f45d92692e5085936b26c65d9c97220cb91b29c5896a36439892c2795e564b29c5c9653c872b42ca794e51859be4f9653c9726a594e23cb6965399d2ca797e50cb29c31210282360322206831df5919a4322068d321028216f35c81c12a0382360d22206831cf1518a23220685321028216f35c81a12a038236061110b498e70a0c531910b4d18880a0c53c5760b8ca80a04d8e08085acc730546a80c08daa48880a0c53c5760a4ca80a08d4204042de6b902a35406046d242220681343108d561910b40e1110b40104d1189501416b1001416b2188c6aa0c08da448880a08d80201aa73320781b1210fc158268bcce80e0cf9080e02f1044137476c5c743aa4c80209aa813d15848957110449374221a0da9320682285e27a291902aa3208826eb44341c52650404d1149d888642aa0c83209aaa13d1604895211044d37406047f82201a0441345de72e9a06a9321d8268864e44532055a64210cdd489281e52653204d12c9d882642aa4c82209aad1311e4c5aec9664310cdd1896806a4ca4c08a2573422ca0e0908de82609eab730fcd81547905b287e62a0f08660705046fd1cd28f5e9a8c9460d4dea4652e797dab6d422a7fe36cd1268104043179a98d0748a464b34c6a3191ccd3b69584983619aead2049dc6dfdea6f236b5b769bc4deb6d3a6fd37b9bc1db8c770908da4c72fc28b32c6791e5fb6539ab2c3f20cbd964f94159ce2ecb0fc9720e597e589673caf223b29c4b961f95e5dcb2fc982c3f2ecb4fc8721e597e5296f3ca72ac2ce793e5fcb25c40960bca7221592e2ccb4564b9688204048b40028245217f08b6eb0c08168204040b4310edd019102c0009081684207a4b6740301f2420981f8268a7ce80605e4840301682e86d9d01c13c9080e0931044bb7406041f8704049f80207a47674030372420f81804d16e9d01c15c9080e0a31044efea0c08e68404041f8120daa3332098031210c4bca8e13d9d01c1ec908020e695317b750604b34102829857c6bcaf322068b322028216f312b47d2a0382360b222068312f41fb4067577c1fa4ca071044219d88f642aabc0f41e47522da03a9f21e04d17e9d887643aabc0b41f4a14e44bb2055de81203aa013d14e4895b721883ed2896807a4ca5b1044075506046d6608a2ed10448774eea283902a8720880eeb44740052e52308a2233a11ed8754f91082e8a84e442148150f41744c27a2a3902ac720888eeb44741852e50804d1098d8820dd428b7965fa499d7be838a4ca09c81e3aa93c20f81026206833d1cd28f5e9a8c9460d4dea4652e797dab6d422a7fe36cd1268104043179a98d0748a464b34c6a3191ccd3b69584983619aead2049dc6dfdee6f336bfb705bc2de86d216f0b7b5bc4dba2770b081693e347c565b9842c3f25cb2565f969592e25cba565b98c2c3f23cb6565b99c2c9797e56765b9822c5794e54ab2fc9c2c5796e52ab25c55969f97e56ab25c5d966bc8724d59ae25cbb565b98e2cd795e57ab25c3f410282f5200141cca3d16fea0c08d6810404318f46bfa53320580b1210c43c1afd279d01c11a908020e6f5553feb0c085683040431afaffa456740b02a242088797dd56d9d01c1ca908020e6f555bfea0c085682040421afaf4a9e486740b002242008797d55f2089d01c1f2908020e4f555c98dce806059484010f2faaae4566740b00c2420f80c0491d319102c0509089686200a7406044b4202824f431045ea0c08968004049f82204aacb22b9e3c125205f24cdce4513a11394815c833719327d189c840aa409e899b3ca94e4489205520cfc44d9e4ce784ee36a40ae499b8c993eb44f433a40ae499b8c953e8448479cacd4f1044d13a0382c521886e4210a5d469d7d1902a90f796248fd1892839a40ae4bd25c9efd3892829a40ae4bd25c953e9441405a902796f49f2d43a11a5825481bc892b791a9d88622055206fe24a9e5623a21c9080603108e6743af7501a4815c83b012188123220980314102c4637a3d4a7a3261b3534a91b499d5f6adb528b9cfadb344ba041000d5d686242d3291a2dd1188f667034efa461250d8669aa4b13741a7f7b5bc3db9aded6f2b6b6b775bcadeb6d3d6febdf2d20d8408e1f3594e546b2fc822c3796e51765b9892c3795e566b2dc5c965bc8729c2cb794e556b2dc5a96dbc8725b597e4996dbc9727b59ee20cb1d65b9932cbf2ccb9d65b98b2c7795e56eb2dc5d967bc8724f59ee952001c19e9080602fc81f82823a0382dd2101c11e104485740604bb420282dd20880aeb0c0876860404bb401015d11910ec040908be0c4154546740b0032420d81182a898ce80603b4840b03d0451719d01c1b69080e04b1044257406045b4302826d20889ed219106c090908b682202aa93320d80212108c83207a5a6740b0192420d81c82a894ce8060134840b0290451699d01c1c69080e08b1044657406041b4102822f40103da3b32b5e06520513562eab13512948154c58b99c4e442521553061e5f23a11958054c184959fd58908337e2c0e41544127a222902a90b7df24afa81351214815c8db6f9257d219106c08410479fb4df2e774eea24a902a982f9456d689a802a40ae60ba55574222a0fa982f94269559d88ca42aa60be50fabc4e44552155208f48485e4d27a2ca902a90472424afae1111e4952cb60104730d9d7ba81aa40ae4612d10440919107c1814106c4037a3d4a7a3261b3534a91b499d5f6adb528b9cfadb344ba041000d5d686242d3291a2dd1188f667034efa461250d8669aa4b13741a7f7bdbd9db2ede76f5b69bb7ddbdede16d4f6f7bdd2d20d85b8e1ff591e5beb2dc4f96fbcbf200591e28cb836479b02c0f91e5a1b23c4c9687cbf208591e29cba36479b42c8f91e5b1b23c4e96c7cbf204599e28cb9364395e9627cbf214599e2acbd36479ba2ccf90e5990912109c010908ce84fc2178596740701a2420381d82a8b3ce80e0144840702a0451179d01c178484070320451579d01c1899080e02408a26e3a0382e32101c1091044dd750604c7420282e320887ae80c088e860404c74010f5d419101c0909088e8220eaa53320381c12101c0141d45b674070282420380c82a88fce80e0604840700804515f9d01c1819080e02008a27e3a0382fd2101c1011044fd750604fb420282fd208806e8ec8af78754c1eca2813a11f58554c1eca2413a11f58654e90341345827a29e902a98af250fd189a83ba40ae66bc9437522ea0aa982f95af2309d883a43aa60be963c5c6740b00f0411e66bc92374eea2e1902a984ffa2375221a0aa982f9a43f4a27a2c1902a984ffaa375221a08a982f9a43f4627a2d1902a98def5589d884642aa607ad7e33422ca090908623ee78dd7b987c642aa60a668e395070473820282bde96694fa74d464a386267523a9f34b6d5b6a91537f9b66093408a0a10b4d4c683a45a3251ae3d10c8ee69d34aca4c1304d7569824ee36f6f39e6e4ed146fa77a3bcddbe9decef076e6dd0282b3e4f8d16c599e23cbafc8f25c597e5596e7c9f27c595e20cb0b6579912c2f96e525b2bc549697c9f272595e21cb2b65f935595e25cbab65f975597e4396d7c8f25a595e27cbeb6579832c6f94e54db2bc5996b724484070332420b805f2876095ce80e0464840701304d16a9d01c1f59080e00608a2d7750604d7420282eb2088ded019107c0312105c0341b446674070352420f83a04d15a9d01c1d72001c1551044eb740604574002822b2188d6eb0c082e8304049743106dd019105c0209082e8520daa83320b80812105c0c41b449674070012420b8108268b3ce80e03c4840703e04d1169d01c1b99080e0ab10445b750604e7400282af40106dd3d915df0aa9b20d82e84d9d883643aa60fa45db7522da08a982e917edd089683da40aa65ff4964e446b215530fda29d3a11bd01a982e917bdad13d16a48154cbf6897ce80e06c08224cbfe81d9dbb6817a4ca3b1044bb7522da09a9f23604d1bb3a11ed8054790b82688f4e446f42aa6c87207a4f27a23d902aef4110edd5896837a4cabb1044ef6b44f4082420380b82799fce3db41752e57dc81edaa73c20f8082820388b6e46a94f474d366a685237923abfd4b6a51639f5b769964083001abad0c484a653345aa2311ecde068de49c34a1a0cd3549726e834fef676adb7ebbc5defed066f377abbc9dbcdde6eb95b4070ab1c3fda26cb6fcaf27659de21cb6fc9f24e597e5b9677c9f23bb2bc5b96df95e53db2fc9e2cef95e5f765799f2c7f20cb2159f6b2bc5f963f94e503b2fc912c1f94e543b27c58968fc8f251593e26cbc765f9448204048f43028227207f08bed219103c0a09081e8320baa83320781812103c0241f4b5ce80e0414840f01004d1373a0382072001c18f2088bed51910dc0f09087e0841f49dce8060081210f41044dfeb0c08ee8304043f8020fa416740702f242088f980fca3ce80e01e484010d3aabba43320b81b1210c4b4ea2eeb0c08ee82040431c3a72b3a03823b210141ccf0e9aace80e00e484010337cbaa63320f826242088193e5dd7d915bf06a9721d82e8864e44572055ae4210ddd489e812a4ca6508a25b3a11fd00a9f22304d14f3a117d07a9f23d04d1cf3a117d03a9f22d04d12f3a115d8454f91a82e8b6ce80e03608a2af20887ed5b98b6e43aafc8a409422914e443f43aafc024114a113d12d48959f20888c4e443720556e4210599588521848150b41e474224a04a9120141146844940b1210847c9d3045a4ce3de4205502c81e8a541e10cc050a086ea59b51ead351938d1a9ad48da4ce2fb56da9454efd6d9a25d02080862e3431a1e9148d96688c4733389a77d2b09206c334d5a5093a8dbfbd3de8ed216f0f7b7bc4dba3de1ef3f6b8b727ee16103c29c78f4ec9f26959fe5896cfc8f227b27c56963f95e573b2fc992c9f97e5cf65f9822c7f21cb5fcaf257b27c5196bf96e56f64f95b59fe4e96bf97e51f64f94759be24cb9765f98a2c5f95e56bb27c5d966fc8f2cd040908de80040431b7a40feb0c085e8304042163831439750604af40028290b1418a477406042f41028290b1418a5c3a03823f40028290b1418a47750604bf83040421638314b9750604bf810404216383148fe90c085e840404216383148feb0c087e09090842c606299ed01910bc0009087e014194476740f03c2420f83904d1933a0382e72001c1cf2088f2ea0c089e8504043f85208ad519103c0309087e0241944f6740f0342420f83104517e9d5df17c902af921880ae844941752251682a8a04e447920559e84202aa413d1e3902a4f401015d6892837a4ca631044457422ca05a9f2280451519d887242aa409eb893a298ce80e02908a28721888aebdc45c520558a431095d089a808a44a5108a2a774222a04a9521882a8a44e440520550a42103dad1351494895a721884ae944540252e52908a2d21a11416ef9ec4908e6323af750294895d2903d54467940f0515040f024dd8c529f8e9a6cd4d0a46e24757ea96d4b2d72ea6fd32c8106013474a189094da768b444633c9ac1d1bc9386953418a6a92e4dd069fceded256f2f7b7bc5dbabde5ef3f6bab737bcbd79b780e02d397ef4932cff2ccbbfc8f26d59fe55945d22598e906523cb56969d2c07b21c29cb8965394a9693c87252594e26cbc96539852c47cb724a598e91e5fb6439952ca796e534b29c5696d3c9727a59ce20cb19132220e8322002822e23e40f4153950141970e111074e921889aa90c08ba348880a04b0b41d45c6540d0a54204045d6a08a2162a03822e06111074f74110c5a90c08ba684440d0a584206aa93220e8922302822e0504512b9501419714111074c920885aab0c08ba284440d02581206aa33220e822110141971882a8adca80a0738880a0c37c0ff3259501416710014187f946783b9501419708111074986f84b7d71910bc0d0908629e71d2416740f067484010f38c938e3abbe21d20553a421075d289a81da44a7b08a29775226a0ba9f2120451679d885a43aab48120eaa213514b48955610445d75226a01a9120741d44d27a266902acd2188baeb0c08fe0441d41482a887ce5dd41d52a50704514f9d88ba42aa748320eaa513516748952e1044bd7522ea04a9f23204511f9d887a43aaf48120eaab13514f48955e1044fd3422ca0d0908429e889aa2bfce3dd41752a51f640ff5571e10cc0d0a08dea29b51ead351938d1a9ad48da4ce2fb56da9454efd6d9a25d02080862e3431a1e9148d96688c4733389a77d2b09206c334d5a5093a8dbfbd4be55d6aefd27897d6bb74dea5f72e837719ef12107499e4f8516659ce22cbf7cb7256597e4096b3c9f283b29c5d961f92e51cb2fcb02ce794e5476439972c3f2acbb965f931597e5c969f90e53cb2fca42ce795e55859ce27cbf965b9802c1794e542b25c58968bc872d10409081681040431df7c7a456740b010242088f9e6d35c9d01c102908020e69b4fafea0c08e6830404314fa798a7332098171210c43c9d62bece80601e484010f3748a053a03828f43028298a7532cd41910cc0d0908629e4eb14867403017242088793ac5629d01c19c908020e6e9144b7406047340028298a7532cd51910cc0e09083e0441b44c6740301b2420f82004d17295014197151110740f4010ad5019107459100141773f04d14a9d5df115902a2b21885ed3896819a4ca7208a2553a112d8154590a41b45a27a245902a8b21885ed7896801a4ca4208a23774229a07a9321f82688d4e447321555e85205aab3220e8324310bd0241b44ee72e5a0ba9b20e8268bd4e446f40aaac8120daa013d16a4895d7218836ea44f41aa4ca2a08a24d3a116d8454d90441b45927a2f5902a1b2088b6684404995cb84c10cc5b75eea1cd902a5b207b68abf280e0639880a0cb4437a3d4a7a3261b3534a91b499d5f6adb528b9cfadb344ba041000d5d686242d3291a2dd1188f667034efa461250d8669aa4b13741a7f7b97cfbbfcde15f0aea07785bc2bec5d11ef8ade2d20584c8e1f1597e512b2fc942c9794e5a765b9942c9796e532b2fc8c2c9795e572b25c5e969f95e50ab25c51962bc9f273b25c5996abc87255597e5e96abc9727559ae21cb3565b9962cd796e53ab25c5796ebc972fd040908d6830404eb43fe109cd01910ac030908d685203aa93320580b1210ac0d41744a6740b0062420581382e8b4ce8060354840b03a04d1c73a0382552101c1e72188cee80c0856860404ab40107da23320580912107c0e82e8acce8060054840b02204d1a73a0382e52101c1672188cee90c0896850404cb41107da63320580612107c0682e8bcce806029484010f3ba8fcf7506044b42028298170f5dd019102c010908625e3cf485ceaef80548952f2088bed489e83ca4cae710445fe944740e52e53308a28b3a119d8554f91482e86b9d88ce40aa7c0241f48d4e44a721553e8620fa562722cc6bf04e41107da73320581c82e80404d1f73a77d177902adf4310fda013d137902adf4210fda813d1454895af21882ee944f425a4ca571044977522ba04a9721982e88a4e443f40aafc0841745523a2c72101c16210ccd774eea12b902a57217be89af280e0e3a0806031ba19a53e1d35d9a8a149dd48eafc52db965ae4d4dfa659020d0268e84213139a4ed16889c6783483a379270d2b69304c535d9aa0d3f8dbbb1aded5f4ae9677b5bdabe35d5defea7957ff6e01c10672fca8a12c3792e51764b9b12cbf28cb4d64b9a92c3793e5e6b2dc4296e364b9a52cb792e5d6b2dc4696dbcaf24bb2dc4e96dbcb720759ee28cb9d64f96559ee2ccb5d64b9ab2c7793e5eeb2dc43967bca72af040908f6840404218f238e4eab3320d81d1210843c603f3a9dce806057484010f280fde8f43a03829d210141c803f6a333e80c0876820404210fd88fcea83320d801121084bc042d3a93ce80603b484010f212b4e8cc3a03826d210141c84bd0a2b3e80c08b6860404212f418bbe5f6740b02524200879095a74569d01c116908020e42568d10fe80c0836830404212f418bcea63320d804121084bc042dfa419d01c1c69080e08b1044d97506041b4102822f40103da4b22b1e9d1d5205f234d3e81c3a11658354813ccd34fa619d88b242aa409e661a9d5327a22c902a90a799463fa21311e4f924d199218872e944940152252304d1a33a11a58354490f41945b6740b02104515a08a2c774eea2dc902a90e736453fae13512e4815c81b27a29fd0892827a40ae48d13d1797422ca01a90279e344f4933a11e5815481bc43293aaf4e448f43aa40dea1141dab1111e4d25c0308e67c3af7505e4815c8dbdc2088123220f8042820d8806e46a94f474d366a685237923abfd4b6a51639f5b769964083001abad0c484a653345aa2311ecde068de49c34a1a0cd3549726e834fef6aeb3775dbcebea5d37efba7bd7c3bb9edef5ba5b40b0b71c3fea23cb7d65b99f2cf797e501b23c509607c9f260591e22cb436579982c0f97e511b23c529647c9f268591e23cb6365799c2c8f97e509b23c519627c972bc2c4f96e529b23c5596a7c9f274599e21cb33132420380312109c09f943505d6740701a2420381d82a886ce80e0144840702a04514d9d01c1784840703204512d9d01c1899080e02408a2da3a0382e32101c109104475740604c7420282e32088eaea0c088e860404c74010d5d319101c0909088e8220aaaf3320381c12101c0141d440674070282420380c82a8a1ce80e060484070080451239d01c1819080e02008a217740604fb4302820320881aeb0c08f6850404fb4110bda8b32bde18520513336da213512348154cccb4a94e4498c1514308a2663a11d5835481bcb724bab94e4475205520ef2d896ea113512d4815c87b4ba2e37422aa01a902796f49744b9d01c13e104490f79644b7d2b98b5a42aa60be0ad85a27a216902a98af02b6d189a819a40ae6ab806d75226a02a982f92ae04b3a11b58554c17cb9bd9d4e44ad2155305f6e6faf11511e4840b0370473079d7ba81da40ae6311b1d940704f3800282bde96694fa74d464a386267523a9f34b6d5b6a91537f9b66093408a0a10b4d4c683a45a3251ae3d10c8ee69d34aca4c1304d7569824ee36fef38e6e4dd14efa67a37cdbbe9decdf06ee6dd0282b3e4f8d16c599e23cbafc8f25c597e5596e7c9f27c595e20cb0b6579912c2f96e525b2bc549697c9f272595e21cb2b65f935595e25cbab65f975597e4396d7c8f25a595e27cbeb6579832c6f94e54db2bc5996b7244840703324200879d77cf4389d01c18d9080e02608a2f13a0382eb2101c10d104413740604d7420282eb208826ea0c08be010908ae81209aa43320b81a12107c1d82285e6740f0354840701504d1649d01c1159080e04a08a2293a0382cb2001c1e5104453750604974002824b2188a6e90c082e8204041743104dd719105c0009082e84209aa13320380f12109c0f4134536740702e2420f82a04d12c9d01c1399080e02b1044b37576c56741aacc86209aa313d10c4815cc174a5fd189681aa40ae60ba57375229a02a982f942e9ab3a11c543aa60be503a4f27a289902a982f94ced789683ca40ae60ba50b74060467431061be50ba50e72e5a00a982f98cb64827a279902a98cf688b75229a0ba982f98cb64427a239902a98cf684b75225a02a982e93a2ed3896811a40aa6ebb85c2322c8f3231da65bb042e71e5a06a982997fac501e107c1214109c4537a3d4a7a3261b3534a91b499d5f6adb528b9cfadb344ba041000d5d686242d3291a2dd1188f667034efa461250d8669aa4b13741a7f7bb7d6bb75deadf76e83771bbddbe4dd66efb6dc2d20b8558e1f6d93e5376579bb2cef90e5b76479a72cbf2dcbbb64f91d59de2dcbefcaf21e597e4f96f7caf2fbb2bc4f963f90e5902c7b59de2fcb1fcaf20159fe48960fcaf221593e2ccb4764f9a82c1f93e5e3b27c22410282c72101c113903f04efeb0c081e8504048f4110edd319103c0c09081e8120fa406740f020242078088228a4332078001210fc0882c8eb0c08ee8704043f8420daaf3320188204043d04d1873a0382fb2001c10f20880ee80c08ee850404df8720fa486740700f2420f81e04d1419d01c1dd9080e0bb10448774060477410282ef40101dd61910dc090908be0d417444674070072420f81604d1519d01c1372101c1ed1044c77476c58f42aa603ee91fd789e830a40ae693fe099d880e42aa603ee99fd489e800a40ae693fe299d88f643aa603ee99fd6892804a982f9a4ffb14e44fb2055309ff4cfe80c086e8320c27cd2ff44e72e3a03a9f20904d1599d884e43aa7c0c41f4a94e442721554e41109dd389e838a40a661afb994e44e720553e83203aaf13d15948954f21883ed788282f2420b81582f982ce3d741e52e573c81ebaa03c2098171410dc4a37a3d4a7a3261b3534a91b499d5f6adb528b9cfadb344ba041000d5d686242d3291a2dd1188f667034efa461250d8669aa4b13741a7f7b77d0bb43de1df6ee887747bd3be6dd71ef4edc2d2078528e1f9d92e5d3b2fcb12c9f91e54f64f9ac2c7f2acbe764f933593e2fcb9fcbf20559fe4296bf94e5af64f9a22c7f2dcbdfc8f2b7b2fc9d2c7f2fcb3fc8f28fb27c49962fcbf21559be2acbd764f9ba2cdf90e59b091210bc010908de44fc214819e80c085e830404af431045ea0c085e810404af421025d61910bc0409085e86208ad21910fc011210fc11822889ce80e0779080e0f7104449750604bf810404bf85204aa6332078111210fc1a8228b9ce80e0979080e0571044297406042f4002825f401045eb0c089e870404216d969429750604cf41028290866fca189d01c1b3908020a4e19bf23e9d01c1339080206484993295ce80e06948401032c24c995a65573c652a4895d410446974228a8154b90f8228ad4e44d1902a292188d2e944941c52250504517a9d889242aa248320caa0135114a44a1208a28c3a114542aa248620caa43320780a82288020caac7317658254c90c41944527a20c902a192188eed789281da44a7a08a2ac3a11a58154490b41f4804e445921551e8020caa61351164895fb21881ed4882816121084049e5366d7b987b241aa3c08d943d9950704634101c19374334a7d3a6ab2514393ba91d4f9a5b62db5c8a9bf4db3041a04d0d0852626349da2d1128df1680647f34e1a56d26098a6ba3441a7f1b77797bcbbecdd15efae7a77cdbbebdeddf0eee6dd0282b7e4f8d14fb2fcb32cff22cbb765f957510e12c972842c1b59b6b2ec643990e548594e2ccb51b29c449693ca7232594e2ecb2964395a9653ca728c2cdf27cba96439b52ca791e5b4b29c4e96d3cb720659ce981001c12003222018603ed8945619100cd221028201e6834d199501c1200d222018603ed83ca3322018a442040403ccf0a9acca8060108308080698e153399501c1201a11100c30c3a7f22a03824172444030c00c9f9e5519100c922202820166f854416540308842040403ccf0a9a2ca8060108908080698e153259501c1c02102820166f8f49cca8060601001c1c04210555619100c1221028241040451159d01c1db9080e0af1044557506047f8604047f81207a5e6757bc2aa4caf31044d57422aa0ca9520582a8ba4e449520559e8320aaa113510548958a10443575222a0fa9f22c04512d9d88ca42aa948320aaad1351194895672088eae80c08fe0441541a82a8aece5d540752a52e04513d9d886a41aad48620aaaf13510d48959a10440d7422aa06a9521d82a8a14e440d20551a421035d289a81ea44a7d08a2173422ca070908de82606eac730f3582547901b2871a2b0f08e60305046fd1cd28f5e9a8c9460d4dea4652e797dab6d422a7fe36cd1268104043179a98d0748a464b34c6a3191ccd3b69584983619aead2049dc6df3e48e583d43e48e383b43e48e783f43ec8e0838c7709080699e4f8516659ce22cbf7cb7256597e4096b3c9f283b29c5d961f92e51cb2fcb02ce794e5476439972c3f2acbb965f931597e5c969f90e53cb2fca42ce795e55859ce27cbf965b9802c1794e542b25c58968bc872d1040908168104048b42fe10f4d319102c040908168620eaaf3320580012102c084134406740301f2420981f8268a0ce80605e484010f2f5a09483740604f34002824f42100dd619107c1c12107c02826888ce80606e4840f03108a2a13a0382b92001c147218886e90c08e68404041f81201aae3320980312107c18826884ce8060764840f02108a2913a0382d9200141ccb77947a90c0806591101c100f35c81d12a03824116444030c03c57608cceaef86848953110446375221a09a9320a82689c4e44c321554640108dd7896828a4ca3008a2093a110d8654190241345127a281902a83208826e944d41f5265000451bcca8060901982a81f04d1649dbb281e52653204d1149d882642aa4c82209aaa13d1784895091044d374221a0ba9320e8268ba4e44d32055a64310cdd089680aa4ca5408a2991a1141a6a801e6b9bab374eea119902a33217b6896f280607e4c4030c84437a3d4a7a3261b3534a91b499d5f6adb528b9cfadb344ba041000d5d686242d3291a2dd1188f667034efa461250d8669aa4b13741a7ffb209f0ff2fba0800f0afaa0900f0afba0880f8ade2d20584c8e1f1597e512b2fc942c9794e5a765b9942c9796e532b2fc8c2c9795e572b25c5e969f95e50ab25c51962bc9f273b25c5996abc87255597e5e96abc9727559ae21cb3565b9962cd796e53ab25c5796ebc972fd040908d683040431df36d8a2332058071210c47c7f6eabce80602d484010f3fdb96d3a038235200141ccf7e7ded41910ac06090862be3fb75d6740b02a24208879c6c90e9d01c1ca908020e619276fe90c085682040431cf38d9a9332058011210c43ce3e46d9d01c1f2908020e61927bb740604cb42028298679cbca3332058061210c43ce364b7ce806029484010f38c93777506044b4202824f4310edd119102c0109083e0541f49eceaef81e4895f72088f6ea44b41b52e55d08a2f77522da05a9f20e04d13e9d887642aabc0d41f4814e443b2055de82200ae944f426a4ca760822af13d15648956d1044fb7506048b43106d8120fa50e72eda0fa9f22104d1019d8842902a1e82e8239d88f641aa7c0041745027a2bd902aef43101dd289e820a4ca2108a2c33a111d8054f90882e8884644052001c16210cc4775eea1c3902a47207be8a8f28060015040b018dd8c529f8e9a6cd4d0a46e24757ea96d4b2d72ea6fd32c8106013474a189094da768b444633c9ac1d1bc9386953418a6a92e4dd069fced831a3ea8e9835a3ea8ed833a3ea8eb837a3ea87fb7806003397ed450961bc9f20bb2dc58965f94e526b2dc54969bc97273596e21cb71b2dc52965bc9726b596e23cb6d65f925596e27cbed65b9832c7794e54eb2fcb22c7796e52eb2dc5596bbc9727759ee21cb3d65b9578204047b420282bd207f08aeea0c08768704047b40105dd31910ec0a0908768320baae3320d8191210ec024174436740b0132420f83204d14d9d01c10e9080604708a25b3a0382ed2001c1f610443fe90c08b68504045f8220fa596740b0352420d80682e8179d01c1969080602b08a2db3a03822d2001c13808a25f7506049b410282cd11886212e90c08368104049b421045e80c08368604045f8420323a03828d200141c84b6362accaae788c815481bcee3cc6e94494085205f2baf39840e76ce536a40ae475e731913a11fd0ca90279dd794c629d88302f30fb0982284a27a21b902a37218892e844740d52e53a0451529d01c186104457218892e9fca39f145225190451729d88a22055924010a5d08928125225310451b44e440e522580204aa9135134a44a4a08a2189d889243aaa48020ba4f2322c8abea02c8cbae6352e9dc4331902af741f6502ae501c182a0806003ba19a53e1d35d9a8a149dd48eafc52db965ae4d4dfa659020d0268e84213139a4ed16889c6783483a379270d2b69304c535d9aa0d3f8db079d7dd0c5075d7dd0cd07dd7dd0c3073d7dd0eb5f070497d4ac503a5fc142f1a7ddbcf8d0cda8f8d00d3aaed3718d8eab745ca1e3321d97e8f8918e1fe8f89e8eefe8f8968e6fe8f89a8e8b747c45c797747c41c7053a3ea7e33c1d9fd1718e8e4fe9384bc727749ca1e3633a4ed3718a8e9351f13e22232f197849cf4b3a5ed2f2928697d4bca4e2e53e5e627849c94b342f297849ce4b325e92f2928497285e12f312c94bc08be3c5f2627889e025119dc5af74dca6e3173a7ea6e3273a6eb158949722bc14e6a5102f057929c04b7e5ef2f112cb4b5e5e9ee4250f2f4ff0f2382f8ff1929b974779c9c5cb23bce4e4e5615e72f0f2102fd9797990976cbc3cc04b565eeee7250b2f9979c9c44b7d5eeaf15297973abcd4e6a5162f3579a9c14b755eaaf1f23c2f5579a9c24b655e9ee3a5122f1579a9c0cbb3bc94e7a51c2f657979869732bc94e6a5142f4ff3529297a77829c14b715e8af1d28b979ebcf4e0a53b2fdd78e9ca4b175e3af3f2322f9d78e9c84b075edaf3d28e97977869cb4b1b5e5af3d28a9796bcc4f1d28297e6bc34e3a5292f4d78799197c6bcbcc04b235e1af2d2809799bccce0653a2fd37899cacb145e26f312cfcb245e26f2328197f1bc8ce3652c2f637819cdcb285e46f2328297e1bc0ce365282f437819cccb205e06f2328097febcf4e3a52f2f7d78e9cdcb165e36f3b289978dbc6ce0653d2feb7859cbcb1a5edee0e5755e56f3b28a97d77859c9cb0a5e96f3b28c97a5bc2ce165312f8b7859c8cb025ee6f3328f97577999cbcb2bbccce165362fb37839c1cb715e8ef172949723bc1ce6e5102f0779f9889703bc7cc8cb7e5e3c2f215e3ee0651f2feff3b29797f778d9c3cbbbbcece6e51d5e76f1f2362f3b79798b971dbc6ce7e54d5eb6f1b295979bbcdce0e53a2fd778b9cacb155e2ef37289971f79f98197ef79f98e976f79f98697af79b9c8cb57bc7cc9cb17bc5ce0e5735ecef3f2192fe778f99497b3bc7cc2cb195e3ee6e5342fa77861e733ec7c869dcfb0f319763ec3ce67d8f90c3b9f61e733ec7c869dcfb0f319763ec3ce67d8f90c3b9f61e733ec7c869dcfb0f319763ec3ce67d8f90c3b9f61e733ec7c26119fc6afbcdce6e5175e7ee6e5275ed8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff0cfb9f61ff33ec7f86fdcfb0ff19f63fc3fe67d8ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ff33ec7f86fdcfb0ff19f63fc3fe67d8ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff2cfb9f65ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ffb3ec7f96fdcfb2ff59f63fcbfe67d9ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff1cfb9f63ff73ec7f8efdcfb1ff39f63fc7fee7d8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fdcfb1ff39f63fc7fee7d8ff1cfb9f63ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f60ff0bd8ff02f6bf80fd2f681015eebef7f6411f1ff4f5413f1ff4f7c1001f0cf4c1201f0cf6c1101f0cf5c1301f0cf7c1081f8cf4c1281f8cf6c1181f8cf5c1381f8cf7c1041f4cf4c1241f50c5c93e98e283a93e98e683e93e98e18399f8190de4750ac12cc8842656d9102b96979a7f153255a905c1934f119ed87ffc3fd5ff0a9effa952038227bf123cb1fffc2f9effb378fea94a35089e020af0c4def96f54f93378eea8521582a7e07f194fecbffa379ffba378fe4595ca103c85fe8b7862ff9d50f18fe0f937552a41f014fe2fe18995c4677f2f1ea14a05089e22ff053cb177ab58eef7e0b94b95f2103c45ffc378627f4fc567ee86e77754290bc153ec3f8827f6f7562c2de1f99d55ca40f014ff0fe189fd23159ffe7778fe409552103c25fe037862ff68c5a7fe159e3f58a52404cf53098c27f6cf54fc3f4f5bfe13554a40f0944c403cb17fb662d17fc6f327ab1483e0795a67ecb424a40ae4452f31a574222a01a90279d14b4c699d88208f6e8d290e41544627a222902a4521889ed189a810a44a6108a2b23a11158054817c1d23a69c4e44f92055f24310954f3044b17fbe22c6896221809ed5b987ca43aa405ec519534127a2b2902a905771c654d489a80ca40ae4559c319574222a05a902791567cc733a1155825481bc5c3aa6b24e44152055202f978ea992208862ff5ac5ffb9b3fe4b550a432057d5b9832a43aa405e72af1311e451e1c16c08a0f61ac32f5d00e197ae103c1d34865f5e06845f3a43f074d4187ee90808bf7482e0e9a431fcd21e107ee900c1f3b2c6f0cb4b80f04b3b089ece1ac32f6d00e197b6103c5d34865f5a01c22fad2178ba6a0cbfc401c22f2d2178ba690cbf3407845f5a40f074d7187e690a08bf3483e0e9a131fcf22220fcd20482a7a7c6f0cb0b80f04b63089e5e1ac32f0d01e19746103cbd35865fea03c22f0d2078fae8ecfaf48654e90341d45727a29e902a90d715c6f4d389a83ba40ae4758531fd7522ea0aa902e941c60cd089a833a40ae4758531037522ea04a902795d61cc209d883a40aa405e5718335863f8a51e0410e46585314374eea1c1902a43208886ea44341052651004d1309d88fa43aa0c80201aae13515f48957e10442374221a0ea932028268a44e444321558641108dd2187ea90308bfd485401ead73078d84541905d9410844fff7a1ebab6a366fdda163e7ce75e23ab769d96b6abc0f66856ed33a3b74fb74a252f1a11951f1a1e9744ca3632a1d53e8984c473c1d93e89848c7043ac6d3318e8eb1748ca163341da3e81849c7083a86d3318c8ea1740ca163301d83e81818153f202abe7f547cbfa8f8be51f17da2e27bd3bfbb998e4d746ca463031debe95847c75a3ad6d0f1061dafd3b19a8e5574bc46c74a3a56d0b19c8e65742ca563091d8be95844c7423a16d0319f8e7974bc4ac75c3a5ea1630e1db3e99845c7713a8ef1737888023fef2be0277f05fc0cb0809f0616f073c1027e4258c0cf0a0bf8a961013f3f2ce0278905fc4cb1809f2e16f073c6027ee258c0cf1e0bf82964013f8f2ce0279305fc8cb2809f5616f073cb027e8259c0cf320bf8a966013fdf2ce0279d05fcccb3809f7e16f073d0027e225ac0cf460b6646f960ceffdef3f188dd1acc81e4995ef9eb45062d2dd3b94dbb766d5a4d9d346849cd361d5ab58bc3bc24217c767ff577297c4eed3bb58bf3c1dc8953062dafd4ad7da78a2dab76ec1a9fc80e5afc4cc70e5dbac6474cfaeb273b685599361d9a76ee55be4d5cbb16cf779a926861d936dd23122daad9b563a7c9132702fe0bfe790f4d9a0cc14b4c303fa85701db2841aeefd589e8bf587a8025d4ef5d7ee86fddbc7bbf75ff0b2e11c16ca1f90a7fe7e8eae6237ee3feffad3d59ddd6c69e10e231788b4b77eedcb4d7e94431985302bc7f0b7322a9b49c486a2d279246cb89a4d57222e9b49c487a2d279241cb8964d4722299b49c48662d279245cb89dcafe544b26a399107b49c4836c4a7807fdc9a50a761810f16fa60910f16fb60890f96fa60990f96fb60850f56fae0351facf2c16a1fbcee83377cb0c6076b7db0ce07eb7db0c1071b7db0c9079b7db0c5075b7db0cd076ffa60bb0f76f8e02d1fecf4c1db3ed8e583777cb0db07effa608f0fdef3c15e1fbcef837d3ef8c007211f781fecf7c1873e38e0838f26ce1ab4b04ac7eef1d6fcf67f4dc46fff3722d13f3e9e24facb1f4f62f30e5a59be63e7b836ad3a700f6ff2bae6b456ebdca67bd3ae71dcd8ebdaa6638749839657886bda298c29dee59d3c68558db8566dba748deb5cb1438bb89e1177fc6bf3cfff711bf3db3907ee7fce3d18b4883f684d8afaed5f278af89fcf419320ada2f9804f53fff44ecd65d5bb75ecda26ae43d7a9a8cfd48b10bf3a7ffdd34b3e1f1cf2c1c19dffa28bbbb846e9aacf969b446dc18311a27c28f40beec5f5ffef47b808c2f9603c8411f615adf8edb458cd763ae283c3f2763a2c6fa72309b39d1643381f866ca723dab7d37235dbe9980f8ecadbe9a8bc9d8e25cc765a0ee17c14b29d8e69df4e2bd46ca7133e382e6fa7e3f2763a9130db690584f371c8763aa17d3bad54b39d4ef9e0a4bc9d4ecadbe954c26ca79510ce2721dbe994f6edf4919aedf4b10f4ecbdbe9b4bc9d3e4e98edf41184f369c876fa5863aa07f2fcc26001a4ca19e4480b9e9238039dd77e726f5e7b075e6282f9419d559992a0eb3b0b4f49c4635a4e902a9faadc5667e9c4208db998e52a4399a01fde3948b473b9ea98db39a8817f76cfc0efc04b4c303fa8f32a0d9caeefbcd2981b1a18c49a200f7e0e1642aa7caefacef273a8315db8674c77e02526981fd4172a8d89aeef8bbff59de5972ab7d5177462983bcb957fe73bcbaf2077962b55df597e0535f08bf70cfc0ebcc404f383fa5aa581d3f57dadf4cef26bd5bf77a7a1bf77dfdcfbbdbb032f31c1fca0be55f97b47d7f7eddffac6e93b95dbea5b3a31cc8dd3aabff38dd3f7901ba755aa0dfc7ba881ff70cfc0efc04b4c303fa81f551a385ddf8f4a6f9c7e54fd7b7714fa7b77e9deefdd1d788909e6077559e5ef1d5ddfe5bff58dd31595dbea329d18e6c6e9f5bff38dd355c88dd3ebaa0dfc2ad4c0afdd33f03bf01213cc0feaba4a03a7ebbbaef4c6e9baeadfbbe3d0dfbb1bf77eefeec04b4c303fa89b2a7fefe8fa6efead6f9c6ea9dc5637e9c430374e6bfece374e3f416e9cd6a836f09fa006fef33d03bf032f31c1fca07e5169e0747dbf28bd71fa45f5efdd49e8efdded7bbf7777e02526981fd4af2a7fefe8fa7efd3bdf38452652b9ad7ea513c3dc38adfb1bdf384546406e9cd66936f0c808a481479a7b067e075e6282f941598d06ced76775de384180fddfafb62eab16d722ae7397b80e9327c7fb6061f831e207c3ebe1d0ed44f13ed2f9c840fce74e277a8cfed34bc2ffccd2f0ba2cbc1e0dafc7c3ebc9f0fa5a785d155e5787d7d7c3eb1be1754d785d1b5ed785d7f5e1754378dd185e3785d7cde1754b78dd1a5eb785d737c3ebf6f0ba23bcbe155e7786d7b7c3ebaef0fa4e78dd1d5edf0daf7bc2eb7be1756f787d3fbcee0baf1f84d75078f5e1757f78fd30bc1ef88d54a48f4c7c57c20bf89f8874e135f2b77f2eca4726d1fb173f29c08712caee0b40cd3ed93db3ff5f708908c6b9922bb47ababae49a9f4d0cd8dad813caa7efd9c40f6a793a62762d27f2909613c9a1e5441ed6722239b59cc8235a4e249796137954cb89e4d672228f693991c7b59cc8135a4e248f96137952cb89e4c53d9b78b68f4ce123a37d644a1f19e323eff391a97c646a1f99c647a6f591e97c64faffc6a382b7c47578b95b5cb7b86add9ab56bd3fc1f0f0b66e97f3f303899e20706f38780bffa834ed0a79445a6d4f294b2c88c3e3283f894b2c80ce253ca223326c853ca225342386788873052fed0bbc81835db29b38fcc246fa74cf276ca9c30db2906c23913643b65d6be9dd2a8d94ef7fbc82cf276ca226fa7fb13663ba58170ce02d94ef76bdf4e69d56ca7077c6456793b6595b7d30309b39dd2423867856ca707b46fa7746ab6d3833e329bbc9db2c9dbe9c184d94ee9209cb341b6d3831a430e0520985340aa64d7fc1c2ec4d9fdd3d4eba17b53af3bf01213cc0f2a87ca88035d5f0e9d19b5c8e4902a0fabdc5639e8c43019b50d2a336aa01f5e4e48466d83ea8c5a4ea8813f72cfc0efc04b4c303fa85c2a0d9cae2f97d28c5a2e8d4f78cd0731a66848954755df593e0a35a6dcf78ce90ebcc404f3837a4ca531d1f53df6b7beb37c5ce5b67a8c4e0c7367b9e9ef7c67f904e4ce7293ea3bcb27a0069ee79e81df819798607e504faa3470babe2795de593ea9faf72e0bf4f72eefbddfbb3bf01213cc0f2a56e5ef1d5d5fecdffac6299fca6d45ff9b0f73e3b4e5ef7ce3941f72e3b445b581e7871a78817b067e075e6282f941155469e0747d0595de381554fd7b9715fa7b57e8deefdd1d788909e6075558e5ef1d5d5fe1bff58d531195dbaa309d18e6c669dbdff9c6a928e4c6699b6a032f0a35f062f70cfc0ebcc404f3832aaed2c0e9fa8a2bbd712aaefaf72e1bf4f7aec4bddfbb3bf01213cc0fea2995bf77747d4ffdad6f9c4aaadc564fd189616e9cb6ff9d6f9c9e86dc386d576de04f430dbcd43d03bf032f31c1fca04aab3470babed24a6f9c4a27fc83ca22a3c30fd0ca105e33fdf618ad323ef299ff7b397fdd8cca2604e5bf7e5ae5749e56799da7f5acced3aaa0f3b42aea3cad4a3a4feb399da75559e76955d1795a55759ed6f33a4fab9aced3aaaef3b46ae83cad9a3a4fab96ced3aaadf3b4eae83cadba3a4fab9eced3aaaff3b41ae83cad863a4fab91ced37a41e76935d6795a2fea3cad263a4faba9ced36aa6f3b49aeb3cad163a4f2b4ee769b5d4795aad749e566b9da7d546e769b5d5795a2fe93cad763a4fabbdced3eaa0f3b43a024e4b7e394d7e1a0ddd179e13a50aafa9c36b96f09a35bc660bafe9c36bd9f05a2ebc960fafcf86d70ae1b56278ad145e9f0baf95c36b95f05a35bc3e1f5eab85d7eae1b54678ad195e6b85d7dae1b54e78ad1b5eeb85d7fae1b541786d185e1b85d717c26be3f0fa62786d125e9b86d766e1b579786d115ee3c26bcbf0da2abcb60eaf6dc26bdbf0fa52786d175edb87d70ee1b5e36fd3b44e3ef2e5bb4ee15284ff8932e1b5d36fff5c671fd9456f2aa42b7856adeae2baa91cc447f9c8a418afe80eb6306dd7d743a745f7d4795abd749e566f9da7d547e769f5d5795afd749e567f9da73540e7690dd4795a83749ed6609da73544e7690dd5795ac3749ed6709da73522c13f7bc6d007a29ee14f47bdc26beff0da27bcf60daffdc26bfff03a20bc0e0caf83c2ebe0f03a24bc0e0dafc3c2ebf0f03ae2b74f5c237de4a884c0335ae74f6d8cced31aabf3b4c6e93cadf13a4f6b82ced39aa8f3b426e93cad789da73559e7694dd1795a53759ed6349da7355de769cdd0795a33759ed62c95edcde4d497c47c63f12d95d7d78dfaca98ebdb9910dfc8fcebdb6a36e4bb946f41aaecd4f99b3747e769bda2f3b4e6aafc3da6b96357ccf5bdaa13fb3c9da7355fe7692dd0795a0b759ed6a2847812c45ffd9d8e805cda628d97662097b644e3a559c8a52dd578690e7269cb345e5a00b9b4e51a2f2d1272692b345e1af5e82117b752e7c58d815cdc6b3a2f6e2ce4e256e9bcb871908b5badf3e2c6432eee759d17370172716fe8bcb889908b5ba3f3e2309f04d6eabc384ccc769dce8bc3f4f9d6ebbcb829908bdba0f3e2a6422e6ea3ce8b9b06b9b84d3a2f6e3ae4e236ebbcb819908bdba2f3e266422e6eabce8b9b05b9b86d3a2f6e36e4e2ded47971732017b75de7c5bd02b9b81d3a2f6e2ee4e2ded27971af422e6ea7ce8b9b07b9b8b7755edc7cc8c5edd279710b2017f78ece8b5b08b9b8dd3a2f6e11e4e2ded57871892197b647e3a545412eed3d8d97960472697b355e5a52c8a5bdaff1d292412e6d9fc64bc37c99ff038d9796027269218d97160db934aff1d252422e6dbfc64b8b815cda877ffdd24e27ea1561ac0b22134725499a2c798ae89431f7a54a9d266dbaf4193266ca9ce5feac0f647b30fb43391ecef948ae47733ff6f813799ecc1b9b2f7f8182850a17295aac7889a74a3e5daa749967ca962bff6c858a959eab5ca5eaf3d5aad7a859ab769dbaf5ea3768d8e885c62f3669daac798bb896ad5ab769fb52bbf61d3a767ab97397aeddbaf7e8d9eb74a2c77ce4621fb9c4472ef591cb7ce4721fb982a6fa34fba60931cd5169da4833399a5cd17c87a620342ba08e3af59da93b4b3d4ceaf4513f8cba46d45ba10e047d4ea74fb3f4998f3e19d1e707bacba67b51ba63a33b1bba03a0bf94f417859c971c8a7e9369c7d3ce2082ff1f", "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" } ] diff --git a/yarn-project/sequencer-client/src/client/sequencer-client.ts b/yarn-project/sequencer-client/src/client/sequencer-client.ts index 68459ab2afd..392ac56d18d 100644 --- a/yarn-project/sequencer-client/src/client/sequencer-client.ts +++ b/yarn-project/sequencer-client/src/client/sequencer-client.ts @@ -8,6 +8,7 @@ import { getL1Publisher, getVerificationKeys, Sequencer } from '../index.js'; import { EmptyRollupProver } from '../prover/empty.js'; import { PublicProcessorFactory } from '../sequencer/public_processor.js'; import { WasmRollupCircuitSimulator } from '../simulator/rollup.js'; +import { getGlobalVariableBuilder } from '../global_variable_builder/index.js'; /** * Encapsulates the full sequencer and publisher. @@ -34,6 +35,7 @@ export class SequencerClient { l1ToL2MessageSource: L1ToL2MessageSource, ) { const publisher = getL1Publisher(config); + const globalsBuilder = getGlobalVariableBuilder(config); const merkleTreeDb = worldStateSynchroniser.getLatest(); const blockBuilder = new SoloBlockBuilder( @@ -47,6 +49,7 @@ export class SequencerClient { const sequencer = new Sequencer( publisher, + globalsBuilder, p2pClient, worldStateSynchroniser, blockBuilder, diff --git a/yarn-project/sequencer-client/src/config.ts b/yarn-project/sequencer-client/src/config.ts index 2574d918aa6..5b82194ec4e 100644 --- a/yarn-project/sequencer-client/src/config.ts +++ b/yarn-project/sequencer-client/src/config.ts @@ -1,11 +1,12 @@ import { SequencerConfig } from './sequencer/config.js'; import { PublisherConfig, TxSenderConfig } from './publisher/config.js'; import { EthAddress } from '@aztec/foundation/eth-address'; +import { GlobalReaderConfig } from './global_variable_builder/index.js'; /** * Configuration settings for the SequencerClient. */ -export type SequencerClientConfig = PublisherConfig & TxSenderConfig & SequencerConfig; +export type SequencerClientConfig = PublisherConfig & TxSenderConfig & SequencerConfig & GlobalReaderConfig; /** * Creates an instance of SequencerClientConfig out of environment variables using sensible defaults for integration testing if not set. diff --git a/yarn-project/sequencer-client/src/global_variable_builder/config.ts b/yarn-project/sequencer-client/src/global_variable_builder/config.ts new file mode 100644 index 00000000000..909d3d32b05 --- /dev/null +++ b/yarn-project/sequencer-client/src/global_variable_builder/config.ts @@ -0,0 +1,19 @@ +import { EthAddress } from '@aztec/circuits.js'; + +/** + * Configuration of the L1GlobalReader. + */ +export interface GlobalReaderConfig { + /** + * Rollup contract address. + */ + rollupContract: EthAddress; + /** + * The RPC Url of the ethereum host. + */ + rpcUrl: string; + /** + * The API key of the ethereum host. + */ + apiKey?: string; +} diff --git a/yarn-project/sequencer-client/src/global_variable_builder/global_builder.ts b/yarn-project/sequencer-client/src/global_variable_builder/global_builder.ts new file mode 100644 index 00000000000..26ddbd28b9a --- /dev/null +++ b/yarn-project/sequencer-client/src/global_variable_builder/global_builder.ts @@ -0,0 +1,43 @@ +import { Fr, GlobalVariables } from '@aztec/circuits.js'; +import { createDebugLogger } from '@aztec/foundation/log'; + +/** + * Reads values from L1 state that is used for the global values. + */ +export interface L1GlobalReader { + getLastTimestamp(): Promise; + getVersion(): Promise; + getChainId(): Promise; +} + +/** + * Builds global variables from L1 state. + */ +export interface GlobalVariableBuilder { + buildGlobalVariables(blockNumber: Fr): Promise; +} + +/** + * Simple implementation of a builder that uses the minimum time possible for the global variables. + */ +export class SimpleGlobalVariableBuilder implements GlobalVariableBuilder { + private log = createDebugLogger('aztec:sequencer:simple_global_variable_builder'); + constructor(private readonly reader: L1GlobalReader) {} + + /** + * Simple builder of global variables that use the minimum time possible. + * @param blockNumber - The block number to build global variables for. + * @returns The global variables for the given block number. + */ + public async buildGlobalVariables(blockNumber: Fr): Promise { + const lastTimestamp = new Fr(await this.reader.getLastTimestamp()); + const version = new Fr(await this.reader.getVersion()); + const chainId = new Fr(await this.reader.getChainId()); + + this.log( + `Built global variables for block ${blockNumber}: (${chainId}, ${version}, ${blockNumber}, ${lastTimestamp})`, + ); + + return new GlobalVariables(chainId, version, blockNumber, lastTimestamp); + } +} diff --git a/yarn-project/sequencer-client/src/global_variable_builder/index.ts b/yarn-project/sequencer-client/src/global_variable_builder/index.ts new file mode 100644 index 00000000000..b3b666b7513 --- /dev/null +++ b/yarn-project/sequencer-client/src/global_variable_builder/index.ts @@ -0,0 +1,15 @@ +import { GlobalReaderConfig } from './config.js'; +import { GlobalVariableBuilder, SimpleGlobalVariableBuilder } from './global_builder.js'; +import { ViemReader } from './viem-reader.js'; + +export { SimpleGlobalVariableBuilder } from './global_builder.js'; +export { GlobalReaderConfig } from './config.js'; + +/** + * Returns a new instance of the global variable builder. + * @param config - Configuration to initialize the builder. + * @returns A new instance of the global variable builder. + */ +export function getGlobalVariableBuilder(config: GlobalReaderConfig): GlobalVariableBuilder { + return new SimpleGlobalVariableBuilder(new ViemReader(config)); +} diff --git a/yarn-project/sequencer-client/src/global_variable_builder/viem-reader.ts b/yarn-project/sequencer-client/src/global_variable_builder/viem-reader.ts new file mode 100644 index 00000000000..00c903fec90 --- /dev/null +++ b/yarn-project/sequencer-client/src/global_variable_builder/viem-reader.ts @@ -0,0 +1,63 @@ +import { createEthereumChain } from '@aztec/ethereum'; +import { RollupAbi } from '@aztec/l1-artifacts'; +import { + GetContractReturnType, + PublicClient, + HttpTransport, + createPublicClient, + http, + getContract, + getAddress, +} from 'viem'; +import * as chains from 'viem/chains'; +import { GlobalReaderConfig } from './config.js'; +import { L1GlobalReader } from './global_builder.js'; + +/** + * Reads values from L1 state using viem. + */ +export class ViemReader implements L1GlobalReader { + private rollupContract: GetContractReturnType>; + private publicClient: PublicClient; + + constructor(config: GlobalReaderConfig) { + const { rpcUrl, apiKey, rollupContract: rollupContractAddress } = config; + + const chain = createEthereumChain(rpcUrl, apiKey); + + this.publicClient = createPublicClient({ + chain: chain.chainInfo, + transport: http(chain.rpcUrl), + }); + + this.rollupContract = getContract({ + address: getAddress(rollupContractAddress.toString()), + abi: RollupAbi, + publicClient: this.publicClient, + }); + } + + /** + * Fetches the last timestamp that a block was processed by the contract. + * @returns The last timestamp that a block was processed by the contract. + */ + public async getLastTimestamp(): Promise { + return BigInt(await this.rollupContract.read.lastBlockTs()); + } + + /** + * Fetches the version of the rollup contract. + * @returns The version of the rollup contract. + */ + public async getVersion(): Promise { + return BigInt(await this.rollupContract.read.VERSION()); + } + + /** + * Gets the chain id. + * @returns The chain id. + */ + public async getChainId(): Promise { + return await Promise.resolve(BigInt(this.publicClient.chain.id)); + } +} diff --git a/yarn-project/sequencer-client/src/sequencer/sequencer.test.ts b/yarn-project/sequencer-client/src/sequencer/sequencer.test.ts index a63e8944b6d..07b1f56d426 100644 --- a/yarn-project/sequencer-client/src/sequencer/sequencer.test.ts +++ b/yarn-project/sequencer-client/src/sequencer/sequencer.test.ts @@ -15,9 +15,11 @@ import { L1Publisher, makeTx } from '../index.js'; import { makeEmptyProcessedTx, makeProcessedTx } from './processed_tx.js'; import { PublicProcessor, PublicProcessorFactory } from './public_processor.js'; import { Sequencer } from './sequencer.js'; +import { GlobalVariableBuilder } from '../global_variable_builder/global_builder.js'; describe('sequencer', () => { let publisher: MockProxy; + let globalVariableBuilder: MockProxy; let p2p: MockProxy; let worldState: MockProxy; let blockBuilder: MockProxy; @@ -38,6 +40,7 @@ describe('sequencer', () => { lastBlockNumber = 0; publisher = mock(); + globalVariableBuilder = mock(); merkleTreeOps = mock(); blockBuilder = mock(); @@ -69,6 +72,7 @@ describe('sequencer', () => { sequencer = new TestSubject( publisher, + globalVariableBuilder, p2p, worldState, blockBuilder, @@ -90,6 +94,9 @@ describe('sequencer', () => { p2p.getTxs.mockResolvedValueOnce([tx]); blockBuilder.buildL2Block.mockResolvedValueOnce([block, proof]); publisher.processL2Block.mockResolvedValueOnce(true); + globalVariableBuilder.buildGlobalVariables.mockResolvedValueOnce( + new GlobalVariables(chainId, version, new Fr(lastBlockNumber + 1), Fr.ZERO), + ); await sequencer.initialSync(); await sequencer.work(); @@ -113,6 +120,9 @@ describe('sequencer', () => { p2p.getTxs.mockResolvedValueOnce(txs); blockBuilder.buildL2Block.mockResolvedValueOnce([block, proof]); publisher.processL2Block.mockResolvedValueOnce(true); + globalVariableBuilder.buildGlobalVariables.mockResolvedValueOnce( + new GlobalVariables(chainId, version, new Fr(lastBlockNumber + 1), Fr.ZERO), + ); // We make a nullifier from tx1 a part of the nullifier tree, so it gets rejected as double spend const doubleSpendNullifier = doubleSpendTx.data.end.newNullifiers[0].toBuffer(); diff --git a/yarn-project/sequencer-client/src/sequencer/sequencer.ts b/yarn-project/sequencer-client/src/sequencer/sequencer.ts index 709035085d3..2a5dae4e211 100644 --- a/yarn-project/sequencer-client/src/sequencer/sequencer.ts +++ b/yarn-project/sequencer-client/src/sequencer/sequencer.ts @@ -20,6 +20,7 @@ import { SequencerConfig } from './config.js'; import { ProcessedTx } from './processed_tx.js'; import { PublicProcessorFactory } from './public_processor.js'; import { GlobalVariables } from '@aztec/circuits.js'; +import { GlobalVariableBuilder } from '../global_variable_builder/global_builder.js'; /** * Sequencer client @@ -42,6 +43,7 @@ export class Sequencer { constructor( private publisher: L1Publisher, + private globalsBuilder: GlobalVariableBuilder, private p2pClient: P2P, private worldState: WorldStateSynchroniser, private blockBuilder: BlockBuilder, @@ -136,9 +138,8 @@ export class Sequencer { this.log(`Processing ${validTxs.length} txs...`); this.state = SequencerState.CREATING_BLOCK; - // @todo @LHerskind Fetch meaningful timestamp in here. const blockNumber = (await this.l2BlockSource.getBlockHeight()) + 1; - const globalVariables = new GlobalVariables(this.chainId, this.version, new Fr(blockNumber), Fr.ZERO); + const globalVariables = await this.globalsBuilder.buildGlobalVariables(new Fr(blockNumber)); // Process public txs and drop the ones that fail processing // We create a fresh processor each time to reset any cached state (eg storage writes) @@ -163,7 +164,6 @@ export class Sequencer { this.log(`Assembling block with txs ${processedTxs.map(tx => tx.hash).join(', ')}`); const emptyTx = await processor.makeEmptyProcessedTx(this.chainId, this.version); - // @todo @LHerskind We need to pass in the globals here as well to build a block with the correct data. const block = await this.buildBlock(processedTxs, l1ToL2Messages, emptyTx, globalVariables); this.log(`Assembled block ${block.number}`);