Bloom Bloom
6 minutes to read
We are given the Python source code that encrypts the flag:
from random import randint, shuffle
from Crypto.Util.number import getPrime
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from hashlib import sha256
from secret import *
import os
assert sha256(KEY).hexdigest().startswith('709149eb5baf8f8cb617226854a7b4f3')
class BBS:
def __init__(self, bits, length):
self.bits = bits
self.out_length = length
def reset_params(self):
self.state = randint(2, 2 ** self.bits - 2)
self.m = getPrime(self.bits//2) * getPrime(self.bits//2) * randint(1, 2)
def extract_bit(self):
self.state = pow(self.state, 2, self.m)
return str(self.state % 2)
def gen_output(self):
self.reset_params()
out = ''
for _ in range(self.out_length):
out += self.extract_bit()
return out
def encrypt(self, msg):
out = self.gen_output()
key = sha256(out.encode()).digest()
iv = os.urandom(16)
cipher = AES.new(key, AES.MODE_CBC, iv)
return (iv.hex(), cipher.encrypt(pad(msg.encode(), 16)).hex())
encryptor = BBS(512, 256)
enc_messages = []
for msg in MESSAGES:
enc_messages.append([encryptor.encrypt(msg) for _ in range(10)])
enc_flag = AES.new(KEY, AES.MODE_ECB).encrypt(pad(FLAG, 16))
with open('output.txt', 'w') as f:
f.write(f'{enc_messages}\n')
f.write(f'{enc_flag.hex()}\n')
And we also have the result in output.txt
:
[[('e32c20f22521b1a170968639eb1cf83f', 'aaaeb4af3ec45495fa8d6d04638e9c4ad9da9cd6057e353b903cccab22ddbd13040fca6ac8b01954fa6ac10b63f9dbc41d7852c8099c8ddadb21ff85e0ce47802c66128e731eaacfab0438cf02ecda46d7345131b53aae7444e268b888a8fc062f01632f98ade058f2f29b5c579c2ea42cdebac901356aa0d331feaf62b08917e91ac8bf5a890fa0198662a0bc5f54e6a10bceff62d3597e4747cf24629da080942bb1fc737a108bdb875e451fdee1ccf6dbbd30288b0417677400567a42ce64679b53089c201cae854c9363b07235bfdaeedb1113ae9123ba89d551e014fb97f58bfe66b01900074d593cc44ffd8ee0bd94420b8448033eee12821c5df7043238fe4bada9bc7608d1568dc3e64324c2434756633fdf492cb6bd55c715010c277a9f50edb2f8633bcc73202f0355c6d2c7909eea4e2c4f61b2d0a63435c5c905039cbdc0c52ecd7b300bd27b45128f2f616936e3b1edec827c9836ff4bbaaeb37ce330a40089d78956ee929ea37ce921c0983ffcaff55dca41b602eb53391c5fbe6b184210f664ef23b61600c5763b7205239938a5b7791886e97c23714d6d807eddd20f76f3566f9558dc51d3c93d3bc011b68b5685a8f0a6e3adfe703bd4f5a7952dd9ae131266213818f67ea77d6bb31334bd47869dbbbe512abff731a26547e4eb7e49b866468cd0af5cc9ced1113ed986708a6191d1e92a9f1ba51ea0b5'), ('82c4327fc565535adc352336ebce4f8a', '05f2ea9e682e485ca0b4e0ab724de11381fa403e7ad2449b0b91bdc5152214b84354474dd98c0a6e2a4527b049f4b7ad786529da01c8ec959a29c6c469a568278c0eede8a0a725ffdb407300129f36c439ed50988c583a3bd212da8b36f438a0f3cadafc19fcccd4c290d78fbf66b431872c7ac92dfd7b5d5a884827b9fc94ff5a59ceebcff4dfd70fa2c24ac9034900455ce1510ba67e3d42d06a6581de2b4babeef058c5ec7df3ba71cc677568378715568e521d2987060364b4371b25047c5f64fd9b10b2532af63abde51a6f2009ca1dbda950b9b582da6891ea3b4317d5bd0e7ac31361de02af0adc5c5396f106f05334144d08d5c2178ac958e35587c97814790c6743ceddce1269122590afe5b049a74d2dd14ad5f4a612fc5e01ba9c3efb4604d9bdc638c1608aa404a9475d4c5e9d50bbd074d0aefeab682d24f344fc0afbbfe4d14e0eaa1a81abd0a924e6ab32bdcb308d8df9f6c2e619f1be6645d88c9717c316262afc12b71dee6ba4dcdf4afa4486e56390a6f437d1fc47008523999c77373e4180bae9fab226c288f28fb49ca1c3906aa608eb889ced68cac17d2b2e24832752f748b8d400a473f4ddc45ab80b677d60a861099d014f199fd601ea2078dc74df3cda901906b202312acd7042a3a6b196b4ca85d9c5c867fb0e0f0939032eb71b16fddd80d096f16cd0a881d5255bb8d8afd1f5ec55d6f10d3c'), ('9aba0b98c8d542b18f5d86f618f0166f', 'ba32d546b718240800f765fc10f3a1d48eac89b9bcea884a82d9d37cf3995d96da3adc68ef4d926efb7502f0a239c6dc17141669d5ae2030fd8dd176a41954fb2d793d39367f3ca1c62bfd3a60e7324fc9a88582da634f1ef39f57195b48876086e29037d4c52ee697281c88d34876d51e147c16710e896139c9d3a8390bf33050c3e2aa0010975797fdb3ac292739af05a69826eae43567160571b5f90eb58a11d509d5f671969ddb8a8399d064ad4e8c87b12b17f3d20e2bc187a3395e9f590830c6c52db9efc01d73251b4d269ddcb7f7dcbb6193c5d94760361f62a0f86f136ceacd9c57be6721f7add8591f06ac8a6d71d9f8e6d0a4b49c38fee6805ad5c5626431845339a44bafd6f31e8dcd242530df1702ea6c63b54f78d49c88d5db345c89ba814d0f5a513f00700cd688337f3661e20b0ea21c1a7b375045f257ad048afd8d8276a520d5a5ba86827d60adcc709e79020d7d2b9d74e2fb97a02f84f5b0b793f6e25d5796d70c070cf20d92f9d93824365c1a8ebd165d30f8112b7d34b1f709846a59e792fb35f3cf021b60752f4e11085d58bc85673add75dcb7da88d40465795337443b863665cf65d2672f5838812641eff53dda53a6714c23d86255af2c07f356ca5e848bfd69abca7ae6511cc4cc0ff75526e3d4ae618a242cb4821e3ab7f087f735502253b228503d99a4b8adcc5a376fe4bfd2a69f145f30'), ('9fb39e686ba315d74b009a662786fbe1', '4e9f15495c7960047205503611d35e5df1c63dd1f67c02181839e22f56486530bcd9de31753b37a54d31263ffe2caf518f39880f004c55630638d7d9cc970a4f6b22f073b31f2d562b735e99627ea47a3e10356ab254ccdae5c0d316d0fd2611202cd2735ac5551752a45b24c91c96c45e283eb7ce6512083a9c9dfbea9c04f1f8c3c8f173ce16558a672fbf715377a8bff6ae62374744e03cb8f7938105040afa32374bd116b7a43bb421f5584f35d320b7feb41575154b2ddaef831a0b432584e4f6709e41db79f3aa80d605c18d278a77abaa6fd94ab1da1e29cf4c6e78c2df187df43d216240cbf26023b89b8e74eb196bff53454b6e5876240d464b70d0eec07eacb44ba5a7ecf279cef068bc71025fa18fe2e7121af700f75ae66e493197d25bc1596d955b85f7b5f9c39ae03a3586bba6e2ea14c735a52fb9ae2e70f856d99c5531355e950b82fd1fed81f605dd9fffc7bf9a0cb65830e8686458ed69a35a57dc98afcf74edf41c7372396ea31dde03fef2f52d223c3245daf4aaa26e040f5d3050b9633e562f4d2bed4068d4897f3b9db239e00cc2da5d73bf065a8944a0a5435d11fa302515830e0c8955876f4a7afe7ddbc46b1b542a96193471d1356091b368f14e7a07917987a5b93b3d68abb5d330a136a50877434774e27fcf1e6ef32c4a775284ddccffffdebfc48c5e2c08cda3140792f1ed417c03d0f9d0'), ('3cef6a7170546a0a0903a630b9e44032', '60f79a6dd1236013dc57837b0d4c45f6df5c7930144a6bad7ae0a30fa99de2ec68f57bbcf8e9e2dc1028aaa9a7ed981460600d48429ff840bdf55c05634ebcf1dd681148b7191ef0ab174a41722a5f68c29e1f948739701cdf60933b79e68df43e2e66f8d375430913ef5d35442b5d9e54903363e80c7deac7875f3687893abfc768cf837338459f4e81c4d3853096850393a9002d5d18c188da8c2078e1dd38e47af571c72633838f392a7e68bc2be73ac4dd2e4f8794e0269515f921d0f88e8629d6e7db9cb65c666e7e19c3cf98672366fbe574d44c544924066e092e9c098567ab88d0bd1630c9c5dd4884d83a1e2775903e6653e95940e1aa09dc4681f51060e9a21d35b15020add7ce07dde322d906321b9b995277f25a75d896bdb4ad681f66703a245ad4504e5c074684da9a8387a743ef5528e1a0b03108cdcd64a70b6cfbb15a12f9e27fdf29e0c62c6b23d008c3f033aef95a388a3ede2c7f1ecbda17d2f1b3d8103bed0606245c206ebcd1a3105c0a778dfb2ed9a436810adfb4b2ca5255a659e131b351f08a740958739c0f5cbac1f8e3f4e224253910f1457a1bc155074acf91bd8878e6eff42f05cd176614e6077d3a917a956013fd533866a5a4e3ca3185d70b91831f4016960ce23cd4ebabd11498e2e4667460d06a077befb2e344fb2366f7ec5d87acd450f3866938e5501826a1af8c833486e75256a2'), ('bcbbb075c9a4496a6d99b0bb75323e06', '8a67a11340ad016bda1fa296b7b6365700a9378953a476b3d10b838e6f7d194ca9089958a5c4b1278fe7845cab09e13ee804cd6fd03aa48de0140ce5049986dfdff06e19439ff7398fd434c2620944ae4510059f9e027a32227a07f46fedda3a4b4e1f6798362bc3d7789879a7e8e71e44d6d9d11d3a78794e04891b6db5edb2b706270cf396806345c93b46f4b20ed734fd804ad55edaf637dacd20d54a0faffc0e3b6c4730ce5d75148e24b8b8b6729540f0706f174e1667123618cc56b9bdaae34d578c4f9336dfd19d8e1fc21937b82d72d478ba289ab760de4b2698ec01d850a9ee6f12f5054409f83bb9afa2ae7ccd225f22e10c4cbfebb380294ca9c378fe5b1ad592e1d69bb91da9cf1215afbdbafb19568c91b7b10f9b37cb723c51d5f9005c8516147aa7a766a27d21725c80508c344117d91ff4ca654e22851f3307f8683eb143dc70fa7e6266f1b302a2e3f808b1c59d8bf4425f497d95cfd8d6cd0e98ddd5e5b2a62da903e42b9ebef835f87966fa09907bf6c2288e1473f86b7f09f35969f609995225ab6cd5006fbce26f7b1fef81651af0e606c97021e3e388f9fdeee4f32d5f7ac4ad6fe5995e30a9336ece236e332d54e998fad191a538612e3baf7c2491faeb335fc07cd01485a93f880e4c90c13f9d1a2ae5f1c25fa84978993b326db12bce215a1b61d8959f74cd5a585478212f25b010cb1343c4cf'), ('65caf189809df66fa7689c7f1dd20cfa', '214ce7daa745cf6e18b70078603eb3639624825c64a03cb9650a23c5bbac5118cc7bf2607f747118636e19d6805885a284d50630c1fe4fa0ed59e59e3f9dfa4cb1fc3b58740ed60b2e330f387c154e52ebddd589f01180929fcd006e047472b7bb68bd95aba7eecbb177e1bdcf81b1f62a48dd6ee3d13f5f60ef39fc03f863d5d75e073f452e6741a51d279b81b3129dc7289eff38e72a358eec98913ed4a07791abe3a43fb08aad0862d319407a63360f94a9dbb73ec005fa1c5c1817e6f11bfef9bca6909bf7c0d5ba6a7b4a82b45c68a3a8ec7efa6de2767f2e2f4bab9878fdc20d3b24d1b861222c9aca941999b8798e8c6aa941775b6f9760d450b6d46037c708b021b1967c283736f6b147657f4061a00afd601ecfa3940ed5de5d7865d044d3a03215ee519d1113aedef4586e1af37bed1ae490966d8efaf9f786e820e08f6a2ae4fa1a6c6e917721ff677753e1c666517d2ef9bb49fbe81d5a383bb3fb1c0ed6f766a1b4f53fbcf7251716a80fb2ea92ebb8895880964e77c181e8945a6a6b76158a3e801fdd7cf6c8575a3966178c00dec97094767d591e499d41e07d95ae64569e502c9227a8532c6779bd977c07d4af370e3e96dcc53d3a73d906da425dba2d705ebeba6496bc9173d19757bbb9ebbc4cf6d3a255c867954f0978fbe515351460e54edef9632a58b6e721875c086cb4828e09dbf413a4b8a80e6c'), ('aaed8c3f61ff0aa076add18e2c1ff95c', '1886538f5f8cef3ed076e5efd7485837efcac1d125e965e71bce76cf22b9b74adf928c1e85c50fda429261c4385c07ac113858e0ebe6a1c7bd51471ff6f603e651b98e06118ded2c97c967f48ce4a8b64c2351db4dd92a9f6dd43b8a65b2a018b6bd6e9fcd8a1e6f1bc5267bdf259b9b5d3f7676e1ec8ac551baff2f7537b0e260ced8b9ed27f17460279036f7679b2e62ff83749c6b9b31fbbaf78df2a80514fb9bac65ac84fc1d41fe3e49eb6ca36b3944d1048e5d67791caacd73392b31545a1ff77e02c65cbd3a69e87fcdf63372184c5f07817e9a073d77d5d4f28a4fa727d45838940c8cb7a71ee7d9aa91f02125fe239ce60d0fd21dc3c65e324f71d0e1fc2d555be4341ff3115bd9644f894bc1159b777b6ee89f0a4a1bd842ed1428a83bb3e292e0570f914fadb48f2170c8d3c2cd084416018316930168935f329df68e1d5f593ae054f99f8ab7fc06f1542000e93ad8bdcf7026f2ff3c05e2417bfa4289297fcdb8b4b3175139026a6076b37ebe46b7909532f61ddf5680bda217b0801c4fa0c186fa5a8917100117f9c81d90f24c3dbbfa46113dbcba536eccb0dfacb65931663edf9d61b6850b295e952c5efe135fcdfaeb19bd413a4784c47cbda66e6a5ad23eefd36d90c8a467017048ec4abe48ee4ed7833966a0e06559cc38b35c4055923887625822b740810bb02f29c465173266f4698791672fc49a1d'), ('bb17b9c41a5746f61aa24b35cf7e067f', '67ce6bc73502b0f15b809031a6ac9ce31a8d2a312fe9d08ab55ed3ff510fef7bbde3fba5628a97ddf092e8f4f4a80c5a5c2b7b9906de8d7aecb11b3b1b434ed81abedbca34ec4059a49c46aa0358457eb2f44acf9b34abf1c8db2365d72a816052010a176f8bbcbf9fc01864ee3125ae99ecdd814b4229efd7186924c8aa5bc7e5682076ada37d496e2222d3006d40f63a5feb601e7e30a2d42538ac455cb817ca3de0e0d0af1ecf957ded6c3a75d35fd8c1e678105e1f1585deddaf0681d0ef5c246ffa4cfa8cb515a22e13a8b68c437f6d7ddf58f3a7cd5c47f6cb830e4f34825a7c034d9d546c86a4a1dd9c75bcf64aaaf3bd3d0a0987d7fcc4295c7c68b8d5d4dbe2c5341bba1799fffabe88548408bc13f6a592aa97d388f9d2fbb3f8203a0f0509b7a85d8f518aa1ae9cfe11cdae58723168cd9d2e7cb7f534d093fea7ec5d9dda5df5e6c92234ed3b77b2cc9c05fea527776055052a9e006d33995488c010b64e97ae02df001cbb9b5ff4197c549f31ca7d09a5714d3460eff2b222c8fe5036162989432765b84a04fb709440e2b05bef473c6b1979f4cf0646ac93538e1a9644c45afef71b784762f3660abf3fea96862cad6c0b70bb66065e81ff6b4369cf9c00cd7a9e35c003bfa16cbb9ad1228ef59e4097a7afa2871b58831f2e0a4d24d3d8b24410a38ace3248fed4faa7e607aec0868ab88f79b8958c8f051b'), ('3396dfd2cbc91d8c990b04852e7291ae', '0b15b86c1e0351df97cbe8fd01f12acd70ab60143d14802f498733a21ff5ca9d0ee617f3c0ee4bef0bae5aa7233639ac286fc6a22f4b40baaffd846a73eb09cb413ff34c1e0e6074b248c8bf9ed903e4dceb671951a0982ddb7b294c17069579778744bac99d6cffdd76c94f986d821276082414b575daa381497cd497078c4d23142aec87770019418856e8d050d86e24d35d8f583e58ccdf878e40a28591459048b7d4540ea3e193a7f50b716a1a69eaf0e64693aa7bb2ed986daa782236cf044e7e3313277f0081d3b747a570d32ea7f83623b8cccb562676d15af3d41aa71a072982928dde4d72e1083e3e36c34f7d04b9881d94cd971678366ace6179f82800cc8d03a2d1ea909960b9ec37c02401bf173f66f80e556dbdecbf9e64ee154a6e7ec44eee0e29b74df3603730a6197f70cbdaa58ee08bf9ce6dfc1c8a5e1f8aa32400736917a510d3a78cf6ea1746575a43c6210413375d1e23d59787c52690a9dd21417f2716d5798d761bfcdf2f179b027c11acc022f160408488c39ab9f05527b33a830b58e4a8e041329e160e6b8c0f1930e9a1ce7b09f10f08f697eba02c979bfe3494ddf8dbe47634b59932647e93bbba7f75f79882c1760681f66e960d75dd8ea954c37abd4a1611b8776534a0e7ee34d05d137e89e7c37cacaf6304b3ae0d279d6b0c5afa939768a992f8bdc876e7f65689633db039a58184b840')], [('de73200dd21b6c2d61c362362284b159', 'eee7e6547c5601373fb4478a98f3b74ae627a4ea98d7bdd3e6811d2f677c13bcb8d17c46065d589f2f9e91900e4ccc4c468f3d37af11c9355e4c3c44be550411f4ece4866a60a383e464777d4eea57642ade2ffa25451b870c72d9a4e766c3b74e748c7a9edd0ed9c954871ef80b292a342192345c22468f08241feb970ccbf181311031ffb677936a9a4e528f66a29d48d21f9d3da547f6b5a1397057fad778138ef0552d260eda51b11bc842852bc2a83c607e8b389e95c02a4bdb56631d2ee57295caab37914ae9696a8f188944878eabdfe55189952ff924317f0eb8e8576cae37002dbfa2ceaea0bb38c6651561cc0db1c446f3a4414417a3ee44354f4c5099cc10d9f4f895ca1e55a1ac03a63c222313f23f3c95522bf72f7f94473e111b014cfb2e5c69ab4db8a688d94582aebd6e1ec10b2859135e23e08ad3ad599dfc019dc480359de8372c160355f47c4fd73c79cd95d53378996f7fb43a723d699002055d42dc7b7006895a8aa680fecc1985ea489f9e68897505ff1229c2e939299f963f694d626182b308bb047e13b857dffa5d5435f0e5303224c4548d3483bacaf55ee4194b1a785a011992b560e3b8c85458c15b2bdca473030982df1ef8a578ee4dceffb109636caed7a412f491aff0f12d03fb0c5e352518c8bb6ea497b98fc739b4c05a7fa72d0735ea488b27'), ('d8ba2e45a564c3808c64011797746ef8', '683d89a93c42673bec0a27e94f86df5d505add530344d36e9a1f5a237d101af11e7a0c3af8b0518608157ebbfb22ceddede1a6779449f16c31f62abd2300f83fce45194e8f79ab412d1a9484c1099f76b4288d5e4f6ebcb8b7511dc2b5ebc9a8f4e2bb5852306fd2fe064d69494432a91bb87ba08cccc2fcde98d8101af3418be61b13161419ed0841541dc9b118ab88c5392458952560591735cedbee56ce4554933f41f6fc5d920b5816e2873e86eded788a528a4dd651f7fe9c0ff81610437f2117b92c362563b8c57401a84d2016d770c6f760b789d4a8c4cc9b07498a7fdab6c7c0f914ca695c605ca9ce7d6fa5e672dfc866f04a6a6b17c0228f593bbabe6cc4f41c5e7d74c0d70e3631849cf16a769846f5580ec2b86c6bbc9530b6300eefe1487a94ed5c4349678fc04c7431ac88824fcd34145953dc5d988ea7961272b4599397bd4d742a2697de3b48401475bc5903fd48bc522edd79d5513102926eb1223e7e397746b3965caf964233740d16dd4185b5ae94011cea62ae694c2697e7dd9d13aa3311a4d82e8b306162c4c04770e36b87b704098f7ec27ff6361ef13da6573e075891dae684ed0bab19ecdb16b188f7b64075de95494dbb553c5dc8ce77b8dd79b5525b0c3fd3c4481321b625b7a88f58276edc455deca578de525f481cf0224b221c11874d1e35d82fe1'), ('c12beb7ffe4e64faae0a14470f103564', '26929c1e4ed1b9ef727d7003e4058e63ef42f6fa2d1907c9c23ee826b0b8d9d70016ad0fcf144cbb0405aadf300f439ba870ebe2acfd3890950e43cb8628adb849661599b418e957b34928bb8e897966c358bb017c8918699a25aa9fb1543dc32ba1386eb62739cbf43bf67e33d12d3758b2926ee5a0deae19fa682e8933c36d2b1dffe0015ee0544bfb65288743ac121dddd7a5c70f080049de93d9b75e7cfd001428a1cb274cebcfd3490e0b31dbbf5ab48e6889cc27383c43cca7a484be18f75806243990dbd0f08aa5c60f75f626a8f7318c9a3cfe6355e1b385d3cce3f3dd4ae2f5e11c30804e76217d7918efa8add17c38f70911fc6f5c88be9b8044aa8de695477d5d6a73cbf8e05dc3fb19edf08097365bac50217ef5d48d1a82176130035e16be6436f6ef6e78f7285c9dfc2fdf0535c4417d0d9489b9bb75ca5000c06b7031027770df2d849c19d2b3cc903e85196741e259c378514fefee4ac3d334ab9d6103714e1604b55c629ef02697a787c801ec256fdada0d5ddeacb68861695f3d0d6778e14f98eb148b309999e80ffed658ecadaabb738c3cfa371433af5a6afa8c7dc86ff8117cd7b3edf9229916082dbacdc30e30a252d144ab2cdfce07bc57b3acf76e8fe8e1e77a8c69e650f6208c56790fec8eca8069c981cd86d00bc873e28f7732c3921bc6231ab634e7'), ('7804f3b3f3fd7192d5a6481ce4cafec4', '90cdf5d5c7d8f460cb4a6d12a68f0cd0ad11e5f5726d5dbb83fe2a28c92dea1f09ddee2c9fb69d807c3e67ec046df6c8642822dd67a0f2595c9d0675135c7e992ca9b523a38cede28beefb3ebf0a98b9608528a9ef9f8d3d7af63dcf3a643bcc7c750f40fdf08accf0b54bb7a3dd24bceed3f919baffa3f3a99f2786715955c24feaf8dbbc1f19b1fd16e7538cc83baf77ff1f01df93be3aeded8ebfb44cc6f86ff9bb406936abb301dbabc362757299e67443550f68f769c7115df89430d9d144b59bc4ffe414a31bf7e21387f8d91d16ca9c0e149a6998a1cbb262e80be9df4097c45b1d750ae94271f0a2e1f2d35ef0253e45b3ba63b0ff8237b28a59e23af0311de27fc384b738b618eedebc8c8705da6e333033f9070fb2122757e556bf624732d6b35c459322062fc7420e3f41d413b2adec5486a55977bf49f4e56705c0520385aed43242b9bd73a634ee99ecb27d766794b0462a305c2c9214ae1864ff9e5f8a7def7987c209f2d0cddfc2cf1fb93e1ad96fdeda3cd0f886f93dff11b8d6c55011fee8d563b26a70e7accdef9ac7dda8f993e1541dcec24b7aa64b881954a04a148c3b66ac69cd8086ac1864ee17a72f90b3accc8001994bd5ba86bb66aa864b855e510501b93609ad3cd98aaeeae9ee7503a9c4e201cc1548ba18a9dc5dca28bce46704a97910020c067e9b'), ('1c9d36b97bc7ce5fd8d4cb4d1d79b7fb', '2fa11c9232ad70bea3d5cfcf5936134df875f8d0c556dfe0f3c4ec6e9a2cb518fdb5c63613d14e2fef13b4062cfad451ba8d8dfdcea089bb9005b47d51dc037425eab19215283864158f0d1bdf77431f93b3da0dcb193e52c07e60e36924c9a83b6c0dda17423c93319f3082ce917a13bc0dccf6be8fa700ed25c7109adcd9c0c2a0a6834854435efdb1979fb1754d9504a196146ce485fa019af4e6326d58d38fdffed7f352b14a321af0349098c706c514d62eca1d845e93b8d970463308be8473747c516c51c9a2380d2ceb8984f96f5974c50386468f0d72495d281f9b5fcf6c95be0cf860636a8cccfda3dd7cd2ce466d3bf434bb80b6f6afd54bde0fae5d90a77dadfd40898ce3d0d7b7ba2bd964906c91c0034f02896a50225aa563af629da54c035f8b45a8b1fc5342c76c38120892303cc95d8b66f03673fc04e5d4ac476e271467ad7da3f390d71453bef855aceb01312c4ef9a2307b5adcc3e6caa1ad17f026a5ada870c82a8139bc34ddc584faebd4c393ace177a84aceed8732c14300f168304913680c122c51314856418d6b6dc0d4ba9783902013b87f057be5f1e0d798104686e575f4cc0f54e7231c5ee8bee5fb5273e753e95bd7b824d70b93a689f13d19f128d0be11ad0bae9d9c24e3abe4fbe17a2de6a78c3a0ca9fd5e10238fc11729aa67895f20a18aa739'), ('6e42cec3116e8613c5d9326033212dbf', '2cf8c56917084ba20cfcaace3b4b1bd3d8e0033a1c0e7d14e899cff8aee7785c62e753d7f0e6aa35625a261f0de358faa0b51df4c26c8bb5cc5e0ac2a2103d8cf4f81de6b4d94b48c9367e719b2f5adb86867ea5ac2038e45784a943086afd81478ba6a31e291e4bb42aa5118df45c6d243028fe89abaddc0136d2cd34342ece00e2a43f5bcf94e35730f2a628c9947b1b8dbe25d66f5d12d22809c539ca12a04cacfe4a40146d64bc3da465a9cd539306be0aab8bbb7d1c2796e3d93ecc908a1b7fc143fb68e5b836918869c8bec114b575d2b2517c8dd1f9f1a7356aa7eb0cb1091b859f88d9bdecc3b4150605440b82e414cd4b62b50a1db00512dfb562bb172497f3b87fb201d26557ee455cf11d89e682c87f093eb4a31b47805dda9c1963f5eec8810934c534fdcfacd965b1fae0eab75e7b3cf8476f4a02d2c9c5ee8898ee6308c7e94058e4e703bc3d83903e1c3b43500b1a3c8e9b52dfd7bbea14073c60c33e1500471c58d24410f36fb98884f62ea0996a6cf22b4ec62422d4800d3141e57144883a189f32b960856036c54cdf8172b1670ee5a7fa1297ba5edcc721b55e6617534d9daaedc4b24e03c979fedcb938bdef9d4a92a91cf3d8fe1d1f5170bd86b1e90db2895fcdf5c8dab6967c12760c43e3ee70910e3c4bc2f7d0f68bffb0817dd2108cee6c7ad8e19b94ef'), ('890385fd17b0870905e6eab0c6c74f6a', '1b7911f46350de31515690c8425d1a6b27fcc5ba319f68a0f12a1dfe9719c6bd55a587664e5f5d21f761874523fe9e92b904a95d1681b3c5396c723eb8c6383fed9835804420a5843199703e985ed76a03d61b90096bcf3e6e402d338c4662d9c1668d7a8cd8730cac5d4a166c3da28b084348b33df1072617b3a1ca0d2bdcb6acecfd99f5934fe8a92af0a376d2da2369a515b95f93c1aca3e7b93a03e74bd3e4863d6bdf53a880e00c09f61eb43402e10b6e7727d571c15e055cdd50beeac8e02c7a6abbad4c886ac1ae4997507baeb885f611a0b9db195adf663173a4eeaa5172f7922a09465203a0f2e90bfbe0579bdeb41d7e9daf2381aa6706c7efc67099caf388ee9a710258692f4177548ecff3d6ed8ebade305c64dc5f603feae112ccbff89d09c392cdb9ca91151e82c8022edf9f41ab97b9054e390e1b0cf99e39cee4013d5de1b2ecd9d8b9fe070b7d59e18d6d494c6ae52463305850223f7a9f2bec08e2c36e62d008d4474860bd7d0ae51c527507fbf1851a686fd1123f875d0bf739239c4b3e6bb1b8e9c91b9dc2903a41833be92ccbb2fcf313628cee2f3296dd9b33882c59d1774ace36e1112e9fdfcb66e2f6b0c5bb49ef3c4a0c68b4ebdcb2e5d2b927fc2e9608ffb6e5932083e57535c042f68479c8c51752bb81a17797c0e0c5680a09ac1085f0dc88dfa0f4'), ('01045a87dba065a61a82474ed1c87a8c', 'a171066f801b3ff433c27ec3402d8d59656609a803c7057e5ebe2c30305214f09fa19cd0978c88f78e300e9b657eed8cf9f55efbb16a76aa74b74b2c190520d900aa513e9c8907381d55ac690c44cb70c219cb72868ae08ffe66fdebbf3b9029ab7e5ceb0579c239ed2d187081d29d93cbc66e64a45a3979a4bfe2dcf125de6bc2b9695ed92e3570850053e99b7ff94520fd2a02fb2bee5a91ea340f5c81af9754ab1f18e1fce70d40c635c8a47a18d622443dc743bfedff83c4b4771131e9a0ec749f2c6f0fbbcf3cb53f7747626a5a59581622c35d664f624ede1aa1d3515977322a3cc1c877ffc91ce3ca7fb28a80baf86fb4cfb1acc023a4ea2e57e284ee25883111c171a8a296efb366adc91ed800af96b24dd033e04bd080561ab9633d8e37e4a3166983dfb4f8ed2d5bd8b7f778bd97c5e9446338c5afbec6256b4722b63c15c3c1d96d62f4f0d599c0905c7a7d44ab2e528cdc26cd28681967ea82b6e9fd9faf72859633cb2fc49dcfe48fd10eecd2160fbc1114309a457f30659c2d5f2d08001f4b9dcd9adb58e8ba05fcb0cd703716fb21f28b097f66e891e24b11a116ef5c59a0dcc60b508b5068d89c27279a243a9dd9050be9eb00cf8081c53fd9eb16f25f215d0cc761def615124467b0d8af199d1385a397430b25d1bff146e8632d8e20131e1670d829bb8e098866'), ('56f34c38e0b7b4bf1b46c7b6862dc689', '083ab6d952548422aaa13591558f4502c2c1609187f2dbeb018134fcc91fdf9df51dab34f9ffc1a1cd3247b70b39a8eb452d37dfc7d400219abdc669aa1e5f607e4057459bd87660c7c6db85ed8a344386c9487563fe5713c580c5c7ff415ca7018a3d269617d47557c8531c073a43ec6e06c893b3868739513d09e0978800c5dae95c7443dd1b9f1a51fdf46215ea76d3a20b1687f5c4012b1ad13397e32cfc62c92a792ccb4f01eea2608ca39cec88cde7e7e5f9ad8433b007f90e6925827fcb79706562cbc42edc9abf3703499cc4ba923795c392c33efceacb299af94553a3d31150660fe5e6a373ae2fed8fdc629d47f3a09f433a7f9e451b18b42a572bfd2645acc96a08a1f2952b3a5563915fcdca76372ead1852dca78f7b92d05c32912822fbde51993754ac2b5d9c0f552045ae25d1951542d657e5cabbc5909a7290dc06fb106a77a5de5d7d852f3a5c678db8cdefc4170cc9129d1a91e7498992af917a5eaedfa04fb8405eef40e3a9098fd5f020077323ea832ef861942d966f36b76d023b832235ab1cbc9a8ebfda4f370a1018527d5c7df25fc5e91eca601c9a7c0e52b87b28e7e30802477bf3f616e56c665bdc4691b5d1a10089dfedf88b6d6b420def3f579ec8437c47b426392ffbe99c7a3be22bea54b8ac622d89786e2143f66247c51f07cf829ee56bf91bf9'), ('ecca4517fd3b0da624072cd01be7fb8e', '38a5be9581eadcfc8238700dc90613895a961d9524c8dbecdcbbd6b6f0c28f23f0107721b2196cb490d96496f3acb3a7d4ea69e25c33a3885acd0451c2057f5b53c6f385cd8095cbd7445d95f9e1d72497737a73b366dfcdc8a1e0dd4f63408b6b012b570d3623fd10e65a47dcc76be4b17b8cfba3c1fc681cdb0a4f9997ac0ffd19834d517e3770164fa56204083b8c9f542d5f3b3dae056f35f1be87ad080223aa848928759ed794899ea4b76424da96ffcf274844029f5a982cccdfa017721e921a61dcd866bfb9da9229308982376e4efc1eade9bd0ad47ba1f881ea9e3ae1947b4094a6d52b54bd73c3e536d8655b036e9b5a407f696eebdd8c3309b33989a20b42ee6278d1fdaeafbdfcbd39324425962277d03c1bd81ddfb3b8f55f0cc809a7920dad0e0019419dff816a42dcb9004c4c112a7e7bb7f3ee29810291e72e2126c4e06b79dc2f2f02836e1b43860ba5342552c6cbc709df21d07528551f2ff3f233907b7d8364ecbff297c3efe4d54feb317fc6518aa22e6d22a6c7caeb27136e9aeccc33e525cd2e372e5faea5c279ddf99f5d3ec562ff2e3fb8201f7e0079af795fab8c139d2a2e39a645a7e2e8d32de809e53dec899f473ccdd0d8f36bb8a3c435c9ea273c01b056e5f7657537c17417f7beffede2920f7d15a30ab6d15ad12c46a3c6a546126dd15ada9109')], [('e34630fa007b43157746127e07a33f9c', 'e802ddf2cdd865fa13cf9854d063806b7a53da2c769d3f0d5f474de9825c444dea921825fc00fa968da734bfb641fb5ab8b3b6f3f07da30f8640e4b7697fd4823f597d6581c27339379cbad5dc816e5f9e9c821709224124fd56d2258a3297d196dc5e7f6b74814330be872d60107216104cce9f15c52b57b8dce524857e7a12acec758fa2343ecbbc717be9aa21e51d82047c0927d86d3eea7d134b35d1b0b3d9ef51f9fd9512897d2c14b82cae63d03bfdb1309ca6b360de7135fcf2fad0bdaa404f8c0b4e0f46e82340be2d7a84b06174f55f7b267d87289e3f520eb5ff8e0bb5a62bdd34a272a617e72d1b1561974520d37d3e2b3a7b6e17b28ef2f8b765f627ff2b0a79727b405778c49e2429f4be6a20bbdbcbcefd2bf14d1c31cb6d7671742fc82621246174adebc0cad00e6bc4d13f947eac66f8ca0ba76e525de6f6c1178fc5649bb3248dd0d5cc0803d486bf0c5dcee0bb00ac27aa1bb41b49e937fdec12b8a7b684e5606d3ade6671b6ca7d498b5715707e76845fe44c03ff4815ace9ef79d00f0e4540678efcbc02817d5673f196a0c4f94a9769c8826a617314be182cfd420d6c633d4c67fac81df76f46d5c60df18ff4683bc9e58709e26d61161f301533a943268b62d77e5432378843666aecafa296e3498f85e3a6f13447fabdba7c7c582207c92a81ce3b8d30b63db89dde35bb996e3ee961089fbf5d01'), ('3c0f4f8a6ac6b56ce8f99c5e38b05d63', 'd2e878c86ddfde4d619ca27d920c7f47fd1427c69f5da89e86de53e8f46188a0ee34a05f25476fbcfac6559f489cfc8b48e5d50d3e40d9a3d5aa32997cc3823f3e9012831768fa4641647adea8922c7c1891c382b37ded738030683d36ff34b9feecd1ce10ef2ba64f8aa949ba81fbd87bd6e0a827ac2017e3f47d685271e4db9284eaabfa91267f8a3b6c25c78fc4eff919bb3b68b554b4837e67ec06b2f8df432ebadf072ec5fa8dd9bd383ba3bf821946704c32ea7994f72922adcd6ae2788554ad9db0faa6c989936ae817590a90396c39c9c96e925065ade98f7d2d20544f8b83d2e540551fec371e55594ed6566c9dbbc447ccc5668bac0843389b31b4ef943d31d42640d03ba68276fdefe5f0981990e3b15909bdf4840d2326acd0a0733c3d1e39928001ff6f5de8bfb1b7e06f06e25253c4eca9c6e505ebc65000c8c216a617e26315488c1ea74c3dab3a9db6c9d110c35fd382acba78407a58ccf2e3bf01c5c22aeca4cadb80dc29858f1f444adb107e36ca4f003f34b4779de846d00e89f443d1d130903df1877b8bf6fac155fde0ff34a8318da82c5a86479a32c9935037023eef6fe6a48a7569b02fbca92073e3b05f43f4d3b209066d65f798e28095e1a686ffd47c1896a86ba3777fc626dc023aad399f1a59245f09af1c3374fe3ee7b1a7fca2e40eac775148f2827e16a7991d807dd97a20557bd78d410e'), ('a33fa6be515a6d3bf0495c578c4d885f', '5aeeba5d86fb737f98d05ab214377b3aa2ffb49861f5e17936c69fef38b285759bd4ea6db8365e4b59ddf8a38eb524bc7507c5408f37815fdba2b10a8ad17ae342ce4f8bbb01e06103e3fcfef90b3a1d7a35540c3e8f996a86b543daffff521c65410a5da144761b80a797d42fbbb6c76436b4a09e824e1e988a84a4196f4ffe337a6311fd274d13f918dbfc7a159527b5d44c0cf8cfd60fc4158af8d77d20bb87e9f5ede5b61a07c6f0416ba11236d5cc96f441b87a92bd9c373c694860be4056b2c229b4d8869827b178a1c96366a8bc393c3e7a360fdc98c73df9be69dbaa0e523d89c171e0e3953680faac7c3d3055b30bddb1511f15b5e339b59a2470c9586abeedd8c60315056ac6c2f607efd854375667d6e8ca63b46dc7774f15066dd995857a5f6d12193903eaf46799343a2e3e9afcff335f0244265b00d5a77402be552d2c96008c842d0777c17191e24b53ba3d951e2473017c56dd3d23ab3b293e84c26ea40d9e93c6510fc312994341ae768b4bd5f15cca91e316eda5beda9240f091e73036d82fbdbf7ceb34e2477daf0975970c043f3ebe6bdd03ac5562100266d5cc408de9b70ab3ed7b191a110c1607922f76aaa427a111a44fa082b51367a6a5f5d4484908bd4966ab859f725df172916e2298e4ad2a158000e34f6cef64a3f8e8e6587bf4041828bf174ab87c0dc3c7456b59cec00fc5bf9d50947daa'), ('d0f5af4b18a893db6383d9da7944775d', 'ee8d1e94107cecf74f88aab31e3b7bafb8307e4a1a9d0e40c5ec6ae15911d2975dff51a9b1650f0db482dbea0cec2e765619c4a4ed4d9014d964de0362428f216c4228b66e4c6e7bbd7bdbb2e63680104e30ca028b2b7d65d728463951c57c31856b333168348fd47f4753b06ff634ce528e90bc0411da270a15abdc62638894bee75933391fc0be64c3ab90b91a6dca93cf7da06e488e4927384db519f61f82121cb21559bc1927311b38546cc2c4c7f0d9dbe1c417d82966fc015d35d87b5319390357c2bb582a844b72b25ddb1ecd9051af1fbe18c3e4bbed0a7a49571a379bf06f62696cfaef9ba949a935cf81de6e86f92d92435107d56ec0b13dfd975e7777eb8e6e0eeea2ef91619b616ca396afdc6524cbdbd4c2d0040f01c078d5710725a380f38ee24a4a91c660557e63d65ea2f6a02a80ce43445a4c9ad5f15b18a9640f4c217ae0c00edaf4ea9ae2dc02e29a65553b7d9e16d0f53749aa59eceb17b6067e211adb2dccbdafb3326cd839d5a117d3bf387a9825390aec808422b0ce6a140867d028dde53d64e7439f333e4d9073da51c51133c0038aff8b1d4fd68680c215c8bac16b80f1ba1b7c613add251ff2fdf8ab7d7093f4a85e26a559e3b68bbb442d0cece9211b023a1b18db29e214fb194706585b0756b937c1011d3be577d7c68387cb0bf98f6b352beea3f69002264cbdc55ec84fccc97aa3c76e70'), ('42c767fbad5546b0c28d0db4dc9df658', 'e230c7bdb8daea93caf3fe58545425a479a1dea28765cff878329cc46d2d92b65073d073f226c1a5c167d4b854a842ea1c70387ac2cc9a39b3791d87d2bcc3ce05da9ee0ef9b2ef442633d10b1f2862fbb7d3d3572f61826cb8ada161f008070e8164d946b55963325c233bbdae0443074bfdd47c721d0e79f7be6741c745725827fab6d1919798451da020adb8be90b987cdf0d3f439153e368b223ae4331c01e19b23b488d52a7181da44a89926ab136358c7708a0e57ddb6ba25577c7a352d78e293257b58e8dfa38503fcc5eaa63d6db3d81ad089b40fedcac966ad63c89a601a6f906d4ffaa47743e3d155f477158f0320275b5642bb304658d20e26dd2f3ec4665e192cf12c22742e182f6555434a842723cd7b743a1aecb9985bb08752850ab8e55a26f01436eafb17d9c218b76961bc5f0d3d306fad9eb4b9852a6649be2b5583d434c69ff328f2cbc6e679e42a39e40097e553ae8257354552006be1c4c9f6df623599edff944ef051d67a7fc20f12ca6c94975c47e746091c08a9011c1a559ebc702b383adf317885b682ab572908b0983abd5d26a4f3f8046ad24db1cd23d5eb8ca51191d6dbb8f114828c6e995c4d655a08b9b1d0346d0bc692ac440482728898ef486cc472682c550ff7e431ebeef5d0e1ecab6de9768071cff683dbc926b86dfcd66cf63de00f4fd430eb93bffe51075320079bb33a5b370fe'), ('4e42e9149e716d8850034111db468b90', '367a9b51762beccb0f6243c0e136fcd85edcdbbaae9c841ed00c215c77cd8a3464a5c2f3f25db7f4d82fd770a78f5860ef9520fb1a88976c178977dadee8464c8af9f4a29d13c8182b70de0552ab29d8fb63c3727ffbde2b5f889a1678ef6c9763d7be03037356e81e057c676c3e30bf8b1f470ea72eb7eaea59fd1a9f7a59134d58fd698f40cd4eda19cf4754a00e4702c5f34582f19fd7c248ec1e08019c243bf1f50aa8630d7e0352df7579313bc714b19e625f4b0f280bd96d374ea24f0487750e7954726b32846c91daf7dd6d5ac16b7632bfea0329fa7de58728b9a511905d76c887ec0a2cefd030288dda757da569a05cee187759823e1150bbb8ebba916f0523b29352845d57248b277ef576212bbc0385beae38c52514501f31969153b108438ce83cbf5761d9217f6bb09683dd4544d7ec930f82a0a78c9000fddda8aa3d0831fc89c11cd25d0a70c3e15000c119c7cfa2b79745fdb6f20479ec987cf5e22e820357002dc2a5550daed2542ed9287f9d07bab4cd65dcc43fddb7715a1a1cc5247fc1778312b7cadd9ec563e721124da8a116cacae1c5281072099d27494995c9e8ca4b7242843fd1ac20b153f5e866a13cd7d430e8d7cc9885d96543ef8a6f7958b4b0afc991ef2977981094d48bd2447bc6b69fa6c15bb1e62e3619ff2ee5ed44eb76ca7492962eee44bc9ba30f3ee0624e9c8270d18325b84027'), ('9e66c71f6c7e6ae79798849bc7c2fc22', 'e1856c168936121328394a2f0eee7e818e5811fb88471213bcc6bdd3a50199bea86228fd545d07d2b1bc2e01e3f35503037792bfc12e43054be74c94807b3f717889ae10887ab4878cdf59231215009f1fcde800c37b0ac1f61b0efda25963db4da495402a57a82c819751fad876fcf998cd189954e9a8004562ad96e8250d83cb6cd13403dbb97c8f0bec35c16f6671fea2e166b88406b391f8091f22ec68536fcb93221dde4b6dde30cfb2e9d601dcab5a8a47da98fa99f3bbe1bb0a14d54c148357b8fd3033728dbdabda008d8c6169f5102ea938a137ffeb96aa6c3ce3d0370dbc0268d2456e9aa8586e6a2bbf823c100b9730a5f28fb2b3f5584ccbbdcd77fef88072a6aac485865633c80774f8b8610a24b5513d99c99122ec0838ba7dba9ab423a5bc080d3bdb06286ad8d69e9b4c8e7734601bef4670614e0ae983c8352b09f403277606dff35c4d6eeeec227c23d4e6689a70e29c1c6d5c3b5ed3ecb8c66573d46cbadfe7aa016f324838fb43f068050b3c6ee79dbcc45af79df2895c43467436295a1306df3b62f2722a5ad8c714b8886d7dfb31269b6a8c88948d92bc2fe6aaf9be27e1113511e181b4e40ff5bb9d688e110a64ab64434a091c83a076b69c0b4cbc7fc0f4efb30cb7b938c30d362cd6b8b09ba0e47cf996844693b6287cf8197ca29c173dd61053ff712c53e655ca54f7ccf2030a6cde153db4d8'), ('0d0b52e7755a946ed2793670fdf5a531', '929ed1b09c79f52dd851737c857bddedd50c06d2d0b5a733568ec6d094d93178190f4312c68804b1256a9fde759c7d87da624016e74f4145069fe91b9e0247f350c83a37afbba0a43c81ffa4402c78d0f97e6fb7bd5bb9f0cd842cb165e05f263b43e5df2d105e29ca14bfc2131c9b1261b06f983c011f0b9df9e6102560b39516a06c49f9fceb3c7d84e7bd846bf781553195298ea29502a13b40f3b49f327ad795b7f60d26f5f60b15cdaefe769095e3aec66f2f0686f87972d3887063ccb05f841dc31019725d7d87ba206428b155e4c24e5c85e5d3b4d1d0b9903b61e57373d39bb7fdf25214d84c5b811304655387a97dd29663b4b4cc88ca8b144e3ea70523c825d7a3daddd0afa643219a60cd806238b2feb5d64b4244b1133e239946a51f83c1c20d5105b5651c2290f285e41eb005120058082ebfc0c40319a8e3019e24506537396af899ade4219220941e7c916d589c19ae3b00521cd6d1e481f80c3b9490b23934d64da9568e7ac0e88f34152f6b0f2078163393604203fede05ecef4af688b243483c70a1e2c6b24f5fd5abb4720bc14f2b878ee3cb2aaa7fcd598375bc0f5cfe93d30fe2e5b56a24f129783a3d5629dbadb5f4e59242f5be08051a56ff5da1da71ae455f1ecf682b01a74df9a98623de44fe86c240ee5149ada87ad63b47c6357f60d852e48649bf5ab5b2c552232ecf59ff2099cae67fc074'), ('c6e9b36a928b68a767d5243d7c78ed46', 'd123790fae9467d2b0f405fc7082b8af19e81c94b02b409ba47bfbcc178b6c646ba18eb753b22d9480cdb810096146054356fff6feb1ecee5633ce180b9d612f9968ead3e9daba649518a1f79842a225f9a642965a1ed29248c7f57a8c6da1ef5e337ead9a975cf0db40e1f78d7fac919d4e0f2c7a55cae201e0eea9bcbbfb297f9bc8029e15f6a203d05773afcc04deb5517c31423dbd2dfc82a5197a78c1565960cc58e6e1a26f6cdd6543265f318057a2fdf9682c5ba73534b2af9039544adffb2cabf8207916553c88a487cf81db00ddbafaffa057e5bfa163e78627e51c92f0304787166b74355d876ecc0c4aa887f90d2c23ca48957b2cd0a96e2782f50984f86202173576190b69b699186025685d6462755b1bd393fe7a8a5127bc30c03738477946e53f93c3d50e90374270fc85626bcbc5e4d1ded838678d96aeb5c876075810a4c45f1aa3ca949ade2b8e6f5bdd30dd91884add04484f955b3ac7ccbb132726f36cfb44c81683113d74fd8d2dc55ce3ab7faf1c6257866412b5f585e54d5c5208d1a888f5f4c1151ead3625e1475f120613a37bfec34aa715586acb56fea25b3fbebb36e498b20b9c93ec433a5d535a3c438cd5b40848e6cc8e670da1733d404cd1b5f3fbee033c866cfbf750f69a5f4c51e7c831740336bda2886d36744d6c64e51554151d7c1bba5ba562b4208fc89e4f2ac9471ca17aed9e0e'), ('a81180df3e866a6868d722ee5d415a4d', '5a0e57a71b283b095607c382f27ce2985b185c00195e7f7e9f47edb18d72e35f5508a4c8f6c5744ec02e8450488e7ce1f1ad86e2c8e9c7981753c63237deac9b4fdfa69f0cdc74218e8f4108e441500a649d13183e5bc511c0c25b2f922cd55f9f32fa2287efcaa3648bfd55d5ee0bcdca531d8e718e0871eba2e756b0d1b768a808b77dd3dc66212938b795335749c3a564a1eb99168c38f5a40392e32171ea933ee761b66cd16d6756189b7c4a5940f9708053afea96a1ba4f3cde8931b0ee2ab5f5e0eb7d5760b344c0d6df907380da3e0f465659f01d54c4892cdef3ddd73ba9492185f05494ae42997c0b79ae0cda87a7d361fe063f6dbe897b4ac74490a2498639de64dc0ef8c171006466714042c5f810e33af4ced8bfd50500c4d05f79a33bbb63e9199ac841d76d8d957cb86eeee7ecd80022087446d585d3e8490d77ba01399b1a3e06c98840fda263b13668b42b3da37d4bd158980f33fc4b9daee1b38fe40446e1db6c4539da9cafed246cb04854260f8950b062dc1483820ae8b417306d08944fe336a3aee00614d18a3379bf6d5b304b136d7c82cbbc58aa6d531db7650ebef8b4729a69553879ae2aa4241a3884c9be6b84838a32833425d65556ce229e7d132622ffa18147470a4aa8a334e190ffbad3f041cc86cd80c19e5994664dcbe91aa3cb213b399ddf4eb79f18ae776a92b8831e1858e805d6ed68')], [('fe8badcaef6d81df5f5b754892d55450', 'b08c2b87f2d04d7ee2f37e3567ddf1ec2040da02942dbc62829d112d6adc1e2f84d95d09d79c9bdeca40f63f18b764b63457a6c6a3c0959a60cb52ad85827e8ea51d75ff92857916737eb20200e01dbdf13deaace3b6efb42bcbeda9d2d09c1819efb8dd3a488c555145692545d475e93d1c52fbab5fee1fe276fd77388754ddd49f43434ad85015f691bf2c512a3caaacaec767a9fbdc6423d88f83adc95122edc231f4281dc02aa0aecf636adf196435e5792db744261bf1eeda3eae5aa0b55c8edf49969c283f21df40707d7e324dc701d5cd26ddb6acbdafc054ea10ccfd5cd317e6fc60320148ecda07dd7ac6798e554282adb759d7ea343eb9b208b18b3ea899ab0fc9274d8b6f39014bb302b195661ec8ae2aabc6fad1367705c9938abb0dbf2db0801927b9893beab1c9ed7ab2bd12e6a942afb627f48f3e69b7c2f174ef822300eca1cd222c3da24b5f84ed9a41e0fd7bb7202dd3c55224edf4f90993ef48b4047c1306ffe2d30332f28cde415726d666529a1817c2ecbd67635adc5de19e641badc34fc4a9080a31696c0002b3affc4811f952cfe461c21ff77364f91f660c2321cf80301ae3dccc369d46cc0366c1f896c4247bb26b8c6c02f8c558cbb7da62e1496c9cea2ecbbb3a49f877e9ef59f96e7615c95d38594d564f153d8c543bd3be150d04e98f1fe1424f5786145b8b0e8f7bc3359e89c82cd44d61d514fe5c53b227fccb66e114a6873470'), ('3ffee8d7811adfc10a8b94af49351319', '2be0d383a1ceee07f056c74afabf95d9b94c29a708621a376116c51b9a368d243dc7ce2d7db5605425374b777a8778336045fa59ebf0fd371d49f666539263b3080a7bb35c596df357bbc3cc2ea566b473a6c4b426001c7474847ffcc232cadbe53a051fb3f2a5bd98c6a0cb8b5627b928ffa3c063c930f06435851bfbf952ddfc9e744466134f67d674909953482abd300b64b4a3d20bfc25881bd9bce7bf229a3d34d2e7b9a61be082edc218cd3f99397373ee06926009ca3effb1e8f78752e4bc238d3fd313a5bac2456ef02ee34882c1bdc1a834ec9446a81a513c7d485c6a9b4990aeaa61b9b5ca0f797f743af2bf612e440e4d3a60cfd46a7dafed616f7085deeb346fe8578f71406d14549eb23aee1b7efa0dd67cfe49a117bdd6ff150937e314037d7a2f57dba9437ae238b0b80178d903c0b68ddc47446261c13209e33b6a2237850684fb1571815a94bcc3cda6dcbb99fecbf261468b4c4558a883857344db244bb63fffb5d5e5c7a70a87640d3a76b767e3a10d315ff6cf3ec572bfad4f54f05e600707be9425b79459dc74e3257274f1fdbd88e617f149a5624dea322e117e1fbebe23c57875fd339fff18888f569f5b469dfbd8d0d1201e994e8caceb94c44e7fd5bd07e1e5d68647210fb6d9b1bc37282f243c997836eb6d144de55cd687e7fd1c8e0377e16d0e5e14379e11bc5e26dfb446af9dbfc55a859b548203589bcb5d7aff6aa53c040814ff'), ('b547b2b68cd60b53015de8b274901521', 'bcfb14dbbf73af94e0f1be6f45d86eb52144f2365ce560e14faeded5a7b4f83900632f3bdabb6d3ff41d7054b741c11145d41a0b4c4f714357cd950e7cc8d6552df1ab799ab4355ac1f7835966c729036003de39fb6a60f65435b352215a5aa66e12be747786ef38ee7f980503a518bb4ec99c0eb9770fe2c3f72cc801906fce639147e8fab1d99e3ad3855359f02dae38c2afa8b29e7909cad99f2c2ffa3328178f02e514f13dce260315e41b8429465624f69e6050ad0bc5cead1664def1eefdb2166220cfa9858e7c0665b746d4cf4267e18a4a1f356a685fab6059b923a65c3fe37502dcbc15225a930985acb744e37c769b7b69b781c8abd73d926d1ecc60db0eb8280a0169fcce5013dff777b73aa611dba9136c7e1727b2a95e3a87a9ba4c29664ebd45b708b290d26484ba1c816ade3d992d4ec5d3067ea0fd332760649a6f6107c6eff36f6953652dc1898e2afa549ae630637a1e35bf4204070898d880b254ef60293af8aaf17871598a2cdf2773a6d7a3589f73cf3ba074e9c27fdea8323e3e07641709edc2baa395938070d22892490e74466c76b2f121a3a78291081a11c8bbc63bbf1905b6326046bc2bc0ccece5ec604ce6e66c1be77af98210f2c27ba31a70b5f1aa9b52b2d300b7cc4c54e5d00bccd9fe87a8a6d111d9b6cef84e9f1d7614dd7717df5c101cce496bf79e2b9fc78a4e30fa4a97edf8915d613092df9d17e22e2e6e7dcbb3ecf1e9'), ('87e5d76581b4091ce80c44a337785e80', '8d8eef46487ebba006afc72444bf6d64e051af2d05209f1182a6b5847f49d48ddcf560ef4cda97dd60c42d74d50fc35a1f6c319c3a6e036452192bd065d4b377a1e6f3bfd971fa5faf40e5e455c2fbab10dcb6f19883adb2393647c2cb5fc249280ce3eb3d2ae3bf05d10a6525d7618fb4ea9d5703c21dc247f940ff014e364ec0a53290f0bd9ee23c4ec20848144fd753b67fa19ac45ad97e06b6e36c25357d89af06a6b70ac6ea86fa584e3d7769a2fe70e9c2b0e3be469d69a63669b84c1b170f6f33b0fd78066c9663d7c4ee4bc9f80b616768d5f3223bbd97fae0ea3a73dc093db45a6509a6e40ea44960c59a42441d8d6c511a39eaa5f123761f92fb279dda6381e743fc7d0d10c943c5b10fc3aba68b9ed4c018fd169c0d63a81e19409137f1a0379243124b65172d520a72ba8a7c13a4361e30425295f082d46b853e1f376e88f23ceb0bbc12a90bd5f477623725962b3328cc78ce074bf2960c1e8e3249b36936f86b21b7102b691fcede7b3a8404eb870d9fb8b09c8a0a783cab9a5925ca1efdbb81ee53b2c9cf7b9b1ae62f5992cb2c76f0e2162e935e8291ac40114d892df064bba6c4280344b9aa7592457d0d537287a1fbb189ea328df9adee34f8d0d8cf0a5cfa0acbf21e39697863fe5e415532affc7d4e43c3ee9aacf1c31f994a767fc42f07857999fc913086ecfe4deaaa3859cabac603d63c6c9788df0757b54f23c2411a9caaed42296877eb'), ('fb3cb0148e54cc871df883c82a603f4e', '4b97f7c8f461a99a4dad477d64b2c85233f0511be4cc9e50d917ed0316c9e251c2b5629497ba426ae4de3e15da04e7f28373b5adefa99b326fb61add42926430297e4c7493f879cbc2eeb791560d213e2b884d32cade9250e0866eb8a1078892408ef5257431adbbcd9370b04092ea9c874396d69e13b123475fab9102e18764c98e83eb1c5a1d63a59e94f5ee1ab0dbd28d6bbbba63033ca75be64e6185620a45b7c8369eebbb0ebeeb45afeb16ebdefcd2d282745df4b8a963445100e732728b9c31f1c6d95060b8c00818ba0ae567b0c51fbb4d448c4ac85aa97a3af52ce39bdeea712c17ff0148e9ad975d942d2644d5fbd9795d4ddebdbd62a5346c174f4e9f748c8ee4fdf4daef535efafe0abac43bd409b50f148be746415f8c24c43f63537cce3d19dd6967c2c7141fc66680ff135d0cdcb3ea934e64fbb3ef8e2d8cbd9d36c7a1f30db8450ab01ced689e586fc4155c148f3e3fd7ca10d39cb177225b1294378a8914bd04be7c14829d48b6eb67d83c5e473483929d5e4bd8c7e89847031849ecd24fc236349559ff8c9951fa279975780afb58da6db69303b84c7f87ace967b00240d11f5f0efe8131f8c5eae884a88795f58ec93a94712dd8e6e8472fa3935b02bc39aad26daca82fc45cb970c851f8c1815967ecd6b68859d5b62ba09d56ac7051d64b34548fe573091b8e0c8883e3e38652385280b9718d54bb43cd7f57c0822b9ea340126a65e6fb6b'), ('b7d38f4235bdedc187cffa0b1be7419c', 'a50da3728595b211db88a6c227d3c3e4112d71916f26632f30c2a37112ff5657cfc35846965822a6ed08f61e3dd1645728d397b8b3d96e85b4db148da0df10973d3abdaa7fcd8374b2f2133451e1daa9484aa8159f30baa8fe7799c5ad888dbab771cd121473914ce04c68b1c1e16c30d55cd50c421ee231aa39dbea139012da9dc44984bd8761642f991cf397e26da46c8b079a2515a1ca7826e5e08572b5d842094c7f65683eae1ad158b187d4cded223864aadac784fbf7786c5a15fa39c912d1724b7646e33bc8e53800e9912adae713d2a84fb795db777ada2f4754a188396d5d8ee679e81e067e78244415b4b248f1298c6061c91f6829668d4fa63c25e434c57f7b4dd819c2457510f57030aee80684647491b7b10123b7a123dc0f91efb22ac6f1545c41e7ed06a3ae129773d569db5eeadad34d1bad96153a05322d971b85a82547833ba56678d9a56e20724f41e90a754a4e159a5f85952e82d6c877d4959db3b734967ae13d49f708b0b6143eee2d966404954d3aa898b4e93fb1c8f9cf4a4f8006df28e3c3097b6b6a4eb3f677ade762a9646ede780f549e3b230978d0688a2f43c8311ad61b6153ae4d90fa6dc40e7c15e3beeeb921efa63ad950c38f233d49f7d2bca93783ea663e696e3a07f99cd80a4a663d316c52705b6e6bbade3fbacafd88b409e1bced8f2518c6f7c519599f7b27f63c197ac5d321015616035e11b67a373c322bc0ebb6aa13'), ('c0b01125c032a77c97f5da6bd810a6f2', '03e2a732f1db6ccfc3cf2a1b59adc4fffdf2ad39f70d606e39b1379c19d9bc22e52e932bd23312db004709016cf133cabc7e90b3b4567025df19153a46162dd77bdcaae7eb80df2cd7139dd8b4276e8c06992262c436dc279b696fecf5ccda50bdb4f1d48afefa10824638171dbb5761d1130562974e7d58748157b727bb8e7dd07c05ecbb5f907b75f4cc43a6eb353ffed65903ef1b8f39ed1eebe1da0ce4cb26d7101851c9d9e8420bf9fd73e1d3adc6bebae1c8622d022fda8ad53bbe4f182aacbd6b5a7c779d4237d3a59fb2c89d6d38213d369135fa51a65a46375a32e664cb384c76cdabc4a4a52b7064c1a96b6ae874682a53e158665d877176abc439aa4994248bc874c7d36a01963a6fc27bf4c891763a19f863973c8ae5becea4318c250bcc78910ef54e5d0b798d962c09d9a3ebab8b3b8dbde883a4784588099a796862d9f3f3d3a0f6a99d70d27b4f7a2d3b504c02b00864112763e38eb3c16eeab8b3656e7ca0a500224a52bf20b0fbdd2dd5d130fc4e5d0370405a58aabebd636d086ac6be69f4c49ebf088fe17ebda0e4260e2ada6572800405dd34e0f899c09af85ccf7038f31255acc9770de3b1a8a654e9408406105df814b6b9c4514e390ba82fadfb9be9b01261bc9662e299c00b9efbf7edb054bae3fddfd68122debbfaf75c8bb2797c4456505f788fe663dc12dd6472f94f1553766c581e46806bfe4581a1ba69d4ac86caf405db8673df'), ('87e03348c3e47cbcbd4d104d9d6c4f7c', 'a2ca5fb6549538c48cd07d4e608a845cc8fad927d7a47c6bb377660b9ca599de535cb82bbcdb2a93fc1fc95639bbbf92ccf6073a2f20721a26080e64b017ed477d899e8a1185efcfaf286e543f4f434f3e82ea55f61cb05fdc516727a42aa5bc214117ae7f65c16392c8b570311c7586a098def13d48ce9108baa04d6ab120bf82451321b5ebc12ad6f00e66a88ab480222715af7f7f0731912c17574106fa2ebafe7175448e89ac8d77c4e2656c7f7b2ef6d584206698360a0efa678abe7d03e2c87af06267b31133544121b30919c2a11e76a56dc2af898ae74114970c3eafab6d2cb30e6e74573aea9a37e022584920503f7602e8fed6bdcffad5c5ffc09dcdffd0e8b758f901c36052449ed2ae0c6b8512696ec868fb91be02ef55a69fad34bbff75d2ed66442d925723190b7dc5354f92aa321fb10e7fe0172dbc3c1e620151c8bd8542029f99e75c983baa14a80bcb15627f89e63dd1a0f00be2cf06fa7bba3035f8ae113cc369540d746ac8ee340b9626fb70ac3b32f69dfb66a8e1d21df8c880fc9f69df92f7691e783279a9b3d44a009cbfb5fe65fcdc887e79dc1b20319ddf3a70c653aeb870ffaf687578204d07e3b6f125f5f73b1a0b388e6bc4025e40e5602f12744f151369a1c79ccc8ad8d88c2806cd2ab1b97fea743cacec6746fa9cb9771e5581996d33b15ce3a836caa6a7c60ee80df779972e84d672ebc5aee1efe82524e5e4eda90f71796d88'), ('a4d80360d6f6e36ef108d91512cf79d0', 'c3fc3fa11692c5db463c2deead59bc906019f62e518c086d5a993297b4a9a97942a737eb3a0105b765a70e00caa75985fd738f873a23efab328643f67c8dabfef63fed70bf33b0a62265657bb5db665b88de8ae462a56667550d92d06aff058dc68ab709dbc7c9f07a2ea9c163188492dc7f688727219acbffc87b2cd3b7affd6f96fd31c3161f8b01010aa1c0801a2bb20ad5903c53a1b6be0908785d57ed826fec57bd8b3f6cea62a3856da2977b94f95571b75ce7cf2b26582b533f63c0761837d122fb268350d8024e15197869c9e68f07af00a073999394191a4f78ba41b4d35b24436efe31bccca255f47f80028899f70e13a48e7be6b84a8d8a02d55f19ce75bf88c4e193b02cae67645268ceebfbb43ea73fc4b9369900b30f1f804032c221a1d3c338dad88e7ba4083b583cf40d91bd32ddedb9d934b7b449d17d8fcddd29a83a8bd5a3e08407b30226f08ccc77bf5d8614b84fe904290a9d7e26130c8f83bf2d7126a61876b05f58d3f567179687c60718314997ae0d0829bea205fb8f9eea39e1d5c552dfbf6e0c89be7891b2e9c77dc68e0abb67d488c5a20bdd66ec123c9e05464984cc72d9afcf209df36daad86e505192fe3719c72cab2d68a69ad11a0656b03ff6de2343a80b18e7b03529ee1746c4daf83b860cf60604d1242bba81492f7ce1f57bc7ca468f26a979afedc2dfbc0d35c3a8055ac07509814b9c2da40f075394de470eb863a19a45'), ('73949b095825527c6774b1f959454d99', '65d0b1ec074c6b1df60c6b36b7faba28afb99fac6a9804bdaa910753fdf01ad1376586dc627f057bd3eab474e6e3e0af5b2a741dfd66dd672c3534480b489762ecbd2ae6dea24c8c9d6709e7c3dc69e7c8cc031fdc1d26de33945bfcbd1546bbbc3b5c7c5954cbd1bfa786558d3d37520e7d4df6b0c9b8a92b485dce53b8795a8b3b8b2579249df4ca77a4140dc7117c76bb7de38af14346c45fc8a17a79a105f769735978de7c49695ce968aa487a77c7182f8177cccfa3f941e3520d94b1ba771df3e542febfe0d9636bc624a66589e4701107954b096bcf7f81e5745835bcbdeb08531c07ecf0e96e9fef0ec89de69b541834519d067d0f2a049e8efa23a9df629fded752ac3fc3f23d7ca3bb9996bf5419d04690e45c6834e9ea830ca07d8eb1903c55897573997013a02bd135d4783d6737606180c9a95a098546fad27df79ccabad8691d4232b9e8aff0f435f78f1db68324d9fac40026908ff98b0030f71224e1de8e52cd34bea9c93e13dd4e9ce04ee899dd5c91c66a6ff269e76d8093a5f29035a6900783dda623cfe2406bf9a5df9bfb74ef0e1d885e0afaba0c5016ff37af7bd1c811c9342f486f7e92fb8dc5a8f16c6329ee7e3e5a95f7c21b2b32bce268d784e160ffdae3d73511e740597734a6cd23424ddd0c262054ee971cfb8aead2bef2ce1557a4bf4190be43249e45d4ff6261d6835691ea955ea87584eae7df4c6c47a9e1a5b4b986bd0f2525')], [('3be447d9edd645c2620fdfff95e2ffad', 'c0875e4937508f960eb67807344bf16ec777f2e75ea63c6d509bc94d1f4c70eb7d6c142c3864c5624fd6515d3e8561814acf6a020bf3af1e7f7d9967768d5b7f93f0f9051a69666e37ba12bba66e38f55f6cc96f139e262c705b5e0f27cb86fdf26d1cf2642d39cb7d2a70dcc4aae49629b5ba8ace68cab315b20b939d3c0178e228ce4b8568ef8162b8d0d52b9d174d682cc5ca6705426f8b8dc6fe607712f6a4e4479211d6086006bbf2f12ee5a5ed55a9988f91a3051b6db4629f3ba03d3b72c90df2e981097c45bc03339792332d537ad9945aab12115f9035502707383cb1bcfb8860e503da53c88bbf4f42ea356b4e7cf5272681d19257c794e4164258fb744f1d9e7b18eb1d271598500ad09a6425be03396774881a97076e5f33d9f6df6bee78cdb448533d4b5baf8eb9dcaab725fc6b9dbe3fa5b94be56096e9a346eb9d02c01f0dc00d6e5c74a54db76843ae46464324b3040d9100354d6c8af264b35a2ae0b68303fc5d114abeed54a8ef0a7fc08b40844cfc74d8a2aa15083435cbe371fbd31d1644d6c31e42b351ee4ff57a1fbb7e311d4bdb341d063746a2908ef88606ab4b227b8ec11525e701ec0844f838cecac0c2b00fd4d3ede370b6cb57686edafff4933b8f07d7be7d30882c9b31acf839cf9f7d2b25cd014a56dd39b3a36cbd5501d3f3ca4f9eb9c60eacd4a0bf9cf205c11c62d2336133b9d36970'), ('b853d4b7e13460ccea78e1f7e0772ada', 'bbc83567c6de2b6e5021327cfd273d648ba80b5d3d7b52b0dafce833ecf1def3836bb45f4b22fa96686e0bc19deb4423a09e8c515156af50a1d8a0906037772a5814190604264e5c41c3fda2cd1fd0fb5fa7d2d8f674659b2bccbc96996db064231182ed5895b25bccec641ae17247d891c866bb47f2f6d8849b159f63606de3699a882f198be762f2bce2bb686ab47ee63020d82165a075fbebf142b3c3d71a208571b2478546b27bd74563df50a4778262b82f74925b88bb975ec485a75aea8e574f8b3b799b967c7d7c5186c8df6bce6e836bf97e188f9850fa0fa4eea72b1a1e658c95f3c0f5fa9d1710070060956779d52b3f55eb06f07469eb5a9de66bdc5deebaec2826852f194c1a6b4e0a9b5ab115067ed3ede042fd53e4586b85ed009b57ec98be05e0493a4b79b8223e40243d30d2f9e01f8863a368e91c16555680dc99eee334f1305bda2f1ac37524d85cff43e0eb312eac9bb316b06cc86de6dbd9d37d43f69f532ab1e266a527cf158bb27c59dbc5314667183c6c4e28003c04514acf6a594edf8adb296c7e01e9f0376de3c42ba6f6a607d1de71767b1531528053a78b052bc0b0e77ca8347b123cf60d2f58be9d66fc2de52d2a955c5df9bdc4ecac0b6557214d11429687f4702d5a975bb57b10f9f812a92125d547990b2ec4e2f8062c0454764520352dc31e10a935ee2aa647931e352ed773eb20ddfa'), ('f1b73cf3760ab358b533293c7bab1952', '271128f2e882ee88246f8945f45d22b66bd8be032963f5e4152e4f941fd2468732d3a6e3c0515d1cfd59c0deef9b6418d6abd855473a8c94987e29bf43e32e22f9c99f0d7ed157df96a1c169448da49f6815f914111b6875d3ee01e7c7393ff877903f1d5b60f954210f7d859ffb1c25d7b520d8aed1ca00930605f9a0df23b3d524bbfd603e3631f864f3ab24ccd655bfceece97bd5343063ec14769936d903b563a55023b9c1e303afc8a24f330c761fe841cc947c6284dd831ff55db0cf2000306b22681373e09e80cacfc5b9ed1ce6de0cb4dfd86d1e03b0b40459443f374d5722a41d2f2c523a67097a713f8ed3c5b69c0ef7eba39f65c41ca00fe93f7f25db4b78daaf3f3d2ad651222d5f80d3e230e0a00f96f2b812f4ea23e5fc7065703dd8ce3e48b8a2e0d0e9ff69723e72e4cd4f0b2dde326abfa2740644f36c217dfdeb9c6a7f9141270e93662c718195303facc9e5be93417e400517976fae22a559ce87ab6ce0709c247ff69fd69b1ffa4a2bfd682ea3329fad9cb971bf4e54e5b8a790284d6434d0d6ff86ff87402ee5b8a7ce6577f103716fa9bbeee9aaedd12f22707d6a3f7330cf592377e151cbd99b61ba9809d81ddcba92591daf61683016425e1f94a5eec5fba5a3f41abd9a905725f017238609b5f5cf864ab808abefb054cd8210f9c4fe465cf904876c6202f2550156be72c4246d093bb85b6337'), ('71cc7c06684c2179b9c2e15934f3000b', '92a6d50bdeb8fc0ff4407ace9e14a6e71b4be61c3d5061109b622149a7fd618c99c21348e6b1fed0c58f9944a542ff695110bb285321731bb12f24f3ec19dc3a07e98b0cb062927764710c09a913172b4ec2140de20b0aae152648553ece05ec0db36c4b359936c6123c18cb51a0adbec12948af54f37d1ac6f19c7d8dd0e5690057ac9508c6ef3ff6d91db48173a90764efd6d48565a871b9b13c24ccea742d5ff3ff73e380f03e77f18d3e75b88aeecd89a7349abab0186e008b0d916b0c1c416510210887aaddebe014e6acdc5546045b60a42df19e78de196aaf8ce9856c6290c833b0f42aebff65a864a72109d1abca5d394cea7553902c966c02e20462d89710cf10df4fa8e987f9fe12b9c665424777bbf41391ea13e86ddebc96c8cc476a01f94f6e979152f512045b788de48b66c144e25210b02305471a6a793084f8d6ca31d0deeafdbe29526ca991fa9120129e4862a3af2c2d7b72e0a9ba4c906390b53fa3ad0d2e04ae638e1c6c6c1610659f83d41ef8122169e341a0ef6957d71dad53c3d5094aaeb30cc891d8314be9fc7939df58d202ec701b337fe6b56fd565dec825ca199a595d1675896f19392108a48fcc5e07742f5be4cad918064811ed9fb0bdc572b92576d987aa0ea09fbf5c05e0b1f736abe29b131125ab00bcf31a6d9e6798e7729af0b2919159015459af7fd9cecfc0449675739e9874dd87'), ('d503610487a7598a123151798c99267a', '2aa5a006c9965c8fc68993d31097bddc2cc0496f46f3f93f279554ef3bf8ac3f16905d4a8c6873e2be511dcc984dcdae38dff9a4fcfafa93ed80db2704aa3d70974af783f8d10e76585e19047ab9ac77951c7edbe80f9c6eb1658a9341e50bfb4d47773c12ee98d0092b9e808665b207fd321bd8cc55fe5ee03c8e55567030c7edbb91f87480a02db76cf2a837712f7ff0b6c7fe78019542cb06fade63baf50eecb8decece1c4c99030fe496d2619f717334f4372171a8fdff08056abc1b056e4db81a615e795f6cb5d48a842e775434eabbb57d96fe2ef58bf494fe7cfe51769e888541af5dcd7723c432fc68164daab3e31b17c63123a4c34d5cd022586111c31365a043775620f6d0a26f0e5161d9f6d866a2aef29bf11d07655bb91e9a50d6560e75aa5cea2e411dd22804e2fa07844a04d57952e114e28887076880fc152271cd116bc8f12e0d3be7fc227e80ac19882b71d12230b558ee51f6519d5b8234891559b8a6782e1a31f395dabc0e78dabd0aaff85ef5eadd7d6b3866d3a05e9d62645064a6ad8be09fb91fd1b35f0842285df988b04cd329e3d8411b9a620a4b046d7c1fca5f09113f9a770d7d89dffeeed99864f7eefa8292952c00338ab480806c8da61bc2a1e60f8e3a5c5a03392e0adef83ce97ceaa91975d84a7f7a9e9b49c566180075b8004632818d87772c0cbe036164069818fa1836b2ce899c0c'), ('74f13970c3e7c94c22d4397594399542', 'c20d9c9cdde49126fec360fd3373f4b3dec17ea89dfef4ece08b2e235acb6ea44e680b00cca957879e3f7737164037ffd98081acaf698833c457eb9582ba6e07c1e4499d0c9f7f933ced5b52cadc344526f87bd6f9350ff70c4bc90ca3d7b07de13845d38a25f4a14f60156748c58bafc3fe017cb74ba6b801e9727d01c1d8139aa90f6ab1a410f21086e1cd0902e722ed817c874325c2793c08131c14c250038909641de892c97e64331c96532a157d3e83abad3c302c7ded1fe9baad2dbc78209e44697433c3322960e572633c34305c354af7647f94fe0128dfd10c0fee9d665dedb386330547d436cf059f5696789c797d93f7299d2963953c5d2854c9c4bc7209aa28c15a2ce50682c9827c6d57e7ea32f88963b2defaeac2f6715b6c3719c9ffd2df78c86f25f28f43aa04a5a428a02c1a24d6130f949163032d25eea67359e8e49a45a79ea9f23e19937755033af87288211f73bb66f54780f983a494dd7ac0712008dd5e45eb45b18a7cbfa75cee7f20bf9d80718601b35ebde5a11ca99a6e91f6951b4d615253a3da62ec6f591595538501226a2039c921c9e45ac92d1fa07a2c47fdb4537041638335c609736426a8f99183094de6a58ecc74df261bd8e3b8630f020c634f4a417cca5db44a6d4b46a85350c60cf792e233257995e3366c49ab9b81206bf5ac7a7122e3b012d8245c6b1a96a9de3bd54ce7fd3bb3'), ('cc4dc3519fbeb8572fbf1f5822bf4b74', '756ac71518e48f8349feb1e327178407090c1755b06d3815ea163dffcccf1e86b8ba18e4ca32e0fb6f5f2082092b0cd5889e4a8d4ede69d3e5b8318beb6d0652a2d0b2a99548beefe1fc9220c6044e0006848f2556972c8da3429680ea44a4fc04d9f3c1374b373171f84c55026f04fefcf3b8a7507dc5cbae572401e88d01e633c03170a4463b1b760704eb3e8aa6ebe88e009788630cc5d34c24f159edec172ea77cba526e22c2775faaff04ab2884114fc4c6d86a84ec9649739bb2122087fa3de32962168a8072e24b0321fc7178e9fd5b65a1bc9bdea3ae529273f1e7e1e268146735015c905fbacbd38ea60ba7c27b0ee848aba552f61dfc06aec958bd3cecef2d1899a361e46798bd872bc171b7410943f00cc14618ac38c55e0c70172501dc79bb579a16b052cde8fdcccc8beea0657de776ad9261ee364ccc3a69167e69eb48b497c2ae2446eaf2ffa6944a89fe7ef47b2b15a48fe5018c79e5a29417f0413ac9ebd94dec3a5d8a596bfe60cb75ccd073f9541d244cb782b87693a4e17776578d54ddee8f5c23e8538321c9fe52065aa3b061be814f5305beed64fdf363ed58118045fde67e08a5e40e8fa24b0aff3ef0ab98d9aaacd9cd7e9da2cac6b4a4b07cdefc3339c8ef4bbcbd7c610dd219c94c14428fa5a256bcf66f232be2a2b1f91c68f62767c6e0b618396b1604ace6fcf86ca9907ef526465d5f1091'), ('c4593575452f6bc9f15dafffc1135518', '58042372edc31d3ffb7f78a92318c9dfa61cff3a7ec8dc15c07b79cae45b03cc80113a255a604c9a301be51884af23854cacf1c05ea6453bc6599ced91eb15d05d04a1b482239118d310cfef162e86ea5fe74325d1ed76b48b8c254a9bf782e7eab8827eed268e0845b8862883364ef633464fe8623a9d39e2e84fd985a75e57aed5aec5eff2d7709ab0e41c1d3962bd996a2366ff043776f19ce47f4b66d853149b679c1f3cba8d4a358962eb493e58a6f23d052e657f64793d523a7e1752a1fc0754fa91a36c2e982c89dc9e9f98f20f6d62b2706a4d324fc4da0c52c2eed117aff88294d0e16591dd7b194a7704e801d5c9a4b61a7baf6aae8bd362a28e19e307a666a7b185831bd078985dab3b8ee81de960ca64da070cfb8b1c2221a5378ceeae2782a17968262092126bde4f193e8c32aabbd30ae1b4e2119374136aa7369e16c52cf9b34d30c7e1a3b84f91370e7ab9d0a0966743d9c6ed4b7f6a752f42f009245b50d9f722223ba3515cae990cbddd4fa38a11b984e72547029c9bb414db31ebafac52554a6c4f55a5d4529becf90189ee09848e70678aecacce05ea85e8e963b1a0f5713a4c0b6ce1dfc1139d6b8eabb9e82df34c7561d811bdbe26897186aec21c92dfea7840d1acf4ca8e7b7065a1c9d691e820e33fa2c8e793ba5bdb4052e40b9e9f8d74175349d4b45fbfadcc8bf6482a1bb2886f8c7ab23067'), ('b99c0abf3e4985361f70307f4d8b9a72', '9f6fe8509694334ed35becb51b28ce83f81ce897584c6e772e62a0f5c95a81b5e41666353e43416166b9dcc2f9ad5e46e0c25db804a93e762c2606c94cfd5276e99e9a86d0f7ea2a663a8d15285abccc4339e671381f8dd1e310ed023075c6a84b7ca4cba28c6397c602b3a1e9378ea13becf4adffb118eaba1a7d03a37b03d735c7f70ca664f927623c34c608328e873135ae8f41dfce5c314a1a333043e517c00ac74661ea4d44858aa62da840f2cf6e37985e5f1cb5a75fe98de4b3a911c8f406c9ac88155b1441992b8528db8ef6e9ed2dac48a6a84989d0ac1553a8c63b920c33dfc7b282dba8fcf299678ee0608852e2619d6b4bdad325b97f0126f0a95b9b83db6e020b98d4c7b2a162fa5b7239ba67a3078a9a16b9d560e8e2058a802e8443d91e7c2ab5e6141180e72005eb0f31ae29d6b626a0ab5c3fb16a42c6460c565cfe27133b384a85ed2be0103d396521361479e2aa40fad4ce38386995baae0832465581965dda70756bfc234e463812f68f3912a249b53be3c8d1ddef22babe3e43bdf9b3f72d2a9f9029b8718deea5707cace15d5510d85fd8c1a09fb9236b686ac4ee193f362c78620bc074f8a8ef9a69c98b8957e60a2af52f012e3f61ded49b3cf58ecb4e80bbb2f39a576721fe56ac28af232ec29f241c579c06767cdb56272d0746564ae2e2b572939ec00cf4b228b4b25a8e488ce6fff7994f7b'), ('813d546c718f50144784a308cfc79df7', '48d8216936b378c1f4886a234ee1daa2186595099d0bce7bf6be06b0006e9bd9d7643b46a22dd73f1f65d789b6204ca2f0cd4f70348c36783633b9cacb3bafa11aed0fe1cb2fb2013773e4353d06a8f45d227a165fe57aa6714ad0878f19c152bd0904b1193b103fef0a31a2a7e93b3c4ec45e5c20968d6bc1f77d455ae710381bc92a167e477e16da32aa07670391b7784ceb897bec3314ac83ce21b33234d51875b7c4255e743c2a36e6267209dbbb69852cdc8496653ba0be5fc3ac21a13e007453d0086d670703a86780599a9d791f83d734046adc3d36d247c525eff2f3320f8f9d83963a390edb6eb8b0b6084f65c05efd63e1d5bdb81095e1f7ce334d13b8d046c69515b913440db0462dcba8ce2abeefc701e35a9f940ae741b4f00d823bddbfb3900e702f8a04749de588953b8ca899d113bf25cba31f0dc64c2ff7d7931f049be861035b631046e53f2152c30d5b7c2979ee8c4beb763b360916d4b219ed1705a3950cdd68b2a5c52af672d9400b64b036f4fcce9cfc819e49ece22564047a3729c44a5e8268f85bd04af7331f8625bacdca05528e8045f90ef492f85aa5857fdee014216e3d0c44176f0bb0db5ed49125a708d1deeab5ec00d9742e0d31345e39ea5b69b98e9f270879f0498ff62a2bd7019fd117f880de68f6fc8eee27493f0cb75daf601b7b0adb06ab326004e9b431907aac523cc454d8d888')]]
44038bf298ffcd794e3b9dae33fbe5abd22c63e1d749b8a245343c643042330b123d5be50ac5abc14015e938cb9107aa0542e9b68ef4c6b760c264b1a4f93ba5
Source code analysis
At first glance, it looks impossible to find the flag, because it depends on KEY
, which is not related to the output we have.
So, let’s focus on the encrypted messages (enc_messages
):
encryptor = BBS(512, 256)
enc_messages = []
for msg in MESSAGES:
enc_messages.append([encryptor.encrypt(msg) for _ in range(10)])
Each of the messages is encrypted running encrypt
from BBS
:
def encrypt(self, msg):
out = self.gen_output()
key = sha256(out.encode()).digest()
iv = os.urandom(16)
cipher = AES.new(key, AES.MODE_CBC, iv)
return (iv.hex(), cipher.encrypt(pad(msg.encode(), 16)).hex())
In this function, the message is encrypted with AES, and the key is the SHA256 hash of gen_output
:
def gen_output(self):
self.reset_params()
out = ''
for _ in range(self.out_length):
out += self.extract_bit()
return out
This function calls reset_params
:
def reset_params(self):
self.state = randint(2, 2 ** self.bits - 2)
self.m = getPrime(self.bits//2) * getPrime(self.bits//2) * randint(1, 2)
Which resets the state
attibute to a random 512-bit integer, and sets m
to the product of two random 256-bit primes times 1
or 2
.
Then, it uses extract_bit
, which outputs '0'
or '1'
:
def extract_bit(self):
self.state = pow(self.state, 2, self.m)
return str(self.state % 2)
Solution
Notice that gen_output
calls extract_bit
a total of 256 times, but the output will always be the same!
Decrypting messages
So, in the end we have encrypted messages with an AES key that is either the SHA256 hash of '0' * 256
or '1' * 256
.
We can use the following code to decrypt all messages by trial and error:
#!/usr/bin/env python3
from ast import literal_eval
from hashlib import sha256
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
with open('output.txt') as f:
all_enc_messages = literal_eval(f.readline())
ct = bytes.fromhex(f.readline())
def try_decrypt(key, iv, ct):
try:
pt = unpad(AES.new(key, AES.MODE_CBC, iv=iv).decrypt(ct), AES.block_size)
return pt
except ValueError:
return
key0 = sha256(b'0' * 256).digest()
key1 = sha256(b'1' * 256).digest()
messages = []
for enc_messages in all_enc_messages:
for iv, enc_message in enc_messages:
if (message := try_decrypt(key0, bytes.fromhex(iv), bytes.fromhex(enc_message))):
messages.append(message.decode())
break
if (message := try_decrypt(key1, bytes.fromhex(iv), bytes.fromhex(enc_message))):
messages.append(message.decode())
break
print('\n\n'.join(messages))
$ python3 solve.py
Welcome! If you see this you have successfully decrypted the first message. To get the symmetric key that decrypts the flag you need to do the following:
1. Collect all 5 shares from these messages
2. Use them to interpolate the polynomial in a finite field that will be revealed in another message
3. Convert the constant term of the polynomial to bytes and use it to decrypt the flag. Here is your first share!
Share#1#: (1, 54374634894026676422403706385209235605654263189334701196866954303113716584451)
Keep up the good work! Offered say visited elderly and. Waited period are played family man formed. He ye body or made on pain part meet. You one delay nor begin our folly abode. By disposed replying mr me unpacked no. As moonlight of my resolving unwilling. Turned it up should no valley cousin he. Speaking numerous ask did horrible packages set. Ashamed herself has distant can studied mrs.
Share#2#: (2, 64946086132218777351978239905100707583094278469454014490074897767952501236845)
Only a few more are left! Of be talent me answer do relied. Mistress in on so laughing throwing endeavor occasion welcomed. Gravity sir brandon calling can. No years do widow house delay stand. Prospect six kindness use steepest new ask. High gone kind calm call as ever is. Introduced melancholy estimating motionless on up as do. Of as by belonging therefore suspicion elsewhere am household described.
Share#3#: (3, 47342035784539865604020206350119236713840941400563052065845192590066845864369)
You are almost there! Not him old music think his found enjoy merry. Listening acuteness dependent at or an. Apartments thoroughly unsatiable terminated sex how themselves. She are ten hours wrong walls stand early. Domestic perceive on an ladyship extended received do. Why jennings our whatever his learning gay perceive. Is against no he without subject. Bed connection unreserved preference partiality not unaffected.
Share#4#: (4, 3655061496519801785813121517481390175484853044687072580165202783250216005674)
Congratulations!!! Not him old music think his found enjoy merry. Listening acuteness dependent at or an. Apartments thoroughly unsatiable terminated how themselves. She are ten hours wrong walls stand early. Domestic perceive on an ladyship extended received do. You need to interpolate the polynomial in the finite field GF(93932419553446968245028291354625723410141714017280323567892277575234453142991).
Share#5#: (5, 61239598692554281055448838803080244308901202829356284150044638062405311124499)
Shamir Secret Sharing
The above messages show 5 shares $(x_i, y_i)$. They are using a Shamir Secret Sharing scheme to share the KEY
.
As shown in the first message, we need to interpolate a polynomial $P$ using the given shares, so that $y_i = P(x_i)$.
We can use Lagrange interpolation to find this polynomial. The finite field is given in the last message.
We can add the following code to the previous script to parse all messages, to get the shares, and also take the prime number for the finite field. Finally, we interpolate the polynomial and take the KEY
to decrypt the flag:
from re import search
from Crypto.Util.number import long_to_bytes
from sage.all import GF, PolynomialRing
shares = []
for message in messages:
if (share_match := search(r'Share#\d+?#: \((\d+?), (\d+?)\)', message)):
shares.append((int(share_match.group(1)), int(share_match.group(2))))
if (gf_match := search(r'GF\((\d+?)\)', message)):
Fp = GF(int(gf_match.group(1)))
P = PolynomialRing(Fp, 'x')
polynomial = P.lagrange_polynomial(shares)
key = long_to_bytes(int(polynomial(0)))
assert sha256(key).hexdigest().startswith('709149eb5baf8f8cb617226854a7b4f3')
print(unpad(AES.new(key, AES.MODE_ECB).decrypt(ct), AES.block_size).decode())
Flag
If we run the script, we will get the flag:
$ python3 solve.py
HTB{sometimes_the_LSB_can_leak_a_lot_of_crucial_information!}
The full script can be found in here: solve.py
.