Official AKADATA documentation · v0.0.5
Lua
A small dependency-free Lua 5.3+ reference. Native table containing compressed chunk data.
Purpose
A small dependency-free Lua 5.3+ reference. Native table containing compressed chunk data.
Why this version exists
It supports lightweight embedded and scripting environments with the data compiled directly into the module.
Canonical validation
It validates the embedded chunk counts, raw lengths, per-chunk SHA-256 checksums, total word count and the global checksum.
Wordlist data handling
Native table containing compressed chunk data. It inflates the embedded base64 raw-DEFLATE token streams in memory; no expanded wordlist and no external file are used at runtime.
Cryptographic randomness
Operating-system cryptographic random bytes drive unbiased selection and character casing.
OpenPGP verification
Verify the canonical wordlist.json and release externally with gpg (canonical JSON SHA-256 ea0be8d452c422f154358b386c0c5bfc1f4e8e0670f9cd4ddf1a662cb3c96ec8).
Use this implementation
- File location
implementations/lua/aip56.lua- Dependencies
- Lua 5.3+ with the environment documented in the release README.
- Check
make -C implementations/lua check- Run
make -C implementations/lua run
Published source
-- AIP-56 Human Recovery Key reference implementation.-- Copyright (c) 2026 AKADATA LIMITED.-- Released under the MIT License; see LICENSE.md.local Aip56 = {}Aip56.__index = Aip56local LETTERS = "abcdefghijklmnopqrstuvwxyz"local BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"local MASK = 0xfffffffflocal random_file-- BEGIN GENERATED AIP56 PAYLOADlocal WORDLIST = { version = "AIP-56-WORDLIST-CHUNKS-1", word_length = 5, token_width = 7, encoding = "base64-standard-trim-final-equals", selection = { pick_per_letter = 2, candidate_count = 52, final_count = 15, case_sensitive = true, case_entropy_bits = 75 }, chunks = { a = { count = 521, codec = "deflate-base64", raw_length = 3647, words = "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", checksum = "b612a14a1554e6f50172fca68e2e182c1c497e9a04dc97405286ef84c67357b6" }, b = { count = 667, codec = "deflate-base64", raw_length = 4669, words = "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", checksum = "e816cb5954ec2ef00016c4edd7598f518228d58c06b3ed46c39aecf55ded7138" }, c = { count = 700, codec = "deflate-base64", raw_length = 4900, words = "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", checksum = "1a9a1b70a84befb60b031564da9db09ac6cdc2a1f3d4ac8da3d52a257d56296d" }, d = { count = 483, codec = "deflate-base64", raw_length = 3381, words = "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", checksum = "fdb7eb76eea6f303471145a9c70bd83d53002e1bbd6f960ab44f696ffc78d60e" }, e = { count = 198, codec = "deflate-base64", raw_length = 1386, words = "LVTLbuMwEPsly1kDu8cGaNI1UAM10EjWzbKKKvUjbtH6ka/fIWdPgiyJwyE59rbKGvviXTL+/OrdcXl76r0tMu/+yjIE++hd9cXdlsIoN4ehOzzLg9QcXrw97fH87u2fe2t/YRemZzxv5Z3dBl4xH96+ejtz58rdSz275cB0aQly5tLq7eqdH7qpFxJzIxVsbZpc3plr4+RjaSKgpQIIbnMUunbriXIyLXrAc1DKPLgUPyHvAN04OavuQLHDV8hxlpTLwqbTGlDvdCdYmTop66os5M/ADILp6gN7KPqIZZjaJz7nzTTHJ7lZ3xr0UN/eZLH15J1gmm+P6mlscSY83YOn5CsUDA5CrvGMnQmCKRVIYpjD2EHBYHsqQbpzk4uscVLp1njolTUKUTrsoMTJoIJIFw6dflwhnSrPj25IsNEWphv/iwyLBy+Y7nIPuTzYFppqrrT/lPN5PZNL/dGeYZUKCZUAtnSjJMfPGo0pwCOz0CpzjeDpR6IUech7sEakaCqU+GAKjkuTv4sBO/wT8qquSCfPN0Owy94yNnM468Ie5k5IuDhwSXMHZlWmpuY0oNzDAeruLTqKE5s2a5RICWtCiwE6D92oTcMjnxAUW15VwaVj2YwqmQRo+62OFSM0Q3oOD3JlYPhK08HbjWeIBiXoaY7QhViD+p6ybnzEAypYZDR142xiGjEI1RWYtrhCAlvdkF132bkkykMJ0NHSYoAqtconiuxnLGKO+j6ot6pS0gGKyePm8QaxxHCKfJR4v2uuoaeO9jz7828dZtj/GZDIjYa7owk4K5LKem9xZlTBQpj1nIAnBoWYR53Gmh3Zy2eLNuPOARIuOVJ3ay3CUPC/VO864QvDV8rSM1koVPxEy79Gw2DeObdRlTdJ/y/8u3FENROWIULcpGkPBcspMOw3bfqHbQ49CW7a2DaT9cwM4ufIejujUSuYWdqx/wc=", checksum = "cc0dbdfad4be71739452379f5f3e139d04bb0538d0d843ae9dadbf46d4e14137" }, f = { count = 438, codec = "deflate-base64", raw_length = 3066, words = "PVbLbuM4EPwlS06C6LgLhHYMzCGH0BZvehhRbEojjGyt5K/fripmToJskeyuVzMMh7nMpzAcxnr3X+jjUzi92+NeHu1tycLpGnq/8i0+qr29FWu1/YW3ko+u3dvDZSH/sl2eudxd8bCt6/4Dm9WDrYvXkH/a8rHGgrg2W/y3qfs3OyhyXbG2xw2X46A4ldxzPA+/7cexwS5Fx+VOmy1ZvbV1/lKdbDO3afM3nMcC3Sac7LGMdd/YYw74cbme9/jyT8U615o/jvpyxgmDX3nCklVbnDezP/vk+GH/TfjPStLbd4ldlrnOP7jZzkry301/xSftHlWvpdVpe7a7L1QWuNnc8tiuQg9u0+SvoR9jvbNdihtqGfxNgDwadORv9fETgAgeowPnvQQ+1nJLsPQ2BL5dqj22XqrjF+BJbNanf+xtoy/HekAR8bx7BVXnHuSsZ9ARVwLiIskppuqIpmf2YARAE0sH2dixNb/ccjODQJBDGsOha/Dw94D+3B8pq+fpxVpSWeLI3oD8ISONSywJwQPcEsgPLceesTxOQL5Bm+6O3u0EEg6qrhQtyDlIUk5yc32Aekwo2GzpiOeSNTngmSRhoypthi8j1/mOMnUZkTBloVwvlRvvEF98OVM2j5BYYZ1ju4OuM5bk5AB/A5B9TBxFCnqcG5jElIUF/p70QikexlK2CFIdITd9cjOTBu2EAkFO/mQ/GqkfhJwLYkOL9n9NSdWdie5QHV8pRfldxV/ph/j940YI2ixKN4pb9yT+Jv5olsECv2nFGLv1EVoa4kbLzQ9UVjCd2ZeQohVYCzPS6E1g2POpIiuRbS4jWYnpx46WKXS6+6bViljtntgDei/uWEAePgk5AZHj7HQ4wD20553B4l8kvimhK1K7854hAFKRIdRSV3H5LTmu6SHolW/+RgRhkld6mv2ZfT/kIwGJPQ8zkTCUdnIV3THQmy5vRU45yA8weswTY8qzkf5zF2xt3P4NTrHCx0VhZQdBSx15+PfRKM8ULCuNbg4YeHrNbi+K9El5FnkCfEsIkqtY2UINDpgIRF5i7+reGHOTkv3CViysdl+ClZ+c6RwaFmySlUncPksoMsLSNaQ/0pt4S03z9IbyHiQ3zgCoHJ/ElJ8r0sY6YhGmeXAU//Bhm6F3m0eMNbk4KpoX9YBoZrcsqXhS8ZodGHxXEXdV079U2bs4IljJFnJq1xBkBgSkr1aq4xvzjJVdKg4NQQdA8N8z63SrGFNc+DFQ0FMrNxK64iI7vUDz0ATHUhoMF0XQXEovhNyvPCGqlmLWqBulkFFNr/KRZqNTFrihRg7aCAFK1opiW4q8Ex4Lf6o8TZmcVwDs8s78pK6ZWQzHL1J1Qvwy64xwOtzPoS/hBw32TZWIY4FdK5BpGZ9EpKzzHcXgZdHlx8ycVY4zlXcb4tkSunsAPHHARMC0OCrnd/QtS8KV45cmnmxIM2/T9YAjxDFwMX1pGR3k0wyY9d9dMUNFQjY8PePWJtqeotV8T+l2UbAoTd2kOqefsEJHsZdoZ91tnktesO4S9KTeIzPEacpECQxzGlrKyjSLCUjK8kxYZxU5msVYHkwviC5OSquT0m8oFAnTggWMLQkJRWyRaRA9hHyfBkPQXbHeJ6dSbph4Jm8OWqvFVG4KSSEQjmniAdYtG/OZCLd1CLkrRWQ3nXRvzd8YOrpgBUbsRqPgRjF4RYlfNdXUO0T0qTsDRwjjHpNLOU8lX5LtNZ0yID+kW0Kh+xIuQ1eGKuCxFKZQFDPFHHTtle1jGHQ12qEkBYRhxpuALguYzFQWIDcj0A8G+YlF6MaSblaTXDXrqrL+EMCp1rU8Lxd0qVuM8v8B", checksum = "837e8393ca1ceb30d91483f8a3acb47fd9b76a8a33964ba3b1c62a095333a02a" }, g = { count = 431, codec = "deflate-base64", raw_length = 3017, words = "NVbLcqs6EPwlQHEqLLMITlLlhRcBox0CV+SL8KGKh8Fff6d7lBUlocdMd0+PbFY87OXLZnlo7yebFa8cFTd3/LHZlnafMrmtNf+l9rOXlYm9YDLlJ5clPZa0WBlutjpbE2ZbPWSU2epF9j1aLknxD/fhkw96bdynG4q9Ht4waS+yocg4WS4u+7CmnB0mD74zJ7nh0Rqc6RuGOznzbs33yMO20Q0vsiTjRWVozRkrO1lpvldu72TJj4w8IsPkRaIuR3vEZNpmv/IJ9eXMxO5c0sq+rPRAyZSLzQSecq8rrEztUOMwoCT7NM3VIRZJhdtHLilHwlpM2Md/JwICIIvRYRSerhIIioNDZHLR8UNGM5bIKQ6pyPbLL5bUAo9c6yqc+Vozv9F+IsCJt4ekqRIE6O5AQhEsUjKd9xb5FU8AaUrl6OCRu8RC3r0HdLjhztw1wMVe3hGSYr3arCWNpGN1Ge7zFvflB94uSX8S3Va4lX8dQC4n3perwKAsRP3sjrKkTHhYkV7v+AyWkB8097uqZ7kCs3J3F+5reNhyhXoEM04uDU+ZwW0W9RKIiwm74rm6StDNPcEqFlvVMpqpwWLvjr/MiCu9G8gDEJT7FLMd0gBmA7Qr+5Qq0m94u+ACoXjPNPNdUUotqfIt5ebd5Z0azMhmN6Dw5MwfZMQiKZfuwqidibFQmJrYDqFkYcANUAi5nTiZTwqdrzPJaAu1VKMgr4qU+16ILi4Kk2WAt7gEWkL5Qi9bQFmg8LRSSVxhCAHK4p8E+OxoFywSUypjcgOOFh4qkuOymgZB82AZkr+eGqSWKDChv4Pm85m5h4dDnOHewAty/Sc1zfpbOuFPkq4xCreOmlgsi1ly4JkqoiQWEL0gPNXWgk6Gq4bkKkq4JvK91p+G9L3SC8KkIHvKpkicgffMDUwuT1rQH1Q24ZVVvHl1lGBBALz1RLOK5CCIMjTEbGfh5eJLLX2QSIxIk7aGHA4qm7Glh9xqJAaOlPcj1cMz/co0gfwLJ1lxsuRMW4PzialSBYEOvR1aRJ3rmcUO06E+f9VKerpbph2Bh4kvcbJTd2s/ofm+gfl/q8/7tQNjomTDCtfPbFlACZsGcscn6egokwWbImgQLjJle1HV+QPzk2tZVTvtd6Nf80wUycrbYSwn+gSxTuE9UoYEWbIFR/kaSbUMSYVZKh0+RH2yoZRSjbLhsNJiQ3T9Z5u9UfrHKG/tR7QucfYfllpsL9qWVG4pExMp0iCmjq1Okk5oLJBU6Nlh5Uxagr9SijvFnu+1tkg3EPkreU8te8DIOoIXMDHlfWTU4j3Qbp4qZmvN+xTdjd5DZ0hoZPcvbIiyQdMwaJ8UGLHOJdsP7UAnraov2nZsu3B98UFsl0LAkhBPeXbaXmg6edoOZ555Z3vhfVJq2vtV1zODx/Og1yDYw9WljJrc3WYfbMJDhByjWcEyNV8eKRHc1tjKORLzZw9YSFWQl07PFgnI5QnA7do+y6XWB8ifGbNSlSr9kGLmruSYWMw8pVia4YNdJktUkV8QiqPz/deoJ6sYlBx5EMQ3A1WQEGQROzvejfuKGNms3XCklWwisH+kn1apVrLRfk2so3K1+qBTS2cxS5zKUabGkvKVJzKt8G8mD1K+pGP6M1UcHfSxAOn/0OcZ9aOuJmSkxaWniAYHfUEwFdlQsyj5HFECNu+iGOSfiQ9IvMje2TRAKoyak5ZONDbqRCxfIDhpWzoRAlVrR+s66GEHboBRqwmol6utrSqUqUZVBVFINIheeX9D6wHW7Js0JHJUPGMBscd5qdRemxtaVnyHTI2+BGJzo/ikB2Ay3DuC7FEI8tB16tddfIcYglXzKb3Xf4/gRGvlQXJYK/qMgem0/wM=", checksum = "507f742f17ebce1bf526f305c5452da2178effbeb70e87db1021668de72aa86e" }, h = { count = 345, codec = "deflate-base64", raw_length = 2415, words = "NVbBcqM6EPwlB7Kp8AER5JBXta/KYLgJ2IqzyKxjwF7563e6Wz5RAkkz093Tgy+L1Td7X7qtyz98Wdy6w7sv69hnz7a6dAe8PPenwVe17fxpO2PX7Oyx9DhQL32Fx3EsP30Ztq7SS567jNgZJt7pbuPBAhV33FnVi88n+7a0/LZLYXk83PrKvtXrgJW7tc2EeOPpzR6nscLxmQeK355JbP082cv7wDuVtYtD9mkvt9YeJZJHSquix2FGhMB4xcYD9bFDWBSNeLcBK5cJglvH2l8UdtVKgf7/O8zYsgiz43AiSi1qr89DjtXUNjfLTOm6pw6ZhWmwiqr65RcKC1sLeOzO5o14oszAsIZ8nwOliWEtUPlqj8g7i+vIGo4DIdi4Csq61k538WQsqpTfIx4h8jKADCSmDtCBnHcdf7fosT18Kt6bCNgjJY9VcRVKS8faZ6rHsgasxdw2QOIJuFSPJFaWWURyZLjgXB3H6g92ApDS3UW4VGBXk6pEnIAMO7JZ5N2pBSB8WVx8vocKSKrLCXLx1ZJiJV+sPVReH0Xq5E9Mnto16dvLKkjl4U4aXaL4OmBnkXOnVcTVlXlakzDBU4dAYfbckndkeiHIbiFHJhti/dzyzrUHdMXGDrADJMB0jVXG4+7aNwKZd8aeIP9o1Y1DtoeE1STP0sSGoqFrA8Q4Ym9C7FDron7IcQ68s9VyKSuOal+ItgpWNGq3lgFY323zDgIGtLa1E8GShMPjm5iOXbln8rx68Q0IP/eU8JWuYdDhzuLcZgvS1bmrsp56SuM+lmwECfouAs5ik4XBIKRk+ksIAy1Bd9ZHOdEy0CCiVqnf78Aa2iXIW4dABh3xvIqHRfHoYFYY+TPppwMNYRWQlueegFBudxIHk8O3s4xlBe9VnTQYW/K3khW3pC6WVeqW4kvfJO9AP6Ns2OF86aLMY21PrxDYQ7sZ2141rGxKAzK5MA98U+zAE9xe6Evu5A9/0PYUu4GVy21oxgvF53Snm72kKCSu6vcoLSmXOpNn0SDYCOjUb5JTB/GQZsCiRxweYn/m0MjUmzPNUYXlQmnHsDCrPXfSdK495Rbl+skSNl395Q8/tZo0ZVDYygbCYIA+GY99KzwJ8r1LnXqQf7JhOWxIqsZENsnEJwlzr+aalDyKvg3wunB7mCoKs+Gmtm+p1h9chUsP4sKs2iOF4jT4bAtp5C1VCOwOJ78OiRVBZ2CVO4hdWtrJgmxgLpoIHxLKpOGWGoEgQ8IGT6tZnDrH0+6lcgOLBIjboNFqgxYjK5iCULuQt8HwsG2KvdcAG+SYPaYh5gqToEJg6VDdma4fNJbQje9SMle/SAdnKiflKyczIVjG9AOC5P87AwnzkJEgP/XgwWnm1DKykObmTu105KjDLwfhUfLfXsMmObtcY8bOKo1It6rDsz77oH/SW4+a7y/JBzllXJZULiPbOLzNZrK3fw==", checksum = "cb16ec4dd964694308c276b150df35b461e5e03f8eed418a55f9ceb47afa9ba6" }, i = { count = 121, codec = "deflate-base64", raw_length = 847, words = "LVLRbqMwEPwlSOIqeT2plzQSSEGKbPxmG6luiCkKAdJ+/e2M72kF3tmdmR2n1dSa3ml168yH0/VoUVQR0l7KPZwuztSTNRe0+E1wurm3epUy+u2FLYOUcrTHq8ALvr2kpcJPn67OxCWkd07Rl/wmLQfZWTlzjh1xD65t7h7DbLJ6h87OyBQ18w0b9iDok5BQZUg7Z5qbO/XOWGEtw+q5xQaVnPkUQLSbvWxY/CC7yrWlsD4kAcSZokFwjzd/wteTuG7ygtNPwZEghamHZ5G2K0Z3uhC6E9bqQ9GivEaKBuBdOrNntuDa10iAWjsa+eW3nxDm8AUnRG38adHy99mSYMF94jVHT/kqEX5qNdD584/TEwFDdonaHyx1AXeFbge66mbFcrjElpkamsWfKnRmkwu21L8EiMk0ZAXA1JkLvtYclIrn30DRb8BV5FQgX34BDsvJk0c141sLmfW33yJg2daa1hm7BBxHFFFtToiS0TuMhoOm+f6vHVGUoOQ7SGgD9pHgn5WAZ+ygSCXG7bw4nBFByaMZsN4d86Uh8zAzg2MMibHJLcofV6h1kFlGD55n2moknzSrtwiKeMZgSs6y6KH6Bw==", checksum = "afcf11c35e7a463e88a698fe0351510e70c0ad902cda1655d425a1a561324a90" }, j = { count = 131, codec = "deflate-base64", raw_length = 917, words = "NVNBcqMwEPwSRpuUdcwhOHvwIQcLpJsErooN0nqNiYu8fqd72JNKaKa7p3uI2VbDxxiLG5M5xjzVof2M2a2Rx5z4Voa2irl5hu633FbfPuVYohmlJIdO+ppH6kaWSF9xj177UCkfffsrZntLRTDtdyTRRSvr2J6kZP1Pize3SVqGw3vML18py9FckkFDRT63pAK+O28CpsoC+GQGaJkuXvqo88hRDntp2FGEM6AtSpTtC9mb1zMw0Y6JCjBzMw847C4d0PB32N4MBD58BiadEAc9tWxvz1RjaAosbg7dm9BOfVGTKffhCT1TxLSEWsDcZuSV1tl1+ADflV5PS8p4m5PZ+gB983gTIjr4lcDQ1Gq5SWi3u95gvh/6Ym96u+NWnPbZnfItOvsckIoz6mcO8MVeNbjXcwtbV4poRm2/q1ksASYzurC9MZr04mW+4q66Z2uo3zXiPcfEgllKyk3FkkbcxWrMHtYh4iMtKGAYYbJAc0z3Q5cst5V7xqEDUaoe2+PWntnSM0HRnVAGW3lmtPoOOhUMq7+J2PMAJvYTKJoR4jhRS33Sv0PjwM398VwpXVPkoA4iYjudOQpL+K+A6KZ8o6D8Aw==", checksum = "cddb9ee4ef514128043b62c589420ff3526c6ee5063f0ce248be21f6d383e3e1" }, k = { count = 223, codec = "deflate-base64", raw_length = 1561, words = "LVVBkuIwDPwS2JstcpzDGmaq9sCBBPtmJ1MbJiakyCSQef2qW5yo2JbU6m6JaHLX2FM05ezrKdqPrj0fo+m6z2sfTTW3e7nLJpzf5eeejBzmKdY3uTOhfkTzHL2ZonFrMjsJX9L1j9yt0SJ8CjXu+nj+K3FzkB+pEIZjtMjyS+6mZi8BefVDj7JRKuDu/E8O+3BAvU0ECKlgJUu3RFRwP6kG6gsPy5+ILM9tMPqyBogi1EfU88BZrWkAiK+IgGolePfQ6hvtb+VdMYYrUk9MnWfFOUcQ8lyS8dGGnPYSXmRmKRfG5VeyiYWKhUS6KRkJr3JzAM61RTJ5gq/cpWsjh11CXDG2fCIBAP/dHI5A1oKC8trySfY1D9EYKqCs097lC4XKgd3mHy+FrFJnc0eNRI7zmzIv/RUdINlqZWp3SeZdvvqk9HiStYmAVAlc9L59Kd2AiWLhk5JN24/cknnjobR7JL78rZ7oSEj1oAvcwAqu4E+xNPYNWSIoL8bG/ANZScnyNQop+PzTwFJu2wwn9eBGv+Czi6/fSStyPrft4QYvhT0CCvjadGNzgKgbrb56EcdW9xYVqo1HWTBIslryMgW2uW2uD94BkrP+fAI9LJutdjSyAhTjyDCZM581zRDOPc1nmZMvi65lt4s2VniOxdjQREuDu7y2Z49D+EwYjPCSyEhLLWqwzHEKHePKm1pq1nmYqEOhiskc1TtYMdYeccz5arrSWSmlTbhu0h7WRBAzs1S3lq3MAT3IhNNnKmqXAwdvoZMlNUzrvuhICYA1qv6Tis2vIUn2SNcBfJtpffcduScmD8rLB7eGhNN82hGQMZyQZNQEp+hHK4piNN+dckDiRuWgvRMklu0mIGw16NjPhFSObLMUnDvdDOw9DHRIIzjNR6ELcFL5t6xXfiOZuJwTXt7VUrI/T4q6142ianLwMsgSJlry2XNL5Yuuw0VBqBxuDjL9MqKJHW31cOJLuAerRDcYds9Rae2VVo6MqrkQZ3WNWGvVq787IYk/4QLsLE4xF1mnaroN/wrEL/vdfw==", checksum = "3fcad2f6d44d7cafc7e9425f1965a92835d9a33ce53db057c2fdae85a69cd1c3" }, l = { count = 409, codec = "deflate-base64", raw_length = 2863, words = "NVZLc7M4EPxLGPKlrOMeFrOHHHyIbLjx2AoYQVIOmMW/fqe75RMFSKOZfsyoOblHm342hX92xdic3LO6bM0prNX1wx5zM302p3wtUzwG/sv3qrB/bsSSwt/qzPblc3V5s8dSXc72uFfXf+yR8M1l7YwlSc19tn1sirDXF5wQOhzk+uZqH/3Ij77vZrzdWpxuKTGXscnwb+tOfzPB0xHHljz2u8R59pHn9c2MzHT6f31zsQ15304jQlczgm01/oWF2/3GdMMTSJzcpvOSEg8fkZi0ZGgnC+ZWvrlHEws7Yd9DSCRl+mX75vp6xkP7FsKDUrDvIEAMOgudH5gEgn3wH4L5vi1Qw1phiUu1b1N9th2ZvdVMMOPDzcpzQJmFn0XOrjJ70ZhyiVew/Kc7faHM7gLef5uCkGsDYbU3xVy0r28zVHQrVSaiFP63vCCz0LIUQ2Ik8tiQj0i3CM8a9YWthcD8dwc63A0rERNIhIjEDwsLq6SYdKDYlqTMs0SeppcJah14ApagsHubIuahg8B8YEzTGZPXQcHyxFusfaipiXfKxk6YUO1K4tyDUYAZdCb+nHjwQdymNIL7JnF2whVlanswzOCAd1IVEko4ZFq5UsII3cIW0q6pblTMTzKWKeviLK8Al0zw3GQu23CUDUfakOqJRoiMrd0VpWQi9U1gPUriEh2QVqR4o//CLrEvzQV47iUFtkpZqVQnyPOVKVm1sm/F5iF555K3pauUBPLChw+sAf4baQuIyGIitJ9IeHg2kn48oSKpe8mGtJSkY4Et4OnpSGVR5b16SCaqbgLZRAuZHiqwYlJkZgsLMzZhdJ/WL8zwb+8uCR92kLXDStLoJgEiaTQ877cTElBdEUzCZ0KXItjQZDIXkZcGjSM2lhtLySVaHz/OcoeldGQLYo981ODB9bQobDFS8+TBjPClBqFeoATZe1xaQop+U8yJSs53bg/RD2Iz3JXZCx4i79Qgcmq+6EIt95fAGvPhg/vYMXuxOVSvJSD1yZUhQRMHLtOZkF/VyCRM8h4Ce13+JuQPInxRxxx4QuAkMawbAnLj7IA+oYI4iP6IIynS95EjeWWsoiZYbUqUvA0GmrKG3PKM3duCUTb7a0iRFQXLudJolLVXOi5P6ZVcTkUUvklScrgxNrHzqS9JyZiGgG7SvN3jYChnwcPtcXZoLLlBSv4l8m4oqYInkw+L/s3sE2F8zT9O0YWdFmyClaUjyKsmwlTRR/ea7tc4C+puIc6HVX036a5/cZxBbpHNQBVYYVr50Fx5F7f36D+58dlyTNxFXA99YlpcS0qYS4boI2m3jzTyehDnJtwPMYzsIXZVia5i15BsMIhIThwhFDRuCUd+JJAaL65Xx9QgyjdOexMDVropzhxq3q4xxHNTngeutFsQJlCuFmT0c+WmUZDp6pCAFSRPpz7Ur3dZOw5MtVgfvTk3aQLka4p9YmvGxMN5B901XgfV8YIVGzyaFdx45uQiWIrpNh0UJSzb+1h0vEg81GYSEuCf/7JD89rE8fkhXD7Z0llDvPf86I4y85pmKUVrY4CFeCf6wyZnaqXqOJ2gl9e1kEaP7m+o5KB5pOtPvLjYrQS3PEf3g/As6lqNBQayUYDmaORkKoxGX+Pw1g1p1L5I/0zL4Obxqbsi3Dgr3b4hyGpyLnawH87p/C4RHaza/wE=", checksum = "b098f2d1be5e7eb3bcc4604962aa9268bdd6bd33d93c657f0dd96e54119bf029" }, m = { count = 502, codec = "deflate-base64", raw_length = 3514, words = "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", checksum = "cc58eb2b069823e97d990859e4de57177a32e5d2fb3a47150de943a81fdc83a6" }, n = { count = 212, codec = "deflate-base64", raw_length = 1484, words = "NVRBkqMwDPwSY7Jb4weEZA57mEMM9g3D1iTBeKiEhCGvX3WLPbkwltTqbimOdvb1Zxytaev3OKYimp18vUIzxOyKrhziWK2h+SOXt794UpW+/og53fVl0deFXD68Ocnx8vWCuP4ocXZua8Rd4kH+pWtb4muOONyuP8pRDW3zIV8r4kb3wmV2s894cu5wpGvAEwGBADsppGt7AJbVG6CeOybTsu4t1sBiQtMBEi+rqR8BYhfQbcotA4xn9SHgSRp6tOm0UEoMsA/2nr5bALQDcaaCkNwUzBfKeh43pM5uaFE9zX4EBfyX0zke9nL524Msq/WEM7QiWdBm9cYs/Zk6uKQgBuUze8mZnTS9R06V4y0izpJ54SzUOwWPnGUg3Es8qoxgqdK4KgcyOMUjSe5BZBpVsV++OVEcVij1svQ0w8VnsDQGHEIdKlRLd1BaGfBsm09Wp2IzD/ESKHeLXhYaNyuWpSNc1cjeCSld6ch0IxaR8X+hPQSniaprRzUfyJlF/sMXrBGZTA3WP2O9V1/vlU+gXrSsZEG9LbXp2dgQYGH7HctOuv3pIaMttMI5jB4BvoE/B5V/jQamXdW0Gi4eFD6FLJa1G2fbPEwdn/ym56vB025PypjUZzAtwIsqiPvhqLmVcVb9KZ4vGdCj6bSj3TCw+PdqGae0ihxsc40UZyWk6kIrWnVISpxbWQJbYwwQLJ/sncLp3KaXVs+xFPC9hJ+09285tv4GnZWHboYtTkYNyRbqLgxyOnIwmIeiG2F2Qz7Tox1xuTnrrtVLzDspp8FIlkvsyGVCmp+dge53yi9tEufU5c2YXB68TItSXqpRzmRQXo4bFu2I9r5EA+ZvgbzcNgvT3tWkG7PQ2dRhBtfcbhxD+6RiwgTll7k90fPMYnS4VlaXJcdN9Oghjrw8YofoIFRbeNEybuVCkjUDuK7U/XmjPyXg8P4P", checksum = "3bbf9d49e08e21a2f18ee73b2102ca749a8baf2aed5d5779a47a863dbfed59a9" }, o = { count = 189, codec = "deflate-base64", raw_length = 1323, words = "PVTbbqMwEP0lsJto81ikkBZpkYpUEvsN46okmBSFXAhfv3OOq32ybDyecxucLk7N/sWp9NgOn04XnRtap21w579Ol6M9vDtddY3+dGpzbXffTtePZic7P9n9h1Pz1Oylrn5ykXKpk0PUqWL0b/JKnVj1Rw5Hp2VX3JoDrgS01fXNqM+4k29d+JJXVJm6Xe/U9Wlw06btIOWrBFfU3KOR8sEe8NhoBrlpB2DRtnPST1X3FiB8BFH+cOnuTvipVXBvvdQ9SHq+W80dqZQXss3YSI9rNqpPHiDSKEg32h1oTk6/Sj/BSdI+LkYeUxsphy4BbNX8MNDFj5BVhVuDw83aUoLeAkS1wiuqlEboHtphK9Ld+XSVGICfH2RbngyvRJr5BeW6OzotjmULGeUL1NVBuIsgpRxu5UpCYuIDJV/b/UOwRP/sZPZSXlx5xd4JvroDi0pHA7j5kzfzxaBu80Oti2M8vMRdF5VY02LbtWdRokwMvtXsjn5Y/OiRs4yC6HoBFnmsEbhqtRB18SSHLGEHCR9CVJwNwFd0E1qrb8S0PcO4BHUSN74C36XARwlsNCcb/T5Bv99E+t0WC5MFrQVuHlUCMlAZv3ClGCmW/zFSrlaTObwiUuRnB0PwgTTHGDAxFTTzqLW//cJ15JA0O+lX9cigSEdI2YMpDydEQ3dTgw55QtJlQv/qhFGcKZ3AZXpWo1MvUWRZVie2TY9xYKPk3ZUjgyvg8GRdKW5KwKqA7qqKughOaH3tWlFCMsiwWyohh18HasbJsSIWNAvQTBf9/2R9YDoccAILJ5wd8iVO6sR5qKI8MgEcWCqv63PzBvsvGDWaCpyBhuOPAm9Di/9EEYglYyZU6CGPdICpCj5IJvzCqUr571E2ibuuVXDzZCIVCw7zxF3xxADBVPheRs3gdPyxUNZg1fYf", checksum = "74b9cb6a77c05aa423398846830bc85bed6a56a4b04ec432129d93e748440a91" }, p = { count = 616, codec = "deflate-base64", raw_length = 4312, words = "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", checksum = "a34bde7449c959b39d0eaaf0c76e72ec16048fc6428836e86c2d655996a1661d" }, q = { count = 63, codec = "deflate-base64", raw_length = 441, words = "PVG7DsIwDPwllIIEH1Bahg4M4KRbYxBGJCgSAtS/Jz4D06nO+R4u+2PhfmB/fJ26g0FbQSa/Y33LOizxvlcYc6iQRlJ4TV6HwvmhELsF9pqbUmL3xgKkZaI3mO6ib3wHhd2aaXub/ABN84s9jL7r3Kv79WeEEOlEiDR+hw5iZ6jM6kCbOVILFYSvcZf6Zf0KN1DhvETO3KJKpdD2GaompVXwltrBPYBSgntAxRrZJcq/uzJFKZSu0S5op0vmJ9GO/CtmmtaonrymTrOdR8bGHLCQAsKL9RP7D8LN8AE=", checksum = "58e56f99b53d050cc64da9bde220688f8251ad5f040e3f4972d04a762eabd7ec" }, r = { count = 434, codec = "deflate-base64", raw_length = 3038, words = "PVZNd6M4EPxLGNbzouMcIk8OPswhwnADPC8YCcaJjb3xr9+uKnlPeqCv7qrqag2zn/ryn2EOS1vfhyVc29q+fNke9vbzdDz8tuE8VDakqePclhv81FW2xK9N+T7M7oG5JRRcksbj7tW+zv082Pairz5sydj+sg2u0NHcYEf3C07ZtjUuunYHWzmmBkv81B7eGAvm0qlhLPe2tjOdfoaZG8Kp49d3wyCu/SFiGHYvSKyvXznsLE5/RmRzKhvLdvaxq6PNpR6R+R9C4pEvYoC4CNnyzNmfuC9cuhqpnHrg4tcWF/miw9HuRlzc5sgz/x5xgyt0dBKQl3wf8wtTU+Hox0AghXyaNXduS2Q0t/M7ohZ0sf+FqC3HCKxx2BJOzC+M/a4AVdi+hLVFLEbcL2aEcA2XZkacY1N+IGoNkUD6RbBuGAuufSEu1RvTRJxB/LkLB78hyD4TkFqwmS48xTJinJeGHMUjBreIVMP6hcEv2Fdxg7vn/HTDScM4UCHfioxRg1sgmB7SoIkois0Xm2NkS3jqsy1flRgysjlEFltifSNHllFdkNsZ4T64JEwUiq+I9ZhaCro44sviZH6FhtP/ehGpTGXTz2C6+MPIVu7z26amWpv6DcG3Uuuwa4QSllwRJ3OwJW7bsCinjtqV3MKdKwEWw2UOaW15Q5TOpB6I/UNVDCArLoE0qHlWY8jVv0qtnyq8h8R36yD2dOugF/+lnyXgWUxnMwDR7V76BCDYcFfwUrk5CumfGhJujFHsgm4Rxd+Ah4dFih2Ej+kIVtxZp8hYzDXI31UZ3XjYuOmBJzSIlRUzchuKz2TDqMeG0E00qxS5crxxX5gGVIevuDJFqtzd5CESGG5ncUl1PxoVl9RzbRhZpMlZDjSdsd3hvsiysLql29xJY/giAW7TlsLl8JNykxfIcKX5MfW89sTt41ZfsyC4UJiwizcJbE/eKb7lWJMOqg7S2DMVfj26HX+yws3WCNbjWXHcLj9D0q+UYg3Coy66dtTnStcIObGzDltZVV7VkWSq5mCL5EazKp4ORl+a6VlJVpIWeUhBW4PPS0t04X+ZUYjCejxSbpP2UZGQdy0z5sqJPCRpCdoljXSiNMkgliaTSk9+WgI2YI5BGCB7OiZdn0Aa8nK+St0we9baHgZ2PNwXShGgokyziuQysBqvHQsou5vpDENszbqMYppOODfZnnZqDATy+0gkCkLgVGPGilxRXe2qWNgRkBEZK+CK8Hnk4KRyM1yKSM0t2MSLVPCbbipvVRUXNH8TOy2ooIStuSEVSPhdlsefBBKwQhMZM7UXt0GlLiAVGx5SXSVuq3yYeo6Z3E8ITJYu6NxJz4olxwL1oP5QOTDxKKz3guCNHY9NWGIPshnoM6qvMDF5nRTpRRykGFWwiCy3kE/Z9trl1wVd6qqmqEZklk5L+FbuZwll7Xi0nlRuJNN4E134k1hnq7SKA4I6zMeGOVxyR5ezr3Iie5wMlBu6mlPTd6vMUQ8sv+RnhdSzaKUM1+Cpc63c9Xb7UCuIrHA6StU8c49ysFcZCxrRqh6nsg+VAIm69ktSTDL4Uq+nQi+du0r7rmZqEKBPZ9O5DXyVnFhxhtKidlZlct6I7pxV984HAXSGxgCqbrn/CZ6/bK0h/mFpJ/pE0tFJVpnyy1F0OOP2Qu9hD1BxeUVmZU9rHoe50Gttr3rAfVvJ21orol7Z3Mw86LSrbjg/XYpfqzZ8dvXAJbwhSaZFJ3tiGeKZRqF0pdo1iVNIKWYlE0931XtXrwsDktX4pRpDtv8B", checksum = "ed730847ba9e6636331717b53cdd8f9af450514101c327b3b0614f46cb655504" }, s = { count = 1091, codec = "deflate-base64", raw_length = 7637, words = "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", checksum = "bd8a6e07e749ba4ddd402c97e18d25cd6c17c985eab9dcd65dde7a8a41922869" }, t = { count = 557, codec = "deflate-base64", raw_length = 3899, words = "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", checksum = "890f788a94f0e0e6cce00ed876ed66e6e7982721d0a1c8a0fabae55c62b7be19" }, u = { count = 119, codec = "deflate-base64", raw_length = 833, words = "NVPbiuMwDP2leLJd5nUCQzqFBloolv1mx8s490BSkvbrV0dun0RsnYuOnKAPczh2QR8mn1+4tIHOgapoP278NViNw8zpjcvD6TrQta8HBqjZ6CXQaUQLnXo/fPNhY7mTiszST9Ah+hLUT0tgaXz+y2W2Y8cssy9v3Pm6yx0Xqu5Wf6PFf/yBF593SR1eNqdxuBjC4d1SzWV1xJwqes2c1SSycTHojKoeGaceRkM21kMWyCpfQuHpMfSe1YPoheM5+URnZqQsafbNYuhTI5wHBsFLLneKJwJuEBNst8Td5BBIEf/xKJyL02d0QoiK7RWWQZ7XTuxyZijMiSTUmuw+HH2ldVzEGWTVlpL4m+6eksTee8lsctI5G1ncInle0x4OrRHABBxVsx8wUW/LT8llRJ4sC7hYIpsMIhB0Pt07CY5gb4Vzvxs6C/wouNTSGMCLLuXSOolgFM6CX8hFIhBLq3lv85ct9fXIr+4UAxJcY40ZWEGmbUFGFW/zKwllcBb0Dw7F574lshzvE9sEyx69qL+EmmRwtfLOFIYWZ5Cd07Qj/gD+8sMNXt4mxC5nXSc4Spcy471f/gM=", checksum = "500a738522fa67eeaf5a499767863fca95822c0dc93a9f440443dfef6d801ebe" }, v = { count = 170, codec = "deflate-base64", raw_length = 1190, words = "NVTBspswDPwlApk39QfEoZ3JIYeYwM3Gb5oS4ckrOBS+vtKKd9LYeKXVrkQczdTdL3G0S9dc40hbGE8cpnB+xtEVbfmbwxFP3BrHm4S+vOnlzziaAoGeXfODL18hCS4BYJJvbnrJJ1rbZuFCfz2H9Osd7z1ffniGJwZUwAFAWzwzCfcINV9S0eIyK3ztGiRDPRpaVP+DejQppUoprUri0AldeSLJnp+NpM6xvoCZhH/vrhL4Ayc7hUrgbz0dIIE9hBrytKoEcrrsmyPqiXR27gVApZeTGVTWKTYqllyKdKIS9SKImZREjtpfqEAX9czTlydREN/4pQhij3ubQU5maiFdEUUlO8EVyp+iklQQPaeu1kLnG7iIfzZ/c4HTK+g6ldyynsB5iMysjyI5cIZPnNq8WhT6UJUKZOEKEtzWg9nQNuLD7O9X9W9REsJzxYBZbYzmvYIXV+ymc8aaFeKtKviFCnaGPOxDUrowJysgtZKFMnAuwxxboAcupDkxKOYVRAkzf88uZn7QwKaeYqJXGGUwV+CoVMMJrEXPK0YDYq3+LqOhC0QLcjodU55W8Y8ogvW+KxSkTVIDSMlTocrn7gw7Yn1T3FOF5F1xu7prX12xAcAlD6cztsMufl9fuJL8Xkib7nSu5QkvXigLyYLGZHYXEFQ4HGMFMclJk80w1S442SFqaqjr1lYm2W7w1ukC0ab7kFSJcl+ETlLzS5lWt7f5CONV/yEXzNld4fsPSfVkuv8B", checksum = "0bb0b28b23728fb397fb3197b28a89056479fca43ec3d87a11a2007610b1463b" }, w = { count = 304, codec = "deflate-base64", raw_length = 2128, words = "NVVNU6NAFPxLCGrJ0YOTuFV7yMFJ4BYg5SgDUhJwya/f193j6dUkM++ju1/T5b6v87cuj323e+9yt3X7viv+rDyFqdnNOtmVcjkXfy1cqxFhrfcIW1sc7MqUQjO0uNkML5ZsbnDFbS1vrpcRqaeOp+/uZCGE7vRs1T+Veq6R2soi+KkdDjqxJaW+1sd7e7DVeO6Wxtq1oJPexdjs7J2znHgXq+PMPi1L7j/q0yvKMlkcKyQLa5NX9uB2RrJ4Y7vxhzddrvBdscJWHw+sxzCxXUtNBLd0k/9Fa4mdoYk8DjzFuc5f+F+hCkdg9sB3pXhwX03+ZGFUnyt7sQaJUt8U1rUPhDXOBNJPdf7O1GypJxIxq/CjPR/x49jkGDO2wxtn5ygjH5Qbszi1WwZCZw2ilzC1+cwwYrBFxC2aITtDEz6K99DuD4IOWWayYv+JftazQpIUHhhYLRRSFr9gASVjGjd9wloiKleRmpEc9y9BTvEZOZxBD3xo8Z/rz3x+Lzp6BZUNJo0M9Si3EKklb/y9U5hU+ZWa8EI39rxiTfC0VDmHxgbYA1b3mtZ4RyG/EHnbDvZCsRf+/nx8kZagSInPyAHT5UbIg9YCGwfkbwyYgYUq8BCVOkrs5dAdf/CgHipxxB1ryXuQbKKqm66RbBB/1wsnkjBdan5Q8xGrZosAJGxziJk1gQdoPgmFN0mAz/g85urzgSfAys4u4xdO1elAfYojTRsvJ6ErE2gxgw22/yJ03AfKzZog/S7JdG52NBbZhVkQ8SQ8fpFPTKlBUTxRmBaGH7wjY7ZOxTP9hcoSBPFK7YY7rpqxAqr8Jgjmevck3qHrWbMLT/fwK2FKcU1bRSVHGSDUmrxALYEj+ARg3Zgz3rS339Su/+CPkBROs/QZuEB+lsCC7Hel90DXs2bQxhGzTB5invxGKSKY3YP3UsaCleklRUr/srsX4Zgok7wjcTFHoWw+KzJ9Rwn7RU0oZxwVHjlYmH4taJA5KllCgh5SJiDlNubXtNHlwnZv5x312UETToWitGsOxu0w+32jkdGQBlXoKT6XVXRMGQS+Mq9o8AwxuEyrFps9mLZRDtIgICArRZrd9Ml2k9s80ppj1lEoE0M0Op5kEKIxiYEVJEwnV4ya1vYBDeLzIhdmuOpruGow+5JgEXJ5z10yCO20qeBFm6PvA3TtA7mNtzQfkXdqHsp6VU59Ign5TV6wUZG2lCN9ouUHU+YBOjDt0ki0NEcM1msi7qbm69Onx/z6Pw==", checksum = "98ac0ae4ea2fd8f5c6afe652466d9814a02bffc475603b7c7ee561e24bc7270e" }, x = { count = 12, codec = "deflate-base64", raw_length = 84, words = "S3UPq0yJ8E31yCmOCjdIdQ8rTTIyAfFSw8tT3S0zknJdgYKZUeG+ILnEcBCvMjEcpKEqxd0VpDIyHKwhyagcIpgNAA==", checksum = "971bf398f0f97f4e9bd1d1f44ab9f4120c9742ff5638195388a3a130c9410079" }, y = { count = 85, codec = "deflate-base64", raw_length = 595, words = "PVHLbsIwEPwlElMJPqAJHKjEoX7dbBM1kIRWSVAUvr4za9rTar2z81g3Rj8u9Xtj9vdgT42pilif0a2e3X4KqsOjincUPcUDIatn0bdw4GyTBqxXVyeQmyu/0C1JZmNUCSyjN+CsMCNyieVEFlfuMFOZ8+EVSt9T3f5RK9nTUwLE6swJn4adkFk9ObOVBfrUm5wBdgkZ5XFfXGpY6kdJpNs0bPmYyk8g58zZebOgXN2ww94cLdW7YDY0GAyQenWMySgL7QYlJgIzgFPxZkUckqiL3TmaHUOHwzmHpuxPHCS7t8ecAc50kY+80jXWmZYG79muPK7OTDk7WKrvSNlqDLynfv5/lax7MT97QV6z6y7WyNAvgoQlMb9e5Bvb8NKTu0gwCDlBvrFY3YozzMxJTmBf5diYD3wA8z2TqLdY+AU=", checksum = "89782208ab86f512c0e8efe6e9ee9402160514f935293ed8d72599a9a1d831a5" }, z = { count = 53, codec = "deflate-base64", raw_length = 371, words = "NY9BcsIwDEWvlIbCkAPUgUUWLGxj7RzHQzKxGAZIUvf0leR2pdHXk/5XRJXh3kU0C7THiN/rcJojNouzW0T1dNcLdSPYL+oeATXP/K6Ld3PwtqJu9ZaQROJM4hZaIs0EtmPRkShFOrBnWsheTr+93NyC+BVbM/anQvKCmYYrlebtkK8U0vyUgDtvtbgz2SwgZPpPbW8iSrJqaP/2CFEz8Hp6Bn66yaHWErA+FlueTcBPp+zkP7qpJTU7qL23nyKK39oXEVrNcQPy77nnSOoATJpKyPRyNUUaPyLefgE=", checksum = "eef42c4656e353ffbaa62cf320e4fec299d5ce55f455c57ab60fb1f8b8b791d6" }, }, total_words = 9074, checksum = "5cc1bcbebbd28f9278e1e887e031e0db982cfd2e0092b5f5ce5cacdcb1875ab5",}local WORDLIST_SIGNATURE_BASE64 = "iQIzBAABCgAdFiEEeRWwgx3yC6/0IY80fYjFs3TmXZAFAmpb5gcACgkQfYjFs3TmXZCUVg//by7oszsa+28N913FadvzUtCSSq83MWM0yi6EnH64wNh4z5z4G+5M3LfKCcrCi7At9P6bXtbIKTdQ1hWA+h3+4Bn8RbCcTtlH4YEvIUWo2I6fnR/UI1sbimI54UvjSDwk9LyXKIrkopLoeU024ifQqjfDLHIzKLVtt7x3QWT7+OWAb4XiIztby10i4F5v8EQ2xyDg89I3lrTzJSK4ktZI5gmwfx89KY1ualfA13S4rP8GuTaiKk8dz6oTQUzCSjSCK2D1T2w7N5MD3hvHnSuomSDFMsvXyl3qrBF2RarKzaUC318P3ujsC5AkRL31YkWPyryWAzdByIT0KJ2Js6JCYAQo/827qcorK5MtppJw8oCvBgnMUdycJBSdAndwZ+fJtR421Nb2LTSRiPEyU5DR47hKVFSMHYetfd6XiQpbCQvYJgDcPW7J9UXxRU+9/ifgV3+QTQh4Q5WWaPtEKYD9KAoLmg+CPK4VwAYA7i/zzcAsDIQJuYi/VkzB/v7dpGqgDdgJyIYC6oCOBxdJX357WOE+yf7otlMpkQaHlKWcBa5jwjoJV2jc0vHlXrS8hRbnl/l0Fm05B/ViBSSonWKVGsMRc+aOfYRnKFL3QSWeFJa9HZbgwjQ/tGI368vFnSYGWqQe8oG3Q0jvE8LXdznR3nA7DtnXFyFjazsccPMekzo="-- END GENERATED AIP56 PAYLOADlocal function json_decode(text) local position = 1 local function skip_space() local _, finish = text:find("^[ \t\r\n]*", position) position = (finish or position - 1) + 1 end local parse_value local function parse_string() if text:sub(position, position) ~= '"' then error("Expected JSON string") end position = position + 1 local output = {} while position <= #text do local character = text:sub(position, position) position = position + 1 if character == '"' then return table.concat(output) end if character == "\\" then local escaped = text:sub(position, position) position = position + 1 local replacements = { ['"'] = '"', ["\\"] = "\\", ["/"] = "/", b = "\b", f = "\f", n = "\n", r = "\r", t = "\t" } if escaped == "u" then local hexadecimal = text:sub(position, position + 3) if not hexadecimal:match("^%x%x%x%x$") then error("Invalid JSON Unicode escape") end position = position + 4 output[#output + 1] = utf8.char(tonumber(hexadecimal, 16)) elseif replacements[escaped] then output[#output + 1] = replacements[escaped] else error("Invalid JSON escape") end else output[#output + 1] = character end end error("Unterminated JSON string") end local function parse_array() position = position + 1 local output = {} skip_space() if text:sub(position, position) == "]" then position = position + 1; return output end while true do output[#output + 1] = parse_value() skip_space() local character = text:sub(position, position) position = position + 1 if character == "]" then return output end if character ~= "," then error("Invalid JSON array") end end end local function parse_object() position = position + 1 local output = {} skip_space() if text:sub(position, position) == "}" then position = position + 1; return output end while true do skip_space() local key = parse_string() skip_space() if text:sub(position, position) ~= ":" then error("Invalid JSON object") end position = position + 1 output[key] = parse_value() skip_space() local character = text:sub(position, position) position = position + 1 if character == "}" then return output end if character ~= "," then error("Invalid JSON object") end end end parse_value = function() skip_space() local character = text:sub(position, position) if character == '"' then return parse_string() end if character == "[" then return parse_array() end if character == "{" then return parse_object() end local number = text:match("^-?%d+", position) if number then position = position + #number; return tonumber(number) end if text:sub(position, position + 3) == "true" then position = position + 4; return true end if text:sub(position, position + 4) == "false" then position = position + 5; return false end if text:sub(position, position + 3) == "null" then position = position + 4; return nil end error("Invalid JSON value at byte " .. position) end local value = parse_value() skip_space() if position <= #text then error("Trailing JSON content") end return valueendlocal SHA256_CONSTANTS = { 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,}local function rotate_right(value, amount) return ((value >> amount) | (value << (32 - amount))) & MASKendlocal function sha256_hex(message) local bit_length = #message * 8 local padding = (56 - ((#message + 1) % 64)) % 64 message = message .. "\128" .. string.rep("\0", padding) .. string.pack(">I8", bit_length) local hash = { 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 } for chunk_start = 1, #message, 64 do local schedule = {} local offset = chunk_start for index = 1, 16 do schedule[index], offset = string.unpack(">I4", message, offset) end for index = 17, 64 do local first = rotate_right(schedule[index - 15], 7) ~ rotate_right(schedule[index - 15], 18) ~ (schedule[index - 15] >> 3) local second = rotate_right(schedule[index - 2], 17) ~ rotate_right(schedule[index - 2], 19) ~ (schedule[index - 2] >> 10) schedule[index] = (schedule[index - 16] + first + schedule[index - 7] + second) & MASK end local a, b, c, d, e, f, g, h = table.unpack(hash) for index = 1, 64 do local sum_one = rotate_right(e, 6) ~ rotate_right(e, 11) ~ rotate_right(e, 25) local choose = (e & f) ~ ((~e) & g) local temporary_one = (h + sum_one + choose + SHA256_CONSTANTS[index] + schedule[index]) & MASK local sum_zero = rotate_right(a, 2) ~ rotate_right(a, 13) ~ rotate_right(a, 22) local majority = (a & b) ~ (a & c) ~ (b & c) local temporary_two = (sum_zero + majority) & MASK h, g, f, e, d, c, b, a = g, f, e, (d + temporary_one) & MASK, c, b, a, (temporary_one + temporary_two) & MASK end hash = { (hash[1] + a) & MASK, (hash[2] + b) & MASK, (hash[3] + c) & MASK, (hash[4] + d) & MASK, (hash[5] + e) & MASK, (hash[6] + f) & MASK, (hash[7] + g) & MASK, (hash[8] + h) & MASK } end local output = {} for index = 1, 8 do output[index] = string.format("%08x", hash[index]) end return table.concat(output)endlocal function table_size(value) local count = 0 for _ in pairs(value) do count = count + 1 end return countendlocal function base64_decode(value) value = value:gsub("%s+", "") if #value == 0 or #value % 4 ~= 0 or not value:match("^[A-Za-z0-9+/]+=?=?$") then error("Invalid AIP-56 base64") end local output = {} for offset = 1, #value, 4 do local a = assert(BASE64:find(value:sub(offset, offset), 1, true)) - 1 local b = assert(BASE64:find(value:sub(offset + 1, offset + 1), 1, true)) - 1 local cchar, dchar = value:sub(offset + 2, offset + 2), value:sub(offset + 3, offset + 3) local c = cchar == "=" and 0 or assert(BASE64:find(cchar, 1, true)) - 1 local d = dchar == "=" and 0 or assert(BASE64:find(dchar, 1, true)) - 1 output[#output + 1] = string.char((a << 2) | (b >> 4)) if cchar ~= "=" then output[#output + 1] = string.char(((b & 15) << 4) | (c >> 2)) end if dchar ~= "=" then output[#output + 1] = string.char(((c & 3) << 6) | d) end end return table.concat(output)endlocal function reverse_bits(value, length) local reversed = 0 for _ = 1, length do reversed = (reversed << 1) | (value & 1) value = value >> 1 end return reversedendlocal function build_huffman(lengths) local counts, next_code, tables = {}, {}, {} for bits = 0, 15 do counts[bits], next_code[bits], tables[bits] = 0, 0, {} end for _, length in ipairs(lengths) do if length < 0 or length > 15 then error("Invalid DEFLATE code length") end if length > 0 then counts[length] = counts[length] + 1 end end local code, maximum = 0, 0 for bits = 1, 15 do code = (code + counts[bits - 1]) << 1 next_code[bits] = code end for index, length in ipairs(lengths) do if length > 0 then tables[length][reverse_bits(next_code[length], length)] = index - 1 next_code[length] = next_code[length] + 1 if length > maximum then maximum = length end end end return { tables = tables, maximum = maximum }endlocal function inflate_raw(input) local byte_offset, bit_buffer, bit_count = 1, 0, 0 local output = {} local function read_bits(count) while bit_count < count do if byte_offset > #input then error("Unexpected end of raw DEFLATE data") end bit_buffer = bit_buffer | (input:byte(byte_offset) << bit_count) byte_offset, bit_count = byte_offset + 1, bit_count + 8 end local value = bit_buffer & ((1 << count) - 1) bit_buffer, bit_count = bit_buffer >> count, bit_count - count return value end local function decode_symbol(tree) local code = 0 for length = 1, tree.maximum do code = code | (read_bits(1) << (length - 1)) local symbol = tree.tables[length][code] if symbol ~= nil then return symbol end end error("Invalid raw DEFLATE Huffman code") end local function fixed_trees() local literal, distance = {}, {} for index = 0, 287 do literal[index + 1] = index <= 143 and 8 or (index <= 255 and 9 or (index <= 279 and 7 or 8)) end for index = 1, 32 do distance[index] = 5 end return build_huffman(literal), build_huffman(distance) end local function dynamic_trees() local literal_count, distance_count, code_count = read_bits(5) + 257, read_bits(5) + 1, read_bits(4) + 4 local order = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 } local code_lengths = {} for index = 1, 19 do code_lengths[index] = 0 end for index = 1, code_count do code_lengths[order[index] + 1] = read_bits(3) end local code_tree, lengths = build_huffman(code_lengths), {} while #lengths < literal_count + distance_count do local symbol = decode_symbol(code_tree) if symbol <= 15 then lengths[#lengths + 1] = symbol elseif symbol == 16 then if #lengths == 0 then error("Invalid DEFLATE repeat") end local previous, repeat_count = lengths[#lengths], read_bits(2) + 3 for _ = 1, repeat_count do lengths[#lengths + 1] = previous end else local repeat_count = read_bits(symbol == 17 and 3 or 7) + (symbol == 17 and 3 or 11) for _ = 1, repeat_count do lengths[#lengths + 1] = 0 end end if #lengths > literal_count + distance_count then error("Invalid DEFLATE lengths") end end local literal, distance = {}, {} for index = 1, literal_count do literal[index] = lengths[index] end for index = 1, distance_count do distance[index] = lengths[literal_count + index] end return build_huffman(literal), build_huffman(distance) end local length_base = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258 } local length_extra = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 } local distance_base = { 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577 } local distance_extra = { 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13 } local final = false while not final do final = read_bits(1) == 1 local block_type = read_bits(2) if block_type == 0 then bit_buffer, bit_count = 0, 0 local length = input:byte(byte_offset) | (input:byte(byte_offset + 1) << 8) local inverse = input:byte(byte_offset + 2) | (input:byte(byte_offset + 3) << 8) byte_offset = byte_offset + 4 if (length ~ 0xffff) & 0xffff ~= inverse then error("Invalid stored DEFLATE length") end for _ = 1, length do output[#output + 1] = input:byte(byte_offset); byte_offset = byte_offset + 1 end elseif block_type == 3 then error("Reserved raw DEFLATE block type") else local literal_tree, distance_tree if block_type == 1 then literal_tree, distance_tree = fixed_trees() else literal_tree, distance_tree = dynamic_trees() end while true do local symbol = decode_symbol(literal_tree) if symbol < 256 then output[#output + 1] = symbol elseif symbol == 256 then break else if symbol > 285 then error("Invalid DEFLATE length symbol") end local length_index = symbol - 256 local length = length_base[length_index] + read_bits(length_extra[length_index]) local distance_symbol = decode_symbol(distance_tree) if distance_symbol > 29 then error("Invalid DEFLATE distance symbol") end local distance_index = distance_symbol + 1 local distance = distance_base[distance_index] + read_bits(distance_extra[distance_index]) if distance > #output then error("Invalid DEFLATE distance") end for _ = 1, length do output[#output + 1] = output[#output - distance + 1] end end end end end local chunks = {} for offset = 1, #output, 2048 do chunks[#chunks + 1] = string.char(table.unpack(output, offset, math.min(offset + 2047, #output))) end return table.concat(chunks)endlocal function validate_embedded(data) if type(data) ~= "table" or data.version ~= "AIP-56-WORDLIST-CHUNKS-1" or data.word_length ~= 5 or data.token_width ~= 7 or data.encoding ~= "base64-standard-trim-final-equals" then error("Invalid AIP-56 metadata") end local selection = data.selection if type(selection) ~= "table" or selection.pick_per_letter ~= 2 or selection.candidate_count ~= 52 or selection.final_count ~= 15 or selection.case_sensitive ~= true or selection.case_entropy_bits ~= 75 then error("Invalid AIP-56 selection") end if type(data.chunks) ~= "table" or table_size(data.chunks) ~= 26 then error("Invalid AIP-56 chunks") end local groups, total, material = {}, 0, "" for index = 1, #LETTERS do local letter = LETTERS:sub(index, index) local entry = data.chunks[letter] if type(entry) ~= "table" or entry.codec ~= "deflate-base64" or type(entry.count) ~= "number" or entry.count < 2 or type(entry.raw_length) ~= "number" or entry.raw_length < 1 or type(entry.checksum) ~= "string" or not entry.checksum:match("^[a-f0-9]+$") or #entry.checksum ~= 64 then error("Invalid AIP-56 chunk " .. letter) end local raw = inflate_raw(base64_decode(entry.words)) if #raw ~= entry.raw_length or #raw % 7 ~= 0 or #raw / 7 ~= entry.count then error("AIP-56 length/count mismatch for " .. letter) end if sha256_hex(raw) ~= entry.checksum then error("AIP-56 checksum mismatch for " .. letter) end local words = {} for offset = 1, #raw, 7 do local word = base64_decode(raw:sub(offset, offset + 6) .. "=") if not word:match("^[a-z][a-z][a-z][a-z][a-z]$") then error("Invalid AIP-56 word in " .. letter) end words[#words + 1] = word end groups[letter], total = words, total + #words material = material .. letter .. ":" .. entry.count .. ":" .. entry.checksum .. "\n" end if total ~= data.total_words or total ~= 9074 then error("AIP-56 total count mismatch") end if sha256_hex(material) ~= data.checksum then error("AIP-56 global checksum mismatch") end return groupsendlocal function secure_index(limit) if not random_file then random_file = assert(io.open("/dev/urandom", "rb")) end local range = 4294967296 local cutoff = range - (range % limit) while true do local bytes = random_file:read(4) if not bytes or #bytes ~= 4 then error("Secure randomness failed") end local value = string.unpack(">I4", bytes) if value < cutoff then return value % limit end endendfunction Aip56.self_contained() if #base64_decode(WORDLIST_SIGNATURE_BASE64) == 0 then error("Invalid embedded signature") end local data = WORDLIST return setmetatable({ groups = validate_embedded(data) }, Aip56)endfunction Aip56:generate() local pool = {} for index = 1, #LETTERS do local words = self.groups[LETTERS:sub(index, index)] local first = secure_index(#words) + 1 local second repeat second = secure_index(#words) + 1 until second ~= first pool[#pool + 1], pool[#pool + 2] = words[first], words[second] end for index = #pool, 2, -1 do local other = secure_index(index) + 1 pool[index], pool[other] = pool[other], pool[index] end local selected = {} for index = 1, 15 do selected[index] = pool[index]:gsub(".", function(character) return secure_index(2) == 1 and character:upper() or character end) end return table.concat(selected, " ")endif arg and arg[0] and arg[0]:match("aip56%.lua$") then if #arg > 1 or (#arg == 1 and arg[1] ~= "--check") then io.stderr:write("Usage: lua aip56.lua [--check]\n") os.exit(1) end local aip56 = Aip56.self_contained() if arg[1] == "--check" then print("AIP-56 validation: OK\nChunks: 26\nWords: 9074") else print(aip56:generate()) endendreturn Aip56-- AIP-56 Human Recovery Key reference implementation.
-- Copyright (c) 2026 AKADATA LIMITED.
-- Released under the MIT License; see LICENSE.md.
local Aip56 = {}
Aip56.__index = Aip56
local LETTERS = "abcdefghijklmnopqrstuvwxyz"
local BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
local MASK = 0xffffffff
local random_file
-- BEGIN GENERATED AIP56 PAYLOAD
local WORDLIST = {
version = "AIP-56-WORDLIST-CHUNKS-1",
word_length = 5,
token_width = 7,
encoding = "base64-standard-trim-final-equals",
selection = { pick_per_letter = 2, candidate_count = 52, final_count = 15, case_sensitive = true, case_entropy_bits = 75 },
chunks = {
a = { count = 521, codec = "deflate-base64", raw_length = 3647, words = "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", checksum = "b612a14a1554e6f50172fca68e2e182c1c497e9a04dc97405286ef84c67357b6" },
b = { count = 667, codec = "deflate-base64", raw_length = 4669, words = "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", checksum = "e816cb5954ec2ef00016c4edd7598f518228d58c06b3ed46c39aecf55ded7138" },
c = { count = 700, codec = "deflate-base64", raw_length = 4900, words = "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", checksum = "1a9a1b70a84befb60b031564da9db09ac6cdc2a1f3d4ac8da3d52a257d56296d" },
d = { count = 483, codec = "deflate-base64", raw_length = 3381, words = "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", checksum = "fdb7eb76eea6f303471145a9c70bd83d53002e1bbd6f960ab44f696ffc78d60e" },
e = { count = 198, codec = "deflate-base64", raw_length = 1386, words = "LVTLbuMwEPsly1kDu8cGaNI1UAM10EjWzbKKKvUjbtH6ka/fIWdPgiyJwyE59rbKGvviXTL+/OrdcXl76r0tMu/+yjIE++hd9cXdlsIoN4ehOzzLg9QcXrw97fH87u2fe2t/YRemZzxv5Z3dBl4xH96+ejtz58rdSz275cB0aQly5tLq7eqdH7qpFxJzIxVsbZpc3plr4+RjaSKgpQIIbnMUunbriXIyLXrAc1DKPLgUPyHvAN04OavuQLHDV8hxlpTLwqbTGlDvdCdYmTop66os5M/ADILp6gN7KPqIZZjaJz7nzTTHJ7lZ3xr0UN/eZLH15J1gmm+P6mlscSY83YOn5CsUDA5CrvGMnQmCKRVIYpjD2EHBYHsqQbpzk4uscVLp1njolTUKUTrsoMTJoIJIFw6dflwhnSrPj25IsNEWphv/iwyLBy+Y7nIPuTzYFppqrrT/lPN5PZNL/dGeYZUKCZUAtnSjJMfPGo0pwCOz0CpzjeDpR6IUech7sEakaCqU+GAKjkuTv4sBO/wT8qquSCfPN0Owy94yNnM468Ie5k5IuDhwSXMHZlWmpuY0oNzDAeruLTqKE5s2a5RICWtCiwE6D92oTcMjnxAUW15VwaVj2YwqmQRo+62OFSM0Q3oOD3JlYPhK08HbjWeIBiXoaY7QhViD+p6ybnzEAypYZDR142xiGjEI1RWYtrhCAlvdkF132bkkykMJ0NHSYoAqtconiuxnLGKO+j6ot6pS0gGKyePm8QaxxHCKfJR4v2uuoaeO9jz7828dZtj/GZDIjYa7owk4K5LKem9xZlTBQpj1nIAnBoWYR53Gmh3Zy2eLNuPOARIuOVJ3ay3CUPC/VO864QvDV8rSM1koVPxEy79Gw2DeObdRlTdJ/y/8u3FENROWIULcpGkPBcspMOw3bfqHbQ49CW7a2DaT9cwM4ufIejujUSuYWdqx/wc=", checksum = "cc0dbdfad4be71739452379f5f3e139d04bb0538d0d843ae9dadbf46d4e14137" },
f = { count = 438, codec = "deflate-base64", raw_length = 3066, words = "PVbLbuM4EPwlS06C6LgLhHYMzCGH0BZvehhRbEojjGyt5K/fripmToJskeyuVzMMh7nMpzAcxnr3X+jjUzi92+NeHu1tycLpGnq/8i0+qr29FWu1/YW3ko+u3dvDZSH/sl2eudxd8bCt6/4Dm9WDrYvXkH/a8rHGgrg2W/y3qfs3OyhyXbG2xw2X46A4ldxzPA+/7cexwS5Fx+VOmy1ZvbV1/lKdbDO3afM3nMcC3Sac7LGMdd/YYw74cbme9/jyT8U615o/jvpyxgmDX3nCklVbnDezP/vk+GH/TfjPStLbd4ldlrnOP7jZzkry301/xSftHlWvpdVpe7a7L1QWuNnc8tiuQg9u0+SvoR9jvbNdihtqGfxNgDwadORv9fETgAgeowPnvQQ+1nJLsPQ2BL5dqj22XqrjF+BJbNanf+xtoy/HekAR8bx7BVXnHuSsZ9ARVwLiIskppuqIpmf2YARAE0sH2dixNb/ccjODQJBDGsOha/Dw94D+3B8pq+fpxVpSWeLI3oD8ISONSywJwQPcEsgPLceesTxOQL5Bm+6O3u0EEg6qrhQtyDlIUk5yc32Aekwo2GzpiOeSNTngmSRhoypthi8j1/mOMnUZkTBloVwvlRvvEF98OVM2j5BYYZ1ju4OuM5bk5AB/A5B9TBxFCnqcG5jElIUF/p70QikexlK2CFIdITd9cjOTBu2EAkFO/mQ/GqkfhJwLYkOL9n9NSdWdie5QHV8pRfldxV/ph/j940YI2ixKN4pb9yT+Jv5olsECv2nFGLv1EVoa4kbLzQ9UVjCd2ZeQohVYCzPS6E1g2POpIiuRbS4jWYnpx46WKXS6+6bViljtntgDei/uWEAePgk5AZHj7HQ4wD20553B4l8kvimhK1K7854hAFKRIdRSV3H5LTmu6SHolW/+RgRhkld6mv2ZfT/kIwGJPQ8zkTCUdnIV3THQmy5vRU45yA8weswTY8qzkf5zF2xt3P4NTrHCx0VhZQdBSx15+PfRKM8ULCuNbg4YeHrNbi+K9El5FnkCfEsIkqtY2UINDpgIRF5i7+reGHOTkv3CViysdl+ClZ+c6RwaFmySlUncPksoMsLSNaQ/0pt4S03z9IbyHiQ3zgCoHJ/ElJ8r0sY6YhGmeXAU//Bhm6F3m0eMNbk4KpoX9YBoZrcsqXhS8ZodGHxXEXdV079U2bs4IljJFnJq1xBkBgSkr1aq4xvzjJVdKg4NQQdA8N8z63SrGFNc+DFQ0FMrNxK64iI7vUDz0ATHUhoMF0XQXEovhNyvPCGqlmLWqBulkFFNr/KRZqNTFrihRg7aCAFK1opiW4q8Ex4Lf6o8TZmcVwDs8s78pK6ZWQzHL1J1Qvwy64xwOtzPoS/hBw32TZWIY4FdK5BpGZ9EpKzzHcXgZdHlx8ycVY4zlXcb4tkSunsAPHHARMC0OCrnd/QtS8KV45cmnmxIM2/T9YAjxDFwMX1pGR3k0wyY9d9dMUNFQjY8PePWJtqeotV8T+l2UbAoTd2kOqefsEJHsZdoZ91tnktesO4S9KTeIzPEacpECQxzGlrKyjSLCUjK8kxYZxU5msVYHkwviC5OSquT0m8oFAnTggWMLQkJRWyRaRA9hHyfBkPQXbHeJ6dSbph4Jm8OWqvFVG4KSSEQjmniAdYtG/OZCLd1CLkrRWQ3nXRvzd8YOrpgBUbsRqPgRjF4RYlfNdXUO0T0qTsDRwjjHpNLOU8lX5LtNZ0yID+kW0Kh+xIuQ1eGKuCxFKZQFDPFHHTtle1jGHQ12qEkBYRhxpuALguYzFQWIDcj0A8G+YlF6MaSblaTXDXrqrL+EMCp1rU8Lxd0qVuM8v8B", checksum = "837e8393ca1ceb30d91483f8a3acb47fd9b76a8a33964ba3b1c62a095333a02a" },
g = { count = 431, codec = "deflate-base64", raw_length = 3017, words = "NVbLcqs6EPwlQHEqLLMITlLlhRcBox0CV+SL8KGKh8Fff6d7lBUlocdMd0+PbFY87OXLZnlo7yebFa8cFTd3/LHZlnafMrmtNf+l9rOXlYm9YDLlJ5clPZa0WBlutjpbE2ZbPWSU2epF9j1aLknxD/fhkw96bdynG4q9Ht4waS+yocg4WS4u+7CmnB0mD74zJ7nh0Rqc6RuGOznzbs33yMO20Q0vsiTjRWVozRkrO1lpvldu72TJj4w8IsPkRaIuR3vEZNpmv/IJ9eXMxO5c0sq+rPRAyZSLzQSecq8rrEztUOMwoCT7NM3VIRZJhdtHLilHwlpM2Md/JwICIIvRYRSerhIIioNDZHLR8UNGM5bIKQ6pyPbLL5bUAo9c6yqc+Vozv9F+IsCJt4ekqRIE6O5AQhEsUjKd9xb5FU8AaUrl6OCRu8RC3r0HdLjhztw1wMVe3hGSYr3arCWNpGN1Ge7zFvflB94uSX8S3Va4lX8dQC4n3perwKAsRP3sjrKkTHhYkV7v+AyWkB8097uqZ7kCs3J3F+5reNhyhXoEM04uDU+ZwW0W9RKIiwm74rm6StDNPcEqFlvVMpqpwWLvjr/MiCu9G8gDEJT7FLMd0gBmA7Qr+5Qq0m94u+ACoXjPNPNdUUotqfIt5ebd5Z0azMhmN6Dw5MwfZMQiKZfuwqidibFQmJrYDqFkYcANUAi5nTiZTwqdrzPJaAu1VKMgr4qU+16ILi4Kk2WAt7gEWkL5Qi9bQFmg8LRSSVxhCAHK4p8E+OxoFywSUypjcgOOFh4qkuOymgZB82AZkr+eGqSWKDChv4Pm85m5h4dDnOHewAty/Sc1zfpbOuFPkq4xCreOmlgsi1ly4JkqoiQWEL0gPNXWgk6Gq4bkKkq4JvK91p+G9L3SC8KkIHvKpkicgffMDUwuT1rQH1Q24ZVVvHl1lGBBALz1RLOK5CCIMjTEbGfh5eJLLX2QSIxIk7aGHA4qm7Glh9xqJAaOlPcj1cMz/co0gfwLJ1lxsuRMW4PzialSBYEOvR1aRJ3rmcUO06E+f9VKerpbph2Bh4kvcbJTd2s/ofm+gfl/q8/7tQNjomTDCtfPbFlACZsGcscn6egokwWbImgQLjJle1HV+QPzk2tZVTvtd6Nf80wUycrbYSwn+gSxTuE9UoYEWbIFR/kaSbUMSYVZKh0+RH2yoZRSjbLhsNJiQ3T9Z5u9UfrHKG/tR7QucfYfllpsL9qWVG4pExMp0iCmjq1Okk5oLJBU6Nlh5Uxagr9SijvFnu+1tkg3EPkreU8te8DIOoIXMDHlfWTU4j3Qbp4qZmvN+xTdjd5DZ0hoZPcvbIiyQdMwaJ8UGLHOJdsP7UAnraov2nZsu3B98UFsl0LAkhBPeXbaXmg6edoOZ555Z3vhfVJq2vtV1zODx/Og1yDYw9WljJrc3WYfbMJDhByjWcEyNV8eKRHc1tjKORLzZw9YSFWQl07PFgnI5QnA7do+y6XWB8ifGbNSlSr9kGLmruSYWMw8pVia4YNdJktUkV8QiqPz/deoJ6sYlBx5EMQ3A1WQEGQROzvejfuKGNms3XCklWwisH+kn1apVrLRfk2so3K1+qBTS2cxS5zKUabGkvKVJzKt8G8mD1K+pGP6M1UcHfSxAOn/0OcZ9aOuJmSkxaWniAYHfUEwFdlQsyj5HFECNu+iGOSfiQ9IvMje2TRAKoyak5ZONDbqRCxfIDhpWzoRAlVrR+s66GEHboBRqwmol6utrSqUqUZVBVFINIheeX9D6wHW7Js0JHJUPGMBscd5qdRemxtaVnyHTI2+BGJzo/ikB2Ay3DuC7FEI8tB16tddfIcYglXzKb3Xf4/gRGvlQXJYK/qMgem0/wM=", checksum = "507f742f17ebce1bf526f305c5452da2178effbeb70e87db1021668de72aa86e" },
h = { count = 345, codec = "deflate-base64", raw_length = 2415, words = "NVbBcqM6EPwlB7Kp8AER5JBXta/KYLgJ2IqzyKxjwF7563e6Wz5RAkkz093Tgy+L1Td7X7qtyz98Wdy6w7sv69hnz7a6dAe8PPenwVe17fxpO2PX7Oyx9DhQL32Fx3EsP30Ztq7SS567jNgZJt7pbuPBAhV33FnVi88n+7a0/LZLYXk83PrKvtXrgJW7tc2EeOPpzR6nscLxmQeK355JbP082cv7wDuVtYtD9mkvt9YeJZJHSquix2FGhMB4xcYD9bFDWBSNeLcBK5cJglvH2l8UdtVKgf7/O8zYsgiz43AiSi1qr89DjtXUNjfLTOm6pw6ZhWmwiqr65RcKC1sLeOzO5o14oszAsIZ8nwOliWEtUPlqj8g7i+vIGo4DIdi4Csq61k538WQsqpTfIx4h8jKADCSmDtCBnHcdf7fosT18Kt6bCNgjJY9VcRVKS8faZ6rHsgasxdw2QOIJuFSPJFaWWURyZLjgXB3H6g92ApDS3UW4VGBXk6pEnIAMO7JZ5N2pBSB8WVx8vocKSKrLCXLx1ZJiJV+sPVReH0Xq5E9Mnto16dvLKkjl4U4aXaL4OmBnkXOnVcTVlXlakzDBU4dAYfbckndkeiHIbiFHJhti/dzyzrUHdMXGDrADJMB0jVXG4+7aNwKZd8aeIP9o1Y1DtoeE1STP0sSGoqFrA8Q4Ym9C7FDron7IcQ68s9VyKSuOal+ItgpWNGq3lgFY323zDgIGtLa1E8GShMPjm5iOXbln8rx68Q0IP/eU8JWuYdDhzuLcZgvS1bmrsp56SuM+lmwECfouAs5ik4XBIKRk+ksIAy1Bd9ZHOdEy0CCiVqnf78Aa2iXIW4dABh3xvIqHRfHoYFYY+TPppwMNYRWQlueegFBudxIHk8O3s4xlBe9VnTQYW/K3khW3pC6WVeqW4kvfJO9AP6Ns2OF86aLMY21PrxDYQ7sZ2141rGxKAzK5MA98U+zAE9xe6Evu5A9/0PYUu4GVy21oxgvF53Snm72kKCSu6vcoLSmXOpNn0SDYCOjUb5JTB/GQZsCiRxweYn/m0MjUmzPNUYXlQmnHsDCrPXfSdK495Rbl+skSNl395Q8/tZo0ZVDYygbCYIA+GY99KzwJ8r1LnXqQf7JhOWxIqsZENsnEJwlzr+aalDyKvg3wunB7mCoKs+Gmtm+p1h9chUsP4sKs2iOF4jT4bAtp5C1VCOwOJ78OiRVBZ2CVO4hdWtrJgmxgLpoIHxLKpOGWGoEgQ8IGT6tZnDrH0+6lcgOLBIjboNFqgxYjK5iCULuQt8HwsG2KvdcAG+SYPaYh5gqToEJg6VDdma4fNJbQje9SMle/SAdnKiflKyczIVjG9AOC5P87AwnzkJEgP/XgwWnm1DKykObmTu105KjDLwfhUfLfXsMmObtcY8bOKo1It6rDsz77oH/SW4+a7y/JBzllXJZULiPbOLzNZrK3fw==", checksum = "cb16ec4dd964694308c276b150df35b461e5e03f8eed418a55f9ceb47afa9ba6" },
i = { count = 121, codec = "deflate-base64", raw_length = 847, words = "LVLRbqMwEPwlSOIqeT2plzQSSEGKbPxmG6luiCkKAdJ+/e2M72kF3tmdmR2n1dSa3ml168yH0/VoUVQR0l7KPZwuztSTNRe0+E1wurm3epUy+u2FLYOUcrTHq8ALvr2kpcJPn67OxCWkd07Rl/wmLQfZWTlzjh1xD65t7h7DbLJ6h87OyBQ18w0b9iDok5BQZUg7Z5qbO/XOWGEtw+q5xQaVnPkUQLSbvWxY/CC7yrWlsD4kAcSZokFwjzd/wteTuG7ygtNPwZEghamHZ5G2K0Z3uhC6E9bqQ9GivEaKBuBdOrNntuDa10iAWjsa+eW3nxDm8AUnRG38adHy99mSYMF94jVHT/kqEX5qNdD584/TEwFDdonaHyx1AXeFbge66mbFcrjElpkamsWfKnRmkwu21L8EiMk0ZAXA1JkLvtYclIrn30DRb8BV5FQgX34BDsvJk0c141sLmfW33yJg2daa1hm7BBxHFFFtToiS0TuMhoOm+f6vHVGUoOQ7SGgD9pHgn5WAZ+ygSCXG7bw4nBFByaMZsN4d86Uh8zAzg2MMibHJLcofV6h1kFlGD55n2moknzSrtwiKeMZgSs6y6KH6Bw==", checksum = "afcf11c35e7a463e88a698fe0351510e70c0ad902cda1655d425a1a561324a90" },
j = { count = 131, codec = "deflate-base64", raw_length = 917, words = "NVNBcqMwEPwSRpuUdcwhOHvwIQcLpJsErooN0nqNiYu8fqd72JNKaKa7p3uI2VbDxxiLG5M5xjzVof2M2a2Rx5z4Voa2irl5hu633FbfPuVYohmlJIdO+ppH6kaWSF9xj177UCkfffsrZntLRTDtdyTRRSvr2J6kZP1Pize3SVqGw3vML18py9FckkFDRT63pAK+O28CpsoC+GQGaJkuXvqo88hRDntp2FGEM6AtSpTtC9mb1zMw0Y6JCjBzMw847C4d0PB32N4MBD58BiadEAc9tWxvz1RjaAosbg7dm9BOfVGTKffhCT1TxLSEWsDcZuSV1tl1+ADflV5PS8p4m5PZ+gB983gTIjr4lcDQ1Gq5SWi3u95gvh/6Ym96u+NWnPbZnfItOvsckIoz6mcO8MVeNbjXcwtbV4poRm2/q1ksASYzurC9MZr04mW+4q66Z2uo3zXiPcfEgllKyk3FkkbcxWrMHtYh4iMtKGAYYbJAc0z3Q5cst5V7xqEDUaoe2+PWntnSM0HRnVAGW3lmtPoOOhUMq7+J2PMAJvYTKJoR4jhRS33Sv0PjwM398VwpXVPkoA4iYjudOQpL+K+A6KZ8o6D8Aw==", checksum = "cddb9ee4ef514128043b62c589420ff3526c6ee5063f0ce248be21f6d383e3e1" },
k = { count = 223, codec = "deflate-base64", raw_length = 1561, words = "LVVBkuIwDPwS2JstcpzDGmaq9sCBBPtmJ1MbJiakyCSQef2qW5yo2JbU6m6JaHLX2FM05ezrKdqPrj0fo+m6z2sfTTW3e7nLJpzf5eeejBzmKdY3uTOhfkTzHL2ZonFrMjsJX9L1j9yt0SJ8CjXu+nj+K3FzkB+pEIZjtMjyS+6mZi8BefVDj7JRKuDu/E8O+3BAvU0ECKlgJUu3RFRwP6kG6gsPy5+ILM9tMPqyBogi1EfU88BZrWkAiK+IgGolePfQ6hvtb+VdMYYrUk9MnWfFOUcQ8lyS8dGGnPYSXmRmKRfG5VeyiYWKhUS6KRkJr3JzAM61RTJ5gq/cpWsjh11CXDG2fCIBAP/dHI5A1oKC8trySfY1D9EYKqCs097lC4XKgd3mHy+FrFJnc0eNRI7zmzIv/RUdINlqZWp3SeZdvvqk9HiStYmAVAlc9L59Kd2AiWLhk5JN24/cknnjobR7JL78rZ7oSEj1oAvcwAqu4E+xNPYNWSIoL8bG/ANZScnyNQop+PzTwFJu2wwn9eBGv+Czi6/fSStyPrft4QYvhT0CCvjadGNzgKgbrb56EcdW9xYVqo1HWTBIslryMgW2uW2uD94BkrP+fAI9LJutdjSyAhTjyDCZM581zRDOPc1nmZMvi65lt4s2VniOxdjQREuDu7y2Z49D+EwYjPCSyEhLLWqwzHEKHePKm1pq1nmYqEOhiskc1TtYMdYeccz5arrSWSmlTbhu0h7WRBAzs1S3lq3MAT3IhNNnKmqXAwdvoZMlNUzrvuhICYA1qv6Tis2vIUn2SNcBfJtpffcduScmD8rLB7eGhNN82hGQMZyQZNQEp+hHK4piNN+dckDiRuWgvRMklu0mIGw16NjPhFSObLMUnDvdDOw9DHRIIzjNR6ELcFL5t6xXfiOZuJwTXt7VUrI/T4q6142ianLwMsgSJlry2XNL5Yuuw0VBqBxuDjL9MqKJHW31cOJLuAerRDcYds9Rae2VVo6MqrkQZ3WNWGvVq787IYk/4QLsLE4xF1mnaroN/wrEL/vdfw==", checksum = "3fcad2f6d44d7cafc7e9425f1965a92835d9a33ce53db057c2fdae85a69cd1c3" },
l = { count = 409, codec = "deflate-base64", raw_length = 2863, words = "NVZLc7M4EPxLGPKlrOMeFrOHHHyIbLjx2AoYQVIOmMW/fqe75RMFSKOZfsyoOblHm342hX92xdic3LO6bM0prNX1wx5zM302p3wtUzwG/sv3qrB/bsSSwt/qzPblc3V5s8dSXc72uFfXf+yR8M1l7YwlSc19tn1sirDXF5wQOhzk+uZqH/3Ij77vZrzdWpxuKTGXscnwb+tOfzPB0xHHljz2u8R59pHn9c2MzHT6f31zsQ15304jQlczgm01/oWF2/3GdMMTSJzcpvOSEg8fkZi0ZGgnC+ZWvrlHEws7Yd9DSCRl+mX75vp6xkP7FsKDUrDvIEAMOgudH5gEgn3wH4L5vi1Qw1phiUu1b1N9th2ZvdVMMOPDzcpzQJmFn0XOrjJ70ZhyiVew/Kc7faHM7gLef5uCkGsDYbU3xVy0r28zVHQrVSaiFP63vCCz0LIUQ2Ik8tiQj0i3CM8a9YWthcD8dwc63A0rERNIhIjEDwsLq6SYdKDYlqTMs0SeppcJah14ApagsHubIuahg8B8YEzTGZPXQcHyxFusfaipiXfKxk6YUO1K4tyDUYAZdCb+nHjwQdymNIL7JnF2whVlanswzOCAd1IVEko4ZFq5UsII3cIW0q6pblTMTzKWKeviLK8Al0zw3GQu23CUDUfakOqJRoiMrd0VpWQi9U1gPUriEh2QVqR4o//CLrEvzQV47iUFtkpZqVQnyPOVKVm1sm/F5iF555K3pauUBPLChw+sAf4baQuIyGIitJ9IeHg2kn48oSKpe8mGtJSkY4Et4OnpSGVR5b16SCaqbgLZRAuZHiqwYlJkZgsLMzZhdJ/WL8zwb+8uCR92kLXDStLoJgEiaTQ877cTElBdEUzCZ0KXItjQZDIXkZcGjSM2lhtLySVaHz/OcoeldGQLYo981ODB9bQobDFS8+TBjPClBqFeoATZe1xaQop+U8yJSs53bg/RD2Iz3JXZCx4i79Qgcmq+6EIt95fAGvPhg/vYMXuxOVSvJSD1yZUhQRMHLtOZkF/VyCRM8h4Ce13+JuQPInxRxxx4QuAkMawbAnLj7IA+oYI4iP6IIynS95EjeWWsoiZYbUqUvA0GmrKG3PKM3duCUTb7a0iRFQXLudJolLVXOi5P6ZVcTkUUvklScrgxNrHzqS9JyZiGgG7SvN3jYChnwcPtcXZoLLlBSv4l8m4oqYInkw+L/s3sE2F8zT9O0YWdFmyClaUjyKsmwlTRR/ea7tc4C+puIc6HVX036a5/cZxBbpHNQBVYYVr50Fx5F7f36D+58dlyTNxFXA99YlpcS0qYS4boI2m3jzTyehDnJtwPMYzsIXZVia5i15BsMIhIThwhFDRuCUd+JJAaL65Xx9QgyjdOexMDVropzhxq3q4xxHNTngeutFsQJlCuFmT0c+WmUZDp6pCAFSRPpz7Ur3dZOw5MtVgfvTk3aQLka4p9YmvGxMN5B901XgfV8YIVGzyaFdx45uQiWIrpNh0UJSzb+1h0vEg81GYSEuCf/7JD89rE8fkhXD7Z0llDvPf86I4y85pmKUVrY4CFeCf6wyZnaqXqOJ2gl9e1kEaP7m+o5KB5pOtPvLjYrQS3PEf3g/As6lqNBQayUYDmaORkKoxGX+Pw1g1p1L5I/0zL4Obxqbsi3Dgr3b4hyGpyLnawH87p/C4RHaza/wE=", checksum = "b098f2d1be5e7eb3bcc4604962aa9268bdd6bd33d93c657f0dd96e54119bf029" },
m = { count = 502, codec = "deflate-base64", raw_length = 3514, words = "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", checksum = "cc58eb2b069823e97d990859e4de57177a32e5d2fb3a47150de943a81fdc83a6" },
n = { count = 212, codec = "deflate-base64", raw_length = 1484, words = "NVRBkqMwDPwSY7Jb4weEZA57mEMM9g3D1iTBeKiEhCGvX3WLPbkwltTqbimOdvb1Zxytaev3OKYimp18vUIzxOyKrhziWK2h+SOXt794UpW+/og53fVl0deFXD68Ocnx8vWCuP4ocXZua8Rd4kH+pWtb4muOONyuP8pRDW3zIV8r4kb3wmV2s894cu5wpGvAEwGBADsppGt7AJbVG6CeOybTsu4t1sBiQtMBEi+rqR8BYhfQbcotA4xn9SHgSRp6tOm0UEoMsA/2nr5bALQDcaaCkNwUzBfKeh43pM5uaFE9zX4EBfyX0zke9nL524Msq/WEM7QiWdBm9cYs/Zk6uKQgBuUze8mZnTS9R06V4y0izpJ54SzUOwWPnGUg3Es8qoxgqdK4KgcyOMUjSe5BZBpVsV++OVEcVij1svQ0w8VnsDQGHEIdKlRLd1BaGfBsm09Wp2IzD/ESKHeLXhYaNyuWpSNc1cjeCSld6ch0IxaR8X+hPQSniaprRzUfyJlF/sMXrBGZTA3WP2O9V1/vlU+gXrSsZEG9LbXp2dgQYGH7HctOuv3pIaMttMI5jB4BvoE/B5V/jQamXdW0Gi4eFD6FLJa1G2fbPEwdn/ym56vB025PypjUZzAtwIsqiPvhqLmVcVb9KZ4vGdCj6bSj3TCw+PdqGae0ihxsc40UZyWk6kIrWnVISpxbWQJbYwwQLJ/sncLp3KaXVs+xFPC9hJ+09285tv4GnZWHboYtTkYNyRbqLgxyOnIwmIeiG2F2Qz7Tox1xuTnrrtVLzDspp8FIlkvsyGVCmp+dge53yi9tEufU5c2YXB68TItSXqpRzmRQXo4bFu2I9r5EA+ZvgbzcNgvT3tWkG7PQ2dRhBtfcbhxD+6RiwgTll7k90fPMYnS4VlaXJcdN9Oghjrw8YofoIFRbeNEybuVCkjUDuK7U/XmjPyXg8P4P", checksum = "3bbf9d49e08e21a2f18ee73b2102ca749a8baf2aed5d5779a47a863dbfed59a9" },
o = { count = 189, codec = "deflate-base64", raw_length = 1323, words = "PVTbbqMwEP0lsJto81ikkBZpkYpUEvsN46okmBSFXAhfv3OOq32ybDyecxucLk7N/sWp9NgOn04XnRtap21w579Ol6M9vDtddY3+dGpzbXffTtePZic7P9n9h1Pz1Oylrn5ykXKpk0PUqWL0b/JKnVj1Rw5Hp2VX3JoDrgS01fXNqM+4k29d+JJXVJm6Xe/U9Wlw06btIOWrBFfU3KOR8sEe8NhoBrlpB2DRtnPST1X3FiB8BFH+cOnuTvipVXBvvdQ9SHq+W80dqZQXss3YSI9rNqpPHiDSKEg32h1oTk6/Sj/BSdI+LkYeUxsphy4BbNX8MNDFj5BVhVuDw83aUoLeAkS1wiuqlEboHtphK9Ld+XSVGICfH2RbngyvRJr5BeW6OzotjmULGeUL1NVBuIsgpRxu5UpCYuIDJV/b/UOwRP/sZPZSXlx5xd4JvroDi0pHA7j5kzfzxaBu80Oti2M8vMRdF5VY02LbtWdRokwMvtXsjn5Y/OiRs4yC6HoBFnmsEbhqtRB18SSHLGEHCR9CVJwNwFd0E1qrb8S0PcO4BHUSN74C36XARwlsNCcb/T5Bv99E+t0WC5MFrQVuHlUCMlAZv3ClGCmW/zFSrlaTObwiUuRnB0PwgTTHGDAxFTTzqLW//cJ15JA0O+lX9cigSEdI2YMpDydEQ3dTgw55QtJlQv/qhFGcKZ3AZXpWo1MvUWRZVie2TY9xYKPk3ZUjgyvg8GRdKW5KwKqA7qqKughOaH3tWlFCMsiwWyohh18HasbJsSIWNAvQTBf9/2R9YDoccAILJ5wd8iVO6sR5qKI8MgEcWCqv63PzBvsvGDWaCpyBhuOPAm9Di/9EEYglYyZU6CGPdICpCj5IJvzCqUr571E2ibuuVXDzZCIVCw7zxF3xxADBVPheRs3gdPyxUNZg1fYf", checksum = "74b9cb6a77c05aa423398846830bc85bed6a56a4b04ec432129d93e748440a91" },
p = { count = 616, codec = "deflate-base64", raw_length = 4312, words = "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", checksum = "a34bde7449c959b39d0eaaf0c76e72ec16048fc6428836e86c2d655996a1661d" },
q = { count = 63, codec = "deflate-base64", raw_length = 441, words = "PVG7DsIwDPwllIIEH1Bahg4M4KRbYxBGJCgSAtS/Jz4D06nO+R4u+2PhfmB/fJ26g0FbQSa/Y33LOizxvlcYc6iQRlJ4TV6HwvmhELsF9pqbUmL3xgKkZaI3mO6ib3wHhd2aaXub/ABN84s9jL7r3Kv79WeEEOlEiDR+hw5iZ6jM6kCbOVILFYSvcZf6Zf0KN1DhvETO3KJKpdD2GaompVXwltrBPYBSgntAxRrZJcq/uzJFKZSu0S5op0vmJ9GO/CtmmtaonrymTrOdR8bGHLCQAsKL9RP7D8LN8AE=", checksum = "58e56f99b53d050cc64da9bde220688f8251ad5f040e3f4972d04a762eabd7ec" },
r = { count = 434, codec = "deflate-base64", raw_length = 3038, words = "PVZNd6M4EPxLGNbzouMcIk8OPswhwnADPC8YCcaJjb3xr9+uKnlPeqCv7qrqag2zn/ryn2EOS1vfhyVc29q+fNke9vbzdDz8tuE8VDakqePclhv81FW2xK9N+T7M7oG5JRRcksbj7tW+zv082Pairz5sydj+sg2u0NHcYEf3C07ZtjUuunYHWzmmBkv81B7eGAvm0qlhLPe2tjOdfoaZG8Kp49d3wyCu/SFiGHYvSKyvXznsLE5/RmRzKhvLdvaxq6PNpR6R+R9C4pEvYoC4CNnyzNmfuC9cuhqpnHrg4tcWF/miw9HuRlzc5sgz/x5xgyt0dBKQl3wf8wtTU+Hox0AghXyaNXduS2Q0t/M7ohZ0sf+FqC3HCKxx2BJOzC+M/a4AVdi+hLVFLEbcL2aEcA2XZkacY1N+IGoNkUD6RbBuGAuufSEu1RvTRJxB/LkLB78hyD4TkFqwmS48xTJinJeGHMUjBreIVMP6hcEv2Fdxg7vn/HTDScM4UCHfioxRg1sgmB7SoIkois0Xm2NkS3jqsy1flRgysjlEFltifSNHllFdkNsZ4T64JEwUiq+I9ZhaCro44sviZH6FhtP/ehGpTGXTz2C6+MPIVu7z26amWpv6DcG3Uuuwa4QSllwRJ3OwJW7bsCinjtqV3MKdKwEWw2UOaW15Q5TOpB6I/UNVDCArLoE0qHlWY8jVv0qtnyq8h8R36yD2dOugF/+lnyXgWUxnMwDR7V76BCDYcFfwUrk5CumfGhJujFHsgm4Rxd+Ah4dFih2Ej+kIVtxZp8hYzDXI31UZ3XjYuOmBJzSIlRUzchuKz2TDqMeG0E00qxS5crxxX5gGVIevuDJFqtzd5CESGG5ncUl1PxoVl9RzbRhZpMlZDjSdsd3hvsiysLql29xJY/giAW7TlsLl8JNykxfIcKX5MfW89sTt41ZfsyC4UJiwizcJbE/eKb7lWJMOqg7S2DMVfj26HX+yws3WCNbjWXHcLj9D0q+UYg3Coy66dtTnStcIObGzDltZVV7VkWSq5mCL5EazKp4ORl+a6VlJVpIWeUhBW4PPS0t04X+ZUYjCejxSbpP2UZGQdy0z5sqJPCRpCdoljXSiNMkgliaTSk9+WgI2YI5BGCB7OiZdn0Aa8nK+St0we9baHgZ2PNwXShGgokyziuQysBqvHQsou5vpDENszbqMYppOODfZnnZqDATy+0gkCkLgVGPGilxRXe2qWNgRkBEZK+CK8Hnk4KRyM1yKSM0t2MSLVPCbbipvVRUXNH8TOy2ooIStuSEVSPhdlsefBBKwQhMZM7UXt0GlLiAVGx5SXSVuq3yYeo6Z3E8ITJYu6NxJz4olxwL1oP5QOTDxKKz3guCNHY9NWGIPshnoM6qvMDF5nRTpRRykGFWwiCy3kE/Z9trl1wVd6qqmqEZklk5L+FbuZwll7Xi0nlRuJNN4E134k1hnq7SKA4I6zMeGOVxyR5ezr3Iie5wMlBu6mlPTd6vMUQ8sv+RnhdSzaKUM1+Cpc63c9Xb7UCuIrHA6StU8c49ysFcZCxrRqh6nsg+VAIm69ktSTDL4Uq+nQi+du0r7rmZqEKBPZ9O5DXyVnFhxhtKidlZlct6I7pxV984HAXSGxgCqbrn/CZ6/bK0h/mFpJ/pE0tFJVpnyy1F0OOP2Qu9hD1BxeUVmZU9rHoe50Gttr3rAfVvJ21orol7Z3Mw86LSrbjg/XYpfqzZ8dvXAJbwhSaZFJ3tiGeKZRqF0pdo1iVNIKWYlE0931XtXrwsDktX4pRpDtv8B", checksum = "ed730847ba9e6636331717b53cdd8f9af450514101c327b3b0614f46cb655504" },
s = { count = 1091, codec = "deflate-base64", raw_length = 7637, words = "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", checksum = "bd8a6e07e749ba4ddd402c97e18d25cd6c17c985eab9dcd65dde7a8a41922869" },
t = { count = 557, codec = "deflate-base64", raw_length = 3899, words = "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", checksum = "890f788a94f0e0e6cce00ed876ed66e6e7982721d0a1c8a0fabae55c62b7be19" },
u = { count = 119, codec = "deflate-base64", raw_length = 833, words = "NVPbiuMwDP2leLJd5nUCQzqFBloolv1mx8s490BSkvbrV0dun0RsnYuOnKAPczh2QR8mn1+4tIHOgapoP278NViNw8zpjcvD6TrQta8HBqjZ6CXQaUQLnXo/fPNhY7mTiszST9Ah+hLUT0tgaXz+y2W2Y8cssy9v3Pm6yx0Xqu5Wf6PFf/yBF593SR1eNqdxuBjC4d1SzWV1xJwqes2c1SSycTHojKoeGaceRkM21kMWyCpfQuHpMfSe1YPoheM5+URnZqQsafbNYuhTI5wHBsFLLneKJwJuEBNst8Td5BBIEf/xKJyL02d0QoiK7RWWQZ7XTuxyZijMiSTUmuw+HH2ldVzEGWTVlpL4m+6eksTee8lsctI5G1ncInle0x4OrRHABBxVsx8wUW/LT8llRJ4sC7hYIpsMIhB0Pt07CY5gb4Vzvxs6C/wouNTSGMCLLuXSOolgFM6CX8hFIhBLq3lv85ct9fXIr+4UAxJcY40ZWEGmbUFGFW/zKwllcBb0Dw7F574lshzvE9sEyx69qL+EmmRwtfLOFIYWZ5Cd07Qj/gD+8sMNXt4mxC5nXSc4Spcy471f/gM=", checksum = "500a738522fa67eeaf5a499767863fca95822c0dc93a9f440443dfef6d801ebe" },
v = { count = 170, codec = "deflate-base64", raw_length = 1190, words = "NVTBspswDPwlApk39QfEoZ3JIYeYwM3Gb5oS4ckrOBS+vtKKd9LYeKXVrkQczdTdL3G0S9dc40hbGE8cpnB+xtEVbfmbwxFP3BrHm4S+vOnlzziaAoGeXfODL18hCS4BYJJvbnrJJ1rbZuFCfz2H9Osd7z1ffniGJwZUwAFAWzwzCfcINV9S0eIyK3ztGiRDPRpaVP+DejQppUoprUri0AldeSLJnp+NpM6xvoCZhH/vrhL4Ayc7hUrgbz0dIIE9hBrytKoEcrrsmyPqiXR27gVApZeTGVTWKTYqllyKdKIS9SKImZREjtpfqEAX9czTlydREN/4pQhij3ubQU5maiFdEUUlO8EVyp+iklQQPaeu1kLnG7iIfzZ/c4HTK+g6ldyynsB5iMysjyI5cIZPnNq8WhT6UJUKZOEKEtzWg9nQNuLD7O9X9W9REsJzxYBZbYzmvYIXV+ymc8aaFeKtKviFCnaGPOxDUrowJysgtZKFMnAuwxxboAcupDkxKOYVRAkzf88uZn7QwKaeYqJXGGUwV+CoVMMJrEXPK0YDYq3+LqOhC0QLcjodU55W8Y8ogvW+KxSkTVIDSMlTocrn7gw7Yn1T3FOF5F1xu7prX12xAcAlD6cztsMufl9fuJL8Xkib7nSu5QkvXigLyYLGZHYXEFQ4HGMFMclJk80w1S442SFqaqjr1lYm2W7w1ukC0ab7kFSJcl+ETlLzS5lWt7f5CONV/yEXzNld4fsPSfVkuv8B", checksum = "0bb0b28b23728fb397fb3197b28a89056479fca43ec3d87a11a2007610b1463b" },
w = { count = 304, codec = "deflate-base64", raw_length = 2128, words = "NVVNU6NAFPxLCGrJ0YOTuFV7yMFJ4BYg5SgDUhJwya/f193j6dUkM++ju1/T5b6v87cuj323e+9yt3X7viv+rDyFqdnNOtmVcjkXfy1cqxFhrfcIW1sc7MqUQjO0uNkML5ZsbnDFbS1vrpcRqaeOp+/uZCGE7vRs1T+Veq6R2soi+KkdDjqxJaW+1sd7e7DVeO6Wxtq1oJPexdjs7J2znHgXq+PMPi1L7j/q0yvKMlkcKyQLa5NX9uB2RrJ4Y7vxhzddrvBdscJWHw+sxzCxXUtNBLd0k/9Fa4mdoYk8DjzFuc5f+F+hCkdg9sB3pXhwX03+ZGFUnyt7sQaJUt8U1rUPhDXOBNJPdf7O1GypJxIxq/CjPR/x49jkGDO2wxtn5ygjH5Qbszi1WwZCZw2ilzC1+cwwYrBFxC2aITtDEz6K99DuD4IOWWayYv+JftazQpIUHhhYLRRSFr9gASVjGjd9wloiKleRmpEc9y9BTvEZOZxBD3xo8Z/rz3x+Lzp6BZUNJo0M9Si3EKklb/y9U5hU+ZWa8EI39rxiTfC0VDmHxgbYA1b3mtZ4RyG/EHnbDvZCsRf+/nx8kZagSInPyAHT5UbIg9YCGwfkbwyYgYUq8BCVOkrs5dAdf/CgHipxxB1ryXuQbKKqm66RbBB/1wsnkjBdan5Q8xGrZosAJGxziJk1gQdoPgmFN0mAz/g85urzgSfAys4u4xdO1elAfYojTRsvJ6ErE2gxgw22/yJ03AfKzZog/S7JdG52NBbZhVkQ8SQ8fpFPTKlBUTxRmBaGH7wjY7ZOxTP9hcoSBPFK7YY7rpqxAqr8Jgjmevck3qHrWbMLT/fwK2FKcU1bRSVHGSDUmrxALYEj+ARg3Zgz3rS339Su/+CPkBROs/QZuEB+lsCC7Hel90DXs2bQxhGzTB5invxGKSKY3YP3UsaCleklRUr/srsX4Zgok7wjcTFHoWw+KzJ9Rwn7RU0oZxwVHjlYmH4taJA5KllCgh5SJiDlNubXtNHlwnZv5x312UETToWitGsOxu0w+32jkdGQBlXoKT6XVXRMGQS+Mq9o8AwxuEyrFps9mLZRDtIgICArRZrd9Ml2k9s80ppj1lEoE0M0Op5kEKIxiYEVJEwnV4ya1vYBDeLzIhdmuOpruGow+5JgEXJ5z10yCO20qeBFm6PvA3TtA7mNtzQfkXdqHsp6VU59Ign5TV6wUZG2lCN9ouUHU+YBOjDt0ki0NEcM1msi7qbm69Onx/z6Pw==", checksum = "98ac0ae4ea2fd8f5c6afe652466d9814a02bffc475603b7c7ee561e24bc7270e" },
x = { count = 12, codec = "deflate-base64", raw_length = 84, words = "S3UPq0yJ8E31yCmOCjdIdQ8rTTIyAfFSw8tT3S0zknJdgYKZUeG+ILnEcBCvMjEcpKEqxd0VpDIyHKwhyagcIpgNAA==", checksum = "971bf398f0f97f4e9bd1d1f44ab9f4120c9742ff5638195388a3a130c9410079" },
y = { count = 85, codec = "deflate-base64", raw_length = 595, words = "PVHLbsIwEPwlElMJPqAJHKjEoX7dbBM1kIRWSVAUvr4za9rTar2z81g3Rj8u9Xtj9vdgT42pilif0a2e3X4KqsOjincUPcUDIatn0bdw4GyTBqxXVyeQmyu/0C1JZmNUCSyjN+CsMCNyieVEFlfuMFOZ8+EVSt9T3f5RK9nTUwLE6swJn4adkFk9ObOVBfrUm5wBdgkZ5XFfXGpY6kdJpNs0bPmYyk8g58zZebOgXN2ww94cLdW7YDY0GAyQenWMySgL7QYlJgIzgFPxZkUckqiL3TmaHUOHwzmHpuxPHCS7t8ecAc50kY+80jXWmZYG79muPK7OTDk7WKrvSNlqDLynfv5/lax7MT97QV6z6y7WyNAvgoQlMb9e5Bvb8NKTu0gwCDlBvrFY3YozzMxJTmBf5diYD3wA8z2TqLdY+AU=", checksum = "89782208ab86f512c0e8efe6e9ee9402160514f935293ed8d72599a9a1d831a5" },
z = { count = 53, codec = "deflate-base64", raw_length = 371, words = "NY9BcsIwDEWvlIbCkAPUgUUWLGxj7RzHQzKxGAZIUvf0leR2pdHXk/5XRJXh3kU0C7THiN/rcJojNouzW0T1dNcLdSPYL+oeATXP/K6Ld3PwtqJu9ZaQROJM4hZaIs0EtmPRkShFOrBnWsheTr+93NyC+BVbM/anQvKCmYYrlebtkK8U0vyUgDtvtbgz2SwgZPpPbW8iSrJqaP/2CFEz8Hp6Bn66yaHWErA+FlueTcBPp+zkP7qpJTU7qL23nyKK39oXEVrNcQPy77nnSOoATJpKyPRyNUUaPyLefgE=", checksum = "eef42c4656e353ffbaa62cf320e4fec299d5ce55f455c57ab60fb1f8b8b791d6" },
},
total_words = 9074,
checksum = "5cc1bcbebbd28f9278e1e887e031e0db982cfd2e0092b5f5ce5cacdcb1875ab5",
}
local WORDLIST_SIGNATURE_BASE64 = "iQIzBAABCgAdFiEEeRWwgx3yC6/0IY80fYjFs3TmXZAFAmpb5gcACgkQfYjFs3TmXZCUVg//by7oszsa+28N913FadvzUtCSSq83MWM0yi6EnH64wNh4z5z4G+5M3LfKCcrCi7At9P6bXtbIKTdQ1hWA+h3+4Bn8RbCcTtlH4YEvIUWo2I6fnR/UI1sbimI54UvjSDwk9LyXKIrkopLoeU024ifQqjfDLHIzKLVtt7x3QWT7+OWAb4XiIztby10i4F5v8EQ2xyDg89I3lrTzJSK4ktZI5gmwfx89KY1ualfA13S4rP8GuTaiKk8dz6oTQUzCSjSCK2D1T2w7N5MD3hvHnSuomSDFMsvXyl3qrBF2RarKzaUC318P3ujsC5AkRL31YkWPyryWAzdByIT0KJ2Js6JCYAQo/827qcorK5MtppJw8oCvBgnMUdycJBSdAndwZ+fJtR421Nb2LTSRiPEyU5DR47hKVFSMHYetfd6XiQpbCQvYJgDcPW7J9UXxRU+9/ifgV3+QTQh4Q5WWaPtEKYD9KAoLmg+CPK4VwAYA7i/zzcAsDIQJuYi/VkzB/v7dpGqgDdgJyIYC6oCOBxdJX357WOE+yf7otlMpkQaHlKWcBa5jwjoJV2jc0vHlXrS8hRbnl/l0Fm05B/ViBSSonWKVGsMRc+aOfYRnKFL3QSWeFJa9HZbgwjQ/tGI368vFnSYGWqQe8oG3Q0jvE8LXdznR3nA7DtnXFyFjazsccPMekzo="
-- END GENERATED AIP56 PAYLOAD
local function json_decode(text)
local position = 1
local function skip_space()
local _, finish = text:find("^[ \t\r\n]*", position)
position = (finish or position - 1) + 1
end
local parse_value
local function parse_string()
if text:sub(position, position) ~= '"' then error("Expected JSON string") end
position = position + 1
local output = {}
while position <= #text do
local character = text:sub(position, position)
position = position + 1
if character == '"' then return table.concat(output) end
if character == "\\" then
local escaped = text:sub(position, position)
position = position + 1
local replacements = { ['"'] = '"', ["\\"] = "\\", ["/"] = "/",
b = "\b", f = "\f", n = "\n", r = "\r", t = "\t" }
if escaped == "u" then
local hexadecimal = text:sub(position, position + 3)
if not hexadecimal:match("^%x%x%x%x$") then error("Invalid JSON Unicode escape") end
position = position + 4
output[#output + 1] = utf8.char(tonumber(hexadecimal, 16))
elseif replacements[escaped] then
output[#output + 1] = replacements[escaped]
else
error("Invalid JSON escape")
end
else
output[#output + 1] = character
end
end
error("Unterminated JSON string")
end
local function parse_array()
position = position + 1
local output = {}
skip_space()
if text:sub(position, position) == "]" then position = position + 1; return output end
while true do
output[#output + 1] = parse_value()
skip_space()
local character = text:sub(position, position)
position = position + 1
if character == "]" then return output end
if character ~= "," then error("Invalid JSON array") end
end
end
local function parse_object()
position = position + 1
local output = {}
skip_space()
if text:sub(position, position) == "}" then position = position + 1; return output end
while true do
skip_space()
local key = parse_string()
skip_space()
if text:sub(position, position) ~= ":" then error("Invalid JSON object") end
position = position + 1
output[key] = parse_value()
skip_space()
local character = text:sub(position, position)
position = position + 1
if character == "}" then return output end
if character ~= "," then error("Invalid JSON object") end
end
end
parse_value = function()
skip_space()
local character = text:sub(position, position)
if character == '"' then return parse_string() end
if character == "[" then return parse_array() end
if character == "{" then return parse_object() end
local number = text:match("^-?%d+", position)
if number then position = position + #number; return tonumber(number) end
if text:sub(position, position + 3) == "true" then position = position + 4; return true end
if text:sub(position, position + 4) == "false" then position = position + 5; return false end
if text:sub(position, position + 3) == "null" then position = position + 4; return nil end
error("Invalid JSON value at byte " .. position)
end
local value = parse_value()
skip_space()
if position <= #text then error("Trailing JSON content") end
return value
end
local SHA256_CONSTANTS = {
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,
0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,
0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,
0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,
0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,
0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,
}
local function rotate_right(value, amount)
return ((value >> amount) | (value << (32 - amount))) & MASK
end
local function sha256_hex(message)
local bit_length = #message * 8
local padding = (56 - ((#message + 1) % 64)) % 64
message = message .. "\128" .. string.rep("\0", padding) .. string.pack(">I8", bit_length)
local hash = { 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 }
for chunk_start = 1, #message, 64 do
local schedule = {}
local offset = chunk_start
for index = 1, 16 do
schedule[index], offset = string.unpack(">I4", message, offset)
end
for index = 17, 64 do
local first = rotate_right(schedule[index - 15], 7)
~ rotate_right(schedule[index - 15], 18) ~ (schedule[index - 15] >> 3)
local second = rotate_right(schedule[index - 2], 17)
~ rotate_right(schedule[index - 2], 19) ~ (schedule[index - 2] >> 10)
schedule[index] = (schedule[index - 16] + first + schedule[index - 7] + second) & MASK
end
local a, b, c, d, e, f, g, h = table.unpack(hash)
for index = 1, 64 do
local sum_one = rotate_right(e, 6) ~ rotate_right(e, 11) ~ rotate_right(e, 25)
local choose = (e & f) ~ ((~e) & g)
local temporary_one = (h + sum_one + choose + SHA256_CONSTANTS[index] + schedule[index]) & MASK
local sum_zero = rotate_right(a, 2) ~ rotate_right(a, 13) ~ rotate_right(a, 22)
local majority = (a & b) ~ (a & c) ~ (b & c)
local temporary_two = (sum_zero + majority) & MASK
h, g, f, e, d, c, b, a = g, f, e, (d + temporary_one) & MASK,
c, b, a, (temporary_one + temporary_two) & MASK
end
hash = { (hash[1] + a) & MASK, (hash[2] + b) & MASK,
(hash[3] + c) & MASK, (hash[4] + d) & MASK,
(hash[5] + e) & MASK, (hash[6] + f) & MASK,
(hash[7] + g) & MASK, (hash[8] + h) & MASK }
end
local output = {}
for index = 1, 8 do output[index] = string.format("%08x", hash[index]) end
return table.concat(output)
end
local function table_size(value)
local count = 0
for _ in pairs(value) do count = count + 1 end
return count
end
local function base64_decode(value)
value = value:gsub("%s+", "")
if #value == 0 or #value % 4 ~= 0 or not value:match("^[A-Za-z0-9+/]+=?=?$") then
error("Invalid AIP-56 base64")
end
local output = {}
for offset = 1, #value, 4 do
local a = assert(BASE64:find(value:sub(offset, offset), 1, true)) - 1
local b = assert(BASE64:find(value:sub(offset + 1, offset + 1), 1, true)) - 1
local cchar, dchar = value:sub(offset + 2, offset + 2), value:sub(offset + 3, offset + 3)
local c = cchar == "=" and 0 or assert(BASE64:find(cchar, 1, true)) - 1
local d = dchar == "=" and 0 or assert(BASE64:find(dchar, 1, true)) - 1
output[#output + 1] = string.char((a << 2) | (b >> 4))
if cchar ~= "=" then output[#output + 1] = string.char(((b & 15) << 4) | (c >> 2)) end
if dchar ~= "=" then output[#output + 1] = string.char(((c & 3) << 6) | d) end
end
return table.concat(output)
end
local function reverse_bits(value, length)
local reversed = 0
for _ = 1, length do
reversed = (reversed << 1) | (value & 1)
value = value >> 1
end
return reversed
end
local function build_huffman(lengths)
local counts, next_code, tables = {}, {}, {}
for bits = 0, 15 do counts[bits], next_code[bits], tables[bits] = 0, 0, {} end
for _, length in ipairs(lengths) do
if length < 0 or length > 15 then error("Invalid DEFLATE code length") end
if length > 0 then counts[length] = counts[length] + 1 end
end
local code, maximum = 0, 0
for bits = 1, 15 do
code = (code + counts[bits - 1]) << 1
next_code[bits] = code
end
for index, length in ipairs(lengths) do
if length > 0 then
tables[length][reverse_bits(next_code[length], length)] = index - 1
next_code[length] = next_code[length] + 1
if length > maximum then maximum = length end
end
end
return { tables = tables, maximum = maximum }
end
local function inflate_raw(input)
local byte_offset, bit_buffer, bit_count = 1, 0, 0
local output = {}
local function read_bits(count)
while bit_count < count do
if byte_offset > #input then error("Unexpected end of raw DEFLATE data") end
bit_buffer = bit_buffer | (input:byte(byte_offset) << bit_count)
byte_offset, bit_count = byte_offset + 1, bit_count + 8
end
local value = bit_buffer & ((1 << count) - 1)
bit_buffer, bit_count = bit_buffer >> count, bit_count - count
return value
end
local function decode_symbol(tree)
local code = 0
for length = 1, tree.maximum do
code = code | (read_bits(1) << (length - 1))
local symbol = tree.tables[length][code]
if symbol ~= nil then return symbol end
end
error("Invalid raw DEFLATE Huffman code")
end
local function fixed_trees()
local literal, distance = {}, {}
for index = 0, 287 do
literal[index + 1] = index <= 143 and 8 or (index <= 255 and 9 or (index <= 279 and 7 or 8))
end
for index = 1, 32 do distance[index] = 5 end
return build_huffman(literal), build_huffman(distance)
end
local function dynamic_trees()
local literal_count, distance_count, code_count = read_bits(5) + 257, read_bits(5) + 1, read_bits(4) + 4
local order = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 }
local code_lengths = {}
for index = 1, 19 do code_lengths[index] = 0 end
for index = 1, code_count do code_lengths[order[index] + 1] = read_bits(3) end
local code_tree, lengths = build_huffman(code_lengths), {}
while #lengths < literal_count + distance_count do
local symbol = decode_symbol(code_tree)
if symbol <= 15 then
lengths[#lengths + 1] = symbol
elseif symbol == 16 then
if #lengths == 0 then error("Invalid DEFLATE repeat") end
local previous, repeat_count = lengths[#lengths], read_bits(2) + 3
for _ = 1, repeat_count do lengths[#lengths + 1] = previous end
else
local repeat_count = read_bits(symbol == 17 and 3 or 7) + (symbol == 17 and 3 or 11)
for _ = 1, repeat_count do lengths[#lengths + 1] = 0 end
end
if #lengths > literal_count + distance_count then error("Invalid DEFLATE lengths") end
end
local literal, distance = {}, {}
for index = 1, literal_count do literal[index] = lengths[index] end
for index = 1, distance_count do distance[index] = lengths[literal_count + index] end
return build_huffman(literal), build_huffman(distance)
end
local length_base = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258 }
local length_extra = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 }
local distance_base = { 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577 }
local distance_extra = { 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13 }
local final = false
while not final do
final = read_bits(1) == 1
local block_type = read_bits(2)
if block_type == 0 then
bit_buffer, bit_count = 0, 0
local length = input:byte(byte_offset) | (input:byte(byte_offset + 1) << 8)
local inverse = input:byte(byte_offset + 2) | (input:byte(byte_offset + 3) << 8)
byte_offset = byte_offset + 4
if (length ~ 0xffff) & 0xffff ~= inverse then error("Invalid stored DEFLATE length") end
for _ = 1, length do output[#output + 1] = input:byte(byte_offset); byte_offset = byte_offset + 1 end
elseif block_type == 3 then
error("Reserved raw DEFLATE block type")
else
local literal_tree, distance_tree
if block_type == 1 then
literal_tree, distance_tree = fixed_trees()
else
literal_tree, distance_tree = dynamic_trees()
end
while true do
local symbol = decode_symbol(literal_tree)
if symbol < 256 then
output[#output + 1] = symbol
elseif symbol == 256 then
break
else
if symbol > 285 then error("Invalid DEFLATE length symbol") end
local length_index = symbol - 256
local length = length_base[length_index] + read_bits(length_extra[length_index])
local distance_symbol = decode_symbol(distance_tree)
if distance_symbol > 29 then error("Invalid DEFLATE distance symbol") end
local distance_index = distance_symbol + 1
local distance = distance_base[distance_index] + read_bits(distance_extra[distance_index])
if distance > #output then error("Invalid DEFLATE distance") end
for _ = 1, length do output[#output + 1] = output[#output - distance + 1] end
end
end
end
end
local chunks = {}
for offset = 1, #output, 2048 do
chunks[#chunks + 1] = string.char(table.unpack(output, offset, math.min(offset + 2047, #output)))
end
return table.concat(chunks)
end
local function validate_embedded(data)
if type(data) ~= "table" or data.version ~= "AIP-56-WORDLIST-CHUNKS-1"
or data.word_length ~= 5 or data.token_width ~= 7
or data.encoding ~= "base64-standard-trim-final-equals" then
error("Invalid AIP-56 metadata")
end
local selection = data.selection
if type(selection) ~= "table" or selection.pick_per_letter ~= 2
or selection.candidate_count ~= 52 or selection.final_count ~= 15
or selection.case_sensitive ~= true or selection.case_entropy_bits ~= 75 then
error("Invalid AIP-56 selection")
end
if type(data.chunks) ~= "table" or table_size(data.chunks) ~= 26 then error("Invalid AIP-56 chunks") end
local groups, total, material = {}, 0, ""
for index = 1, #LETTERS do
local letter = LETTERS:sub(index, index)
local entry = data.chunks[letter]
if type(entry) ~= "table" or entry.codec ~= "deflate-base64"
or type(entry.count) ~= "number" or entry.count < 2
or type(entry.raw_length) ~= "number" or entry.raw_length < 1
or type(entry.checksum) ~= "string" or not entry.checksum:match("^[a-f0-9]+$")
or #entry.checksum ~= 64 then error("Invalid AIP-56 chunk " .. letter) end
local raw = inflate_raw(base64_decode(entry.words))
if #raw ~= entry.raw_length or #raw % 7 ~= 0 or #raw / 7 ~= entry.count then
error("AIP-56 length/count mismatch for " .. letter)
end
if sha256_hex(raw) ~= entry.checksum then error("AIP-56 checksum mismatch for " .. letter) end
local words = {}
for offset = 1, #raw, 7 do
local word = base64_decode(raw:sub(offset, offset + 6) .. "=")
if not word:match("^[a-z][a-z][a-z][a-z][a-z]$") then error("Invalid AIP-56 word in " .. letter) end
words[#words + 1] = word
end
groups[letter], total = words, total + #words
material = material .. letter .. ":" .. entry.count .. ":" .. entry.checksum .. "\n"
end
if total ~= data.total_words or total ~= 9074 then error("AIP-56 total count mismatch") end
if sha256_hex(material) ~= data.checksum then error("AIP-56 global checksum mismatch") end
return groups
end
local function secure_index(limit)
if not random_file then random_file = assert(io.open("/dev/urandom", "rb")) end
local range = 4294967296
local cutoff = range - (range % limit)
while true do
local bytes = random_file:read(4)
if not bytes or #bytes ~= 4 then error("Secure randomness failed") end
local value = string.unpack(">I4", bytes)
if value < cutoff then return value % limit end
end
end
function Aip56.self_contained()
if #base64_decode(WORDLIST_SIGNATURE_BASE64) == 0 then error("Invalid embedded signature") end
local data = WORDLIST
return setmetatable({ groups = validate_embedded(data) }, Aip56)
end
function Aip56:generate()
local pool = {}
for index = 1, #LETTERS do
local words = self.groups[LETTERS:sub(index, index)]
local first = secure_index(#words) + 1
local second
repeat second = secure_index(#words) + 1 until second ~= first
pool[#pool + 1], pool[#pool + 2] = words[first], words[second]
end
for index = #pool, 2, -1 do
local other = secure_index(index) + 1
pool[index], pool[other] = pool[other], pool[index]
end
local selected = {}
for index = 1, 15 do
selected[index] = pool[index]:gsub(".", function(character)
return secure_index(2) == 1 and character:upper() or character
end)
end
return table.concat(selected, " ")
end
if arg and arg[0] and arg[0]:match("aip56%.lua$") then
if #arg > 1 or (#arg == 1 and arg[1] ~= "--check") then
io.stderr:write("Usage: lua aip56.lua [--check]\n")
os.exit(1)
end
local aip56 = Aip56.self_contained()
if arg[1] == "--check" then
print("AIP-56 validation: OK\nChunks: 26\nWords: 9074")
else
print(aip56:generate())
end
end
return Aip56