diff --git a/CHANGELOG.md b/CHANGELOG.md index cdb35d17a61..ed412091aa0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ - Performance: Optimise EIP-196 AltBn128: EcAdd 33-128% faster, EcMul 8% faster [#9570](https://github.com/hyperledger/besu/pull/9570) - Update to Netty 4.2.9.Final [#9587](https://github.com/hyperledger/besu/pull/9587) - Update to log4j 2.25.3 [#9600](https://github.com/hyperledger/besu/pull/9600) +- Add `engine_getBlobsV3` method [#9582](https://github.com/hyperledger/besu/pull/9582) ## 25.12.0 diff --git a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/osaka/test-cases/21_osaka_getBlobsV3_partial_response.json b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/osaka/test-cases/21_osaka_getBlobsV3_partial_response.json new file mode 100644 index 00000000000..e18314bcbf1 --- /dev/null +++ b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/osaka/test-cases/21_osaka_getBlobsV3_partial_response.json @@ -0,0 +1,157 @@ +{ + "request": { + "jsonrpc": "2.0", + "method": "engine_getBlobsV3", + "params": [ + [ + "0x01c4cb8adb8a6f2830dc923dfe047de2abf7b666cc731d2a8d602a850422dd9b", + "0x01031f815dcc3e03e345af9f2fef78d3d24d868857b84e63760c378e35681b12", + "0x01e4cb8adb8a6f2830dc923dfe047de2abf7b666cc731d2a8d602a850422dd9d" + ] + ], + "id": 68 + }, + "response": { + "jsonrpc": "2.0", + "id": 68, + "result": [ + null, + { + "blob": "0x001611aa000000000039ff00ff0000feed2b94641f8bd341e42f69201974d970004b43639c96605ec09569f461865022636899c168be8f89a3e6bcb20dcfe84e00f835e78d7285c57e5c3345247cbf1386e6f325f6de60d9e18adba6ea8fa3f1006869a4bcc0c0c663f6c08df94e30a9b79998574b10f7be07971355eb070ced0017063cf5c8529946e7f9a1799d27b3c2b7769e389e37b69a5dd50324e83e4000e962157a34798c9aa4c9e5584e4aea12f1101ffe8150e554697c386e840b720055674a4728386285b13dc2fb5fdc58c65c9525072b6d7cb40db8ed8a650bd400cfce99c64530feae64e91151a01759b422f714298abc0a5a449368da5762c600c8535711092a5bdc5c12cbaa6eb48b663abe0550bee0a250df682577a8836a002baf2ad1efd66e15d8bfd22c4f13c8b16e72aa227c36772fe622199337794d005839ae127bf3ba649e034d7b71ab295941e48689c38e6b10deceacdd5d596a002cd4aae5787cb5ec6f1113151e692302152c7262c3cedb39df595579de2c4600f2d834f26043bec91197caac0039594e5b18dcaf5a2996063a178c816aa25b00d9bdbe04737ef689528d7b874e0fecdd7eb9d5bfe770c4d81f696cf3d7223600ac43d013bde846c31e0831523c7f6d4f5194ddffe5ca0587c8863f2b300feb00fc01931da3d4bc449141466d6889e47104c07de46b73f188b0e831aa9c8e08009d5f421bf39f2e4389f6585c07bc67984b02f1f2a3d6fbfe7497667e962e07008ccffadc45ffb5b58a22f0eac691b0b9c732126ad7df17d9e501d4e762ab9d00efe0c6ff20acc8d4b4f8b10e4b424ddd53782fe8be979a77cd7bfaefcde444007e77a44172e890b82bd3fb120d52f002a323e6ebce429cdd581dc1f59dd470002e0a6da82ce2c3c39515efaadf875ca97bb56f1e76a395a3bd5a5439b57e0d00e3998c04d473d3d1ecf79655dd5e41a017fb95a366fb999308745bc7b7db1300455c9a8532e9f7d3f6af4f56054450022d70bd3790cc55902d777d992c36380061b641e31076eae4a8c8f50248e75d44fb752852756e4a2b9acc2c5431f18f00fa181a6fbc3c5a7bed90830b7f65711518e4ff8afac1f81f2d90227ea654170000c62f9a0c88d7fe37c77aea16ad5b858da3465c54dc048dd5e23dda21f41100104f9e6b9e845418822dccdc3cfa24e76d587c48dcf47cc2ef97ec96b26e8200410d981d8d971a0f5a9c85d6ff45ed69ab760f2e67b9280e9eefed16c52e8d00d01d8a4a1db19e360dead5049823a7c1a0ffb3b15d856ef28b6e3235ed1efc0030d51e1a32dc792c473feb7668cf2e9287f3f7d6d96748042e8fc77b3e094900b1c09d0dc04ed0a0b6ec48f967cbe373fc010bfb12be505ca605ebbec513790057003a1c7841e40705ca0d606239ea86ea654a32aad8c22d57230d25596c39008b03749a3271c35cf35acc5eb719facaa716356233c78d6eb4a2c247d772f4009f28cdddad12edc21f719151e335914d361e3cfad0239fdf12053280a92d72003b889e618256be00ef5219048472adede1f0895830fc602862f7b4f0be5770004dde69baf366f4cdbda8dba276ba416e8c4963a6fa97ba04de5192a54135c000d875da5e51d75773ae78dd0659415e753358698944ba1cd8fa88fa021e9e5d0087f6e4b3074b65f7ec22c7d9eac18a478a2cc131a4b8c9e2467f8226a0acc600b65d4fe61b849a8b0b6ee5af3d72796ba685c24c5aeaf747c5e2a6078241d0000dc18c8332b0496a1f35fc564a6251ced5a3cb202249a449b57e462c540f4a00a7aebefd732c3ba565aa8873c5721e239eee5737d634779df4f21d910add2800a1614a33fe447ce585cea7bb7a8606dd1c77495a33a8b7427ff810a346d1fc0015a6a43756171ac271c6a1ab9dfa31a4253b0b34369962bd0ff611e4c3fb6b0094c69eabbddd1f4e6885d24733316d7aaec96c5eefadffc1f15ad42d559b7300770101f837fcf45366b7b0f54c7d4205ad2aa7b0ef8ed26420aebe6e0d75d2000b6fb3fa7736c3b539c33bf232e73db3bcf78476d1fde8cac71ba508c3455d00b0ac84bac1122eea491a8b1d1af0a0521617bbcb64ee79a49cfb1261f524e500e2ed29272e7de38c038e08038e56b6bf81d3fa426761927ff23ae2be586357004fe5451ddb32282ab6450a879a97cf582398eb8ed87d0e4eb28b2e63f9523d000cb2a069405a5d6af46f3d46e2c6ca5a3a9af875b52d8f1c68b4ac81168448009ac0846e2bf15b006801c79cebbcb0e05518f267fc300ced708123f1f8537600045a7c35dd0b4f451c89655d06dfecd3b38b1372c1e319887bca86b64533da009f8135e7329a59a968ebebbbe13a39bcd223d217a97e4bfde634235e35872800ecb19d6b39fc6942ec4bd0c8b572c55f42c9129742b68394921e6ae953b4f9002ed3231b7499dcea75a74590cb4e736ad052e109bde985eece1f5a34833b70007465e106f6e184a3b479b238d86463ac9bccf29d1c065ee5e8b839182499dd0042d9910a2191ecf3e4f78464ff1647591503b0ddd04f7099f83d6db4d594af00d396df12d9c14c23c493e293fa293d09a6ee8346ec4808be4872fd0a6ec677007f9176570efd98731e1372e8ac97262767329f7f3c49cb86a0d2d32c4ef16000200ecdf5bb2e80e27f6e17a1e9a3c7ff779b2948b1364a87cd8080db52a61a007d513462d6cb76581e37a4533750aa4a1ddefba9afc5734eb3725b5fabea6900042c69205191eab486f27ffc827e4e3d5931181d551dc40bab184d4cbdabab00340bdf5154b701340fa6c9302d631335d49bddfbec9f7f5ccf7ecb5844708f009c90595cdc7daa76a61426452afdea1bdbfd94947b6d50cd28c389fc50c7b5007651b5cf20326a92eaaeeafd09c95e82dbf9ce0ccca5779e2aae0566b8b63500d012d0062baf5febc9a7f70de1ba10e7ecf6d0253fc474b9f554d967cec5910082369ed9f8d5d8518837cbcdb9b9190da6de51d2acc9fa5f955daa4c96007500cf6d7698222db03ad978e6616b34b128134265c1b642dd8f8f2dffaa5e3a080093dce5953f7c0641944397a4ed4275fdb91b582e00e9d3e77fc617b1baf80c008ae3862def56728f074714dac8920aa61fa96c874b1b3373afe795b915b6540043cb741d086b37d0c0117003741305b198d46a0a01e98130f410b6e4ab3f1100e143ec906280e0766eaf535b7484f61d193056356658bcc2209d48eabdf55500b6adfb8dc074f07a0b2f5a59d1ad44161b57ac1d6fb61d3868e853f511ba61000f99a8803a29bd8c9dbd6f2dd556fcf58c361172c53ef26847148f2b358fef0066680508d5e1e5560338160aa62b811c7349a875d8215e22ab984efdc0d50d00be0dc15e17f4dd2a6dd1dc926e53bce651223fbf653c6e70542be7e237d39b004d14415e8250d0ce3bac0dfe929e99c75b093d212765b2af1b6888afa10c61000cd054d5d8feb733a603922c97614df3c82741e6e9e0f1e20890191a5de8d900825a64d4e887711b36b5e946ff5eae7760c04c120e0e552433659605b16ed600930ca5225c791f6cc000a457ad7f12bff226d7dbcece7942d8516b13af878d00b8283334b4d03feb9beab8e2867b596286f70359c11e104408ec6b6ea0b00a0078ddf600bd64541a5234201dbde41c34cb2c0faa0fa78db91ff27c003adee200b3b3e044705fef5e74bee697d6caa1d79005d521790afe02daa68e82812f93000a98d66d0d628a250699ea513cc6c5e29a78014e1ce1a8ab3672f766672eb400194753d2c25e8b341de9f241537c80d33fce26952287420e7d890513d73deb004273196b8ab00c33223607eb2a6f220e7267c6c353d26f3877c09b6384c2bc00c380f75352d4773c9ba3a2d53cdafdfe606fe8e1abe5ff1eb788f0aa60852900e72a1b255c06c022a896d0221fefde783772fc289d3083f508e472483e9403007334bf238de8a1306ac3ffa32ed20005edef1847425aa5e1a140ebeee4888e001a7e011ef3203cb5ed9ffabd61a44e45a9830dea7ccae48f67cf6539b79b8f00a7f3e4d4c745fc2f81ed96a93303604bd1ba71703f03573e4e7b0eb1566c5700c117084fed8e4754ffd682f84129afac85f64ab2acff7f02c1d80c36c8482b00dd8bc6f6aaa9f9286609c0624cafad9d7993e76e39e9bbbfb502e486c9ada600d2a78852cf965fe53200149b9208eb63b4348e887e59abeae1b8e166116d0200c40add049c83ef28f99fa77422f4d9bb5815b2bbaef8ad02688b84383fc9e700aee94fba7876ec89a55c069918896e4a60b67298aa679fe2e8fae0209d37f8002b008ef9c8306f8ce98ef54d818b870d626b10283a67981556020d0d1333c100bcf8f951b8fae35a2eede491a1778e19da983c16a475dc9c059f751228a099008ac9b3d49103e66b2d7ec9c194402476e9e3b187ef28cd07211b724b2c9c8a005c03ec943a7de9ddf31cc7afc201d4a75dacb49cfab28ed0afcc5645787160001fb41780b31678af04e33c275d8b769542d88cda7344905b06189bcadb190e007c688b7b808069274552436db9a2f67c1a5bfb48e0cd5a1cc6b9ffc028956300df83b6f2f604dfe08eba4ec3fe5b81ed27ef02c736aeb6eba38235d0c0d4e7000226b1b096d149bbbc0e34d53acb4b723273602b5ea9de3f675a764c176f250016626039a3ce3a9b476cb3bbab8ceb0d9e82ef88939c9fb110c8167f3531d8003215b94231fdb37561254b232fecd726d0fed0b4837932111a8409cd93057400e4f754041eb90d8461cbbdce36450e71093adc98db2091e4302a4070fd1682000d25aa300a3f25f3b8bb6769c0f7f483b9115479144bb1e2de1cda123fddb600b6c7ca7c11134cfb0194d6b7b100449eb4a6408008ad6bd982aa99b0e2b18300ac82518fd910257d92636f39fa661c0da61e213994dc895c5033ef905bd10100ea8946af9eecf8a3d007c1e04297aef2df67e2e574ff3c0048e1d22f26d861008ce735467e3498f67d7adde3cb9b00c30445c236eb01a09fde7b9affc9459c008fcb418cfbfb95d88c6bab082170c65c2dc13e837857926e7e1d497e8635aa006612c4ecf9666553457fe4c3e8c60587ca66dabc9db33f81fe67cc51078f9b009e4af30db509b0bdfcceb7f9f3cc0f05117fde9cc453c18a85f3936cdc1f9200fafd8babebe076dbdd3c94ab7aa8d2270b0b8ef082dabcc3dfd5832b11660c00801ebc71c8a60eb26f62cba006abf60e86b7f71eca5a4ef9627d56c3d573c200b916fa36bc5b5b11a5314a52c1f0403079b44dc413816b00c797d56b8ed87b00f3b1b50538438b0e7fe68f36ab7cb3c70e2a8bae4a799f7cd48648563e772c00ce3331d9e4b728e2eca5e8783c8aee37e800e56c599771217c6ec89cafd2b400f18579d52729bde89ccd7fb8e1fb0342120292ecf9d827371af260cd7a0fe500ba08f691b1ff8aa8c8e4cd93283d47ec20f615af092163062f303deb0a5f42009f74090fe261e1ec8953329e30701fdcf2279f2d98e8a83f0b8e1060feaede0085c836b1116515e3e1a0c9d0e23be4beac97511bf62de7801c0d1fd3de8e3c00791d1ab8382a0ae99533e22652b010abc93473555844a1e0a919ed6d276ac200e63ccec656866d06194a4ef302828f7696c4437df63328c7c2476fe4b5fc8400250caa8ce8d026de5cd4bed3a8b2d06c5972555c12d6eba89486903e19425d00a82d0eab8f6199ee19640c98ccc99cc1d2ec3ea65046ddedc09f957442710f00fd83bea90dae14cdf0be93d9b908901f7fa8016774b870b5a487a5557070360069169cda47b3422199b68a421da71ec750ca50e9bb1d3896282ebc52bcf918009aab8bb086a0a669001759689519b29c03cf89af9f71aa8348d38691de3bc100130f72c0c41e1932c3adcbf36bb1cb43729c00b16869d739b88657b221b626006e2db52f4f1b9e2267d7adee83e68a14297fce888625a732cef54c66ac5bf8001a006947ce0510c6b3dcd8a21bf8601010672214a5af830dc714f7771426e200467efd5f9443fa052a64b2a0383412e621b73b5e44ce35d4cdb5e5ffeceb6d00d1f127fc6445a4da9c364bbf7933ed8921425540e3a7b42f60c5e1b2155b92006fc9c4522d44f7cd6a360a84da0d49eea3749124f9fab3987fa196ec02c6fa00d79acaa376ef0d8cf808b97c7f69538c24a3e62931dd33b99a6f4d8cf717bf0003360342646017c03880bd2c4244f69d081c0a14135caacdca10628fd8654f004af204acb24ce61fb45baaedcaf3427c1e477925ab71a5335e9ff36c27099800e642c4566826e122ddba52b3d0bee3579f1242b43d633ed301e1892a679b150002c770afc884b39d250863106fdb87a4219c04807abdfc6d55dd787c865cad00cda58e178b2f88adae5c0bc56a97267016f18d552b177a81d76c2b1da7112500e0d819fc9901613a9a3221ccd9f537cba4687f2658a8cf797b7170f1456ad200994b2190ae1e3c4745d7303f1f3edf038f843d2e465aed4678c96040ea4abd00be590336045b7e95b7a330de74a64f93a1cacff47426f55b6b2ebf64dc0bf0005f30bb008b930cc5dc38226509c08ed12aebfc3f829458429c2dca69701d8600f4532f47e3fac3e831763f5d0cb425d4638b5d937f3f8ca0200854795cf3fb00b14cf7e56fd7448830d183ebc2c1126600282a09bdf80766b8513b2694d56d008f1f8930171c156fb88017dbbd7d48d209a8f874ee7d5beb486871304721ab0063b87abd2420c67df728cd853fdcce2faf2a1f800a324196d7666f9c1a81fd00103f6a005166559be231bc724614655ae52551623d396a0d42fdbdc7c2d1f00072f8ff737cf8e786ecf38d6a3bd27f17ce614933441989ef6183f13185ef0c00135d5a1ddd794cea168abefb6a4b2c671dc86d07dba9974f96d94ce64d17e50058c1f8ce27409a796bc4271c370ee86e103628914ff8f7816b4db0d9e28436008aede0aff06e541bbde0905c9a39caa1de83e3a6b8b03ca87a1b8d444a724100a04f2f6ffe2aa72335f43ee93324ca8225fc13b221777cb7d88fe07fdb206b0008eec1f73ec9d1d5febdabeb7d536ff488ca834e0989ef1f5e4a3abd551e50007c678ed24f055650cc67465b1ecc201158057063d31cf56ec8b3ee876049da00a31a8bf8b9f4d4110c2eb770a01ca305129cecf569f5d82de6b692976faedd00030865bbbe862d2ac1b0ef6c33797a11c2c4a72783bdc5d9717cb0c0abb88d0063d0fb3ba99c7a4ba5fc4046445320c76baeb7325d87451bc971ac67bf925e008dc9bed318ec9b8fc3fabf4f1277a398f5b9ab15d4ceee5fc03102e2c12a8e001721d114dacb20433f211ba24bc8c135807d8e4c0bcfb298bd987a6d34a2e100a8bf9258e4b1b39686f8cc0446a9ad8b94fcf1d0eb2fc8739f0a38886e7e10007d44b4b6b16d545f76919971573efe31667d027615a793407ee7c8f638d5830040fc7ced2958f52e561b6a7d9c43383ff7a59e5b5bc20a93280ea4ac94dcf8001fbf9e43f67c5139f6a614d9b73f4b11a7c5fe3967f512149517b76eb452f300e3939dea78ccea07686ba1b8bffd2590fb497a88493920c77024529ea12ab900e429c329f0306bb940ded261d3f03ee1210ebaeb99cda252ded021806a5c3d00693212aa70dcf6c9f126bebd6b28181491afccbe8c537885c6906729c3c31500447e9b3888e454a3138d0dae754c36a00b5752daa1d547f59d7dffa169b1c20089a753877d3a01c6cbec25c23bb050d4b193436d352a232125aaa2144f5df30026bd63c8ee674e57a9dd19e448559a8b5ef292d68158bfe874eca684bc960600e040a5dbffc0585e44c26d645dfbf1c8d77301fb5cab5188cb66ecd30a0ca50087339174c082058d458b5d1915268be634b0035998f70ddc5078e76be997160043260d52574a82b42737a8a3ec740c11bf6ca041379229c6ee1decd967aa7800aa9ee739cdbc3499e743151e18f58f118e91c54d2e2841117d0f10d8acd5e300c0cd5ceabd786a1e46446f90eeb5146b3d3af605973184a6d98ef5b469c17500dccec30425481f31912d423cb737b092c30d5ae84b447d07121021c482857e00d16a3cfe7ef388ae5da8bb97e6e631b077454f6f7f2c98009a55de4a2c07ab0024aba50d234116db82161046a09f1c5c755a04c96a13375dc72af311e51108001a342b1a1a5d6aa198908ef414e44293837275cf0c69af4fcf6091c3f57ff30091be30da2f30b25de8e95e276a98aca5b0bc2a01490154b20a79991f733dd50032982c2f54d5e388c0c3aa1b79d30a98895fa8a02932c2f146202dc35c52110070e6eef454c8ae8d665a17fb1e7dd9528051ed41c5bfafc4b1f6faf40069f50001d55918752424cb9135c48b37f4cff172e7cd38ccdd820a1b4a0dc17fac1c006dd472358cd093b0331492345b5ddf3fe1e7ca4274c4660327363414036ab200cf111cdd58ada41afa0644ab04d23468f8e1d9c82d02a2fb94a91314371b13002cdab57f2c33692bdfb57f5a5e97826452b7d7e68edf024be3bc7762ab862600fa29a93fd0a879ba4d903403430153f04f7a5ff11fd60eb7c9fd19e5c1346600d7391b00011ef891bfc36562f4ee23e0a81ce0129180e2fac6904ef347312d009b12b1884e5b9dfc096fe39a12921e2e47acb846cb96099378ea1cf57398050097ac7976b733dfe9a6913cf2fc546e9590180b81b526a589280ee317d500ab00a7cc0e90605b698a41a09c62959427ca9507995745ffa5dabd74761f30ef550020f605840f43d237ca03c4ef6d881a8dc25f4a6679f3b4110b33ca961183c6000884950d159d22d1d6f246c57f3b435c51727498eb4d7cec49ae35dd3bb4100010726009d100ca92280cd9aaac71d31c1f102fb12586a24b5cbccfaa75d4ad00d914e0c6cbfe5c18b674ef89cf1f9d6a94d98f39a6f7c347e44a18fb94f720003af5b61211e0adcdd751a22e4e1ddfc3795551872f9f3606acdb1b9ad51b3a00eddfdb381a5552625864a7c447987c3f0e4444fa712e3fc1f6244a2e7bfbd400b8c1aa20579bb040b36bcce7dd008dbd8634d66d7329b998b0c33aaf83c63000b55fcff9954aa96113f2435324403253e407c99b2fe20f8fe1dd30a39a85e2001e4039e1d497ebf780f66cedbaf33543b43360a3c3823531f0ea04b558ac6e0089b55e2037dcd1bbb303259f78950c490b5a9b6777aeb4c04851a11ecbafc800675322c70001597b5f028f87e805d2a65f2b1df1345759e23c8ff9dbc37e0100b73eaff5bc25b28ccbe37142a3e45098db65546543889e9f18e668312709fb002d1223f3fd2b4a058f144f66eb2759ab7d53fa659b3382cf1644c90974b71d003d68561e12f6b12a72aabaa124213345263f104476dda54bfe8b086c9070dc001b783cf56ce7a3376c2f75f2215eeb8b3bc3848fcb8babe8c6d29e20eff64000163dcdff2373df5bcb0df0defbf66c9356b3b57d599ea217ae0d2ce50a69040048675b942dc504806ddeaf8f2648ce7e2953cc3d37aca0b39753ef265787dc0079282ac0e2a2e51718f236b2b4df076055d6570741f0c40902714f9437dc3b00141aa1487e882d9b5d78c5f40997f3900737adb8dbfebdde034e108bbdf20b00fdb7527d31eb49301cc71200f3a82e1363bfb441f62d3400053ba66030eda70061d4f7f6fe42233bb01e1ac347ee29c47b97107497395789cf9cc0abdd19240036784ba6d76d9ecfb7f33a75a2db19748fd397d3385dadbbdf98f3a672b69c002a0c0744742cce804ede60afdef37efd2d15e0acb514f14088e682d289294b0084052c731e419f95f5680ba3e9d1df80dd60533d5229cf409056e21ae730fe0079754c741ce27a9593a0c8a5503d97c2c079eab083f9f8279e706a6878abfa003d9ef85d9c5b7ba2f9d7eeaa1220ee00b865f9f985f7f2b12090375f8d2517006520c739913997280dd252bbc3f98de3df06ea80e010b679678ee1e4d59bc100e3e20d1f614fdac10680bd4db6c117d1599b39f45a8a15328e9084c2c4374700568a39c4370ac320a8ad838cd027af47457e513a6f12bff7cec7c20aaf8c1700411cb66088ad1753389c57f2bafeb4481921a713280bdb75396f7fa1769476008e7b07c3847fc9dec601456a634639504f6d2ab6cb34737b80621d444c31cd0079f34ba4ec5875a998b8b1c40e72c83040fc9115f0dc6c46ca2eb17d863ce6004775045b9838a03d56b1c7089afa700e1dd7c3ab0cad8e2c5515740964e1eb0064e549bd94a4ead17824772d01a94e7900f1a91a58d0ca9cc842011f5645bd00f8e99a5aabc48f1a382afdff130b76ff436f2f894a053f26022d2944d549480067f397a45d4c0114bb3095f741da7bab8f0660632f2f60fa2b0270ab08df020031a45739648dfe50a6f2da81b22313db5d8c40e684fb51799cd1a16d2af64f00a417796ec884b059ffe4336e639ba8797f0a5db795fb5640b10459c66f4c0600b98c0256906edc90de72f9bb0c77b2c078a8b28dc337294acd050292ad4d4800dcda8d65cff58d9fb0db598ab90018483a464b74baf0817619f96d76b606ed003829ff7599748bc11011800bf8df16b6b01821fdd21589792f3ae1c494946600af17d45fe81c9970b99f016a8f34178fe1871d7db885ffb4433bc51503d060002d762fc2d5f662f2533acbfb0b2dbb4702641ddfec8e575267455c601b7ab900a85ba02d70c60962faba55e5bf27c1d5aa29bf829005dbd984534b6b47e42d0005ecc644c5abc060ba53202b5941943290eced18e69f4d15a2c84f7c8168e50009ec67c560011e925db2ee061d1c277054e4511ce5785f04e32c6abfb66a520066b83c1dd15a3ae067522fb191e698080b5808cc2a82daf9c49e2764498f74001079d9e117938b0bd2b3bf109462c63f5f00eef14f3af2fa23a3cc7ae8215c00a58e7f992355026b1074e892ecfe0c948a4d4bba669216dadbdfd46eb9814c0050102b63dc0cc275459b52b758eb83b6b749e415594bada0509a412fce20d900b8f326045edcb321a4d84d6e3e20cd1c58a76f925b511ff32e8b85a277dfa400da5bf79874e2e78c8013b4c29309a7b4da23131f561c168bddad75678d357d004f0445f150c8c6abaf7bc58767dcf4d79ca7040937c8a7d15fe17ae756960700b2cc0e400422a1ecc53987d266cf14219c1c009fa84de8c82ba17c5f09dd500021478c98fb29458ae8a97c2525e3387c8dc0ff51613e8cb7aae5ca0909228a002f0d2113d57a6d8d6a2d7d4d987d91c2a9fbd1cf4d5a1c7e381799acc5b5ab007dd11ae4d2173e1c52fb9f2493ded77859728914831830207149130f7bee100057a9537708d1148d03efb35f5c74bacec889c8327871d01476f4921e85e415001f7b5e9fbf34f4209e1ee1697b23cca171e379222052daee587d49e0ad64760013385e4135bf9c77142fb0e34ddbcc2a22096df773ebbc28eb1dc11b2fafc300a37c6449523ef6b24a34d63f80f56cca4464c84fe09eb2e17c81fb9cb06a3d001b8cc4ed57c997ca1acfcfdb39094ce6a21143e579690d9eb50f8b51a339d10028e19e39887fde0aa21f239872eaa0347fdf0041bec7a79b9b47c83c760afc001852bd7dbfce422c3862701a0d0a0b7ecd750a8653d8348fd50538df3299ad001cbdc7e21c36706f5681cfd272b75477ce416f06cd3ed10e2f3e81dcb5a9b500e1759ada191552e4bce948f8a91f7baa3da3d468f907700bde10c08b24afb400a18c3b787645ed768384b4efe3f27ca1e65432398fc1a94d1723aeee429d3d00417100485d78b22e4ebfb8e20ff749880ed5fc148e6010bc64c2d20c545519001aaaacfe8457924e2bf806c2f7818315e83c1a5a42e65a37b5a300c8050a4200a8594bd70ed26dd3e443bb4227d3e7429c80e591fcece9dcd5bb047922a6b3005f92e06b8e044064fda509ac5035d1194bdd63e8373d079d9396e90e687c29008f6f16f39287523964054cf6af946e48d9684cf9bdd28017d1623cf87ad2a70055102f9e5e6cdcfe3d94ad54e288e72bbcb3d3b509d15b323497b4fcf1cdb500116f20d0918aafcadf12160d35f5185924b65cfad41acb1a6981d192b74aeb0052b0bc8b37c8c05df317c8d76f2c9920d64fe19d8da9d40686635717da80610027f44ce3f3c0a67673abee98a22b5d2d85225690cda11ce7bc3588271ad06300712ab23286caff15e2f59c42a3d02a30588582376cbf050464be489cbe343f00eb97f540d4512b33f02f27aac34e20a0e5145efe950e254f963d5b01e65b3d00585ab3db673df635fca1281d7a827b26f2912b14c0c424243625af1cb17c590061dc7e8974e682b9493d0f0f4b1519b62d5cc06dc0fa5ca5641aaf8e4a374d00a5516134b9a33300af631937ba3a0be7db91ad0f8e8a92c0d654c6e8f43f34000c439284f3617af7a97289476709e225b07ed9918d3564b54928183bcf911800fbef88ecb8d49c3be3c95890a55eacc6335ef62d2663a896d95ea00ee8bab700f93106c9f354bed0fa0f3ccb00ed439f5ebcd74a11368b99aeb2896b662d550097860356e1f91445ba4bdeda895a66ee7b218561a77a20e28671c57dcd56b800311b7d00e8556059e05d961ebf1ffa3aae863f2015b1a1ad15b59e36f6f82b009f3901110dacb5e881d77e7bfbf84492cc5bcacc93c1811dad8a2d97a2d5df001a19715d25f2bc745e3402aa57307553e940e48c95451e5850ece5e0b625ea00d227e3a476ca13ea0f8bf151719b21259cb7407dc698dcae1d74ff8b0bdd2d001f1c6f7e070e63140484ac16f16a7b677332a2ac97d5932b7e3a79cc4785ee00263e22ec2fbf5578c4079c47bd087e9166845bad27510ffd8a7d29ad143c2a002ed8019f4317cfaf85831f3090c25ae473de793eabf4b5327454fe0f20e939005f1fc294f86802f48c2b388399d31e499adc5db0595e833a735f579fb9a39100db9fcaa412958c8311a74072197ddedccaacfa1abf1a9c470e76900b840c6f003f07aecb6c4231542d5f19076b7f2a9d1b1c72c938dfbc32a621d1ba85f1f4009d7dcf236c64356e3e83717146cd50e44a5e6c58c9dc25e2eacbab6b4613d5003b888b95b8ef5ba7336ddb9b7c811f1a5bd39e145cceed19f484d59fb37a5f00ee76e0c6f486d603f16d871744bdc1a922278b9790f6acf915d1dfe27cb97100836cca674da9165ecb586243e8cb3590f4b3ecb15ae5ecaff7faa8e5a729c4005f6d7b0b9d8cb69d1a6a27f56a140ff41b0a7e8fd3fd4a0f24f2bcf8ed6e0000b81a1f515fa75f27547f303b9c55c8593d86a5afafe00421a53c8b7cc408d8009286df2fcf0e1d1631ce25f76a7c8e3ef0e3bb8345c7c06e553f9f1c6e919000ce717ac36ba35328b27d7ae0c6f8c7a74369290078f55f8eefd1fe04970c0900ad8574f02a760a172ae44847b2727b42de9bd722cf5d2845dbb490d15e24b00009fa4894eca9b83024787bbbde593d2e158997c66e8f1106872bf192416189008dc6f2240d610f09ccd38d504dd40fe416cd220823b54e6a4953ec6f5d60f000ffc3ed6536ea8006a6f74369828c4115b0648edf0649cbbb9e43bda5ceac3b005429fec0d50a42a0007bb4cbbb85255ae3af3d42d66b4793ac734ba47fb73c006a3a8194e5c021002e1a4fe80efcebbf892acccbf2841be0cb1ef298586c70004c69708f25b8f991a2742ad9865c084d88bcc96157783a9bcf9a46c8055298007a407f37bd9964ee7c328d37af2cc001e250f4c10d551a6e7117f3bb43a7c000229c3b753b5cf42a8733afc03f0ee3041f197ff3b6726b73b38aede97c77b60012116ead60945375b33debd352d74a6452d58c0d9b6409037edc4e25dfe0970053775dd2243e34ba3b9f1c8e5cae50706a3eadda84f0175ae26d3c37ab71bb00433a12e9259d029140a40e5ab7381eea48694964fb515aa2dd34ea1634ee1b006881c8991b1b021a1b43c44ce24c3e4f6cf0e1b81b096b9db69a1d0657d229000d6f359ede4e17ccffcc61582d8df751c7c15d4f862353daee249384dfa2a200baa15c32c9fafd695a272f01a8ec63998451addee3a57a2f171e55d9cd1f0a00ebac1136304deaf3db76a3b5b5681d53853134a99d5fd8af9c4d54e7dec1d600b04ff90587371cc641c23c482474ff992bf8fb056dbdd9f35c3ce9d02b745700a6f4a13cd5c377f96bc27b6e404d10f5bce95670828f0d4f2450cc6715710700997db5f47727d997166d30f7747ea3537e366be228cf2140e7735305d26a1600dc09c7cbd5df6789de407583e3952032a0b0708dba5db62afcf1df5c88245b00010331da164a2e689427760957adeb5e27ec887956e7d15d39b5d1e37675e8000deed9b7be0a11c27a44648a076917822c7956a9c53be5838e8e808b8176c8009960a368475a9cbfd14814e75ea1d8171d013c2d96c4bed9a33e06ce1334010034d7450501d50aaa1c434ce050e363ec32c0bd8e01b1a016b9e497b676af07001cc81c8de37faac60c57b9a28297883844b68e36307dc985debc7830c9fde90028c307495f4c5b34dd2cc135df51ec73624d53b3eec8a16439116bf2145cdb00ae64aa63233d57f20608a42de9e7cc3a4b3629788a217cd2145d4bbd652d9000c7fc155103aced0db466a1756f8d314d49ab454c0df26d4a3dc631e4d3296100299a5a90940d7c38120dcb4d5db2b874b56001bdb66cebf303fefdc2f4ac71006eca9cff51e6544066f5d57f220cdd0976937f22505c54b9cbcab4b4c9c62900c0f51b476c2fcc72c07593036293c2b4e5f61b7e7e4f5b8be8562879ed285a005646483255053db9bad870a1c3865e9c8c01f6721b6926b649f95eea2fb75600d44692cc8542ffdf564aa56888412e4c05de476a885a72940a8c8f7bcb121700fa891087ff7250dbcb671b3fac9a8f133b1571c813aa9050b50b36115a15bf00e38b1b49de186e3669cb507998ff5e4f42705d5c4bff790ec0617515d4b0b100e8a1971b7a8b30eb742fa00ad2229036fe3776a4978e00346abb357c4fb4ae00bdf57232f036b042a638a8973373e5b1cc1ee9a5ef5e0589314a37334461d8003bd39d461579cd418643511ab6c0b99127921903860ecf84e16d95f0d579b300dd262deaef8b8e62739e1642bd4375d2e0139b72a7e58a693946e7a366ff74007769948ccc5033cf9a02cd471419fa0a688d328460f930326dbd85aa000a6e0058c5e384baec351783bc7ea046b2aa7bd942f1d3371a453359be1aee5bd84f00df7d13f0346a8f41502012427d3415e6e01a058f8bce28e52b87f52eb693d60020602b7bf423134b2613c8ed59bf4d69e489e2414811a8ce909295d69c1c8200524511038398a451bdbfb6512a03500d28df4edec50928250e108477d7d4b700430b8b9aae86ca4444fdd74d82d86b0d33e4a247b07b051b0151edcf604e97002afc27efd587a699da1d461bc585f5bb52f4ea327010f3f3e4d9e281330e1d00c9a939ce303954a6929be364faa1179fc949c18c248f9d8dda9d852969fbf600d980bf4341c552fe61b40fddc915bc7c735899281340c70c8f43a91e77571b00b18ecabf0d650c486da3409b2ac1d29fc8a5d45e51c7e404ce4110b5bd247d0036de2675d4bc5da1f207f938ea3cb817617680060ae731ce6435f069eb907b00d4ad8f98f78f0c1577ff6062a9774716fd788dc1b40f1860f11afbd43317b80042c95f6c8dbc4d2cbf6b90a3e62eb17ad9c966c6dcc8911e9a94f60876eb1b0045715f75f4792406c2b3acbf6dde7a607745ef34d6abcb310c6d3a14397ce100faf6969c0054fc56b63678b5e7a31ea267bd2e3c6b082fb795b50079346cd9000a5a8f95885efff9a636fc207c051c41bb5cad076914d8785a9e68b5bafc2a00bba91932803456c7f3bb28ac8fc1741f3c886d3f8d1da43fdf6aebe02f7bb9008974aa5f5eaa58ec34a83b891b9f31d1ec7fa7fc6db2238d8b895e28d195e500b5bb67df05d7d9921597fe30f3ba3fe920f853efcefe04463bcc3dc759a13d004980734eb5993f4b413b47581c31aa1887cd4f1a3de5bf75596947709636c400b651fa368db12de444cbc542df869d50e49cb70fd0cd9384cdef9cfa21bd0f0098aa90492fe1f0ea19258d5e74448a527e67dc9a96abbf9ab222191c48dc0c00ae056fc369beb267e30eecfd6dffe7de24f3af6e8e092742cb092be41f0bab008b0b889b50ba3c8c80b9f925d52feb6f48a5bc7aaef70cf590aa470e9728f800c38e10b037afb2201dab448c7c02134e71c92e6fa556184a44157ef8a6149300b6609df46f9a8425b132fb872ed1c287e982bca72771e828670758b196cf2300719b989cd32fa73eb8c5915994f5a6feb2a75bdf936b41b9f94850575a335300922a902ef34cc4382ebe87ac643d770777cd7db45d553baec3ae76c1238f6a000dd85c1d240e6d5ce90f30cbdc91378471f557d3d0da09fb4134447fe0f783008c2bb0b08f18de50d97d026eea1a5d3ec035a181b4a5e9d2e90d9fe28f76af00b9f29b1d48165d3f737136ca3dba37af885077a95ba526e552f5be64aa7aaf001a66c305fc2915c7b605c1b07d9636d80e5d1557cd68027e391d4c46176f3000cdaf3b241247976c620c79a68fd397a59726d663e5200f9303eadb8ee8152c00a17fa94bce607559436dcefb06a2a5e5e3c4eb9ac0d918ffbe32417d53beaa00960fbb1b19a5199d234f0b41baabcd713eafb61eb4f186ee25b96de5baf46f0041af41c576b1d4e8fa29be41b17e5785692cdcefeab6775b87b0f0a15c5f4800d5168a0deb7183e78e27822f7ec3d3d5a83f2583c17495cb38ce93780e866500b767545f3e55083d1e519604b4c3be80de6f0b0642102ea73a1032385503bd0045b48f2ee7aafab8e4ed25b62e628de4c376e56660462905fd3dd7cdf5ea55005ee19e7e5a2dcad04b15715fb435fb7591de5372db0038d57efc89667558b0000e71092f1d55c953c50c07266ec7e77675f08fc53daa7ff75c2eb17e18729b0014b588d07081213990c9d2d6568f748dbe0fda6cc450e5b65603b24237746c00d1441a575b4a63ca3d768dd0973496713ad76c83d7217ab90f72ece4e0eb3100e7819cec583f7ed6c1e5a7a6b451de3eff6b5dd3e1f3f3ff9edc9659f2109d000add3bb9229f21124284d43eb4b4d13e3fbd9526c3d3ff8ef3584681000f6b008fd651c2503f0379c1a87c8374f6a81c56831b2bf42aa70a83fb33db91f63f00f0b0d2d5da1e9492022b60687ef0f9c1c530dcfd1cf302d3a50da9860db4670008d58b4b8f9288149e4739b77cd0e1c14adbf2f7f5577d46278ca3679a8abf00abb9d2bc517e4f09af1e5808688d416d434e430e9aec59d2be10b51bb502830083a0af26800543a8152f14c8e42fe3ead147026f3e0804127df3c49db9a947004dfcf74645b0ff402c701301e2c9c672610609014193295767b1f2595898e700d140784fa4bf4bf5090f733d0003ea4c58129c2b46d756e0b2210bf19e975200c0be5f2882848c388fee6034796603456b4bde2d5b611acd0ec0e675dabdb90044ecb7c9d4dd06c516ac4d174c23e92ea30d230e85ec075c6808f22b3bbced00df7df084500acf6c63894d667696109b3fe6e0cc0066524476c125a90ce4ae004c78d96ec6d338d1b0b77803c29220f2702323e657da38257e1b2b2c194a67009fe0d5517475f5849f35debf9de464f5a5592b07fb74ad2d7f4dc37be3b18500db2289cf0a11b6227e1bf2dbdf24e193b3923f44f2ce3ae39ac9c1594ae33c00356b41f80bf158d5f6f821651280aedd40a8fa3dc2401298dc797d22b223b500955a3a0d2d796c6840d13dce8b32508e9ad1c25548b91202eb58f56a145d260014935ae124e20f5f2babd63a77d40e55ab14f514b216bb41161c94d1b072f0000f75ee23328ddd8ba305d971bc28e788b484c5db7be7d0eb2aaeaceb58de5b0061824ceeef42ad2830b6eff5e4ca3d267c374141382f12712393cbdc449c7f00b903995154d5313bb107d93c68a1a2dfee502157cead47e05849f91d85680400031ddf33591fc22b7045f9af4ebf5853b40034cf6082328e0b0c239cb347200032b85493901a46b6abffd06a271ce8169c26044666a02e71c702896e5f6f70009f38b49a8434aa3027fa196cfa87055d1da3ff087e10e0d40cd7c5180dc78d00d9d2d7b5c43c1dc2efde134e0e95126ec82ff2c27ea6a386731d800fa6bee300088154a05e9bf09cba9cb2c792aee9e946e190c5307547c278c19372ce3f18007494d741a661e6cafa3c6ea01db9b2fb859db114a68de8c3f896932c96b3b300853b77a9c96027486931a4ca833187e039d8ed48400732470f14b9368c183e00a79aeb528615d0959d8076c228384683b37b03ecf9971369a73ab8bd15843400a85f30048710278aacaa958616f173eeebcc848f72c53ed75096a0ed91322d00ede3a6b65ea72f23def1601dbb001b2560bd6aae050bcabd2e00ec2322ef46003ae63635d6c57172b15c0abd0be0fcf8056f7c5254d43d08485523ea378ce50043ef5a0e15d75fff512fa90da50910adf837f6d2a6fe77492f934b6bc7d58700a9131a37154cc38b4f56976bb62c802a66f046414db152bb5ac6c0c3ee32d800eab73bb8d12c848afc78fca4314cfadc7a7a2846898eb062b89b9dc859fae300c8ea8ad5883c81e071256ed847a3c172c2d38e8dbfce68ec11abd8701d6e2000c897dfeebbb971a0d3e240f64a12fa56474fe53c6a4528a8409d8a915d3d3a005998440c906f53b70a09e50ddfea6b33ada3bdb9285905743f75ac6feb0507001c0cfe3871e00028cd5de6c40b3c9905397a162450be8426fbbcd3e725548600144a42e9b4fb727897d6fbf404b59fc59641afed6af4ee0fd8b00e17604e2c005115595e71119afa1f339ff64e6d2cf3bea05325f6648e645a2dd8d4f51dd2001fec019309dd602d0e4784280b2198690a6fcbb4dc58834377e8b5dd26ba9f00d31cbb53a8715eeeba31fae12463656565a6dcf601197e262f4c823138daca00e3d3d8358e6f9c23a87740269f1ef10bf74345e53613ff30ea85e7b596ada60019a51dfbe9e32c1a41425b3425f9608e3d8782a41697cba023f20b51548458006ed49a7f178aeaa881cbf213c894f2bd3d44d2a73f704fedc613fccea7fe0700f3337f841bd8435483a6430292179438bdc9d1ccf1b3f16361ecacc2594ba600f6da31eb0a1e5efa58c9f150de82d745c09368919eecdde0a9b17fcf39a745002e486ecdaa3aa37abe922f9f9243f781734567f7ef80852a6440e2bb6c97d900d4bfa6cb9bbe071113b5559c7918d62dd0d75f3a25158e76afb6882f1b077c006ba4767e145a511576c4e910648c277ddeb7e7a432f3c74ed9d8c26ae04c1f00c05d10ca419191eddaf653f213e9ca040462ff90a5254c83c5a3730ee525bc000686812a1d90d13b9c595007aa023f3ca763d7e3d32d7bb5fe6617b3bad2510053d20d56e778416cd6415b1328fecebb5981d243c8086d415a42af2bd1d24f00713a59e86965236d42c3b15de217f201c8528c8cd614c86a2bbb096ddf838f00a38ef4292f8a0a1e5a139e1734f1222d36adbf5ddeec0decfc84dc19e6a8a800e177da70d81a4362ab9974a848a00b30b99d0cca1d5881a2747a4514f3d3ee00f665aca6babc17ea651bd4770960dc07a38f10735c92291029f4703ae99519000d3ceead856b45190b826c42c4ec8a92cccfd832ee3b29f3590e2307107918000944a416ed526b36956987f33bd2b10e5735829c0734828b976ca1ca49d0510045ea894e99c89a7ce6c53677078a6599a615c1c21124686b990b933efc798a0035d95604b2db01f758f5073043f3eedab884482f166561f816d3448fcea79f0042bdd81766f47025f517764717ef4629db6f342f52e3165c845b49c3e3726d0099c55613a2996e9a2ad886ef57f85dff073e1086c40f0f7725d6d611a488f60085e37d23fbbd36427c5f46d8608bac2070d1b22ccfada8fde2a13cbfdd03d80084de777f70237fc5df937d386db934bb75686e3b00545a6f264df8c2e6cd9400a7623ef4e008cb1b95c5606bd07c5621f5fdaa062d803e2bb1a9d80afa038b00e43ff8a7a96fdb6809587d26eefe16c1ebb36236ec224c95edfa980089a1df004697ac9ac1af19833136f97a0e40d7820050e4ac60e28d1bda2562484c8f6600d865538c440de9d40c00f91c2fadc61a830760ff94c92b5c32312d1b820e6b007ab999c72928c23e8bf188f237e1cd71aeb708454c90737afd0382cfe6cf7d006bfdb7b05d16bfc8446dd6617d0976544c237c67e6b27f383bd8a0495948bc002f3f3bb4bcf783579727ea03cb29977af82adc0b2f6575bef16b6a15e3f0af00d48c67a79ec1b4bcbde488e154b259d363e323cc5ef75483980322978e460e00315b698e903eda0299acb11184c0d764216fb5b9c608ee09b09c81eaedfab9002f5bdfd453a225e84573f9929a0981268b8c549c47ddfeecfdbd5c60cc8fbd004878ad948f2f565dcc6c5d6e555fc35517b611abc9ff60abac7ac3a1c5e82f0012293de6a20e2003635f16c57e2bfb5409ab19d0dbc868870a89179042af4000ad033f0a8d23587da94c91e37e3a02a8b65b2964e42e4dac1bd45c5cc21aa900f994d5675af2c31f7eeaec1701f26b25d2fcbd7f3310761e47c132d01cda0000bedb4efc27d84524aa29ec9e36606b621f41ca6ce69301a33fba1bc914cf6000780f5adcafda5f5cd23a42fa60edfc272e495d1fc53728714590f9f8b0e25500b67967a9cc1e0ef9924ba6b61a0ac885cfd307634bb5291a6dc4c239f5f6720083475cb8b248231f9c82edd4b593e59cf24f66a0a8dffb5b6f8e463bcfedcd0075c366895ef762d6e507a684524a2c83f06b0a995c06d02ed1e179fe3f693300dfd0895ce63f94837df54887f1f9cfaaa7874bff5fbaff36375076aa2a93270099b1989aed25e4128d9f80f67e4ac59bf895fc15300b46f3df5a710ecc0b0d00c605121ba47d5e9744dd7d1a7e86adac5c3b96b19caf917f36a8ac7368599d00d5bece11416021b8491c37eb4701e1f0e4b6ad71ceec63e041968e1fbcfb8e003a37882739f5d2a8a32ad400f6d7c574b937bcb2cec52e118c9204e931278f0038be8f9c0d2854dce0519560cc9728e06c886e4333656741afc49291b5efe500f5b0be83648c39fb5e4fb6d3cb6c0719fc50e6e72f2a9e0f5fdf40b199944600df49f19b139058f2540d7e51c71142019e396774d7d65b5d274afde8afafec008888111c3a211d5b85ec8b7aff40d8a7fdbd32747a4651e9273a5e95c8e340001df73bab7a9fdd156edb6d56fdaa552fe208ec64946f7c35d19e6955a1cfce0002c44ca41a978e09bd913f5f24e4f6e2924139d48e639e8939296706238c3a003730a53b9fd1c413922b907878f8e6675acb6c66a34cd1227fc113360f1c340067a302dc950f77dce972cb13ea7ee274896595ed8374e0d19188a16895194300baf5540a571e22a7cf8363f039fc995d01354313bfb262e57b3b3328ded8c60047a8fefa9adc422b927a6062484f69f59e86c246d4004704c366437190633c00b27df7fa3d9f98f0ae0ccc4e2fa989b46896761a7bd9f38639488368c6e718005cc935643e54c03c04cf72aceb745a5f230c1ab0241703f2a84afa83f9991d0033807dc34ece7254db9c805453208fef7e9da5e00486f53d7be85f39135b75005d739e10a80fab04bd3f5f44aa544bc3dae3440ddf20738ee07c6f6654448d00b501cae59ad6c3429ce3a9946045ea9b0c3813adb75fd0e7f46223df99c93f00cef045d2209abad24263982746fbb71997e5629cdb08c0a17596d139e28e6c0092374c8654e3ca59d943ec888f4ebc4b0e5945021a7ce280aebe626c0db9d100fb4eba7a78b6f847d5bb947b2a1b10ecfbac40c2f6fb4dbdc83e565fe0b2570099e12515579ebfa627a93bb2df1c6f455013e2b5e92758d4ee5e4e7bd6cb920020b8c4c5484abeea8a37ffe47708eb9f8c16d92327219a7219552c20e8364c0059173ad4dafce26d78a5bb1dba2ccf7e74f47ce74088d73493c1025b230f6e00b142059698b0ca8904f736194f5696dfb9baf0cf4f5ba7dd86370165631478002e9d0ef38b504d57ead915e180c43d8fc72f0c2be4d94606ac2d9b0b2c0842004941a114dcbcc7e99517c01535d9afeebe064cd0489f5086b4f60142e9e50c00a219b2609a696e5b06573cec131b2daac9b2b1d60f080f047c338e714df41f001efdb2d9de8d9dd3c59cdb5c9eabbffb7ee4076237d209e86e198f69128737000fa11bac77998836d93caf979370477807f065a137593a38f6805ca4858f9b00a3c870f2a852d7311571a97311d32a4caabbcb3144196ac8ba27355fc501680075c85c21191006e978dc8bba53c5e0545cbead477ec3da3e2689168a156c910075118d4931665cd7ff60f9be4c78249a47abdf114ddcddfc86807dba15c81a007bed7bd6927560397ce57038759fcf7ad091aea1a59d258900723c132343bf0044c6d6e2329f5af396f143251ea4c07e3f0594fba700875944d8b1bf48fd2700380aba28c67d9b2d0a93cce37cb9b676c5927cb6c55338ece2851dde7c4a9d00011f7516ff2104b8c24ed2d7d6b8bdd241ff309cbd9c2ec98940ee14965bc1004ff7a340fd01ec8b049df33905b183180211c104e7834c42719dbd78f9a706002ce7145075fb2211b3f8387e5a833d1bb0c405d3aba04cb49b4912869df1b400dfea55834d7bb38b3bbdffc307e314cbead4ed1bbfaf05ff10fbe331dede61001399ce222309e41c6ab24039a4f13eb301be86e81d5bf17de39a83569c44ad00e0af28f3838f9c7787624807f8a79659895f49d5dc38f659c2e0641da0af5200297704688fc0c625c2cf31fe4044c3f668a4217cce4813fc3abe74c406b9eb0025bc0cada1a152c43806b3540e33dd2d962c1ac349e7f4c3198574f2c120fd00694ce1b8b1abcd6bd782a2df8cfb559e34ccf800b466292d199316a00522a300dd8676a2e08d607c4587b3160802935f4c981ae98b1998c77154c50df69028006cb6628867dd6b59e89df4b52cf915a6c6be65adc848482ae26cb08837a41c00cc81b6fbfff882de3363a85d39b67e6440e6eb32672dccaae044628c5aa5e8004caba42d3cac4e879d4d9a2799bba8bdc766eaafdeff22a8adb7a967313801001e66a951251ff619b012a96b009c2b685962b9ea60763fabf5a32ca0954af900a9efb2df3effbbc62bc3ed2cbcbe5351ad0d1a08b35ecdbeabcd2f29bd7f48002d4eae7aaeaacc39fca099e6c18d13c79e01a3acfc617058563bd42880ff3800592ef1f2d9f5ccc81c467f171e9f1ddaaf3b4ce5b634d22a8e65044318d2fb004321518de446681ae3629808e83d1beb7ced2fabf2a85e0e4cf1355efc7a89004c38deb1692287ac23628fecbff257dfc65dd8eb3ed70904ba64db2bc8c2ad0052d14bc181f4822519e88b6711616e8cf9ba739095c04d925550b63b70a7ce0071dc1911b8685cb4c2b1e3e54ac37a4e5a3fef020f73eb76a01514f56fb1c200845df044c8bffcd05fa95183e07a0a420e6b2e9da8a332d9473bf98572e2fc00b8edc3605e95f12a8d7d229a540f3bdec931ec192af1f434053c302c491f8a002e8cae161d6d33e0b92ae05477dc8f4862a40da533c80ab8a9a3398c440b12008c9d7fed7ef0dfec83f2b1d86e9f7dcd8f48de61be2e28878851c63f82db530039a25bcee728e3a18a1a8368245550e28253861119aed1e3d62c438c67c06d00edfeee7c46721af245182ef6349e67427811213ee5171c770bc6ef47e0f649006571efdebad19d299a39a08593ef2f068c37187dbc0942bbc6ba50c5281ea2003e3920f8c1a52f76328e9aebbcb312452b0b5b871f7bdce31f4f7469560d0600337c076ffd88e71994e8023ba596396dc56f24bd5a4dcec8ad1d41bb47f25600586d5556d38a9fd5cea0a989a0eb5551ac632d02f71689e114e6b36c4c182d00ac9b2bdfc58c19d96b14630f59b103ff43a56b2e6b320da11ab2d48d1de6870024b94f8457e192fa76c55548f0e54f64080f8e13361927190594604ab0f92100b8ca5770670cf27598666d5d5608e01f8a08ddeb2fe4c9ce1eb93cb939aad600ae02ce2c92ad9bf2566052d361c6ed4c274592dc219aaa0579ceeda41e895c003a79cda3ea9f6d6748cc3818d0c1be2caacf8981873d3f3e69fa9c0328734c009c0a230def62856b655575f4cf88fecdad0b570533d41b3a32432facbd17b700c9e89ad3f3f0d990c55115cd9680041a6cf3ec6ab256fec5f689cf885e050a006d5f9fbf664e2d37827a6d7a6d1c35cb7a00387726558dd3f7275815bedbf200afbc3645b6f74da3a059705808c150a64e3dd9dd61c4a0d1019ec1f5f65b1c00338a5b1e16be3269256289ec1febc4731b85856a37eee68daa4406e5de658400bc08642653fff46312e166ad529c18f1824c312cafe3b918bc25259f207ec600ac3d53bf63474221a7d62a17c5015c73ff968b70b8d8def6ca40a7465654d300f9d355c37a2612bbf3d9cbf96b2e9e9b09a8936ba78a76571ad3b039d17d93003088203a039edd14db205e62f7f39b739a4aa0c258d287090222a74207d15700abca22be92ebbded29e51d35dbb0a94dd16724bac2ba49f889256fab7a3e6a00d51c3115ba091a1619c4358a0713fd2bdf33ae5425024f6194a82a110fc76c0017d608eadbb08430c6fc07e114197f519039b5b544abd862bff0e1ee37d7a300220c9472776950d433fb91274fab42e61f6077c53883d9bb060aa418e5b5c5005b76042420c333ab8204ad541f59da892b849d63f3fc08fb98ea2f0347c49e00255892e5fd5a1ae971c79a4f153065c7f721d7423ad10e3cf9110d3fddd1b200f9ef9b559d10bc59687cd63170f285a74a49753f8f7d7283da5dc0caa73b3300590b5636d81dfbc354c1d5307a003817231ec00a466c31bbb0a96f0a96f0b10076c6a777f04ad53ea73dc341e25133b3c279bfd98e73b152d011cd1ea9fcec00285aa5451b84578b7c8d7a3803589bf3155bdc347bc93d49ba1d657487bd0f003f7d3a5177b11a86ec1cfe15e71a5171d6f14060a91a04852a5804c5603d0d00c3f0f478231ca707d1c30dbb73c736be48583e56a894de899578b7c8cf7a8b00aeb345f36c0e975e1a1556bae912e6d2df93469aed30786e856335e602d89100369c85ef55b13545fd4ed7a85525e2f43995b0176cd3193e0263ac885a9ad600a5bfa5cd5a0b5991f13bf135dc474b892fc87849294600078ef797c72b9bb80001fa939848163c6b825e2b431a0e9b5a7645df8eef74b57c27573680266ffc00ac7bc804817e299814e8e06103a96cde4e240012b9ab88b9b511e48044970000c1ba97ae439ddd16b838ebe85cc2c81f95828572c68ae6b5938b58d2ed32fe0020332144b0ed946f8a970782a62a2d2d4bd8c1521ca8847ca71ec6829999d20010476e5105d87fe35b20294f4aa34d818fbc1686ec32712bfe7082cfbdfeb900592b42348a4484fac82c5880ba12f6ea24f2c102362d6e730ef5b9743a02b80078705f07b179cc92205b505055e1667e6ee3f3b4faf058f0e9e3b87695c35d006d60f2ba99a0bf40c26e25af553961b2c5a175fa4b7df5eb7f925d194f4191008c7cbade8eaeadaa68beba9dc6a8ae153a12b98548f6415bf512351ad9f16d00d054a772b8e87040439238da815cabb4789a3719743fe1ff0588397b7f4fcf00e7a809b50f9e849dd13768f3ce19a8000658d608b96a2e6dfe857dc985682500dc5703f92bdeeee302ab4095b210dbb1f83d38eca9e8ad7c7230521a46cff3006c719647f68adf17263c69c617eef2a8a0f939889474ca6236f17a5e26ad8b00492bda31c1fbecfdf18660b07eec2e6ea162468bc2303978906f35065e87e4009a8e5dfe3cd0dbf8256541070cec57b5f4ae756e7e8dd2ffc2ebdd26c53ea600a81876267284a76f4974a413a56bdefbb438b2e01a3f211d5eb145d39087ff006d62dacd5464b0907bd924520de43a444e1070dbf851fb76dad0346e2a45f9000624ebdd7debb60886a13939c5cbfe512e502fff9108eef57b2e6785fbd3a6009fe6d9696d79bdcbd00f113710a19a9e3cbf532b4d2cfa723f26fbf87f6a1c004c8e8c64ccea42eaaf2956953b796728645caabd6c7e0a6cc51565113c38d700eb0cb0d043ee1f51e150bb6a35b569829db347d40ae7a8f761dc7b530826f3007dedb5a3c2d072127a529fd72f51245ec957229105df93f0a5ff0e1e036445006d5287156a6e7f46637815e4ef9119f44f934e1364a4065ad808efe213113800a9eb74906b862e6bc0e59d6d2f3722c1bcd6c89340447383c9c6cae0f8d4ac000901fe0d17079cd9eae67ff507108cb523dd65fcf37e6ee08447b38542782e0086786039f926ffc4dd4d68f04e4656803c2dacee7e3d3ffac36778ab37b9310087fd7dd7c3c7da5bb621164d76e0e12b0316407ede28b10da8416413d502450032ea23af9ce30da08003e4d8d1839f16e64198d1adda53d4fc380d42c1776300fa61fd110579178c5f3ad4f460e04c77a7e3cfbe058264bb620cc96c71679600f4e8a6cba58bd7999f0ff42af8186fbb738e07d05806bdab37f365c3ba0c6a00f0091dac4df2c7e0e44731b07f30810483c67b1a44c0c8f1344c996584083f00c8bbb6aee0d609cf8710e9fb9b988ea137b29e3fccb233d924a4b2c89f81c8003a3a7164e9bcd798c4f202e45e88c6a3c7a2309d1f7214e8c95b6ea3db59ce004a70e06cb5d549b013b3d9fe68be1b87c05f6ab77aff4c749fea126c147d9800f0d99d10704a90834ffd743462d88f1e5296276266d572bcbcd53f9d0b1eac007044fadfaf61abf09cbef7a7ce3589f852c1bc4d57f4379664995c801ceda5001a9114f3c9e856be2603d127dae78755316c400c8748cab44f001d518a4ebe004168b5bb39c84be8cf2f70f88a67023babc4685eafe828280eb4acf538208d00c19d59b68b8117a5e3a689fcb4d39579ec3d6ea0da2e16bae8b032577084bc00a4f35ab03bddcd53f73b75a7b95e0f6ca351cf13fd0d5114f45fc6d4bc78e3007d28677b0472ff145b9842a03a731be049d589fb229a39658d8940d5e03c5f00564633e19bbcbeace1643bf155acbc9f6bc1ed0a02977464f39d7d80fc9c0f001f9e11921ab4630bf0466a6aa2c9b9bcaceff29fe978d8185ad7b742dafe9f00161ddf0aad6e842899242f98b28d892cdee9316d246a9dca5c0d8ebb0c26cc00b9c30e269401fb46fd2a802ada09bf45fb43e7227c34126427bafb44db68a400b62f4c2d91135352358459251b2c446c6662ade318d69216af927d94fff31000684f424a04f7aa7bffa33f963d04e6d7ddf25c42d9f39714e398bb1a403ea700100d8874760ba27380f187d824640d9b430d6596cc1db1eb97e886db7a2994007bc8014735dcec0c1c9df96871878ccfd639b8c3292b5edf3e80a8d067d966005f51496f04fb55d541542fe407b3b2e11ccca6af8f39886cd0d9918a0433ea00d99bc77e795fdfdfb07049e74b93291558f7bc7139e01682fa6ca3a2c96dbb00b508d9eeb6a03b8c1222a6e095a32cdd37ed3efbfce8f9b0ae1f96cfdd10b60093277e38d4404de887a177e31cb952216b9d008d284ca0f0bf98c374425ac6003acf5c9844786e51bf49c7ce2bab2690c62ae892e293e9c98b8cefed63b23200eecb6859d95cc71f56b040cba614ae6503ea8bd3680e96eaac566048405799005218b692b2c59a4ee507eb81562496a4e864fcb04d726fcdc9cbf02f2ac52800b607c3448056f37becec110ca845c4f99c16e6d2c8fb5625ae561fd846c4bd006c574b56c89aa16d3c110e11e3e032daf5f14aae685437f6b6334c59cba1d4003bb258dd301f95a4de65bc0e4f64f64a452a9e3e54be5288f5a7fc2723f6da009e53122606993c3c52edaa1be4a704ee68f441c498a94d39a3154f97c749b400980e648c45018d2f77fa7b12ab42577fc88adb81716224b649bc68b00f686f00da50de962cf186330d3d24ce6bd9581a393d06c360a3f2228c28a7cf976998006c3ba4273b75b8bb6a470d04dc42c4d56e3995ef78bce4225138bc3cdbec6c00204c4c87fce2ac44e46748f9cf45075bdb74b639bf7b896ae7d83bbffb80e1008de540a9a200b0baf29b0c2d44837db463a833dd261618cb0823a41235f60c0081c5b956c8d18893ea944a1e699e870003442427075bf1d384be89b9ef28ad00e557fcfdf7d771d6a3c937627a46d5e86b0ab8027e0033159230dc4d63501c0040890e293d92decb5b31f4210305a333e7a77682589a0c806647de2086a7ad003fbc08b16a7e926f1bcc7678f89daa5cea2610bc9831938500d711d9997f4300de071ec4e6ddcb3534d56a6e7667a849e4e2a81beb26d361eff5d7ed607802003c9d7eaab8791d6dfd846f06368dded6f71d3aacd6b6c13d717fabec448a54001d9e39bc03b0fcb355ffb30fa28b88d0a39f82fa6caa342f944a9722cc9352007eaaba5fe8805145be8d62e97f7d159b380aa55d1de1ed12a52ba084e73700002f03b63b8b19f2314d8e622b25625fbe71657972c1211b4d2135a1ae02b56a0090f19e143527d176f87934d41045cd77a1754ad9b0c08337235afb257d80bf000ec9edfb912d565858e1531e18b6a63589d86cbf20539a5da5cbd8c464a72500b4b054aa199425e0e37d9273ac842904be7d7f48273164ef164f9b762cf649005ed1d6143c9ccdfa08fb6eee6f47929c10e565b7fcdf560f130d0ea1af54ca00317b5aed8297470604837f1a50385cebb78fec98be921098f046067f665545008155226f0d1ed6e90837276849c5c18f73f133d839694396e44e3fa64eb7c00017e8f0ffc39081e25fa8531184bed947a2932cf971282f4ddf740540be8aaa00eddad4e4afde19e09abd94278f98decbea31f4401b3da4e93b9b36e28b547400d205820c70fc0436f4220034cf48eab04ee3d76d367248ad8651273978cf440091854b6fc0927312f3cdf977fc119e271791f0a8a649449ab7316d39fc259e008383f26a7dfe3e306d150efcf77b50f653d1662f4ef402a525469c2fb0a0fe00c6f72678f136315091186e6ff723209333f9c461cb637ec01b680a7a4ad5800007f8b509c6e57ab24e24887a4625b26a6224a6512ffe573e7ef281a422b831000869696afabc0ddd9cc9a81f2b1440fa97f0f7fed1e8b072d72f731dd76d09003d13f59a772dfb31ce96bfcf85873394dbc5945fbe1bb621a73add23c8df08006686406efc0451d46c0c2da5f1b96938f56474f8c2b5f627cc51fa8c1b938700583cde1a98a82cc9fa65905530c23f77d203c237a23dff2b9309ae74868ac100a32f63ea0e33712b148bd155cc9151ad498dba1423512589d020ed2e0b05c000e63396b237bff16aace840586721813b7300410a9eb2a6b83e2b33cd70f82000db076dac2bb3d4d32d4c15c9c243867ff04029bcf171def582fc424f89e62d00686d573a03ce0575d36cb906a0cf9958b87e9a52a1f3906fe84617ae99a641004dcf957af3f6e87128929c702fa5a07e89b5eff9b688a2867936b78cc80d440089a0d75985efe86632ae617ee17d70e99d6194bfbef398df814c7cd6af4dd500866a781ca2eacaad42d95651aef13d7425ac2315829155bbb331a91395d691001cc5aa1c10c61e1a6d8eb896bc88659881b221a89546e74e426b8642e2608100375ae982d597ab9f5e338b784d9b07b1ae3cbcf5ac7be04643dc45f4975f26006d615b9923e0158160c8e3ba3155c3e497675259c200b6ac920ad733ca8d2f0002b991739db93c0cbf88c041aa7ed6b667af46d096eecbbe6a57518ab0088f0006e1f123c2bae7ab79a39a20279bbecaed2913d646ba7db8f1d4c2859aa35d000acf770eecf71b985d34730be1368929a486818bac122c847d51ba40974db200c77eec30b18af1478abcd2af1a2dcc057ce285ba94f7daafd38bc83c72173900d8760902744cd872aab5b06500868ccb1744886d1dd44bd437fa7b9ac5181600b46f307930f9e305e5f163c0c35e6ee6bf9ea3bfbecb425d196367df4aab130095392f0021004d75c91136d87961fd7807757cc6f9e6fdbaafe2f77cf52be8007eb6bf497604ea571653811e34f366518b64b10ea2329dbbb1853c875c9d9f00a492810828b2d6affa556160045560e2fe2e4f5eaedc544b523fefa9b19bd10016afdfc08c88076e16c055e2de1a59c01f9dec378756903ff7fea99bf914de0047cf99e9312556422f9b93a650b5fcbf196a53d7df90ef011e241099b44c8e0065efff0d286cc94196c24272d509db97ae06e84645b3c6c23380125151263c0050d88fe5948f0d68a7b67af7a3de0c52083979be678e7f92eff752acb9b0190087d0b498b900db6aed7cdab7194073b843a8f6808d0115b32f856a6fd3943400266ebec9b594d483ab6d014f498625ef17b15efaae76cfd0397b3f7e1e83480077a09d9694e36503317ea36a51a206cce25b9f5a18fee9d424d3375f33e21a003ef50239e378c66167a7badb96dcd798d8ec3c49f1cb06f8db227e435157c600b939e5a50746338d3ba6bc8bb644ab0bddd5f4d6ca6be6bdc08a5ec24bf2e400aab5883a220a4bf88747a0bae047e068cbd8521514785cb62bcb22e66c62be004be3c47c16c28ce68e1ecafdb8b4b8c63b0ba946875b0c0e5ab37159ac1fae0079ee9c8ff5d70e9c227ffea089677f7e4058bfa763d0ca41b220ef5133d899009682771d8de4b153e047467ae06a8027752de4acca3fb2ed7296fefdbb3f0b0044a57dee75c3e8ed74407f57b15b18a393ad844434c5915c865b6b8be1bfc5001a0a4c1e49fd49cfe91c5806399c59256558d3573162498d9ef6a28498ff270012158f50590f0787f8e971d4e73b25e64ad32a6108efefeadd30efae8b36650006e21247913752f4ac0b70d8f5d7693ec15f3f3133d3c92ea80130557965a10092a7f028fa24bd05a4ce2a5ef890d4b43d02deb82064d230e484427ccf7c640045865d16073526bc8309fb8c7a4618aeca64114ec3cd65f64008b7f081150c001f962851b45e150e6a735adb4d8ba7fc98b2972032665fc2ea6317082bb0b8000df33d8ebe4c45a308c9d508f71191008421dbefb180c8ecc752be5fe75e6b001c51ac02bcc1b5c46ef708c784cd98c7f72d6bf3c47dbfe4df0573a1b71ce10028fd3124f0491bf150b725be5f466011378579291167a40ec9afd6ee18600b00f521cd798c7f92b2fe387daaf404ffc4cba05deea4f467fc2a0ce47bed280500cbf9f705ba5434d0d0497ff0d3c0e639dfafaf397dbffe692ee3cae34856d4008d7ef47d031818c031df8b9e146a93188f636ccd623d3aece5c76118cb443a00a2ab41a15b15e2134eba5803ee36bf1a9b8e9f52c890ca36d1ba8ae30f7c4500e94b38f6a7e7de140d2856e3ee39aa209f59323b7cb4b28a6fdb63ea476fc900f7b96a7418594ca44733c03a3377a46a8877bb124eb67b3e015b5d36921c750067ecd3f55546257dd5c3e8d51866f842d9f7d44b4f57bc4e17d3b7dcadcc6e00d18a32ee0a1c05a734432b034fc092a6f67fa3e2ba086d526169b9e803a09200576b50a17ba089dac61b04c47bd9ba60d015407a685f366c5d8b7fd380a03300eb293de36be843d2834d780cd8fdfad3edf8b985c157e61e166088678acda700eace21747f476ac187becbd5f7c4e7b1152a0fb8a1cc55cd2cddec645b6b01009de9c6f5ad0f6de8c375dd4bb6b1c854318e6c9c436598bf3653f93ae323d80036e8c62f65a4b99567d11d2804dfdf49874d6d18dc44056b6e503745d69dcc006a489e1184652f9abd1cacddb892582f55b8da6182be82e65470371c28e1620020c6d667aefe557100f5e6a812532540e23c7c5c0f8cb00345c09d07694853004303aa0593f68c0d86b512cd3f860ca9d28d292d88d7418e14c3b6d8fff2ad005c6dcac9f14dabed004772588c390357d639d2353d259f1a49242abef31f6600ad8a686dabf5ec2e4c27e77d9ba9d0873bb550294fdbf53637c28157d2e931007536f16a4c4476192b11ba1a1af4dc4823b26c06d60b1d23a0cc8a695b4b5500e46cb86e0f45f454ccaae6c73d70c655ccc4fb6126d113499a81c2719531bc004809a962af27a3383636da80942262fc074f97355facd5d69c7c1d854ee438005f67dcfe64bb48b1410cd685119f168b8c8459293841e86d63cf9d57145fd2005cbc7d6d1d69b75223f96eb9635ccb76190cf0ad76198d1bb287731cf7c19200a4362c3473f690eb9577117ad67742f32543da2fb28c29a231d80bb38c5e3d0078deb9a613e3e43f3b5ecbf97f249851a57e7a1a4be8c8e10b1875d16aa2f2004a6b1cf7fc94ba46e5ee5af8df909dfff32c4a29c63a0aec7c829873984ba300bdae3d2183ee962ba042a6cb8c06d13424f9c383bc1fc112d3a027b1b746c80070a9b7b8ed750ecf92d40546297806530edf779d592a81412ddc91aa7f9a33000707617833050110a0c9b65850956ab3d16a85707785926fbb6c75cc00a47500613c89fa27daaa2d6e702a345f18b6cddaf6c7b5b5705222eb7d89e3fa4b06002c1006e7ca81fc959f43ca09431785086238333b345aa354348732381e552b0050848fbf073e27a5f5e1052476f1a261f551131a9d1f09e270adc33a358142001043a31b2a3de3df9b6a8aa684d0ba0a90340aa00e632fe3d580c6d7e3afbf008efc37473566abd1aa2239f4f7311f0e107079046c6a767d19d428d53b10020002ef60a764372a316b0d37b923fbacbc233f1a757696c5d9919df02ec072db00b5fb147877a1b1dffb78ccfb3a79dbbc70fe53d2fc9c709c9a689529d9caad00ae61d4b0e48d7b61c8681dd3c91e853c334bf8fae0e31eaf51c5ee57403683009a4e954ac54ad2a5c7f6ee6538127ac6e38e23a3ed46c78093235a16b6cecd00908a81d1885eec0f825400ba43b1aebb8ff249c136ecf82a170dd5b770b6af002edb13b8cafe2aed724f83d4a034040e8b1ffd33fdbc97d36c7f47acf0e8c3003bb033be6c6395ee97d64340cd3ba0e0bcd33c332f973ab7c2e96cc520fa8700b5caf040f91ef0307ae468d14c30f8c62c85f2866b9961aa367e410d4d72280041fe908a3a4359c2df85b138bce4e5e90771648a8e5f3b7aa97fbc4c0f5b1b0043e148d4e31354da1c2283e21cbdabfa9972a4c2f5db7814f5443f488ac79b00d891cb1844c92d97347cb0414ccd6662f2d5293cc3749392a502b19a72c6d100023c1e39fbe12a249b971f5383417254b7138ab0d566ce8953d57fa90157be008e8ace200071f67e7a33c681e4bbe6ba49f63f0bca30d9e85e2cd97e1a3e07005e4a6986e83fddc11515d7ab63dc85c73bc41a17b8753b6f1d642cc54014e500c5052bd92d6a5cdacb5e05d9f625174432edcd9a17f35d3c31fa69e0a7e10600f6be17d0e9cec8a6ffdf03ca4a5adf2222af45a5f0b559b900f0c2a707f2d60078eea9aac1d64cc713ae1b54a8e3963a45e1b105f07c98586041506709ae180041ce63cee0dcf58df00d14f490856cf3163e6ce7efd6b31a914bedbe80d92800f7ad186bdcce2a0fe339c9a9d675486ffef76746b60eba39c95ec6cd7053cb0013a8bc20540cf484d080884a8a7d0f05756fbfe609f00a4b2a65419b8ef77500aed46af64179fbbcd692ecd3b40250aa214362ffb46a1b7c271676eff1e760005df18dcd7ba11a84c6faa48705c44385d91c56913927027b39a386819a80ed0024e25589b433156c1a3b42df3bcf98c9b1c952f9149ef009be1594248e278f0032c7678b90638bc7c365e8748d754b32579bcf2c337e5befef4f2f44615f03004b29d39947bbdb88e2c9364302128243a3ba6a8c39590f0bad3830a25ad01b00134fbf594266e56d3a5999170a63dcc99c4bcfe38c8c1e0e51959b565fae3e00d9abebca86c053f3acb0018bff8d27832063edf9181b1a8000b500d11b60d900b85b022b24c2fdfd540ee9d4d967ec73b168265ba40db24e608e8d7b8ec20a003fec60383dee41f47fdf4fa3aca808a367f627e93c9da420ed07b5d72696a60041d6850634456ff82e4f9465808f704f3e16381ce47e3faa47132dcbea951300d869c24bc84779a5ccc636bd258ab47a59db06ef8791920644da974a27a3c50049644c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "proofs": [ + "0xafd7bb2ffc73818ccd6b68ef61dbe3fc82f3ff76194ebbcfa7c186bb7c905853267900670bd88168cced1143d30f3fd3", + "0x9716b2ff49f294315ed92182c112efe6d55baa1e6d2947366ef97be5832913e7d5d850b04a97dcab8eb9984eb0f0a9bd", + "0xb34f9e8d76aa5595d18e01eb6b9619252ab087ed870e6d58f394c493417fad141e291c65199cbeb0907ab2c1222e6570", + "0xa99d52c88d3304eb21c333320efb5b33631b8694f8e0a5c8370ad8cc6485b5fdc1aeae36a83909bca0fae634214cda36", + "0xa1f83d0f4a6e4882d249dded41afe290bb8c6b67f06509713e1f370cf8c2bc5e37f2bcd06d7bb70465b1735389d47f4d", + "0x84b8d984c49d00f349d1c87b7e719a4c9a28a70816739352859a8428a00882e49da9fa255b7a6cc3f0c7fc9218867602", + "0x863e2a3cbd9660bc52d1c88d9fa29bde00688163090714da050daa44ac9af470fbd9f8637389d092bdc0e987433eac9f", + "0x8896e03c5a210f3eb32ce876c4f2413ec1e19761d73a86a23160631f185b44cd6bd9d8f76b354c692209eb192cbf5ab3", + "0xb33f5dd77acfce137c8cc64fde588063a1211202d0073c72a5714f1d8d005f52c19197af751f47e4fc0609bc64d6d44b", + "0xa87c71a2e197f09feb4c3a7cc4bc8fc3662f08801999242a3c99dc98f68fa3dea28baf5a1199b2b7ae2c2b489234a6a7", + "0xa0f0d760c5f3445e9e4fb435d6af5b1cfb54c3397866937086636e194fcf2a837b2bfd7d2c993e6a3b690681fb253415", + "0xaea2b3819cdccfd32a967f36fe88408ac3c143e5cfc4163999c019326d6dd37a4b90ed55b810585cea2a7716e0326966", + "0x8fe73bde494667789d00678f3e5d1629ca524708790bbff9981048c954604018f2bcb373947538e5213aa86d61ead371", + "0x8fac195f65249be6c6cc071ef8fe836b55d56cdf00e3560656be47312af887676c465b1d40268a77f133879728e2d176", + "0xa76e9dede97dc0b58ce4024e9e16279c4214be6820d018ac0950f6039c724acf6b3fc9e621db896d4127ebdb74632bab", + "0xb9b01734426c5e5a4fdaf3939eb7fda407b1308ab0fe8272165f5e07ae4efe52b18e92845fa764b9e8a1180ebbc0d41c", + "0x8d97fd966f512c45d6173eb3bec5a1bd77876f0e9c3f0c9555be22ae263518be95cdf65dde2703a82e685c6abc0b8f95", + "0x957c70f372985f466898ad406c0d5943c6ca475f9782763b37c0882a9b6c726c36fb6389d17e770156603c5e4156fb8f", + "0x8b561b5dab8ba2573a6a1bb5f65fa7c6890e30754a1d0113f995725110619f6455ad1cd190e8213916795647f1d6276c", + "0xa8d1c887b99f5992044c4865147471e1372556c5c0ba9077060d93f4968c0defd89db565925cecebe41793a6d715aea9", + "0x92c40e67040364ee458319770de55602a44d71dc4ab6dd49d470991ac58f6400e5722b8ef1e1da7fa05a5500e7352053", + "0xa0e56ab9e7ae829db96fcb6136efdc59aa64763d9ff222c9dafab6757d4412547b47ebdbc25e81bfdad71f7c162a5f52", + "0x86d16af20ad411a9ba01c2f42cb3f0e5045918c4601255f55bf3f4343e75e30e2eec0a9f031a171cbf98bbf49450dda5", + "0x8be6a691d1b39bfc15ea806b3b9ed88f78a2f744c56fc698ad187aaa6da0d396334167eb0f6efbf5f3df0ebc7b858b11", + "0x92ac07c9d29e8a604feb60be43bc069b4483bb2e80c04173f1fa0fec075da7adbb58dea60e84d80008a318abc9964a7d", + "0x843ef13ed9a186f65640d74f422df7f61a8e166cf7767bf8a5b132056475906de9f50e1c14284b687dba552050026329", + "0xac270a498918789f62185be014d276f921a514b32e6c6f54ece007dea0e53dd8bb7da5dbe8ab89e4c362263d438e5a85", + "0x8bb5f61744b138a52d39e424933d31aa96bc8c3b62fb972db172699fc51c27bdb8c81ec31b83235b39f4ad6d916bf4c1", + "0x8b320c25d5ab93879790b0ba7072f65a58ca62ddff905ef450ea9cb02ab169d0404660ada646eff477f457316c1e4c88", + "0x846e9e0f41719cf43e27550f0c3b4f7ad6aa7515b9e86260e0f5eaecd1c0081397c2561658dacdfa01a61941ac11f6b0", + "0xa8eef48852d5088e69962fc10c5a3f4634c6bc5a74f1851bf1e7ed22b25bc8e0576f7afa946eb06d249824940dd3e6e9", + "0x8ab0ca9dc65a92b3c82f96fd87f07fe3297a1e9281c3ea34d81d14e548ffdd398d47cff47c53697eea07b7bce1e247dc", + "0x8a10ec28af66f8cb151242f111d7e280ab45e92470dfd64d97d09aa5e132ffcff700a4d518a1a6a353cb892df8ccd63b", + "0x9229563f3bb2a8855f43b3557076e4a14762bc3b15542afb363346a63870b0caf7f16ff08568e01b41d498ca104e8216", + "0xb18fe6f4da5d19ce2e2394179d4e830d7315bdcfb8f4f62ada66d4493dc7070572a25895f93e22c48e4d64efeedc7cbf", + "0xa4e73c485e89ebe9bc848fceb3fcfae455c911d9abf3bc30d860840a29eaa8c6d660dbd0ac95828d38716a25823aea47", + "0xa4316b3554a60b9dde1deaf5e1d216fe0591665e99fe106570529bdc26af58fe3be3955c5246359917a65b33b12281c7", + "0xb0c41013dbfca25f913fb6ef0c23fd64bdc0ebac6b49da68411d0ba1bc60d98d49705d76a54122f589004bc501202193", + "0xa7205d1e5c25833e9f39467ba6d4185708f586828562140986e94c120e4cceb4d80a4f0bbe6a8a9a8631395a5efe5a77", + "0x87f014cbd598d6d6db03ff0faaece47d568d5d260b8a4d1a68b13712061fa052bce2c90a17f5749c2bf7f1cb3f8654c8", + "0x8ec95b01d883c88b5a21b2424dc4e34711d4ef3476b85b6b5a516cb7ad070ae4aea5389e70078574b1075780080f61bf", + "0xb5cb535def5b314aa973f87f4fcd5af3d985baf2dd9624eea765091dedb074c9a92cd9c57f6b4c800de346103c3f8f52", + "0xaea8e14c75bf9f0f0de40f2ba2da5e6c0211b2ae080679b5ac0960d829626d31e10586907d3dbf37c785dac122ca6899", + "0xac89e50a15ff90aee44e9773b7ab24edb1349ddb7e3587b31d09f3d3c7163c055a49151f0a4140a9c1af109ff267d2bc", + "0x804de967e9b43e215816efea2d5d8ed8890368e64c7730aed9b45ea8d7cc314d142703c34134d66985d8d1d75132b5a5", + "0xb29da9a7a9085de51586e1526eaa11479a2644b5efb5ffb9eb155dcadd23d7215a38ef578dc16ff5267123dfb6a7d84f", + "0xb9786fd318b13960e66a4441be4d34ccce37bd2e41b488bdd15bf300d1fd4f3672ec6191e956955b9482f9fb2b6c82a4", + "0xb5ca663b16bdec75fdc21bd8d5d33abdbd8ad8dbffbe2748ab7f527271716abe6eb1d43ea89c80401008fafd723212b9", + "0xb9ad11c77e162da5864f0c9d1b08d4d51ab25b86ae00d013d392a66c46dd6ec35bbbc42845afbcf4de0f43bedccfa3ea", + "0xa85f6b771de64e9afba39c6ead82fd70edea9cc4f4390d42246c6d03fb35689791284a4f2cbfa3439c0113b7ccc5ef59", + "0x910a11d65397f515ec43474a280cf91505a7447039726d378a99cdb3345edc92421fb873674f45ace9a8e80bea4c6bef", + "0xb6d51420e9c60bfafb3f653ccdbe208bc70bd0b1d5c93f3e85488ea1d69c1b28aa8048511d879a69da0de5b2b33baca5", + "0x98772a5933a59277d05aa897130da7d84d99ed6806844a18dc99fc6ea8cccbad8dd26a5f448974d9369d7b875c346b27", + "0x94e6761ede86cd952d4ddd9f2c1217238e859754b83f78f26d9635602a9ea917dbb0d3c74a3ebe8c4909d9c66c413de6", + "0x8f8b2915f6a93adbf3af8b78b39a72ff87800ee1ccdff61ce7d314e6f7805a0ec6c32ab30d2d3644ee1eb9164225a175", + "0xadee109cdc5857caa08ee483b1082c6ce7f53ff48e9f372c3c229de46e0502bbb3e9d98183b219d88eb7d4c5bda8a061", + "0x95d8a3a967124a139d3776bb2de73db7e62180d5d0c2ce986115a4b2a414f6797104522dfaa38280c5ce02275cff13ca", + "0x88d59c904dd00d90eb191e710798e3f2bcab410d676a841734acca3fde952baf99b4d9ba488a76e9ff96145f875789ca", + "0x8a12d885054e2cab1d3c11d68900376b3f23ec01944a1b43992e17423725a1b83b63c0ef1c010cda3677e99bbce64ff1", + "0xb43bffe15c30e64a1563fa064f4812dbde549373f96841ae1dc4c581f1eeb1b699954b8c41fbb1e78b8ed07e22f851f5", + "0x87597a0b80bbb6219f24c45eff698651fa5703ae3e7fdcefd8f65d48fbffa874087fac3a40267e06bbde07771feabf67", + "0xa4bf57e18ad9e92a9054d6a3320c3baf7141d2ed6c12b4a45dc40641e506b892f54d8dffbb1f7433ac0882c42045014a", + "0x971cbb5b82dbbde433d9e1e057706b7de60dc535a6d1cb7f1a4d31c77b3026c68fc406d0c171f3165a0bf01e301218b8", + "0xb95905c5f1c69b97cde45be94f80417ef5ffc0bc12236a7c36b3f458344d33b91ea7f8af1de7d8c607083b11b6c380ba", + "0x818483dbda760deda57a1621df8ae858f8e7b61fc274f14f2341b73de5bf1ac359816d5d8ca4527cda8ad4aad5aa97ce", + "0xb3292b81b3cfcf6169085b2c9bf4d7feef238df950bceb6e396257a4bc109f37534f2c112a6dfac2a8302c595a36f118", + "0xab278c18934ba98a1df02b50bad89db3918fc7b9803d7fa8c03141d4e5aff1e116bc37b6128a4a2f5ff6747c77ee14be", + "0xb83fc2b2fea3d122c9b51ab4c28888ff885535bf8e5dedf3bce29954284b1bd8cd5e6ce51fffec3b1fae7145f50dd214", + "0x8944028494f5a4fd1aa94c6a88d20d935eddc53d566da4664faf4df28c7b6908f5d487513731ccba03fdea9b82535e93", + "0xab9b543dc98eebb9f17c54e8ebd04e7235b88619968cdc51581f84a5061773001ee3f0287d6a43056997a25f9f78cb26", + "0x88cd717c6aa33781eb5d67766bfed5a99632c0460987f21274bbd82128de6de86f4ef54acce2f01e665a227f47c5140e", + "0x983f6696624757dc05e9262c89e50d06149bd016df813a884bda7af80a64bd43c7921d95f0056d5070233e6cffd2629c", + "0x8977ec67511d95c13c9c08f448c52284b69da103b92a0e7a4a00885ce5d6a9f98e65fe1fca0a9377f64f955160797cc7", + "0x82d3654892d946b15384d79ee849b924b5d28a662e53a94834d4d17246334decc43dbf05b7ffddce29a49f96c9f6db03", + "0x875bcde8fcfa26c73f49f133f52733ef784b810b1be3085b9cfd639b4130c8cc5ccdd7faa43ea9f67c37236733915b34", + "0xa66a32c9d5960b10f0f0e7b88be18cd43f8a251e48b9d080354d2d1cb7bba10cc765c55181ebe07c31179573ec3a3601", + "0x958d111604b5085e8462c4e44fcfb07b46eb5e0a74d0bd3cbf3443ea13df66d040b4995ac6129fd26f7d5e2736fb61b2", + "0x921e8fab1e73b7a5de5bc24ac8eb7acf5cd2ad85f3a4bea10c0e1a744a0eb1765ef5a91f03e77309e008e4763c986b81", + "0xa1c6005bd4c578b6d2507d6585ae4dfc2af2d2431d602b276584227e340f54490e6223434b1f63668cc663f92cce2b59", + "0xaa2ff138accd9a7d4df354502b753d87d7de51d605d3628d4f93606da8b091ff7a2b6b158617edf13a3e44efbf1e43cc", + "0xa5c6cdd60b932465711065e531f1e23f2b61358c4ae20718fe3a3e2624fb10817e1af91ac2f21e48d140a1addd81009d", + "0x9945cb56fb2679b3a4f32aa62b40abf1a3d63c55feede58c93dbe37a30589e28b7da0a8c2ee8dc6529d3577ba8bbdad5", + "0xa73a981e5e8316cefb450f803114ec7a4785cc34a0aa5979ee2357e3ebef23f7f54c86481700a59101f33e4e10a21f94", + "0x89a844079cc1b0b2cf0839a66bbb0dc0236f48e434dee1348aef249284c581c952c6d28d9c7904901161e013053507c0", + "0xa0bc264fdf198db6155e946bf7604b20f4d6861eeba389d6772c2af0b7fbfbbd1ca7f80b1bcc355bc6925f3d0b76fa6d", + "0xadbed4c4291de8b27d785dc4155a8e7064f0161737fbaa1d1124b6bd4c1cb5354a9fadb7d662efdee2889423d9e58092", + "0x98caadd58e1e2d5e93166277e50bb8bed7113f38b0f893147b91d52626ed4351834c1bc62c9a5fa8a4bfac52df2306d6", + "0xa1129db64f0cf63452bf41398a6b43c4bcc419cada3330a3528d3dbf07e589aa033fcf2aa3a22f30b48a1c990ccba3ff", + "0x83ed245a461769cf7d8174bbf4f5243285fbcd6b6dbda80ceeb1a7a01ea65694b2b5493d83aa1e2d9deb35819d21f3eb", + "0x8eedbc1cf8e895510fa11855cca6c0756dea7d5efb1c62cd9f080a5bebdb605d7d7d2a9be5dbb4493b960fd4885a0592", + "0xa111da6db2b5a1c17cf532bff3e8931575fa16e096b63152ae34593ee91ccf12df53371ce53c7993a42b12c7cd1bd322", + "0x895cf78c44f73c00a621dc696832a29959fca181b688db75eadf0e8111e97d31d981d0458237a34137f97b77bc621e3d", + "0x8fec3f8887df7890cc662f81e55d4201f1f146fcb1625bababff50fb9de805d3fbbe5dacd37a77bd06f300fe49f47155", + "0xa3269837c3b03c8a9390eb75b4ff23540e0cfd3afcaad9dd58a6bcf4d2bef9ad91ea9c9d08103f124b34871d7880f829", + "0xb2ebb0bb4f270561bc8b3baceb1df51d58eaa65c4c7adbf9741ede2b8a498dfe4e2254763da5b468dd23a2e90efcbd53", + "0xaee2fa532dd54e4eb09ef3efaac308dbb5df58dbd54ab2fb573a4298ee1c71d6f21dd8fc813d0e0d04a840c8f44d99e0", + "0x83665c9e1dced435256f3c55105502933d53713af292473e6154a21c1181a78a119a3da2bdd714908dcdbf856de957c0", + "0xb0b3da192a3880242075ff441f526e432f341f3b487aa461b0e2ef92a2c7c9bd57f338e15b55060467342e9323266510", + "0x8c9d7ea1f3b2b0a5a803f23001b2733e1a01ec2c4190db393c1a60482fd055cf1d6412da2088820cc928118e9b0b5756", + "0x951834b87d462b066a8c74b4e34c30c100b34aca89475b49603624305d9df3ebb50874759b9202b6510074894efb26e7", + "0x98588272e9b1b17bd9179d4c09de625e73b1edd557a625aadbe7ac631c552998e0470e43dd29898141d5b10c2be18695", + "0x86b763f749e1ccfaae1290204a38becdf64ac1901a61746cd4f90e5cbb17f8c894616b8fd5b1835872938886e4e43deb", + "0xa4c42848df2ce38d5490ad41e1d40735cf2e3d70af165c7a492e5e99890b3a1a5b9e26062ea5600193250bb24c87463a", + "0xa32d351c62c6ef77f9a50cf530e60f771c40201a194ecee07c03192a3140fc25bf4cebf79bc9212ca8e456dd567c3116", + "0xa632a9ec7c8ee0b7df2c0b1bd9b1c2fc40369cf82aa9743796d96b778e256c0c7ab3d206a99d0d8ee593f16633d086c0", + "0xab823943b967a188991bb235192bd046334acf47dbfe66afe9197eb78c4f6bbb66ee171d2ddcd0d4ddf1134fcbd7dcb2", + "0x95956c3386f1e6596dd8fb04ea6a31834ad3462ad2285a2780d6062b3737307ed44d869df16d6d9e5a8cdd0cdafbf247", + "0x8908680bf59c51de68281fa51e968baa8c92de5f9d7c1e634a9d018976cc3e1232833c42f8ebd5dc65bd17962ce00779", + "0xa727231d2f48ecebea7cc7265195eee96a0a9cb611b08e24e6a0b7d259b583dee1811af8cc77e868208cac84f3cdf373", + "0xabdd1bb4f75201b1cd3267b4f6674cdb35ec016003cacca75e1f4ddf7b528dc0bfc82c28a548aaac1d65aa4af153ab97", + "0xab3f9c629cd56e3bf7f836f0647ab569f58597cf4feef22201033e54b4b6039fa49bc347918e799163520972af269652", + "0xa30abed8814bd6de9926af713800a51f3aa0cc20d4e61d6f12f7983861b63ff7316343ed9686ea846fd1128642b42125", + "0x8bad73c9a93e3f113fcdc5d64dedc0c7df61fc9c825e2b11ea0569743d9e273ef344209bc95aeacf6529108dc713eda5", + "0x80a96308f740b9e968925368df37a34ff953cf8b66f6a5a381eb83570da0a1ab7bbabf10388283c7cb0e662a9da65b40", + "0x833e7960579a0b64426a06e7e388b55d00764896839205d29f15323e95ad660da48958300de81b7a7fae3e3054c2a4e7", + "0x90ad7ee2e3afc44c99ba3ff4de31693f558500346936d4576c60cada686bbe7672ee92d04d31cbaba3bd0539ac160ade", + "0xaebe1b1019490d5607e8b9ccd8e944b461b91a20c717b3f45bf26c5bf243159f79930b32a01c24b7ae9ec931b8d540a2", + "0x87ac84e9a220209e78a9c0239b212539109ab10907f9bef321aaf2c365fb6f03c1cf3a34541d29efe4a6ed4ee1708341", + "0x89bdb72b0b7813cd22fd332cb8a3a5f71e1a932e1dd3a976b49b794892d51c9b7bc06e6a9fc3e48860a0c6fdee11c1e7", + "0x98050a202101049bc67e6e974b95b671c0e4ef7ff4fdec8d7adf5b6de54b61067fc0bcb75f198bece141fcc031f6ed15", + "0x81b39391eb48f1f93ff7cda1062d1a6a9d3af3bc7c8f1fcfc85e722939a65f011515fe31a5ae11c1e3ca42a21a244944", + "0xb03fa558abb13744b3cfda5ffb73c0fad504169623c9e5aaa08e640c2387fdc5c14fd119795f219c7e88b550b634bc44", + "0x848f092626d1e172247abb2a327a5b255843fcc30185b1e2a5bbbeddd10d9f39471ebec7f9cdd83a7debc0829bd8d886", + "0xa04a2a78564303209b24bdb7d0092f25347371415367352a598847808587279e05c142d5a2b1d0f63ec55b31567272dd", + "0x838a34a61d303b182bb3326a3def26f5a8367763ad8f2b4ae89cc9c52664a68a308e2c3f73b68de6aa0a339d9534ff10", + "0x95535b7d27f025e0ba7f61a063f81bcbd36f1f592a50e57e4a28e22c59587a49e9ce482df3c2a39c8f2e5968c7d1b256", + "0x80734fc946e2013ea7ba32e0d776d9f00cc190a439ab0aa50cfc890e955fe6117ac8e082aefd15303c73446987093958", + "0xa96220043d3bb8d19e992ff27b49bea942c3e348d63c03e17ec8cf01af36f95a1eeb32ae1cb9e50d2939d69b83ec2292" + ] + } + , + null + ] + }, + "statusCode": 200 +} \ No newline at end of file diff --git a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/osaka/test-cases/22_osaka_getBlobsV3_missing_all.json b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/osaka/test-cases/22_osaka_getBlobsV3_missing_all.json new file mode 100644 index 00000000000..f0472e0667b --- /dev/null +++ b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/osaka/test-cases/22_osaka_getBlobsV3_missing_all.json @@ -0,0 +1,22 @@ +{ + "request": { + "jsonrpc": "2.0", + "method": "engine_getBlobsV3", + "params": [ + [ + "0x01c4cb8adb8a6f2830dc923dfe047de2abf7b666cc731d2a8d602a850422dd9b", + "0x01c4cb8adb8a6f2830dc923dfe047de2abf7b666cc731d2a8d602a850422dd9c" + ] + ], + "id": 69 + }, + "response": { + "jsonrpc": "2.0", + "id": 69, + "result": [ + null, + null + ] + }, + "statusCode": 200 +} \ No newline at end of file diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/RpcMethod.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/RpcMethod.java index 439e332ad08..c206fd4ed7a 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/RpcMethod.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/RpcMethod.java @@ -54,6 +54,7 @@ public enum RpcMethod { DEBUG_GET_RAW_TRANSACTION("debug_getRawTransaction"), ENGINE_GET_BLOBS_V1("engine_getBlobsV1"), ENGINE_GET_BLOBS_V2("engine_getBlobsV2"), + ENGINE_GET_BLOBS_V3("engine_getBlobsV3"), ENGINE_GET_PAYLOAD_V1("engine_getPayloadV1"), ENGINE_GET_PAYLOAD_V2("engine_getPayloadV2"), ENGINE_GET_PAYLOAD_V3("engine_getPayloadV3"), diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetBlobsV3.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetBlobsV3.java new file mode 100644 index 00000000000..dd0cdc82a44 --- /dev/null +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetBlobsV3.java @@ -0,0 +1,200 @@ +/* + * Copyright contributors to Besu. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine; + +import static org.hyperledger.besu.datatypes.HardforkId.MainnetHardforkId.OSAKA; + +import org.hyperledger.besu.datatypes.BlobType; +import org.hyperledger.besu.datatypes.VersionedHash; +import org.hyperledger.besu.ethereum.ProtocolContext; +import org.hyperledger.besu.ethereum.api.jsonrpc.RpcMethod; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.exception.InvalidJsonRpcParameters; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.ExecutionEngineJsonRpcMethod; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.JsonRpcParameter; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcErrorResponse; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponse; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.RpcErrorType; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.BlobAndProofV2; +import org.hyperledger.besu.ethereum.core.kzg.BlobProofBundle; +import org.hyperledger.besu.ethereum.eth.transactions.TransactionPool; +import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; +import org.hyperledger.besu.ethereum.mainnet.ValidationResult; +import org.hyperledger.besu.metrics.BesuMetricCategory; +import org.hyperledger.besu.plugin.services.MetricsSystem; +import org.hyperledger.besu.plugin.services.metrics.Counter; +import org.hyperledger.besu.util.HexUtils; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import javax.annotation.Nullable; + +import io.vertx.core.Vertx; +import jakarta.validation.constraints.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Implementation of engine_getBlobsV3 API method. + * + *

This method combines the partial response capability of V1 with the blob type support and + * result format of V2. It returns an array matching the input order, with null entries for missing + * or unsupported blobs, and supports KZG_CELL_PROOFS blob types introduced in Osaka. + * + *

Specification: + * + *

+ */ +public class EngineGetBlobsV3 extends ExecutionEngineJsonRpcMethod { + private static final Logger LOG = LoggerFactory.getLogger(EngineGetBlobsV3.class); + public static final int REQUEST_MAX_VERSIONED_HASHES = 128; + + private final TransactionPool transactionPool; + private final Counter requestedCounter; + private final Counter availableCounter; + private final Counter partialResponseCounter; + private final Counter fullResponseCounter; + private final Optional osakaMilestone; + + public EngineGetBlobsV3( + final Vertx vertx, + final ProtocolContext protocolContext, + final ProtocolSchedule protocolSchedule, + final EngineCallListener engineCallListener, + final TransactionPool transactionPool, + final MetricsSystem metricsSystem) { + super(vertx, protocolSchedule, protocolContext, engineCallListener); + this.transactionPool = transactionPool; + // create counters + this.requestedCounter = + metricsSystem.createCounter( + BesuMetricCategory.RPC, + "execution_engine_getblobs_v3_requested_total", + "Number of blobs requested via engine_getBlobsV3"); + this.availableCounter = + metricsSystem.createCounter( + BesuMetricCategory.RPC, + "execution_engine_getblobs_v3_available_total", + "Number of blobs requested via engine_getBlobsV3 that are present in the blob pool"); + this.partialResponseCounter = + metricsSystem.createCounter( + BesuMetricCategory.RPC, + "execution_engine_getblobs_v3_partial_total", + "Number of calls to engine_getBlobsV3 that returned partial responses"); + this.fullResponseCounter = + metricsSystem.createCounter( + BesuMetricCategory.RPC, + "execution_engine_getblobs_v3_full_total", + "Number of calls to engine_getBlobsV3 that returned complete responses"); + this.osakaMilestone = protocolSchedule.milestoneFor(OSAKA); + } + + @Override + public String getName() { + return RpcMethod.ENGINE_GET_BLOBS_V3.getMethodName(); + } + + @Override + public JsonRpcResponse syncResponse(final JsonRpcRequestContext requestContext) { + final VersionedHash[] versionedHashes = extractVersionedHashes(requestContext); + if (versionedHashes.length > REQUEST_MAX_VERSIONED_HASHES) { + return new JsonRpcErrorResponse( + requestContext.getRequest().getId(), + RpcErrorType.INVALID_ENGINE_GET_BLOBS_TOO_LARGE_REQUEST); + } + if (mergeContext.get().isSyncing()) { + return new JsonRpcSuccessResponse(requestContext.getRequest().getId(), null); + } + long timestamp = protocolContext.getBlockchain().getChainHeadHeader().getTimestamp(); + ValidationResult forkValidationResult = validateForkSupported(timestamp); + if (!forkValidationResult.isValid()) { + return new JsonRpcErrorResponse(requestContext.getRequest().getId(), forkValidationResult); + } + + requestedCounter.inc(versionedHashes.length); + + final List result = getBlobV3Result(versionedHashes); + + // count available blobs (non-null entries) + long availableCount = result.stream().mapToLong(blob -> blob != null ? 1 : 0).sum(); + availableCounter.inc(availableCount); + + // track if this was a partial or full response + if (availableCount == versionedHashes.length) { + fullResponseCounter.inc(); + } else { + partialResponseCounter.inc(); + } + + LOG.debug( + "Requested {} bundles, found {} valid bundles ({} partial response)", + versionedHashes.length, + availableCount, + availableCount < versionedHashes.length); + + return new JsonRpcSuccessResponse(requestContext.getRequest().getId(), result); + } + + private VersionedHash[] extractVersionedHashes(final JsonRpcRequestContext requestContext) { + try { + return requestContext.getRequiredParameter(0, VersionedHash[].class); + } catch (JsonRpcParameter.JsonRpcParameterException e) { + throw new InvalidJsonRpcParameters( + "Invalid versioned hashes parameter (index 0)", + RpcErrorType.INVALID_VERSIONED_HASHES_PARAMS, + e); + } + } + + private @NotNull List getBlobV3Result(final VersionedHash[] versionedHashes) { + return Arrays.stream(versionedHashes) + .map(transactionPool::getBlobProofBundle) + .map(this::getBlobAndProofV2) + .toList(); + } + + private @Nullable BlobAndProofV2 getBlobAndProofV2(final BlobProofBundle bundle) { + if (bundle == null) { + return null; + } + // V3 only supports KZG_CELL_PROOFS (like V2), reject KZG_PROOF + if (bundle.getBlobType() == BlobType.KZG_PROOF) { + LOG.trace( + "Unsupported blob type KZG_PROOF for versioned hash: {}", bundle.getVersionedHash()); + return null; + } + return createBlobAndProofV2(bundle); + } + + private BlobAndProofV2 createBlobAndProofV2(final BlobProofBundle blobProofBundle) { + return new BlobAndProofV2( + HexUtils.toFastHex(blobProofBundle.getBlob().getData(), true), + blobProofBundle.getKzgProof().parallelStream() + .map(proof -> HexUtils.toFastHex(proof.getData(), true)) + .toList()); + } + + @Override + protected ValidationResult validateForkSupported(final long currentTimestamp) { + return ForkSupportHelper.validateForkSupported(OSAKA, osakaMilestone, currentTimestamp); + } +} diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/ExecutionEngineJsonRpcMethods.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/ExecutionEngineJsonRpcMethods.java index 300cab98e48..9e4d98951de 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/ExecutionEngineJsonRpcMethods.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/ExecutionEngineJsonRpcMethods.java @@ -30,6 +30,7 @@ import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.EngineForkchoiceUpdatedV3; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.EngineGetBlobsV1; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.EngineGetBlobsV2; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.EngineGetBlobsV3; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.EngineGetClientVersionV1; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.EngineGetPayloadBodiesByHashV1; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.EngineGetPayloadBodiesByRangeV1; @@ -233,6 +234,14 @@ protected Map create() { engineQosTimer, transactionPool, metricsSystem)); + executionEngineApisSupported.add( + new EngineGetBlobsV3( + consensusEngineServer, + protocolContext, + protocolSchedule, + engineQosTimer, + transactionPool, + metricsSystem)); } if (protocolSchedule.milestoneFor(AMSTERDAM).isPresent()) { diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetBlobsV3Test.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetBlobsV3Test.java new file mode 100644 index 00000000000..2bee0f8acc3 --- /dev/null +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetBlobsV3Test.java @@ -0,0 +1,292 @@ +/* + * Copyright contributors to Besu. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hyperledger.besu.datatypes.BlobType.KZG_CELL_PROOFS; +import static org.hyperledger.besu.datatypes.BlobType.KZG_PROOF; +import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.EngineTestSupport.fromErrorResp; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoInteractions; +import static org.mockito.Mockito.when; + +import org.hyperledger.besu.consensus.merge.MergeContext; +import org.hyperledger.besu.datatypes.Hash; +import org.hyperledger.besu.datatypes.VersionedHash; +import org.hyperledger.besu.ethereum.ProtocolContext; +import org.hyperledger.besu.ethereum.api.jsonrpc.RpcMethod; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequest; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponse; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.RpcErrorType; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.BlobAndProofV2; +import org.hyperledger.besu.ethereum.chain.MutableBlockchain; +import org.hyperledger.besu.ethereum.core.BlobTestFixture; +import org.hyperledger.besu.ethereum.core.BlockHeader; +import org.hyperledger.besu.ethereum.core.kzg.BlobProofBundle; +import org.hyperledger.besu.ethereum.eth.transactions.TransactionPool; +import org.hyperledger.besu.metrics.BesuMetricCategory; +import org.hyperledger.besu.metrics.ObservableMetricsSystem; +import org.hyperledger.besu.plugin.services.metrics.Counter; +import org.hyperledger.besu.plugin.services.rpc.RpcResponseType; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; + +import io.vertx.core.Vertx; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; + +@ExtendWith({MockitoExtension.class}) +@MockitoSettings(strictness = Strictness.LENIENT) +public class EngineGetBlobsV3Test extends AbstractScheduledApiTest { + @Mock private BlockHeader blockHeader; + @Mock private MutableBlockchain blockchain; + + private TransactionPool transactionPool; + private EngineGetBlobsV3 method; + + @Mock Counter requestedCounter; + @Mock Counter availableCounter; + @Mock Counter partialResponseCounter; + @Mock Counter fullResponseCounter; + @Mock ObservableMetricsSystem metricsSystem; + @Mock MergeContext mergeContext; + + @BeforeEach + public void setup() { + transactionPool = mock(TransactionPool.class); + ProtocolContext protocolContext = mock(ProtocolContext.class); + when(mergeContext.isSyncing()).thenReturn(false); + when(protocolContext.safeConsensusContext(any())).thenReturn(Optional.ofNullable(mergeContext)); + when(protocolContext.getBlockchain()).thenReturn(blockchain); + when(blockHeader.getTimestamp()).thenReturn(osakaHardfork.milestone()); + when(blockchain.getChainHeadHeader()).thenReturn(blockHeader); + + when(metricsSystem.createCounter( + eq(BesuMetricCategory.RPC), + eq("execution_engine_getblobs_v3_requested_total"), + anyString())) + .thenReturn(requestedCounter); + when(metricsSystem.createCounter( + eq(BesuMetricCategory.RPC), + eq("execution_engine_getblobs_v3_available_total"), + anyString())) + .thenReturn(availableCounter); + when(metricsSystem.createCounter( + eq(BesuMetricCategory.RPC), + eq("execution_engine_getblobs_v3_partial_total"), + anyString())) + .thenReturn(partialResponseCounter); + when(metricsSystem.createCounter( + eq(BesuMetricCategory.RPC), eq("execution_engine_getblobs_v3_full_total"), anyString())) + .thenReturn(fullResponseCounter); + + method = + new EngineGetBlobsV3( + mock(Vertx.class), + protocolContext, + protocolSchedule, + mock(EngineCallListener.class), + transactionPool, + metricsSystem); + } + + @Test + public void shouldReturnMethodName() { + assertThat(method.getName()).isEqualTo(RpcMethod.ENGINE_GET_BLOBS_V3.getMethodName()); + } + + @Test + public void shouldReturnValidBlobsWithKzgCellProofs() { + BlobProofBundle bundle = createBundleWithBlobType(KZG_CELL_PROOFS); + JsonRpcSuccessResponse response = + getSuccessResponse(buildRequestContext(bundle.getVersionedHash())); + assertSingleValidBlob(response, bundle); + + verify(requestedCounter).inc(1); + verify(availableCounter).inc(1); + verify(fullResponseCounter).inc(); + verifyNoInteractions(partialResponseCounter); + } + + @Test + public void shouldReturnNullForMissingBlobsInPartialResponse() { + // V3 key feature: partial responses with null for missing blobs + BlobProofBundle bundle1 = createBundleWithBlobType(KZG_CELL_PROOFS); + VersionedHash unknownHash = new VersionedHash((byte) 1, Hash.ZERO); + BlobProofBundle bundle3 = createBundleWithBlobType(KZG_CELL_PROOFS); + + when(transactionPool.getBlobProofBundle(bundle1.getVersionedHash())).thenReturn(bundle1); + when(transactionPool.getBlobProofBundle(unknownHash)).thenReturn(null); + when(transactionPool.getBlobProofBundle(bundle3.getVersionedHash())).thenReturn(bundle3); + + JsonRpcSuccessResponse response = + getSuccessResponse( + buildRequestContext( + bundle1.getVersionedHash(), unknownHash, bundle3.getVersionedHash())); + + @SuppressWarnings("unchecked") + List result = (List) response.getResult(); + assertThat(result).hasSize(3); + assertThat(result.get(0)).isNotNull(); // first blob found + assertThat(result.get(1)).isNull(); // middle blob missing - KEY V3 BEHAVIOR + assertThat(result.get(2)).isNotNull(); // third blob found + + verify(requestedCounter).inc(3); + verify(availableCounter).inc(2); // only 2 available + verify(partialResponseCounter).inc(); // partial response + verifyNoInteractions(fullResponseCounter); + } + + @Test + public void shouldReturnNullForKzgProofBlobType() { + // V3 rejects KZG_PROOF like V2 does + BlobProofBundle bundle = createBundleWithBlobType(KZG_PROOF); + JsonRpcSuccessResponse response = + getSuccessResponse(buildRequestContext(bundle.getVersionedHash())); + + @SuppressWarnings("unchecked") + List result = (List) response.getResult(); + assertThat(result).hasSize(1); + assertThat(result.getFirst()).isNull(); // KZG_PROOF not supported + + verify(requestedCounter).inc(1); + verify(availableCounter).inc(0); // 0 available due to unsupported type + verify(partialResponseCounter).inc(); // partial response (0 out of 1) + verifyNoInteractions(fullResponseCounter); + } + + @Test + public void shouldMaintainOrderInPartialResponse() { + BlobProofBundle bundle1 = createBundleWithBlobType(KZG_CELL_PROOFS); + BlobProofBundle bundle2 = createBundleWithBlobType(KZG_CELL_PROOFS); + VersionedHash missing1 = + new VersionedHash( + (byte) 1, + Hash.fromHexString( + "0x0300000000000000000000000000000000000000000000000000000000000000")); + VersionedHash missing2 = + new VersionedHash( + (byte) 1, + Hash.fromHexString( + "0x0400000000000000000000000000000000000000000000000000000000000000")); + BlobProofBundle bundle5 = createBundleWithBlobType(KZG_CELL_PROOFS); + + // Manually setup mocks to override the automatic setup in createBundleWithBlobType + when(transactionPool.getBlobProofBundle(bundle1.getVersionedHash())).thenReturn(bundle1); + when(transactionPool.getBlobProofBundle(bundle2.getVersionedHash())).thenReturn(bundle2); + when(transactionPool.getBlobProofBundle(missing1)).thenReturn(null); + when(transactionPool.getBlobProofBundle(missing2)).thenReturn(null); + when(transactionPool.getBlobProofBundle(bundle5.getVersionedHash())).thenReturn(bundle5); + + JsonRpcSuccessResponse response = + getSuccessResponse( + buildRequestContext( + bundle1.getVersionedHash(), + bundle2.getVersionedHash(), + missing1, + missing2, + bundle5.getVersionedHash())); + + @SuppressWarnings("unchecked") + List result = (List) response.getResult(); + assertThat(result).hasSize(5); + assertThat(result.get(0)).isNotNull(); // bundle1 + assertThat(result.get(1)).isNotNull(); // bundle2 + assertThat(result.get(2)).isNull(); // missing1 + assertThat(result.get(3)).isNull(); // missing2 + assertThat(result.get(4)).isNotNull(); // bundle5 + + verify(partialResponseCounter).inc(); + } + + @Test + public void shouldReturnErrorForTooLargeRequest() { + VersionedHash[] tooManyHashes = new VersionedHash[129]; // > 128 limit + Arrays.fill(tooManyHashes, new VersionedHash((byte) 1, Hash.ZERO)); + + JsonRpcResponse response = method.syncResponse(buildRequestContext(tooManyHashes)); + + assertThat(fromErrorResp(response).getCode()) + .isEqualTo(RpcErrorType.INVALID_ENGINE_GET_BLOBS_TOO_LARGE_REQUEST.getCode()); + } + + @Test + public void shouldReturnNullWhenSyncing() { + when(mergeContext.isSyncing()).thenReturn(true); + BlobProofBundle bundle = createBundleWithBlobType(KZG_CELL_PROOFS); + + JsonRpcSuccessResponse response = + getSuccessResponse(buildRequestContext(bundle.getVersionedHash())); + + assertThat(response.getResult()).isNull(); + // No metrics should be incremented when syncing + verifyNoInteractions( + requestedCounter, availableCounter, partialResponseCounter, fullResponseCounter); + } + + @Test + public void shouldSupportMinimum128Hashes() { + // Test capacity requirement from spec + VersionedHash[] maxHashes = new VersionedHash[128]; + Arrays.fill(maxHashes, new VersionedHash((byte) 1, Hash.ZERO)); + + // Should not error for exactly 128 hashes + JsonRpcResponse response = method.syncResponse(buildRequestContext(maxHashes)); + assertThat(response.getType()).isEqualTo(RpcResponseType.SUCCESS); + } + + private BlobProofBundle createBundleWithBlobType( + final org.hyperledger.besu.datatypes.BlobType blobType) { + BlobTestFixture blobTestFixture = new BlobTestFixture(); + BlobProofBundle bundle = blobTestFixture.createBlobProofBundle(blobType); + when(transactionPool.getBlobProofBundle(bundle.getVersionedHash())).thenReturn(bundle); + return bundle; + } + + private JsonRpcRequestContext buildRequestContext(final VersionedHash... hashes) { + return new JsonRpcRequestContext( + new JsonRpcRequest( + "2.0", RpcMethod.ENGINE_GET_BLOBS_V3.getMethodName(), new Object[] {hashes})); + } + + private JsonRpcSuccessResponse getSuccessResponse(final JsonRpcRequestContext request) { + JsonRpcResponse response = method.syncResponse(request); + assertThat(response.getType()).isEqualTo(RpcResponseType.SUCCESS); + return (JsonRpcSuccessResponse) response; + } + + private void assertSingleValidBlob( + final JsonRpcSuccessResponse response, final BlobProofBundle expected) { + @SuppressWarnings("unchecked") + List result = (List) response.getResult(); + assertThat(result).hasSize(1); + assertThat(result.getFirst()).isNotNull(); + assertThat(result.getFirst().getBlob()).isEqualTo(expected.getBlob().getData().toHexString()); + assertThat(result.getFirst().getProofs()).hasSize(expected.getKzgProof().size()); + } +}