From 889f10cb069b194f1b235b9681d735ee651bc07b Mon Sep 17 00:00:00 2001 From: Joltras <72395471+Joltras@users.noreply.github.com> Date: Tue, 3 Nov 2026 20:12:22 +0000 Subject: [PATCH 1/4] test: pin only the floor content in the seed test --- test/resources/floor_hashes.json | 660 +++++++++++++++---------------- test/seed_stability_test.py | 6 +- 2 files changed, 335 insertions(+), 331 deletions(-) diff --git a/test/resources/floor_hashes.json b/test/resources/floor_hashes.json index 6b9d3a1..958cde9 100644 --- a/test/resources/floor_hashes.json +++ b/test/resources/floor_hashes.json @@ -1,332 +1,332 @@ { - "0/0": "1202236fd5b9a06b52eaba5f1d3fa8a1a89acb631639e5b9e6713d6e37c37229", - "0/1": "12f12e93500f63fa1fc8e32152105d10eb9be35756e61714ef8f68508fc8ad18", - "0/2": "1b53998447331f112ae82a033b853e9023f637c6a38c6416c066159c77494709", - "0/3": "7f895419eb446ff4c012cf667e33db585103d8bdcf4101775f92940de6a5e23c", - "0/4": "3c7cb242de4c51e94558155050642bf247958c3b111d48f48b7ed6885650cb8a", - "0/5": "b9ac41f21d3ca579ee8046bc425f619eab81f5f262f8e7ea60f430b949a9afb9", - "0/6": "b84e95c1dae807c9bd7b92bf6faa271e110e938cb6f539652c0701c14d85c487", - "0/7": "219f31d84b019fb7c08b9a12f26e25c7281bc80027dc14c4b5c70e91847d33e5", - "0/8": "a4320fee50fdff4c519e34f20e9070396325b69af7c994b5f29cac2c9a5ce2e1", - "0/9": "147ced49b1c11a4997d38fe7450858e62025dc2424b13b6dd7f1d3cb9e2ff986", - "0/10": "39e2f39af0efe65a07354c7326a6dd0b1616ca4f429aef2e2437fa23a6abead0", - "0/11": "58b1f1c50f28f5ed960247b14ef327ab99167c99a94981a7bdad78fa5b541255", - "0/12": "34c65d758a804775f203224f4a74cf5d03773956dab346fc2ff36de51ba57957", - "0/13": "a66c04a809cb88bdf7ffab378389e2fe43c6f2c44827b7c37a0f88a38eac6873", - "0/14": "df26792d44a8e2b8ce33df1b43ffd512b724356b80509002bc231a807b6d7691", - "0/15": "2efbcd6339b99938ffe8e356dfb7d55ebb20de3ea0f7bdda15604fd896273ecc", - "0/16": "aef10d28966ae4d319bbf429f20604c98d76122df09666ec10386570c48c4db1", - "0/17": "82d4c400e122d181ee9663f7c7ffed41243be562c3186af255bb986f8e2d2f96", - "0/18": "634140e411eaf15cd3ac614ca18483663a935720bb74968440ba9733ae34ecfd", - "0/19": "9a9d33a272c0e806a4145adf78bfae11be4db97a1ee34bf1e98683e8c8a2b54e", - "0/20": "af0bd0e9e8803ff72df48cd96bd3e8b9f41ba1a292610dc7f8626880fbab4221", - "0/21": "81fc31efb85d78f62500c94b6bcc5a88b3e5be8dd3a55e1e82cadd6dc01d8eeb", - "0/22": "fa7a1e991673447cb93d2cbfaaf2d3ed7e61db0045b361bccf8ec2bed394aac1", - "0/23": "d154847f18a96e788f2d7539b461681d76d5e45cb6eed68a708f92bf588c83da", - "0/24": "b70457fbd0c521a7de9a025ef1de40fff5e72492cfd9a1b24aa93f94d4344024", - "0/25": "82dd2447475b15821212354651733819baf9ba3a62da20a5a6ecf90bbfb9e0bd", - "0/26": "d1fc59b7408835e06f4d9123a6bd346840f67c18487d2eeca941fdf3c8b5f5be", - "0/27": "570f9a00d9861891661f6607c6ab31a24a79d0d504645fd59a4086c38269fb09", - "0/28": "c8a75069915f7f358e1757b03c8fa9298c8d137471277d5fc70036ea4f857e9f", - "0/29": "d9955b9c5ba8c4188af4eab6a7384f3d4132f98f234f51c46158d8fc41cfd84f", - "0/30": "137d0764da965f303a51778c25ee8b1d6563e8e1d1d1bc050138a98f4aff0ce6", - "0/31": "55ad7cd385b6187c71d918b689588b8645b1203705ffb2551b17e501f946be81", - "0/32": "6cac6c373b2d2239a5be80971251c7a4b35cad2fe32ddcfae626f90299e5dbb5", - "0/33": "e0dbb4a6f84d42f51ffff3f7697c5ebc4b48d096b74cee1e6f4361ec26f1eead", - "0/34": "0d16d6dfa0f05bf64e6753479b7222f3ce47b9ba84362da332f705efcee4f586", - "0/35": "4a938b8209b7f5a53b048657df61956039e708b141cc5b67667ba72e9a24608e", - "0/36": "733d2df19ec2a2c390b8e7d5d5972b1418382809ab0d2e34bd1fef247beb5be7", - "0/37": "83d453d180698ce8a0b2d26e0d76d15e90135c1919ca3a69184407b3930cec9b", - "0/38": "9fce17d2fa458a7267c439d24b253fc8aa27e52540026d6fd4ea399f3b83d170", - "0/39": "1720c5cefd087361f24ad1a430928ff4ef8667ecafc8aef9d86f41706177e125", - "0/40": "de38219a1d2cd7a485dbd7083f4c71646b6cf14f2fead5c17ae730d9f56f1f00", - "0/41": "13800056ce5f57df7d27c86a4f3e8e29e8d924d479715a3cfef60f5f41f4ebc2", - "0/42": "170a4993d571fee043eba3ae211e3abb6ecc7bc0b5f3410a876e946bdecff46a", - "0/43": "efdeb6f2fcc7cf135a9a58adc229a758602ceb9d381735f10235fd572b61e8bc", - "0/44": "425cc3f9646578f3caf5573bcf5540a0659046771946bb60feb3f9aa1a357743", - "0/45": "a03fa2382bb1f986c3a7eec94b6e4ada5052ec431dcee78e966d4eda90ac3052", - "0/46": "5793230ad24e005d56d5a5302b99d9c84019fa15883c5db01bf7b70707e0c481", - "0/47": "e5c5d8791d71ce4112af197613236234b4e272d57d1805ce2976a290b99b8e34", - "0/48": "aec92c715e52ff55b63d61d8ad642826102150218d44d11e3e4cea406850cb49", - "0/49": "b12eb0f3ed4e684438022658087dcf254d1a08ea89f32468fb20e81ba646741c", - "0/abc": "630e2795728926c8f9882c78f6a002ccd24f988f57f50ceefa890cb2ffea6c4a", - "0/test-seed": "9d974050d91123aeeae6e0568b88de1daf89151c3c147afb385a16807dff1737", - "0/a\"b": "c55d1709e228cddd1b8c831df3e2e18a052f07687070c8ae5c96be9c3bd112e0", - "0/รค๐Ÿ™‚": "8bb4dc14ba58a238d49ed9b17657011b2d81734e8fb61f11111e5b2762229b79", - "0/78d11f0d5a8bd74e510194e16e4b352a": "4f4b5be9b9abe6aca31f2186826d0286ddc79c00be9a1a05356405c9efeb53c6", - "1/0": "d669fb366454af70e3b46d4a6ba51f5212efe934c9446903c4e4033dd3e1462c", - "1/1": "0d4f49d49a129962b1f2fae3d1a297c6191ecf698e554ea5640d75dfe58b2561", - "1/2": "5c56aaf1a6c17ce5df7b54449f789967fcc868db499e2170f8a975c54a77485e", - "1/3": "d7d5b29cd74a3ef825c4eeccfb7cd11620843a3025e36db6862c6e86676573cf", - "1/4": "3b96203ad01b48ee7ed4a075a501f4128cf5a4f353fda8faa10eba2fc08cee38", - "1/5": "638f9f9ac44a180afeca643ad57ea98bc88eb8d2db3e1df3a72b66d3e7c22896", - "1/6": "f36860a9edc8d05d0e4f7546c3461639c157b3df73533476ef2f14038d4090e2", - "1/7": "374e41262a50b8bc4734b251c40724d9e491e2a70b081cca9b94d64905dffc07", - "1/8": "da789847aaa0f47bac9b6c65199619980e45546806bd01f2057fb673b736cc0e", - "1/9": "f055d75de733d2b8b78767c3ec69d7838b14decf5bed47aba4bf7f49d751af48", - "1/10": "a7cfc459153a0b28efd24bbac05e7e5badeab9cbe4232d545b1bd18f99f7706c", - "1/11": "f7a60a156afc955525ba2d54947e6d399c634bcbf2e4c18c2fffd54b8bdedccf", - "1/12": "f7bb717991462d9520d25cfad7a0d2ba5040252995ef3408a7aa994852fd199a", - "1/13": "b94b14083fc038624f57731428aa13ee503d489354500c3a271498357f7e63f5", - "1/14": "788ea52b5fe1b7bc051e5dbe9658efd2beefe0fb888f42722e946512c8ccfab9", - "1/15": "2a9251bcdd752bfa060aa51a952f4032d31583f75ba7c92ed795a49d8d60351f", - "1/16": "c74a32764711f7d76ce75ea27fdc1c4d2671bf6afcc7f86aea326e8e1d48d104", - "1/17": "261a9ed3e0e71894b35cdbabafeb5717b12096c6e662ac642ae2b63bb48d520c", - "1/18": "b4d3332a6d329195e11069b61a60788e56e1ea414cb3fd4653df2dde475d6ec0", - "1/19": "e4ac6ddfe1fc71ce3b401345fb0bb2dc24000873401265160736d6560f7a626d", - "1/20": "977b8756119ea9961dd4f2cfbf623cfeb9e421dccb85d002016471b79e6bcc47", - "1/21": "9e9547b55dc908370e713df48eea9bfbf60bb25b4c0536c3f1505ed929ab538b", - "1/22": "6a672bc0befa7d8d0beac5e99081dbb6f6a2f69a45b00451e6fc685924a81ee4", - "1/23": "2264584b861917bdc1a9751d306d9252e525004c279d1df5cbbeb8f3b200f41e", - "1/24": "d3d5fee36921d247ed02102a12744353755a23b5959d9f9a42513ee34f3ecab7", - "1/25": "5f0ccf24cb37d8346ac354ecc7f5f6159c102db25fac4f53ffaa4cab6da671d4", - "1/26": "a0843537a669b31337d80f1b4f96c98f0177d65bad7a475cdfb0310fad5eedad", - "1/27": "64389687e15df02397afae26e92338ea5021268c6b5d72ecbe7c7f6b9db1575b", - "1/28": "055f761356cfb7e95ce08a51cda3be77df9e406c3357293db06638d9186b22bb", - "1/29": "ca0ecd382d7bd0d7091e25eceb14ebaaf96e8b66d4a3a6522c6c9b851e8c95b4", - "1/30": "18bb334981a3e56c134441f62b02caf720d834133f61be896449c4c433fc45ec", - "1/31": "202126cd54b594eec41f33793db70711b1452ad2cf279c3cb113aa92b17ff550", - "1/32": "98ecdd7781884a38a9e5edc550af0ecab00923ac5f740e607a54f96725b89f6f", - "1/33": "7a6d08bf5e08ef62e3ea38a4afd58e2aade43195ede2555feb3d9ec8e7b5f931", - "1/34": "fd5a23b95abe9ed3e0386fc35ac499abafb77aee91c4d792ea13e0efc4efd284", - "1/35": "d828c8d1c3862a33dce3e592c2084f26042d6f11b3688b4772c04d96da4b7c03", - "1/36": "5e8ddcc09014da74acc4cd8e4855fa01bdbc715cf191b780dfa85047ca6e0ddc", - "1/37": "3841f11b39af0f4ee01f5d660996b81deb94a079ab41679d4ceabf3fb9cb087f", - "1/38": "2b6124f2044144726bc7b9acfec0a843f024eef8e8aa30e4d03db54aa50f8211", - "1/39": "86d9c47640f5a70e032a8b85802aaf9f73432e551d15cc71160eadcf5ca0da68", - "1/40": "1394b0f25f860a0384314323d280163192d8976195d67665cec8a3ae054560df", - "1/41": "4914ec4b6fb68b9fbc8b2a54f4d484138077b079b51a19622cf90f5a3f12927c", - "1/42": "05a1720db6dc0254ca568890ea39ac1a962d2bf7ef49017eaca8e577d1bc8be8", - "1/43": "0c135d096f612b7cb6f9cd4e6c89402253ad0b577cf40612264cdad9cb046d46", - "1/44": "f08cf9c06e92513485f297c50d13eeb803b1481b7c3a17cd0d721323c5da77f4", - "1/45": "0ac7ee98c8a813afddffe6d0344e62d32949311e6d85be181137ac0cb02d72ca", - "1/46": "0d184f98876f631c99cc45d1e336ffc99e2453ad12ccddaa8f67d4a46450bf29", - "1/47": "96d5e547f1febe1a75ebd5dc8b28f71ad6d584f0ce88fcfd117a4e5dacea09c1", - "1/48": "74a66ffdbac9538b7ab12755e5edbe3428c6e69ac675551ce40b568be91d6575", - "1/49": "281c2605be98a54aa540463eca67d884fb01d25f392189c4c934699969c35852", - "1/abc": "fe3a254c2549981fd6772a9b005acc27ee0c6b72ad42809e532d3c44ff10f912", - "1/test-seed": "6c8bda4e2608410e017ada753a324b10ba44f6e83c9db64ade5bbb4539d9472b", - "1/a\"b": "4b759a5811ad186d704b72d912b5815a1ee7d88d4e7428aa0d8258e4ff498780", - "1/รค๐Ÿ™‚": "7a38efba3b429c264d8a576fe32b40f108b3e4332785bad15598ae9855dcdee4", - "1/78d11f0d5a8bd74e510194e16e4b352a": "4210e2d74947794c420a24c00dd4bf6aa798f80cf6d0e07596d6bde78cb47913", - "2/0": "c79807580dde578ace9f35077fee6b3f41665856da7e3ea698c5424e4ff71d21", - "2/1": "c5c6f2e2f66c1cd757f8f37d4cd4669a217dedf43d15d92f278f2c396a915b6a", - "2/2": "034c66ac4434e210fec327703cbf6b065fd4923d9adfd075cb0208189c1e192c", - "2/3": "10923be82e7bdc457344c6e95fc0a8e64b5cae15d3be6f326dec68476504107c", - "2/4": "0688f89e60067106b767c08bb010cdccc3198fb84894dc6b2e2144bd5f919843", - "2/5": "9a0953a2cad5a9fe97cfb146ab0e5d5f4804ba08e82bbce5b01203d3230c6214", - "2/6": "201b8920a736a0b0163615c67f52cf2d92885d8b32aef1d71465991723b0f21e", - "2/7": "5fd2944dff263b439b13f9ef714dbca5719e28a7d17abdff3fc9acb29c146a5a", - "2/8": "708cc8913272b0117a63eca8bfe9bcad70bd5eec5742efc90757544ebe8e2af5", - "2/9": "4e60a7dcc193ee8f52485dd7650e1786893381d68f4690c8a682baeec2be9e14", - "2/10": "a7bd13bbb6fc51051146cfd93b2ff7a525a4ce43ee4882a936a5e6956487de15", - "2/11": "620e3190decdb492b6a637481daa4aa422cb7b42d7b2ea44f5ed1e2489e46b4c", - "2/12": "12bfe3fb34bc3d5b6be35e61ebf3605825efd56199f1dc12b033819c2ae9a255", - "2/13": "d92554c55cf2690dcf2ee1e6d26f4330c07147b35ea1971c11a716d3353b9114", - "2/14": "1823349910f00a874e3dbdadc3c47b160774f792fa88555c8c19a68a389cfa1a", - "2/15": "4c9b2b4cac8328238b984afbbe3428a78bd18368d3b9d97c3fafab2d6d4eae7a", - "2/16": "7141b8f71a0af8dcdc20cdfe8bc5dc944b0159d3a4d3d4d807331df0fb249bb8", - "2/17": "a2bfe512ee90667230718af88b0f0299de922ea62181b699344e6e6c602fd25b", - "2/18": "1a3d8b301436fe6d0350afd4e59fb8e68761f351b6322494860b2f5709e942c8", - "2/19": "00e1742cc251967e6429862f3fb47e6c1882bf3ea11148b3170130ddaf81bb03", - "2/20": "031a839ea87a932a007a267fa0eb146630a9e75976aba656f87967b69700e72a", - "2/21": "0f3b575958bd71d0f8cda0f294d3faff956390fbbe57bc875f88aa38c6b8e6b8", - "2/22": "a7fa862ad20efb0c4d5085e5b625d6013df525c074f376df01977c089b2ec0c2", - "2/23": "5956ee3b2bfa5f12f9b7a408282fbcbbf83b10f9c9ac0ae6770ddcf5bbf67d1b", - "2/24": "4536a6882022233258a8d49e5f81cc8ee1ef2ddde6e9b843ff6b2bdfb2d8b3cb", - "2/25": "ac9cd940ef7e756a1b5ce571fbca3f47bec911e338aa90ebcacd78d95926fdbe", - "2/26": "a8bfdc56229f47177ceec0159fd0a345edb61d641cb6e367b7db04e4677d85a0", - "2/27": "464e6a5fda4a9451ab315749463944db8f2ed3a0094b1e7148d2d61f98b1ac00", - "2/28": "be52362d2355255986bf88c3a0d4f76f37582b39acdbc25b4775824e9d0e8d39", - "2/29": "316e26d1a0f548807a6f146f9edc8c572e78ad06c1c8460b659a097e39e716a8", - "2/30": "a272b363594c3333d09a7bc18846482608456507cde1c509e590abe039287f85", - "2/31": "ff13420a9940c4d582bb3e87932ab58fa61c8196e03627e9f12d1818c9a4a258", - "2/32": "fb1ec65ee8775d033a55ff9ec7b521e05f2caf252c8ae287bab00c2595a9fafc", - "2/33": "52eb47a214fc93add7ebbe9ae092a946e938b3405f365059f2c47b808e0aef13", - "2/34": "8aa48f9501da93f481c4ee11b5d13359a6f80fb361f1b1af8c438714554ce730", - "2/35": "f750e043ac22895d68f7589266daea56ec062636193197ff4d39f58380315e95", - "2/36": "bc9e400d66b59050364ce8132c4add733596432773b6a987aa288afe1d3dc6d8", - "2/37": "d1136582d9b765e3415c61f8c5a57bffe31eed45e1d2626ca8e7ba832ec98332", - "2/38": "cae1d7827b879814110488ed9b3e59a364278efe9a4c3da80f68bd8a86efdca5", - "2/39": "1b1b4431debbb23db4d8cb2aa7c4aa5546232d67ba1b68c68d52fe3574ba59f9", - "2/40": "3b5e80dd14e59c53365a2660235a5030bef914096656518f266a50659edfeef2", - "2/41": "c9ca2efde777742b60f2a2e270f850b97ad8f93779a30c65e70c3e57a5c2eb49", - "2/42": "3eff0d43c4606eb9fcc8f8434c426c6f41f201aa59681791fcb08439885057d9", - "2/43": "e9bb95b0f90e4067d93252508d553bd79b4b5baa93de62f51b53be417a727a49", - "2/44": "511e9b9086edee9106f3c41ef079fd45045355ed496e60a5950fbf47c30ba307", - "2/45": "15bf0ab2c311b363a73d601ccfdfea3a9d1a1c849149acf856f10c9bb98c22ac", - "2/46": "43cb684cf6613c8ac867ce95be89d57412dde8a28cbc35b2dad968ca437f43b5", - "2/47": "631dd36b8ad17b946fe5e9101041e02f2c9fb231bbf4fddc0acdc7ac643fbe68", - "2/48": "dbf376c203f806c428f9bb369dae13c5e8ad7b5ea301e6e57bbe55e79359aa5a", - "2/49": "81b21ed1221c9081ef8b32bf582e644c006dabc59f535ab8e3606255d594b886", - "2/abc": "c8b1197772103d7189eef3cc0e4a477b821d255c1a2fab9f4093a6d795644cad", - "2/test-seed": "f4577acce3dc676a78399cb0df96473f739ac743e088627d2acfb390bd7b7e6c", - "2/a\"b": "d7f44ae7d346d7855a447af4b0a19bfdc409fec163042af3dbded56dde74181c", - "2/รค๐Ÿ™‚": "a65aadaa2d851b2a85836ba315a2d3d84a95dfa26899fc98d9d89c32699f638d", - "2/78d11f0d5a8bd74e510194e16e4b352a": "7db79230dc4ff8e01f1b739aeb2fec5d9c394e8697e7d067f8aad26de5bccf9e", - "3/0": "9d507bdc84a5938bc23e0dbfd08dde2c761961e3a7d1fcc98fbf6f044e59737b", - "3/1": "42e4a97fc783d2d52a6c03f99acf5e60a4c61f3ba6d6bb4a0f2826a6512ee5d7", - "3/2": "ef39aa3830526982ea54e73b91234395700afdf2552528a249cf2ae5f7165df8", - "3/3": "ffc4b107026f6a78dd4aca91636da05b4fa290d963c86ace9bed0eed13723f20", - "3/4": "c08e45a49d2aad059ac5e3459371fa3122645361ad86c41e5234a80c05dff580", - "3/5": "95112c1615f1e4b08f212bdc543308e2204085688f336c8bdf40caf1b286f9f5", - "3/6": "58865790792a9f1e97e38ee1ff579bf9d1cd91700a83ea8e26c0c3830f81167b", - "3/7": "92f4dbb819c0a645e8372a1639d07006965bbd774c8d745c5838f06f744e75e8", - "3/8": "b5e3782390bb7971145c0eb03840ca191b4a4561c1bdbf2a045e100506dd4004", - "3/9": "32e1b9d49e546e1db482ae27278daf724a51ee10de1a629c341bf1e7b7de7206", - "3/10": "f5fd3342eb3580d110c17b1a1c66bd74102d0aff97395d69c8a17c87a2c7b3b0", - "3/11": "59cf07eae07bcf16024f172f9dde31d60021ce9080f29e7c46f59cf2246380e5", - "3/12": "1851da1531493f0b839830c92fd17d19eb47b1e6931526a98b5c440dc51fd4b8", - "3/13": "3a492daef4fc5311ff40229e696e9f58f58b48ff80fc82fdb9561c8cc1b90719", - "3/14": "055316ade5f4299556fe7816777d0a9c906b7964875fc4fa2eb72eeeb823a8bc", - "3/15": "ae4e8cb7e484161874cc4c4ebee3a0b07492909121dd8028104aab13c054b691", - "3/16": "e7f34899eb8896c2130720f5d4fb76cabe2a3182a2644b40e5532f79f8ec78c3", - "3/17": "c5ad8f7575a30d36751a4f74f1626878d8ab5edcfe50dff46ec69d642b7595a5", - "3/18": "da88db183be9a271af7a1e70bc3494bb641af1eed9a7348e8923301b74c2df4b", - "3/19": "78590e1c5c5f46d03736829f42cb414defcc198da07fedef58b6600ce5a5b3b8", - "3/20": "f361178788b2506d444f62945fff89c4fadaa6e78b8b1b9b4e8e01e3415b900d", - "3/21": "dade1f83a56523836fcb1d029f29917066b9a80ab4c33732fe46574f4fb7bccd", - "3/22": "7f1e5a0918317e624f6dd23493279ebef43a7abbe50d1e03e44166fbb0808671", - "3/23": "fa45e422b1d8e34197fd5cabd5aa63e135d2ad5c71db586472e919d0dd296e4a", - "3/24": "623daba0e54de7732232a50805c6771d5f0a9408687c31a078f7d400bdd0b83f", - "3/25": "4ead9530c3cefcd4b359fac558312116a2bae9c2f7452996fa3dabd8c253611e", - "3/26": "5f72dab3950a3c774446e0cbc34c25dfcee1539a0a32662aa96d0459fa4730d3", - "3/27": "13ec5ba03fbe3fb03ca5e0dc9fc789ac867ef211705609c6fa93de137e46b62e", - "3/28": "47317a9a3b30c0af24dbafbfa61cbe845b076e7df5c013796bf288ce88d7f489", - "3/29": "fc41cdfc135cd7491edb46b05c93f9a49e1ad6aac45bc61fd492989224fc175f", - "3/30": "6a1b11a85a3f7dbe120ddcce36353cd1b43e8b8e59c7e88912de39784c2a7b58", - "3/31": "949151b59205b6ac446a72590d231258d48112094f861188d73ab7485a263b85", - "3/32": "45c05a4b5c2f594905e916008fc644e5e3fe86f3d41f61474b82180fd66b4d4e", - "3/33": "f5aea63ea64f0b41aa141cf4ee4cad5cd8eb56f2fb300e35ee0c4d820006aaa8", - "3/34": "640fe9a61bf90c937ac0cbf2574f461d2371ec58d36ace0a4c64cda712869e29", - "3/35": "e740cc6563fbf111b79917d9ed58cd60c9fa1369b0d62270c7d42378ec3dd132", - "3/36": "8ce6b172cda7cb0ee608745e485e8dfc073d53a4e2dc6794c2356931f7a5e5ad", - "3/37": "1f0c170097fcfcae97fac5f6d8081438b5f73c9c4182379c1a4ff7c3862c28f3", - "3/38": "ced4480cf859dba6b9a041112a7678abb956e6ed10f0f58edd0654d0a5476361", - "3/39": "898aa3c70a992dfa5b44d5274cb060717b11c7bd9e1ba24165ab473a444213f7", - "3/40": "64bd8296b27e8724e06bd7fe3a346d8949dc75b88a923f34bba8d63b44da36e0", - "3/41": "e35db82259314673173c94819be64f518cff8a195961c50834f5fcdb94820a0f", - "3/42": "5f16127ce46ceadece5424d86d56c413a4f672ca8475b12f2e7030a2c233839a", - "3/43": "0eaefc4a6e656817fbde5327502b0a66076b612cd9709cb079a1932c77964a62", - "3/44": "32d6a2b68eef8a925bcec199cdb58b689df0b62e78e4ab38310e386cd92a2eb8", - "3/45": "2ed39fb7fc6c1a7647cfae8e7ee6597a1455e58e8da9aa667dd68a783b688835", - "3/46": "eb95708b1d4d197baa8a2f51f20b41f5a13c4cfaaff5419a3933a45dc5bbeedb", - "3/47": "c3cf187fb1cedcff3b0fe69019f1f37d86176385738bc287d4f7dafb17ddb851", - "3/48": "acf3be8c7e46528e2b461660c6eb15c6546e130f1b6e7dca6847885b96d61ced", - "3/49": "f965291c342419318db79fb9fe5e44ccb2ef71bf1bbc8924a967afd3a13e83ac", - "3/abc": "66f0e21ed445e200493eaf6b43245824855c780b3baf9f4b8b8309eadf6e4ff0", - "3/test-seed": "571ac084f7651b24d4f8e5daa80dbd20f3a368e95af660ac1a160d29356bec18", - "3/a\"b": "1ffe0c829313a5c9bc445fa8c97fa80585c3e89a30046249e17fef59749fa602", - "3/รค๐Ÿ™‚": "37736d0abd13574ccdb8dfa52ad11006ed8b876e71e6483669a87de21b39b9d5", - "3/78d11f0d5a8bd74e510194e16e4b352a": "e547395debc341239adf86e7fe8346db0ccd0a29e683f8b48f10f63e37c13537", - "4/0": "2e24eba651b433e459ea02dae1a203984eac56e10562e8cd51f6ac24d90192ce", - "4/1": "79af4b3a840934f6b5ef69447ba13e740cd5b0470029c4c5c6749e3a3f48d159", - "4/2": "ade38ad5804d09d9e85dccd502dd5e7b97769469c142884c8bebd273aac584b0", - "4/3": "e4929f01383981adac82a875d24e97a16e71ec40f5e53ce32bfa0dc1d7403825", - "4/4": "bd1f8381cfb661c0d6af933318aa73337353970df5c2625e4ca33b411c59176d", - "4/5": "efaca9a06edbfed6e67ecf7d087e91f5c8dbfbbc1205f061d9909774f71e5b86", - "4/6": "baa50f3ea15a4d2a758bc29581099230c8467b98f09963da400208907600af3d", - "4/7": "2fcbf6bb3c6ed916a69060e0b5bbe12e7f1a2813d5c0a2637c8aba9a2f3d9697", - "4/8": "ba5abd4a0096bda8add52b9319e0b7120a5e8177da53637f68963adb18d23ce4", - "4/9": "66dc53773fb82736773a19e629462e2f4c34129e2286cbd183112498f52be420", - "4/10": "93a109ebc40cda61b5f022e89c0b7f1e8b1ed82b356e21d31a4ab2487544efa2", - "4/11": "fe840c5fc84017b844432da2cefa19ca4bc063a813395467ceeccae29407e9c9", - "4/12": "4812af251e6f99d4627a8432138eac7e14c76d960c68ab3e5881bae9e06c9800", - "4/13": "f9f75cec634d39f23b0395f2e7759b1329e844b8dc703a1789eeec97d18c2edc", - "4/14": "2c7a6ba22647823d7808244a402b66ec6aa8961f2e9cdbc3f325ab1e4d1ec8f8", - "4/15": "8cae36dc30d09c00c9ec1a7c41bb7a12b52638547c1dbe6fec89a42566103945", - "4/16": "f7dbeaf66216d7d614ddbf2fe737f9db4115919341f737d71b023da76ca4cf73", - "4/17": "6327ff98624c892fc39eef0fc27a9e33e4dfab3b354d5e3b9d7e6038931d5893", - "4/18": "f88e302f64d78df1abb296338c2ab3d1490e903fa50f0c49f2e4e2a64ede980e", - "4/19": "c20a1c9eddd91f89d36a31d88787ec126d02ad45a26b4852ce5f79ff8d2663f5", - "4/20": "f58874e8ca6339a5761ab9d2a0d614b695e159a213629a1a596d315cc1418753", - "4/21": "ec37ab221796fee3058a5306849b168ba797917cffa86aa46a674a01dc942d8d", - "4/22": "4bcb6a766f1256d760cab510427b108a7cf4285ed3d86ec21d7c0b41fde8d62c", - "4/23": "dc22d5e9f2b7f1cd2c940b0e52fa23e809c9b3d70a821076ff0dcc2736ad6a64", - "4/24": "e4be6fe7f7b19832f3a8e3e402c0292981d58b95407c4d8e7254d7542a0d2c1d", - "4/25": "3ee4285f57653ec0af38a1fff4bcc22bad8712d4b3a33a701563f99df6effdba", - "4/26": "fb8835c2e69b4d06078bd656176cf6324a88c345f540407b77df69f97ce501ae", - "4/27": "0059fee6488f3039869f4fa40ce1b69e071d03a8116a80f5f74496c59efe4d5f", - "4/28": "954fa212a38f786a66dfea092436d980017d842cfda9c0366c6e657e13b51bb9", - "4/29": "4bfa7ca3e7c71307ef9c64558b4d0f4bf28bc2e6cbecab983d31f50e73d96583", - "4/30": "1ace1afb3ad430fe88650cd928abe36c61b6aa76deee4e14fdb2f7c652c52ec5", - "4/31": "1ac1183f80b55abf196676aa53f3a3e79f8189b680f97c077acb5e765f3abd1e", - "4/32": "ce83fceab0b279c373f5076870a299cb872355acbb6f26e7b8065714bfef5abf", - "4/33": "641163f4db55313fbefd7aadfd2aa3246ca6912bfa26a9d97b3e0224db084f07", - "4/34": "1b68e851b64f30dfab7bc6dbe6584b3530bc3d055e6d011ddd14856d70b51350", - "4/35": "53b29433914a177ff48d326202381ef1bcdd5c0b004a38488b2b73e000338c60", - "4/36": "3d6cfc08f7eed7bc80c7465912e27a8217e6e3363d38f15e11675ab769621588", - "4/37": "9bb331cd7d59e1ec0089aa007a943cbe74b88509f22c229bffecb70e157cb3a1", - "4/38": "6baaa2df4d9a13adae8f25e6069ad41ae902e85fd40d037da32200ae55127297", - "4/39": "4ea72fc47e8cb763eab3c0e49cf9137ea35b2f2f1a5fab2d702c539bfbc2daa4", - "4/40": "1f58d7397d1f2dd9c029c2fe98365b5727e91aa51be68958f49473be9b3b252f", - "4/41": "37a6cedd86843fa3b01517ffe76bb597e880730c74b20f25d6326f6543887caa", - "4/42": "1263c5b406be527696cf21f7ddff56c2368ccba53bf9b4e6d63091947f395eac", - "4/43": "2e6458ffddf9922790770053d8bf90c56a53d14ffa321d060ae0201b034c16a7", - "4/44": "46a189d96a272bfdc7db55e95889db56fbf370382c45c24660ddf4d7fede1a9f", - "4/45": "407199f9fec4fcfa0e1b2568217ee56e796388628355f62f364c599fd908b6ac", - "4/46": "aaa10771d353a8106bff4ce718e0ea73b7f6bd38b209ad34752c24f76ef140a1", - "4/47": "a850dc3d16bed3f595f60c66194c713fb40f142801103a9521aaa9598b3fbcea", - "4/48": "0b0debfb0bb6857c9ad3d129c7f2bfc62ac9f34e942df0a7d583087f65993e83", - "4/49": "ba07fb2a537046b51824c7a0e74dddd074bdcb246e3be1f3841d36f55eb7ce5f", - "4/abc": "c926a2922371fe4ee78c97f66c4cf1e40048ed444e1af516185823443361d85b", - "4/test-seed": "153f725f9a9a86fd09df9e26006013b5c068e17eabbd9553dd396520fd58729d", - "4/a\"b": "f6da322f33dc3b30cd31db2a77ea81a6e08a84ff172697d69db25ef70cc9a2e2", - "4/รค๐Ÿ™‚": "eb84cd05fdbb209d0cb8f85f297243e46a145f2364fae2dcb4ffa2d6c588eb5e", - "4/78d11f0d5a8bd74e510194e16e4b352a": "ff6db1cd1d38bb8507d76c1c76905d7c84b0289bfd3e1b771752740ebca6abad", - "5/0": "d5e3f8bd514f1a62b6571835a6e8ee571fa33ed81aa4f723c16142e8cc32274b", - "5/1": "735803dd37756ffc4ca01e4be340352f98db94cf60cb16c18d2070106cbb57b6", - "5/2": "4562a3d128b38acbbcf16ad8c0076678d2bd3132c867b7bac5f2120fc1bdb36c", - "5/3": "841031f449e6e14fec3969fa51f55272735e0c6296f03a4fe117b8d5856af4c8", - "5/4": "5b40627efa32103d78123bfc31888bc412cc0be210cda5246ffb9ae90feb1483", - "5/5": "9eeccc7554a001d9fed01b8cf7cfda030eca3a0395f654947e091680f95fd7c7", - "5/6": "d4dba06e0a37d47a950439a21e241402f47775e3f418d6ffb4c861c3a1594cc8", - "5/7": "e601a161526b8d7900cfd93618e4b9474cd21d8f08d4e0404afc7dc14b67927a", - "5/8": "846d147d7a17d76cd8627d2683d3c2075e0eee6eacbb415fe3e8874e85604789", - "5/9": "c4df1b020567ea7d65d3cf60d3e0fdf4d68f0e611b1407fc434dd689e31e42e3", - "5/10": "e68a9cd3cd3bec9da5adac239cf8e8ff6e5fbdec33e0b14dee40ff701615ce94", - "5/11": "6bdc5c325b3b6587c3d48027631e5e88401965c31ef7ca12b580d0353d559197", - "5/12": "44d7821de18c9ab01eca7daba7d6e65e5cd3c8a0be98287ca791aa8ff3f5c4d3", - "5/13": "66dc23eeb651b8cef31b18cf6e8f84bc3596ef5fa4c1813cad8f5f85897ed18e", - "5/14": "511a3246b71f643f3225a7b546363acb970595f2cdd6186f530d58c81be87c8a", - "5/15": "664e18fb5101e40c2547ab4a3ccefe87b78a5f6c9ebe63ad2dd5a90821e166d9", - "5/16": "2d191b1b4397d5d63cc263716d2ff64a92418feec62def5e80faf1e3a0548bd2", - "5/17": "694bc190a9678b696c36c93a4fb8ddcda2a6c07e8b7b6a06bc93466562d7698b", - "5/18": "52af3ba409707bc94931f6b812a98f3f80c8c46f731ddf25a8091e4e36901e16", - "5/19": "648834977c2b8a591c891bec0b3fdfc12a243bf20be3c99ea4611fde01faf4e5", - "5/20": "172ca0fb2c44d5cbdc1089fcab1386fa410979b8063bc8acec731b2142d9a3b6", - "5/21": "6d5f7583deaa1be6e981b48a0ecfc51d7f91c1bc2a42b493546cc1b3cbe8090b", - "5/22": "08ad7378b5bd13d6f28e63b6493666ee5798dc2ca4575420dcb51f34a4310cd0", - "5/23": "b2d1f567915f40b2fb64e409981627b9a1899790a47c2e4e0b1b3684cfcba8cd", - "5/24": "a39d930e67b6deafa0a442f31f84e23ae80044278a73d0a242c1ad1425e3ba79", - "5/25": "9bffe7acc23727a50ce2ebd255a1be88b1f78e53620672ac9a3b1d84106b6a0f", - "5/26": "093f4414630c77e7ff98f215f3b6bdf659258674a550621a2938ffe411cf4104", - "5/27": "b8fd169e6c4d4eafc4aa5ba5055b46c14c151e4a920a15b9242d0ebd54e00ab5", - "5/28": "d85f898fd716dfceb5d30342b47882e4416ff9c53cce80aba3d23041604e52c8", - "5/29": "127c6fcbf6f7dda8e845612f8f776d8342c91046331555fbef3c085d975a93be", - "5/30": "22c4511f635e607b7f747ca9eda619e9e4e3e01692ccc8793a23a41bb5f6b4d6", - "5/31": "e91db3219e2d0de18c31fe65b0f26dc084008bfc1f2d52a1b1cb3f5d75419254", - "5/32": "1529fff7889adf42489df9951e2f213da0d881f42861201b63c9d9763dcaf0c6", - "5/33": "29b5af4f03d1a2ef197789480845d70341a2b56a729f3995d78bb763a3b24538", - "5/34": "1dabb3f61acac043a19b8590c9763fe625af025dfd0dee14970471a7a912d05e", - "5/35": "05f162afbb75472d311e0460d0ea76bb86a3b0fa76c41d642e27037729fe6721", - "5/36": "4b9957d26a6095fdd0f7b6065dd8ad9982e05640debd4faf6e77fd6bb6bee2d8", - "5/37": "91ea6b3a047f930444c506937636f57d26e0afc974eda70055e85a21dc437992", - "5/38": "af880ec789d304d4744de41cc1ed4c98eb818593c98023ccd20214078f754f3b", - "5/39": "c8a767673c93bdaff0905ee81137f9a6757c86b50073a5c567a2643789082b17", - "5/40": "3a11e49b92b6b895129f2cdaed804832a6992e8c39fc6cd4a7e87046b8b95fd3", - "5/41": "9538927273f8ba80f075f2cfd7911e20476579adae03484881adbfd885eff657", - "5/42": "8bb1fb7e00503bf3a702929c8cb357d939e74cc4be9847b6abfc3a94bcc1ffb5", - "5/43": "f6491e992bb75bf1d8ef65c401e917925328e2d7360c63c3087dda37f3ed5866", - "5/44": "348302ef1f4c06bf7fbb7444bce4d8b512a170751617e625b83103cec68a10e7", - "5/45": "871c2545bfd14da09a36d6c4ae0da767dc34127d29aa9f336e5eab583fd5f735", - "5/46": "2a9010cb193d30be13bcc974a1ff4e5b2d9e9fb7d0b09608e34bb17fff6f583c", - "5/47": "22ffe9dda7ffca3fed2ef0c87d5b17708c20ce6bbc4fc3dd0db639547ee47b49", - "5/48": "8d4f9a88a2f5f273d6f6a5b8c6f9ac83f0e1f05b93734abff2ae765318c10d38", - "5/49": "ee4e81344fbb8cdcdc4f53936d72640b539814f2bb2666c028e6e1c817237eb6", - "5/abc": "a9faefaf1573d04d2f9488d194213f42f845e707912d8d382e3d9a589e4511b1", - "5/test-seed": "57b986d75fb35282aaf42766aa545b4634565b78d4f5f17dcb46509732416d4c", - "5/a\"b": "5501904a67d59dd72da2298410f3f740a4a8ab1dad3efeb940680c06ce9dc26f", - "5/รค๐Ÿ™‚": "9ec2a4905c785e2f136065360e1a6e01aa2740a28cbb08197074ea48f83e43d5", - "5/78d11f0d5a8bd74e510194e16e4b352a": "0c6f0f28b1601461d52e21fb5cfb0b12de0791bc98c2a8415e95446f9ed59545" + "0/0": "c8507928776c422b67e5b8007fa89ef9d12478401f2e379544dd0cb792b26102", + "0/1": "edc614512141ee0ba1105c1f33545856f92be8b3f401bd611f5189d679a43edb", + "0/2": "3313156cab5ca62327afa947f3cf3fb2f56e00f6b72e0c70bd56cad8243810dd", + "0/3": "de56ef8aac46db5ecf7eb02b87b47d5f424ef0546eaebbd9860ec56c354dc25c", + "0/4": "5ef97b0de37af4f4d13c5a151f4498274d8b2f3d240c09e1a279550319d270ae", + "0/5": "2891d10b174c8f470741d5cfd6580694201d770b64b06caa8adf0a3056dbba63", + "0/6": "70f6c112dbe7743e3690f022dd6d822af8f201f588ea1dd315ad08ef8d585c53", + "0/7": "2df0f36ec96b813e4ebcb4407128c16f65209bc9838924c04bb2d85071d0149c", + "0/8": "eb3f9b0a63ec1b52749c2cb784162e0fba8e8cef07990d8b1d83e82b87e36820", + "0/9": "1682c5f5983db10341449a134485b07a68688c31292922e11836d44b089de1b6", + "0/10": "257d4aa3a5c1d9404e7cc5748e1f35d4077c8df3c176ab09bf23f870caa4f21d", + "0/11": "53fc9ca2477db65068fba859429b573f08b9ac88a58a2b22ba54d4c8a40426f9", + "0/12": "e4d1169433146c0d8f859a1e57d28860493cf2e5b8a692af08113212598c7f51", + "0/13": "ba8b7a4484f8aaaee0a1d993a2b4e698f166a1412c3a16c30228f45e7604a83a", + "0/14": "61e171be3bb074c18f2b53383bcb7c737890c448351640da5faee06070b35fb4", + "0/15": "52787136b43504feb953255ca2bde4c15bf63788f3fa23a5c81a1b4b56d2380a", + "0/16": "c8f75d8ac50719c0eb6694aefe780d21135a806481c8b96044e18f5a93d1be98", + "0/17": "e19739078003c4285f55bd0ed548df236972426b8d0ec10d408f35ef791592da", + "0/18": "7c6ae0a8686ecfd875afd013fa0df2458360497c5232e82425791cd47cf8f8c8", + "0/19": "6cb6f6bc484c298e31cfdd7db45c62c6dcf7e4ee3d448c2f88a16a334505ebb6", + "0/20": "2a41670371522616c162b485e7a3770f499e9739d6b0d8a1795bbce9bfeed966", + "0/21": "00e5109baf758eb4da076168cded5fb9c355035d9d854bb13d470fa0ce040475", + "0/22": "8a73bbb0fd8b23ea8628d07d9d0110922008c3977bced6e3966b6a72150d3a67", + "0/23": "a6b7c6d1a86d41ca65184cb3359cef790601de400db90bcd28c1e7e49eadac7d", + "0/24": "968b1cd8d5042e2c43eab6c066b81736bb6e9e734a37ff956f06871f938338cd", + "0/25": "33d8dfa2012909608600a17d86312125fda003114f7f6418163687f82f03daf2", + "0/26": "bcb64d7aabe31512902c0102f955cd878c967c1c0e86d225c49ba6b49753b513", + "0/27": "31a0b43a54206702f1ffb5fcbc2a166117585140ca0765c02ffa2e81e23718f6", + "0/28": "0c5f05cb80bfcbe2c910c54a686656b88909879c34c46a62f83c338707006ee2", + "0/29": "54213bb0a295329c703bcade5947f1c35c95a840904248a2093a7d967c3754c4", + "0/30": "97e916f953eaa65cdafd0f3bd4572a0d7a4b9c070a3837ff8958754ca4e7857c", + "0/31": "10fac9716857614d0bd243012807709a5e6653606a5cd0583768ceffd34b991c", + "0/32": "0c413bb085cd99eec030de51231ab28243b6f045273a62416bc9e65db827dba4", + "0/33": "c715480b168dc0a196bdab633e90f4bc400cdedce51e599c69ceb191a2b27c71", + "0/34": "0097ff7eef5283505e21abe09ea66da21ccdf783d6fc2dd0e798aa79c938fc25", + "0/35": "8aded6f1843133ec4e472d487999cd8e3e6e8aed53557961305ee1dd27d55389", + "0/36": "dea3a6022f01f97a45fc24e781f6f0ca2bea326ede66e6f69ec599bab20cd11b", + "0/37": "e6582bfd8252f3e2b195e05f25fdc7b8a65168af43cc2127d0c6212dbd5425b1", + "0/38": "cd6e227fd85c5e36b3426880fd4fec3f2bf8c8ee88c15b4c0ed05cc05b6dcc4f", + "0/39": "a25632f514157cc215e2160263eb0049b160799dfdfeb6f558dadc8c1eb5921c", + "0/40": "2352142ab3a15476eff7cf39273b68d9623a2688d190675883dcf74b9f02dfd9", + "0/41": "7972b4628848ae244d8081398ed66411466070a12bdd3662fbcd89872b08d418", + "0/42": "e22c90485a479738b39259bff6460ba7acaf5d2c8282db2498a7f73edf361246", + "0/43": "8d6980165ac659eeb1e466875e0c8f687ba2f0b05cad2b163977d38fe98746c4", + "0/44": "6bad44a6844343c02bd53bf6be9a78d04040e6f570e59fa7d9a6572da4cb1a71", + "0/45": "98f3f734bc8aa1b621a3f24ab45e436e0fd27e3b1f5ced7711585d3d9463b5ba", + "0/46": "efae5484fcf32ef92629f08dbbb4c1baf8184de50f4b74d2d7f25bd063e3bb42", + "0/47": "69cdf5d3d490a6f579a45276f8dcef5248e495e11ef6bb3c02579c1319100dfb", + "0/48": "c8da3c12292359088a74536bd26c6e937710ce2ffd33411c176881956c2ded63", + "0/49": "2317242bee50313cc6e39ca83c5673bb2031ac37ae1619a3adb1e6fd40d005fc", + "0/abc": "c4742b5217a57cc8d4703eea635250d1f03b1e10d52c17bd3ebf7e9c267f8542", + "0/test-seed": "6f71a57c4c77e0b26f0a75a22106d525f870095d4ae3081b793e25be90b775d0", + "0/a\"b": "73f7082d19aeb242ceb8755ea5a4ef0f2aeda9b7d0433cc48c3525b94cb92b5f", + "0/รค๐Ÿ™‚": "9f8070e652aa2f696c41614214f80d7b938479b810d45524b27bd12d54ce627c", + "0/78d11f0d5a8bd74e510194e16e4b352a": "3ad6ff298310557a2ad1b40ed24b80c6853030d7c68b83074dd610b942a9c3be", + "1/0": "9cb52019f17e7a7d5c3a7559b3a97989ae1853b5d35c3a07c23e605d98174415", + "1/1": "9be84f12c587aca977e29efaa78b90473f917338872540b23b1ab7b1c6c3f24e", + "1/2": "66dffb55aa0e0b2ce3887a8dfcdba64ef6143387cf607e80b2a2f6e9cf2a6722", + "1/3": "e78b16ecc7a76214ea6aa4a21d1ea204038d0c26c9da94449d8b8dee0b8da9fb", + "1/4": "a584ddabf92045fc59bba5e85b7f4bb8d955638552e80ed745ae66ccecc14c8f", + "1/5": "a6560047ac50d74c86854b7b87fc41dd45890d18e389ab165ce669bbc2e8bd88", + "1/6": "bd7d67fc392a335a0587702790a9a3326004115acab68f0366cd7a0abab6b4df", + "1/7": "5fcaaf3840b484f37bd4ab86c0cb3fc0aebc120e00782829490d01041d19a835", + "1/8": "d1e6b694ce0aa0e827bb5c8752edd483c1d6c5378e64de3822b8c50fa1a435a9", + "1/9": "9320d66878ac08f8ac82957e472e3c731958b2a9a9107ca78a07c3e3233a7ca5", + "1/10": "63b1219c8026efeadab771021fa99b731c2ccb043223a076191d924088b12838", + "1/11": "83a081db1080b81b90d077764efb5f6c053a56b546dbcff2223da30f6b6b2569", + "1/12": "5b65baddb93763286bc8dfd8698d755a8c5fa40ac549831a2609c065318e8e04", + "1/13": "eac11b1209908cbb7df6231f5eac2e789ccad53436ed7d44e189ebae47dd4521", + "1/14": "97347d9537f6b8f999efb3f1abc9f859e0a3d7b3f9b2dec636f743329cf9a424", + "1/15": "7bc91ed6f55f534b12ec6c7bb2882c33da42a1b1f0a899154a474e1aac5d73f0", + "1/16": "cb9a1d4a1800befcf9bb95abcf95691700abfa7b5e6809f0d8995d6adec2d338", + "1/17": "12d99a8e437601905e9cc76bc66a47b75161d0ecf2ce51d46eb61e8be36c5b6e", + "1/18": "6134201ddcaf115fe8526a1d2e75e1fb27433945bfbb233b3934cc3e864713e7", + "1/19": "943e0313f77044e9f0ac2cc5bd131823d71b2e6a6ae773b23bd9b438ba992232", + "1/20": "688abfac1eedb9a284226041508564157836bd3bdea8e88ec16f0bcf16f7882c", + "1/21": "738ef3a4ea8077dcfb58a9772375b12798a5022cd6233ffe53e392cd67eea96f", + "1/22": "39f9080eba140c22674003c09004a121d65e5e1cfcb1aa6b247e393819a8246b", + "1/23": "60c2cfefc50a7b374999c0dbc46992c9de892fb799f6c1345399e7a306a0bbed", + "1/24": "14849ef96273a3acd8c731ab49db7e94f5d30e2779957a957318e98770257769", + "1/25": "44c3325a8860d04b4d138ac5b7a23c07dc43cae0d1df3b197000f3311cda2664", + "1/26": "777f8863021c730930d74b1cc66c01540206c27c324e54f7d89f362d3ceba8cd", + "1/27": "ebf6415db594f04342576d1880d28a611e4d48bb223f24f127dc07b98a44615e", + "1/28": "6bc61a57b74708d120a71e10d36be8dc90f35289a986d93280b3a5167903e682", + "1/29": "5204bbc66a784cff72bfba7d9a2da3f6aa191aaf362fe9f842100af07a71fade", + "1/30": "30859eef09be062cec7e8947be9a462c7d7033dd6a5bd76ec0865ebe8795a5c9", + "1/31": "690652b779907f48290e0061e840354b5fd8ccae9e9590025e08e6ae091c6456", + "1/32": "849780e691ce32f6bbc19149388c8eafef3edd6ce9965b9f62feb85ad8ebfe62", + "1/33": "6305234d16d7fed3862ceeb18bf02bcd1735f3deb0b91ef30bf9edd3ab69522e", + "1/34": "07a03aeb49f29a302a9925315c260822cd27d96d36152b0309f42370743c0fb0", + "1/35": "e7b21c5c16951a4ca0e3f04db6f11f1ff9fd0434f2149335fddb0ad06204e518", + "1/36": "d641e3d9362a3b413c2ff9c9f3b29fc679a828ee764cd385b02a55fafb512cd5", + "1/37": "131251ef0ca054d7a311933f0f0de27155715b9b5c71bde5ffe3fb47273ee76b", + "1/38": "ffa52072a21b5d4aa44e293bdd091ab57c9589d73d468f66d8c4a30f4f03b4d7", + "1/39": "86959c8afb3b12c57e1c352ae63c408c08c7a2233824b787c11f687bcb36a6d9", + "1/40": "5b1264d1e7de6f10496e66ee6df62e1f18115bc688508ba690fafa9d9c71ecb2", + "1/41": "6bce5b0b84d405fc90f31cee870d379ea8b86c013b7911c46ae705ffddf13e52", + "1/42": "a768e45dd3183dfbcff27f69f7d7a9e434e8b2be65e95602f052331bc5be3a4a", + "1/43": "c33f19aa94f28bd33cd67edd15e99f331a6e9beb29cbe99aa259094b4bcfabc8", + "1/44": "d686609d340a1d0d91aa01c06799bf0b2c0ebdc07d33f357ee91ee2da3c7bace", + "1/45": "5b39750465e9b2798894fc0ebde0eb433ec0b97cf289bdfe1457382137e89729", + "1/46": "beb0ce5f0104f68a4e05cc8d889fa11ec55663ada404a4af9e49d03cdbcdc707", + "1/47": "d85d3fe9a086627269477f1095ce696c24112b8f944d6ae7d94330b785ff26f0", + "1/48": "6fca2da4fc0615642d3443e27d79a3060e11bc4d13474d2297f0ec61f572b360", + "1/49": "2a8b4cf192d898c2b1a521ed5fb8c3c9033d82ad44c5ffa2dba53daf85104699", + "1/abc": "b2b16d510039c17b890cc43678f935e5a5a67b1180e59555d1eee742c0ce75ea", + "1/test-seed": "efa08c4cfc593e040bb9cb2ab121d01b606dba4067985eead14145bb224e6125", + "1/a\"b": "2c25953d0f265651501fedb620920ff8fa7a14d9052218095eed431f58bfef80", + "1/รค๐Ÿ™‚": "bb2dfc8ce44a9f84aba2c2e04c6f580c6f59708fc1b0ebabd51b721d67f4eaf4", + "1/78d11f0d5a8bd74e510194e16e4b352a": "8b8ab0f0ce901d54af7354c69ebffb3ad800680038818896093f5ee71ada8dea", + "2/0": "7744b1ad9e1eeb4da4b378365f188519b5b0c4e8e6937a72f7cdf38e2a3c5ea9", + "2/1": "b68e8eebcc91782b6ad4480d028e6f21e5c58350e8a3b858d4bb66c61e70d49d", + "2/2": "13ea7d7d61ccc72dc21f6100953c9e2383edbd4ee564e54acd184305aa3ebcee", + "2/3": "056b83f7dea6e5052599ab87b5899e7f539a857c9e159a075a5992278fd3cb14", + "2/4": "b6d66ab174a59f3ee9e78e7e24e15d2d14f1492d1725cbf1c03989fad2fa74aa", + "2/5": "45cfbda37588260ed21f2c993105b35fd3d9ce917b9b48e2f41cae18ddcf8854", + "2/6": "de917f93437a15c5e04233b1380514496f2f868a57d751b45f6dad5a006d5003", + "2/7": "ab77b375fb969290e00510705189722411d609bb63d03461d22445a83f17a4f7", + "2/8": "cbd8174418304ee11032d18b7074887f10ad6a519327291947e505680c0e66a4", + "2/9": "c1fd560e3231732f34c5f535883dcb07567ebaf20318245438d772464787a2db", + "2/10": "9d42217c434eca169c81316a3d6ed57f5c75b1ff99e78f7ac2bf0bfcd451cde1", + "2/11": "e74d3eba0cfa453c3286dbc83b0472f75426a4cf80abb9f91e922b5647cfc220", + "2/12": "0b58b15e2a4846d424a0eb6ea8251ebfa8489948783b9caa021a3f6aa9260799", + "2/13": "87e4931db2b0a381f368e598cf505fc71f079def3b6ac298b095805a01f9ade2", + "2/14": "2d2929c4250256886f2a9fc47077f587d79f5f0edf7dc24426794008cc772d47", + "2/15": "fa161c170e6e305dcae3b14f04267f8be66409534539af725f6bf81dd5fea635", + "2/16": "bafb5a707953bf1ef616b161a9b1a9ccea5046154ea6a5ab1454e96d79979381", + "2/17": "55e302ecf3cc4b32e8a7747df153ad45ffca72483506497384fce2e43652ccb0", + "2/18": "97917141a6786036ffaccbb4f6a635e813a52ac8a35714f24664258669be19d6", + "2/19": "47f8a7d3ec7a8e9679f3f270a6cd7678633598909dd7a2228071e6e39c8a11cc", + "2/20": "73475d704865617e01eec3e4c7392cb855d474bb4101fea6b2753681b9a91ba1", + "2/21": "ee089746cb5d2abfcb1dbfd7aa6d62b28c46859abe6a6cc7f8d03e56381cdf92", + "2/22": "77bdb33111e92550d752c2018afbad1afc30b4221f69b279b9f22cb58f1962b0", + "2/23": "bab15cf7a4591bab668f774b833a4463bba40178ed8a0d70734947b280e47717", + "2/24": "d2a4be1ad1b588444a496a9d4177109e2eac40f1814138c99d6d1c7c25c5663f", + "2/25": "7702221b1662abd1bf443e3032f89b56215d0c1fe5c9634e0a33d3350deddb6c", + "2/26": "e864dc4cbcb8ff664853686233225a824b71f49cba2f74deea1e438150804118", + "2/27": "21f9f02871f7a00fa3af4589027f73a9a3eb871d41f769810baa4e119670f869", + "2/28": "6caf998b9e5cfe995cbb00888b54afa407589e7296572a1eeedef292015a735b", + "2/29": "9dc26f87a496dcc921101c0bc02ab11894ecf052250ee9715a3bc9b7d0cad630", + "2/30": "8346d1e58f72138a9a4c10eea24e046655beddc652ad48bbb158ac5aaa8b0e30", + "2/31": "19d7bf06ba2ac9a27845ce70096a5b4ee4e82686bfd164c1f40b6d9dd9ec933f", + "2/32": "ad9bc7443eca8ebc7b853bdf9a77998336fd6dd58b5d42c71747c569eae3e607", + "2/33": "e6e7cc5f4584ac37c169a5d99fe5040bf4bb012f4df2194cd92760d56209661f", + "2/34": "de189f104a00a59999f4c6dac8f413b211cdf6f7c9b175fe82ff0c1d72690386", + "2/35": "ffeab02c6c0c79c6312519c8385d9692f75543591522d624d8c34f2274b0d6e0", + "2/36": "df15adf2a091495eeb57ee5fb7e8f3d09fcad03ad926ecd1ae69de2bc865e134", + "2/37": "b492c3e3b517d8ae018112011176d5aaf78408769d155cb4ee639b7b30522440", + "2/38": "910653cf3f1ce883e8cd7925a9fa072cd4475136c97d7ea4933c994ee0f92623", + "2/39": "3f4976bac66b6f716a52f562fa762ec955f30accf9033738aac708f2843bcb12", + "2/40": "12bcea5baf5e2775aee3b9b7f189efc9902d35ecd9b14ff7bb2df628953c7c2b", + "2/41": "805b66bef72938280669a67e2abcf54b1a27e34356843bdcf122dd4de7fc592a", + "2/42": "7735eee339ec936d56d096d504a80575e649226050aec195004fc55204c573a4", + "2/43": "4d6b9e0fc2ee6818c4b99cd9f9443a96d7d01bfc31cd048723f33a7fa0987da7", + "2/44": "992d3ce85202f6343cc937f9328df19cc850fd5e8391906c0718fac9bdda7f0d", + "2/45": "ad7e3dfbe2156382a419b2d02d73b9ff6bb4d4b43b77aa4e03d5efb7d6dc41b1", + "2/46": "9545da7ad4247b39f9e9798f0509d49d1d6a17591d0844949b20874a35efe7df", + "2/47": "dd32b886c05982bf340791afc414e8b00503a09460204bb0f12cdcaa50d84f26", + "2/48": "afba53d3f44c05d548b5d9fec1d28fd1211658c9354dd86c6815fb2dc1ed8051", + "2/49": "cefaeac881b460b7ccba8be3425788919e7ee5556a13b14737206780ad13eb9a", + "2/abc": "8f7f7a5cca0dedfc2d6c51587b3372849989a8059d5bd6f210a9348a5c29e388", + "2/test-seed": "5e620eac3f2b34e72d8a7c8ab7df3f867cc8a322fe201007bb106a4252e001a4", + "2/a\"b": "74f141cf0f51e4b5d2af40ba576306724b47b8bf3bf40ebdb540d6e5b1143c97", + "2/รค๐Ÿ™‚": "8bd2e06d448161539fa88c87dd846d347021deb9eaabfcfcaf89fb39351ec357", + "2/78d11f0d5a8bd74e510194e16e4b352a": "9719fe64c2ce1a1a5da424e6d9d7749c6052a056fb9401fb02bddccf312d443a", + "3/0": "817ec46d548e109fde64c34bad9687621fcac5cc41166092dfbff871bfc17ef3", + "3/1": "f949b68eb87c80a1f49498982893787293330428c6a592a6ebf5c49e8bfe9ecf", + "3/2": "10ac139de5cef5fd82f942305978161ee6124a153d7f6101768f62cd4d147a31", + "3/3": "b9236eff72197f39adbcc242eed7a7226b93861c8fe237615f4aacde2f3da5f3", + "3/4": "81511d0b59b1f63b0a42bf0d7784dd193b5b410a12ca6eab4503486e36c9900a", + "3/5": "5394316bc713df453a7ff71b0ed14f6edc881010ff9802ba2bc66e84370a5766", + "3/6": "19aa187bca9c9f507e31d02c4ff3edfb661755966450d8bd58b17704ac45c025", + "3/7": "35b75c7080c2b1f12f54af3a618d71a64259c688c66ff08c3f41b106895f139c", + "3/8": "31614f4ac2a4568e24d05f9d5819c90959c0a09ab914432286d52bd10739f06c", + "3/9": "46130d0b18843506e4be65f26d501283fdf0b35736efd6270805d60fb6bc18d0", + "3/10": "84d1699f996f2f1effcbfe80d5ea4704fb88ecdc146c657f90a5b26babf02bbf", + "3/11": "56793d46b90ff63a5c9150a25420d14b9df4a0a4e262419bcd725061be4eeee5", + "3/12": "2b09b77130b55226ddefb3f05868b1ef81db35217a75b767cb2f0b6adc4f49d8", + "3/13": "9b84245b24f2ff21d680473b5e43001e860f7483d8cfb597cb4b2289bfb85bfe", + "3/14": "22aa23a7ef8da10c41da832bbaa62dd16083399c954fb93eb46ac7d2aafed7fa", + "3/15": "9e4320dd820c9bd723f7a23c05e934ca319c39958bacc675b1aba5de0844770d", + "3/16": "84f3e5324309f1974874e0334bb257838a50f0fcaf72667cfbce45c3153484c4", + "3/17": "480ca1967febf05178b200990926746bd8c783563cfdd4ccd1f085d81ea93bc4", + "3/18": "c80b42074b835a61e39a147a5f6bb5ceda4f0d3e99464bb80d7e1000d3c159af", + "3/19": "22c5ba8c0ba90988be0c886b8a9827c11dfb4c5c65df0ed51ba6b6f9860918b9", + "3/20": "e316653016398131c232fccf81acb668ed7bf79ac9761fa6769ae7178dceae75", + "3/21": "d6830009abe4e5cc17e7a68eb8d5699ef56aed2290ba2bbac87d48742ecc9752", + "3/22": "8e41dba7a7cd3648ce3892ca912e1c30f77114f797248a8b61e1949814084b25", + "3/23": "f8b0fddc8ce65c032f9a9da8cfd3c5ff8869f8b13127c7ca4b406ab5a990fd8b", + "3/24": "7a85c130eb1be24d88ee856bced3c0d6682c6f87c8bf4a16c59f2bfb10aa0258", + "3/25": "6ca911b80f76ac3393b78633b715381b88db030110ef923d80ee4e301ee527c3", + "3/26": "ccec48f92e13b598dd1e3ed650eac150a89e36be6d4534655052b0f6b4aef04c", + "3/27": "4a25facb34677bc74879581784687e522a9a0a300beb471ab9f420e8dd9ec621", + "3/28": "281554b87162c73f234c0f6a5712563794f834242748abfb867c3c3891b48d83", + "3/29": "aa6af77ddc146b4aaff93a26d9f5aaa4a0efa9f87d83fd6537abe6d859471cad", + "3/30": "850b5165e6796bd44f187fadc744e279e449ad1a979be5a27d61ae30e2571cd4", + "3/31": "6fced44c57b5f1d986a778cd3f09373ed9488f2f5cbdd3cb922d0ef777fefe72", + "3/32": "9cd53b2103e86c00872d1780d08232e835a6518ce41351ca5e1d1f406916c8c2", + "3/33": "22897d7544ab93b38ca304d0200b5425bbb4c8dd6a0594650327d752c79719c3", + "3/34": "6204029ed29275cfc51309be98474cb78dd8f4a1c07c2072545d165b1b067aff", + "3/35": "b6b42f47ef1d272693cd1fbe156f047381150ba091efd5c11c28b8e89d0aa5ef", + "3/36": "51b5ae0e6a9e27e048e37f89ffd73df59590d75e078baa1a4bab8e0bc98ba5d8", + "3/37": "c00bcaafb4479626dec6d8dd7bccb3f90118b19064671984b2bc5af30ec19d58", + "3/38": "92d9c654ca9f338924e5a55e160abb4cac4ff6ee0a902a1c53682a86dcdbdb05", + "3/39": "bb7c7056b09100470354b8aeb2d295429d1e8b0ae22fe414d8859e283655ec62", + "3/40": "4cd94d4b5aced6f3e8642662d3eda3b9742cd47f84788f37798b43aa80e88d14", + "3/41": "5dc055cd8d584abf061ff4cb75a0d8fcb4533c9a0da05646e4652a0f197e285f", + "3/42": "df6420c96a41f25910cb0d9d5b29908e483279448e3572ae2923a6d3133849e3", + "3/43": "64f0327cae68df4e3b82c37906bf2ecf7cfd3b5318b0342265f997a46d8d8809", + "3/44": "f882120dd43a9b71e541c2d54c1371663da7bcc91e4c28c00b60b2801c9e4084", + "3/45": "2f207a1847236f03fdd0f048cd4071510342c9318a7a13799137629ba752410f", + "3/46": "da2fb995d798c3962338bc393fbd967f4550d5f6c9e8cedf774f7c2096b8f897", + "3/47": "e82b64ec214514c2252c41e4083f76fd785cc7e0d727c372c1774452875dfda7", + "3/48": "ebae8ce56712aae90066d049c4e1f1cee2536f1bf73941bc1ade58311847fbce", + "3/49": "7a269aa17f9bf6335a50223569eb39e5c9ada225030d44c7a54eb388bac5e59b", + "3/abc": "80d2216dd25ea68c0d7e547cc699d0f27f97bf78532409fe4bb221eb62edd878", + "3/test-seed": "9820ae6a97fb558cfe098dccbbb6f45ea986806ba37be88b0ac9ef0b2e8c5b9f", + "3/a\"b": "850b97445a0d828cc8098d7fffaed14bc216923c18510f65e918a853c155985f", + "3/รค๐Ÿ™‚": "c6b6a2559b71a8e2463e8ffe70b286fe6170084307306a5837a7c76fa9b47e7d", + "3/78d11f0d5a8bd74e510194e16e4b352a": "9ef2b54d41c46ae5311ea085f83a73fa64a6b632df1884b846bbb1b69fddadd9", + "4/0": "f0bb570c3bc01361fed1297c72bf6a3ca2df48a6c4a0cf74fcc2759c05f6f8e8", + "4/1": "c5ed7ae8eadac430d5649cac739a58c74c7a8357f0aa47a58da144c5c933f91f", + "4/2": "3ca848d542b58af80e161be0435d93a33336366ce909df689281e46f37a209e0", + "4/3": "3e796076a61b4ff59408a65609b2ccba1046193b2d8dac468592a3bec5763d55", + "4/4": "2b2d9f1390dd56740fcc55b13c08bb3490502d677b8b13b564fee7812b8fa225", + "4/5": "2095ac0d8f79955801399e3c377a804aa35502b57a610e24154a945eb443261e", + "4/6": "0a0feb82b27a81d868de0594f1ea1e6a1fc5dcbac0026574530e036dbc8e139a", + "4/7": "5c122f7ad00fdbe39feba8ef94953acf7a805504de1cc5165aa058c771b3456d", + "4/8": "9cd70dbca3941640e721c3bd1697a905b649723f4aa53192452b3d43c30327b3", + "4/9": "73fc243fb0626137bde9f4d593778a63967f23de4809f771c37eb4aadeb7500c", + "4/10": "596774051cadb5b74c8b5dfaa3099b5c7bc0be5a4231050c3d666122b0704204", + "4/11": "bb7512413ca72612ab95c6b403a16a21e75f42111297dd41c11d2eba1354b52b", + "4/12": "721f101181c9eb8dbc3cee6cc65f9aef488660f769a194907b0c878c3ddec22f", + "4/13": "07fa4e2da15dcebe34ff0f8217bd47256c4d00ebe70e9cc9e493637082644110", + "4/14": "ef5ffc5f47716084fb7f1ee17eab5c892698e08ccf71295c97a9d65ca24c17cc", + "4/15": "740a55068c4d3a8972c21cbfd4e0d7f8b1eb0dd0e7a66e029afe1a2031d24091", + "4/16": "167f5696e5b1a8db34bd96318434a721199f511db63087c5d4dd113ed27681f4", + "4/17": "89aa0b6860493f77cf6c34b0feaf1b0a99e9cfef155bf9abfc7cbcb8a5fd541a", + "4/18": "b0d61ac15188e35d4e2d0525413e914cebd3588f099315a811eed231b76f1e90", + "4/19": "aac4e35924a4a3357eb32668d5772b0b903eab50ba53e44fa3627a5d51af7787", + "4/20": "bdc9101a05c8c678121d51a585c658eb603b9c1a9b63db8a32c5982b1d12aef5", + "4/21": "b1f807bbcc474fbdca4829461d39ffdf0767d933e66913b3a9ed2ebe715d63e2", + "4/22": "dabe15341d4f3371ef89c62f786e88ed9c35ae8e25557410ff6a50894c3ca6cf", + "4/23": "3010eaed7f257112fa71a60d51ce77882fb30932db35e1ca30bed827ad739c00", + "4/24": "c33c2ccb9ad9583566093ab6946fa63cddb284a0338553000d18ce3424b630d4", + "4/25": "565207d2889584653fa9c75766a6f3d2040e264c229885e5d3877e82390f1877", + "4/26": "4709501309deba391b780e5df84b0551885458ca90b6eccfbf695b2b47edcae3", + "4/27": "aacbdef48217f3a4424c33ca25c630d5d865df0bd57c2f27b90a305b71af266b", + "4/28": "6002734ab93bd25d44ac05aa002b57cecd8ea751b54cc83d974652bcf37cb625", + "4/29": "1463683e12e5853e57ba8f571e44ba7fc65a1eb94d1a2967faf3836838cac7d9", + "4/30": "ec65dd73358297f76bdee9d4a170751d031291ab28d65ad2a7feabe0cab91b0e", + "4/31": "6137a1ea996fba81bf08c821a1824a08a2ca2faf0ed846c4eca88a40642899ff", + "4/32": "397181d0f12a241430058eb78fb626bbbd505b4e2bed3e09054cd83305225298", + "4/33": "14ff233ce8e864c05c92370b0255958eff8a6866de2d28c006d4dc84ea249223", + "4/34": "62d7cf46fa7f6418c980b0432aa0a1253fb468aca9a3a73eb95aa29992c94fe2", + "4/35": "ab0de1ae6adce236cca276d64912e1acd2b82874d6ad5e16ceb0d872cc33304f", + "4/36": "5443ff14324697436349336ba5f1d32b127904d0387a3d89000915e1ac801d64", + "4/37": "6f20c88b58bb95993659f88b030b0cfc2ec83f3c69fd99035f835f2efd5845bf", + "4/38": "3aa017d02dc2dc1f6a7096b3f97567d5f7e22e47d2c67a427d7e7cedf75211d9", + "4/39": "59aabc994a2858513f7d6966f0be02b419501955090dbd64202c6434447184cc", + "4/40": "9ee21449a7f70cd4e88316bbb2da1fb94e52a42d4f433f84507dd365a1831217", + "4/41": "c9efc706b04a822f74d92c51a6f2b828ff11a55468c7046168320c4b4599a229", + "4/42": "73a9db9464e2c542b38e9f7f575647bd3f2c51c3cc95a60522cc0564e407085f", + "4/43": "eb536375fee7c33449953d2d749b477611bb9dab4aa79cd0db3a8bfc6c068bfd", + "4/44": "43faae2895eb3526486b4fb9a98cc2b73c62c4628e1afe3d43d7fd30b7e3c591", + "4/45": "f4eb77e6f5971f33a683309dfa80bbce22abcb6ae8766fc5e300af9a56e9f795", + "4/46": "3664bacbfed7b89f8c59c98e15d625589303ae69547ec0ea2fba338c3185efde", + "4/47": "051a145a18beee1d7e933024ca0326b2c38764f2904a18526acfc568c6ea3543", + "4/48": "5cbfef0417e99b21a669bf4a2c4f54205b0ab06f76dc21ab52be5ed305f886b0", + "4/49": "254cc8f7934c22f8c13501d9caadc7a21cd528416818426e99d049e4935c9ea4", + "4/abc": "b4fea68c94ccf55e46cd8bb65105ae9d78f97f283985cb53e88a204415b7319e", + "4/test-seed": "7f50ac490486b5ccc6de19c99f047f639882bcaaf1b553b8a07d4a2ba4fe12e8", + "4/a\"b": "989bc5abefcb12abe5f7d725265305558cee6cae32c233241409666198f448a6", + "4/รค๐Ÿ™‚": "c2550820a7fc4f8103ef646551a428320a7bbc5b082863f1f4f6a3bfd312d906", + "4/78d11f0d5a8bd74e510194e16e4b352a": "0e8f53375d5f03fedfcc8161decf2ac033ab2cd91c7fecea40ef2bde5b9f5f00", + "5/0": "b562bc96b5e777d2167106133330da18f59fa7041efce230b393f8a134ec8e79", + "5/1": "1a6dde990aa04c2e72d46d287baa5a2c7a9f008f8f3ac5c6a9d34ed37371269a", + "5/2": "510599e7669d8d2be3a37da72132c6c8c4be355da7d15dddf5c4f31c197c70c3", + "5/3": "9df9e543d2650fc957708e7636ba91117c63563175dc109d305405500078695b", + "5/4": "2065ea67ce02a7ce6d1ab2b5fc599ff981cabfc58d908e8893c4a9b0a7fae8f7", + "5/5": "094df44d56a5eccbdd2cc72e38cfa0c9a901faa7af60e2fb21e809ca0905d11c", + "5/6": "8dcc024651cb75fba11c36cf9098c7b8cd7f7e409c6d226a50de90e9d34ec707", + "5/7": "f4762ed560efc7c0ad4e6cfdfcb46740d199b35d9ea86b52307948e652b80dd2", + "5/8": "c2c7a1dafd0f000939d49a21f9d14917a2764857cb46f1ec25f6f1222d75e8df", + "5/9": "e9dae735f9fc788c79c2b5a4af5c8b0930b8ee0a36566ff9b43179683a37f50c", + "5/10": "2ae25d0256323a22888d717aaef2aecf277bc97ff99fd2511699f9af8eb7e6d7", + "5/11": "71e0af25417f9e475e4d20729c9613308e9dfe1ff2c764bf2bd8e1dd0d566b50", + "5/12": "72e0eb230f5b4e831608c290980108eec782ccffb9e1ef2a143bd8d326ff38bf", + "5/13": "55f7dc2feeeffa252208d71904a56e465111cf53c5dcc080a3c3bb5c37aff9d6", + "5/14": "697a0f38cd1bc42d89c4ec3521e1edf6524a09018ae791f9b4f1103605df332b", + "5/15": "2457bf5f985d1d319cf4f80950781612115d1fa72ed7137053f31c7f51b25cdf", + "5/16": "037dbaec386e372bd511638aea4d08667801cbfe5db87a11f275b0b6c59aaf52", + "5/17": "0266e587f0c19318376e08f31f52b31c4d528cf8e78c4c409b5b6ca8d045feb3", + "5/18": "88870b526a019b54eccfedf1be33a667ec71d9563ba60c351fa518d91442b840", + "5/19": "3a35aa5ae857a514cc873038dfee3532533ffed642848413101f82359d811a41", + "5/20": "2139cf1d6e23cbb7efd37759065fcde772e7cfef385a068b209078486d4d2ae6", + "5/21": "8b5fa9dde4f8f1ece2ddb5a36b106c59760e8387da7142b32c0f068320a9391f", + "5/22": "a82ee865b8603acac5ba18a921812ae65904a8d4e7436241e78626845a910a1e", + "5/23": "0c52913ae5764cc347e891bd907e3e7a2c65d0ae5168cafbd1ed84121fc06f07", + "5/24": "582cff136956e703b1f0a3df54759f38d83dc3e25a79483d9219dbd9cd9ed156", + "5/25": "e63bceed6e81f69f507f7590f17c6b9f577b2c32283da4dfc5e0d5aa1719ed30", + "5/26": "fcf2644fcbd4dcb9a32c1d9db1273da83359ff472374ac0caa405ce3189bb962", + "5/27": "c0c75ea5560b91a763c99171a004213363edb5ccd561ad9ae6931f3e3f4fbc47", + "5/28": "c96b2c5881f50356ff01ca1cce930180d911848259ed00defd1eeacc09cac6e5", + "5/29": "ec2355216d86e54066cb1efad13e6d8f35b55218f5df6dc32c0e50e0fd58170d", + "5/30": "afac279ad34f1d1de80a1b7021039aae987bc2b027adbbfd2028f6a2bffd284f", + "5/31": "51b8f9f25b263da76523f75b84286bf3bdc0b0cc629c43eb13d281bf65c10dac", + "5/32": "6be78691c08db84b7c938450b599372a28186c982c68a98f45aff4a3835a437d", + "5/33": "1b8b42762de7db0ba05afa1538427e6b245c6975b3d653ebad7f69c8bc077e3e", + "5/34": "788872f975b70cd6f040ddafc8f7f7ace52a72688e93116dae4b3c281b95499a", + "5/35": "00c6be2ead8fb226e9132fdd88d511f1b14eb3906bd7f496ecddb9eecbf822b5", + "5/36": "159d65ab8ef5e8f5adda30b2027acbe0516203e3f53db023f2295c7ca5b1cc6a", + "5/37": "199753cc1793771e7b14445e8d47e2f568c81a35c6bed5b25ccb7bbba0b5cdfa", + "5/38": "1911c2b1f19f8ad6c8cc93194b688e4c2c7f634087069866578ef9435c80f4a3", + "5/39": "5cca007df6efdf2d0302b3749803d6696ee99ead3dc2430a293b3bacc9ac2e62", + "5/40": "088224553457a17e7b33481cb878122263cba6779fb2637adaffefba4d7ce9eb", + "5/41": "3a06724d91228abcc737ffaf74ad7de6b8668699877c52b8b84eb17c04031586", + "5/42": "e95262452380908e54ed670cee5a80a8e677f087b363f7fdadd5c63b9bf5d886", + "5/43": "c6f0c7c32773055a2df214823ca6f4cc3b8c438df396983dcba9bb11be9e8c1d", + "5/44": "89ae325d719e24e8b3cfe600d8ef63bc1211456c42babac13b601c997e3c84a9", + "5/45": "9910d66707f8b6eac61b0493ff371fd9b5a2cc49d230b40278e61c6fd543da8f", + "5/46": "2d6582260c8f9b721374a5faa82c0f90c60d99550a3dc358d4bd51ce89c59164", + "5/47": "b45afa2f4c2ad8533ecb73777bf40a8de38a911e3241842a51889b52171c31f8", + "5/48": "7f9ffc7e3f96d640cd8a90c32436d5e43a91c5c995550ca0d0bf70db221748e4", + "5/49": "d6473a5dd99fcfa6a2d654eb147d9e43d1e98cdc2cdc813821e4f170fed80385", + "5/abc": "45dcd34518dba3688251bf31c9122a5983b3f43dbafef17edcabeea33dc4ecd5", + "5/test-seed": "fea0e6688559428b5652a5e3355c2678ba91c07da1438058b139b5d816dd14af", + "5/a\"b": "ce72e365a3777a2a88139f3ce665b603c299b52f03e88e621e72be54642ce474", + "5/รค๐Ÿ™‚": "420940d9425c0f7e73f622223dd58b1db7b862604f30e3d440a322028d7dee54", + "5/78d11f0d5a8bd74e510194e16e4b352a": "ad6826a1d7dc861b1523c1670c5f0ccfbd8769ed4e2f691148b9f8a46b6bfc82" } diff --git a/test/seed_stability_test.py b/test/seed_stability_test.py index 2aafbda..6cf8c19 100644 --- a/test/seed_stability_test.py +++ b/test/seed_stability_test.py @@ -30,8 +30,12 @@ def _floor_hash(seed: str, floor_id: int) -> str: generator = Generator(seed, "floor", stage_id=floor_id) generator.generate() + # Only the floor itself is pinned, so new metadata does not change the hashes canonical = json.dumps( - generator.to_dict(), sort_keys=True, separators=(",", ":"), ensure_ascii=False + generator.to_dict()["_floor"], + sort_keys=True, + separators=(",", ":"), + ensure_ascii=False, ) return hashlib.sha256(canonical.encode("utf-8")).hexdigest() From 065859d9ae2001e461c0dbb740e096c71c7a638e Mon Sep 17 00:00:00 2001 From: Joltras <72395471+Joltras@users.noreply.github.com> Date: Tue, 3 Nov 2026 20:12:48 +0000 Subject: [PATCH 2/4] feat: store the floor id in the floor json --- readme.md | 2 ++ src/floors/floor.py | 3 +++ src/floors/tkinter_floor.py | 1 + src/generators/generator.py | 19 ++++++++++++++++--- test/generator_test.py | 32 ++++++++++++++++++++++++++++++++ 5 files changed, 54 insertions(+), 3 deletions(-) diff --git a/readme.md b/readme.md index 50ae4d2..47e2c59 100644 --- a/readme.md +++ b/readme.md @@ -96,6 +96,7 @@ A negative floor id returns `422`. { "_width": 9, "_height": 8, + "_floor_id": 2, "_floor": { "_seed": "2", "_rooms": [ @@ -123,6 +124,7 @@ A negative floor id returns `422`. | Field | Description | |---|---| | `_width`, `_height` | Size of the floor in rooms | +| `_floor_id` | Floor id the floor was generated for. Together with the seed it reproduces the floor | | `_floor._seed` | Seed the floor was generated with | | `_floor._rooms` | List of all rooms | | `_id` | Id of the room, unique within the floor | diff --git a/src/floors/floor.py b/src/floors/floor.py index 9f60546..583f3de 100644 --- a/src/floors/floor.py +++ b/src/floors/floor.py @@ -38,6 +38,8 @@ def __init__(self, height: int, width: int, seed: str): self._height: int = height self._room_id: int = 0 self.seed: str = seed + # Id of the floor the rooms were generated for, unknown for old files + self.floor_id: Optional[int] = None def top_left(self) -> Tuple[int, int]: """ @@ -99,6 +101,7 @@ def from_json(cls, json_string: str): floor._rooms.append(room) floor.add_to_floor_grid(room[0], room[1]) floor._room_id = max((room.get_id() for room in floor._rooms), default=-1) + 1 + floor.floor_id = json_dict.get("_floor_id") return floor def add_to_floor_grid(self, x: int, y: int) -> None: diff --git a/src/floors/tkinter_floor.py b/src/floors/tkinter_floor.py index 7aec780..14e1576 100644 --- a/src/floors/tkinter_floor.py +++ b/src/floors/tkinter_floor.py @@ -63,6 +63,7 @@ def from_floor(cls, floor: Floor, canvas, name: str): name, floor.seed, ) + tkinter_floor.floor_id = floor.floor_id for room in floor.get_rooms(): tkinter_room: TkinterRoom if isinstance(room, TeleportRoom): diff --git a/src/generators/generator.py b/src/generators/generator.py index c986f92..13a4dfc 100644 --- a/src/generators/generator.py +++ b/src/generators/generator.py @@ -55,12 +55,15 @@ def to_dict(self) -> dict: Creates a dictionary representation of the generator object. @return: dictionary with the size and the floor of the generator """ - return { + generator_dict: dict = { "_width": my_globals.FLOOR_WIDTH, "_height": my_globals.FLOOR_HEIGHT, - "_floor": self._floor.to_dict(), - "_generated_by": "python", } + if self._floor.floor_id is not None: + generator_dict["_floor_id"] = self._floor.floor_id + generator_dict["_floor"] = self._floor.to_dict() + generator_dict["_generated_by"] = "python" + return generator_dict def to_json(self, indent: int = 1) -> str: """ @@ -70,6 +73,15 @@ def to_json(self, indent: int = 1) -> str: """ return json.dumps(self.to_dict(), indent=len(my_globals.BASE_INDENT) * indent) + def set_stage_id(self, stage_id: int) -> None: + """ + Sets the id of the floor that the next generation creates. + @param stage_id: id for the floor (must be 0 or greater) + """ + if stage_id < 0: + raise ValueError(f"stage_id must be 0 or greater, got {stage_id}") + self._stage_id = stage_id + def _seed_random(self, seed: str) -> None: """ Seeds the random number generator with the seed and the floor id, @@ -83,6 +95,7 @@ def _create_floor(self) -> None: Creates a new floor. """ self._floor = Floor(my_globals.FLOOR_HEIGHT, my_globals.FLOOR_WIDTH, self._seed) + self._floor.floor_id = self._stage_id def _add_new_room( self, new_room_tuple: Tuple[int, int], room_tuple_queue: deque diff --git a/test/generator_test.py b/test/generator_test.py index cffa188..5bc5184 100644 --- a/test/generator_test.py +++ b/test/generator_test.py @@ -320,6 +320,38 @@ def test_every_floor_has_one_super_secret_room_next_to_a_single_room(self): self.assertEqual(1, floor.count_neighbours(*position)) self.assertFalse(floor.has_boss_room_as_neighbour(position)) + def test_to_json_contains_the_floor_id(self): + generator = Generator("abc", "test", "", 3) + generator.generate() + + result = json.loads(generator.to_json()) + + self.assertEqual(3, result["_floor_id"]) + self.assertEqual(3, Floor.from_json(generator.to_json()).floor_id) + + def test_from_json_loads_files_without_a_floor_id(self): + self._generator.generate() + old_file = self._generator.to_dict() + del old_file["_floor_id"] + + restored = Floor.from_json(json.dumps(old_file)) + + self.assertIsNone(restored.floor_id) + self.assertEqual(self._generator._floor.get_rooms(), restored.get_rooms()) + + def test_set_stage_id_changes_the_generated_floor(self): + self._generator.set_stage_id(4) + self._generator.generate("abc") + + self.assertEqual(4, self._generator._floor.floor_id) + expected = Generator("abc", "test", "", 4) + expected.generate() + self.assertEqual(expected.to_dict(), self._generator.to_dict()) + + def test_set_stage_id_rejects_negative_ids(self): + with self.assertRaises(ValueError): + self._generator.set_stage_id(-1) + def test_save_writes_the_generated_floor_to_the_given_path(self): self._generator.generate() with tempfile.TemporaryDirectory() as tmp_dir: From 668b60b286b0546a9a9d58dcd535f52ad1c574d5 Mon Sep 17 00:00:00 2001 From: Joltras <72395471+Joltras@users.noreply.github.com> Date: Tue, 3 Nov 2026 20:14:54 +0000 Subject: [PATCH 3/4] fix(ui): add only the final floor of a generation to the history --- src/generators/tkinter_generator.py | 8 +++++--- test/tkinter_generator_test.py | 8 ++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/generators/tkinter_generator.py b/src/generators/tkinter_generator.py index b32f2a0..60c3df5 100644 --- a/src/generators/tkinter_generator.py +++ b/src/generators/tkinter_generator.py @@ -61,7 +61,9 @@ def __init__( def _create_floor(self) -> None: """ - Creates a new TkinterFloor and appends it to the floor queue. + Creates a new TkinterFloor. + The floor is added to the history once the generation has finished, + because a generation can create several floors until one fits. """ self._floor = TkinterFloor( my_globals.FLOOR_HEIGHT, @@ -70,7 +72,6 @@ def _create_floor(self) -> None: my_globals.DEFAULT_FLOOR_NAME + my_globals.JSON_SUFFIX, self._seed, ) - self._floor_manager.add_floor(self._floor) def _generate_and_draw_floor(self) -> None: """ @@ -178,9 +179,10 @@ def _redraw_floor(self) -> None: def generate(self, new_seed=None) -> None: """ - Generates a new floor and updates the legend. + Generates a new floor, adds it to the history and updates the legend. """ super().generate(new_seed) + self._floor_manager.add_floor(self._floor) self._update_legend() def _update_legend(self) -> None: diff --git a/test/tkinter_generator_test.py b/test/tkinter_generator_test.py index 3fd3cea..6f1b3cf 100644 --- a/test/tkinter_generator_test.py +++ b/test/tkinter_generator_test.py @@ -263,6 +263,14 @@ def test_shortcuts_work_again_after_leaving_the_seed_field(self): self._press("") generate.assert_called_once() + def test_each_generation_adds_one_floor_to_the_history(self): + # Some seeds need several attempts until a floor fits + for seed in ("a", "b", "c", "d", "e"): + self._generator.generate(seed) + + self.assertEqual(6, len(self._generator._floor_manager._floors)) + self.assertTrue(self._generator._floor_manager.position.get().endswith("6 / 6")) + if __name__ == "__main__": unittest.main() From b6396e13f2ba14cc8b9a6462d3a3af08f59540ff Mon Sep 17 00:00:00 2001 From: Joltras <72395471+Joltras@users.noreply.github.com> Date: Tue, 3 Nov 2026 20:16:23 +0000 Subject: [PATCH 4/4] feat(ui): choose the floor id for the next floor --- readme.md | 9 ++- src/generators/floor_manager.py | 55 ++++++++++-------- src/generators/tkinter_generator.py | 88 +++++++++++++++++++++++++++-- test/tkinter_generator_test.py | 59 ++++++++++++++++++- 4 files changed, 176 insertions(+), 35 deletions(-) diff --git a/readme.md b/readme.md index 47e2c59..eea182c 100644 --- a/readme.md +++ b/readme.md @@ -53,13 +53,16 @@ The UI draws a generated floor room by room, including the doors between the roo and an arrow from a teleport room to its target. Every generated floor is kept, so you can switch between them. A legend next to the floor shows the room types and how often they appear on the current floor. +The status bar shows the seed and floor id of the shown floor +and its position in the history. All actions are also available in the File, View and Floor menus. | Key | Action | |---|---| -| `Space` | Generate a new floor with the seed from the "Next seed" field | -| `Enter` in "Next seed" | Generate a new floor with the entered seed | -| `โ†` / `โ†’` | Switch to the previous / next floor | +| `Space` | Generate a new floor with the seed from the "Next seed" field and the floor id from the "Floor" field | +| `Enter` in "Next seed" or "Floor" | Generate a new floor with the entered values | +| `Page Up` / `Page Down` | Increase / decrease the floor id in the "Floor" field | +| `โ†` / `โ†’` | Go back / forward in the history of generated floors | | `Ctrl+O` | Open a floor from a JSON file | | `Ctrl+S` | Save the current floor | | `Ctrl+Shift+S` | Save the current floor as a new file | diff --git a/src/generators/floor_manager.py b/src/generators/floor_manager.py index d70578a..fcaacb5 100644 --- a/src/generators/floor_manager.py +++ b/src/generators/floor_manager.py @@ -25,20 +25,21 @@ def __init__(self, output_file_name: str) -> None: self.current_floor_name = tk.StringVar() self.current_floor_name.set(output_file_name) self.current_floor_seed_var = tk.StringVar() + # Floor id of the shown floor, "?" for files without a floor id + self.current_floor_id_var = tk.StringVar() + # Position of the shown floor in the history, e.g. "2 / 3" self.position = tk.StringVar() self.next_seed = tk.StringVar() self.next_seed.set(secrets.token_hex(16)) def add_floor(self, floor: TkinterFloor) -> None: """ - Adds a floor to the floor manager. + Adds a floor to the floor manager and shows it. @param floor: floor to add """ self._floors.append(floor) self.current_floor_index = len(self._floors) - 1 - self.current_floor_name.set(floor.name) - self.current_floor_seed_var.set(floor.seed) - self._update_position() + self._show_current_floor_info() def get_current_floor(self) -> TkinterFloor: """ @@ -57,32 +58,36 @@ def set_current_floor_name(self, name: str) -> None: def decrease_floor(self) -> None: """ - Lowers the index of the current floor. + Shows the previous floor of the history. """ if self.current_floor_index > 0: - self.get_current_floor().stop_drawing() - self.current_floor_index -= 1 - self._floors[self.current_floor_index].draw() - self.current_floor_name.set(self._floors[self.current_floor_index].name) - self.current_floor_seed_var.set(self.get_current_floor().seed) - self._update_position() + self._show_floor_at(self.current_floor_index - 1) def increase_floor(self) -> None: """ - Increases the index of the current floor. - """ - last_floor = len(self._floors) - 1 - if self.current_floor_index < last_floor: - self.get_current_floor().stop_drawing() - self.current_floor_index += 1 - current_floor = self._floors[self.current_floor_index] - current_floor.draw() - self.current_floor_name.set(current_floor.name) - self.current_floor_seed_var.set(self.get_current_floor().seed) - self._update_position() + Shows the next floor of the history. + """ + if self.current_floor_index < len(self._floors) - 1: + self._show_floor_at(self.current_floor_index + 1) + + def _show_floor_at(self, index: int) -> None: + """ + Stops drawing the current floor and draws the floor at the given index. + @param index: index of the floor in the history + """ + self.get_current_floor().stop_drawing() + self.current_floor_index = index + self.get_current_floor().draw() + self._show_current_floor_info() - def _update_position(self) -> None: + def _show_current_floor_info(self) -> None: """ - Updates the text that shows which floor is displayed. + Updates the texts that describe the current floor. """ - self.position.set(f"Floor {self.current_floor_index + 1} / {len(self._floors)}") + floor = self.get_current_floor() + self.current_floor_name.set(floor.name) + self.current_floor_seed_var.set(floor.seed) + self.current_floor_id_var.set( + "?" if floor.floor_id is None else str(floor.floor_id) + ) + self.position.set(f"{self.current_floor_index + 1} / {len(self._floors)}") diff --git a/src/generators/tkinter_generator.py b/src/generators/tkinter_generator.py index 60c3df5..f46140a 100644 --- a/src/generators/tkinter_generator.py +++ b/src/generators/tkinter_generator.py @@ -17,6 +17,18 @@ from rooms.tkinter.legend_panel import LegendPanel from utils import util_functions, globals as my_globals +# Highest floor id that can be entered in the floor field +_MAX_FLOOR_ID = 99 + + +def _is_floor_id_input(value: str) -> bool: + """ + Checks if the text of the floor field is allowed while typing. + @param value: new text of the floor field + @return: True for an empty text or a number up to the highest floor id + """ + return value == "" or (value.isdigit() and int(value) <= _MAX_FLOOR_ID) + class TkinterGenerator(Generator): """ @@ -53,6 +65,8 @@ def __init__( self._legend = LegendPanel(self._content) self.show_legend = tk.BooleanVar(self._tk, value=True) self._floor_manager = FloorManager(output_file_name) + # Floor id for the next generated floor, edited in the floor field + self.next_floor_id = tk.StringVar(self._tk, value=str(stage_id)) # The position changes whenever another floor is shown self._floor_manager.position.trace_add( "write", lambda *args: self._update_legend() @@ -72,17 +86,39 @@ def _create_floor(self) -> None: my_globals.DEFAULT_FLOOR_NAME + my_globals.JSON_SUFFIX, self._seed, ) + self._floor.floor_id = self._stage_id def _generate_and_draw_floor(self) -> None: """ Calls the generate method and the draw method of the floor. """ self._floor.stop_drawing() + self.set_stage_id(self._read_next_floor_id()) self.generate(self._floor_manager.next_seed.get()) self._floor_manager.next_seed.set(secrets.token_hex(16)) self._floor_manager.get_current_floor().draw_step_by_step() self._floor = self._floor_manager.get_current_floor() + def _read_next_floor_id(self) -> int: + """ + Returns the floor id from the floor field. + An empty field is reset to the floor id of the last generation. + @return: floor id for the next floor + """ + try: + return int(self.next_floor_id.get()) + except ValueError: + self.next_floor_id.set(str(self._stage_id)) + return self._stage_id + + def change_floor_id(self, step: int) -> None: + """ + Changes the floor id in the floor field. + @param step: amount to add to the floor id, negative to lower it + """ + floor_id = min(max(self._read_next_floor_id() + step, 0), _MAX_FLOOR_ID) + self.next_floor_id.set(str(floor_id)) + def open(self) -> None: """ Shows a dialog for opening a file. @@ -235,10 +271,20 @@ def add_information_frame(self) -> None: textvariable=self._floor_manager.current_floor_seed_var, style="Muted.TLabel", ).pack(side=tk.LEFT) - ttk.Label(status, text=" ยท ", style="Muted.TLabel").pack(side=tk.LEFT) + ttk.Label(status, text=" ยท Floor ", style="Muted.TLabel").pack(side=tk.LEFT) ttk.Label( - status, textvariable=self._floor_manager.position, style="Muted.TLabel" + status, + textvariable=self._floor_manager.current_floor_id_var, + style="Muted.TLabel", ).pack(side=tk.LEFT) + ttk.Label(status, text=" ยท ", style="Muted.TLabel").pack(side=tk.LEFT) + position_label = ttk.Label( + status, textvariable=self._floor_manager.position, style="Muted.TLabel" + ) + position_label.pack(side=tk.LEFT) + _ToolTip( + position_label, tk.StringVar(self._tk, value="Position in the history") + ) def _increase_floor(self) -> None: """ @@ -280,13 +326,31 @@ def add_buttons(self) -> None: button_next.pack(side=tk.LEFT) # Right arrow to increase self._tk.bind("", self._shortcut(lambda: self._increase_floor())) + # Floor id for the next floor + ttk.Label(button_frame, text="Floor", style="Muted.TLabel").pack( + side=tk.LEFT, padx=(20, 6) + ) + self._floor_id_entry = ttk.Spinbox( + button_frame, + textvariable=self.next_floor_id, + from_=0, + to=_MAX_FLOOR_ID, + width=4, + validate="key", + validatecommand=(self._tk.register(_is_floor_id_input), "%P"), + ) + self._floor_id_entry.bind("", lambda event: self._submit_seed()) + self._floor_id_entry.bind("", lambda event: self._tk.focus_set()) + self._floor_id_entry.pack(side=tk.LEFT) + self._tk.bind("", self._shortcut(lambda: self.change_floor_id(1))) + self._tk.bind("", self._shortcut(lambda: self.change_floor_id(-1))) # Next seed entry next_seed_label = ttk.Label( button_frame, text="Next seed", style="Muted.TLabel" ) - next_seed_label.pack(side=tk.LEFT, padx=(20, 6)) + next_seed_label.pack(side=tk.LEFT, padx=(16, 6)) self._next_seed_entry = ttk.Entry( - button_frame, textvariable=self._floor_manager.next_seed, width=34 + button_frame, textvariable=self._floor_manager.next_seed, width=30 ) # Enter generates a floor with the entered seed, Escape leaves the field. # Both give the focus back so that the shortcuts work again. @@ -360,11 +424,23 @@ def create_menu_bar(self) -> None: floor_menu.add_command( label="Generate", command=self._generate_and_draw_floor, accelerator="Space" ) + floor_menu.add_separator() + floor_menu.add_command( + label="Higher Floor ID", + command=lambda: self.change_floor_id(1), + accelerator="Page Up", + ) + floor_menu.add_command( + label="Lower Floor ID", + command=lambda: self.change_floor_id(-1), + accelerator="Page Down", + ) + floor_menu.add_separator() floor_menu.add_command( - label="Previous Floor", command=self._decrease_floor, accelerator="โ†" + label="Back", command=self._decrease_floor, accelerator="โ†" ) floor_menu.add_command( - label="Next Floor", command=self._increase_floor, accelerator="โ†’" + label="Forward", command=self._increase_floor, accelerator="โ†’" ) menu_bar.add_cascade(label="Floor", menu=floor_menu) diff --git a/test/tkinter_generator_test.py b/test/tkinter_generator_test.py index 6f1b3cf..8b2b81f 100644 --- a/test/tkinter_generator_test.py +++ b/test/tkinter_generator_test.py @@ -269,7 +269,64 @@ def test_each_generation_adds_one_floor_to_the_history(self): self._generator.generate(seed) self.assertEqual(6, len(self._generator._floor_manager._floors)) - self.assertTrue(self._generator._floor_manager.position.get().endswith("6 / 6")) + self.assertEqual("6 / 6", self._generator._floor_manager.position.get()) + + def test_generate_uses_the_floor_id_from_the_floor_field(self): + generator = self._generator + generator.add_buttons() + generator.next_floor_id.set("5") + + with mock.patch("floors.tkinter_floor.TkinterFloor.draw_step_by_step"): + generator._generate_and_draw_floor() + + self.assertEqual(5, generator._floor.floor_id) + self.assertEqual("5", generator._floor_manager.current_floor_id_var.get()) + self.assertEqual(5, generator.to_dict()["_floor_id"]) + + def test_page_keys_change_the_floor_id(self): + generator = self._generator + generator.add_buttons() + + self._press("") + self._press("") + self.assertEqual("4", generator.next_floor_id.get()) + + for _ in range(10): + self._press("") + self.assertEqual("0", generator.next_floor_id.get()) + + def test_floor_field_only_accepts_floor_ids(self): + # pylint: disable=import-outside-toplevel + from generators.tkinter_generator import _is_floor_id_input + + self.assertTrue(_is_floor_id_input("")) + self.assertTrue(_is_floor_id_input("12")) + self.assertFalse(_is_floor_id_input("-1")) + self.assertFalse(_is_floor_id_input("x")) + self.assertFalse(_is_floor_id_input("100")) + + def test_empty_floor_field_keeps_the_last_floor_id(self): + generator = self._generator + generator.add_buttons() + generator.next_floor_id.set("") + + with mock.patch("floors.tkinter_floor.TkinterFloor.draw_step_by_step"): + generator._generate_and_draw_floor() + + self.assertEqual(2, generator._floor.floor_id) + self.assertEqual("2", generator.next_floor_id.get()) + + def test_going_back_shows_the_floor_id_of_the_previous_floor(self): + generator = self._generator + generator.add_buttons() + generator.next_floor_id.set("7") + with mock.patch("floors.tkinter_floor.TkinterFloor.draw_step_by_step"): + generator._generate_and_draw_floor() + + self._press("") + + self.assertEqual("2", generator._floor_manager.current_floor_id_var.get()) + self.assertEqual("1 / 2", generator._floor_manager.position.get()) if __name__ == "__main__":