From 4a2d92951d2c68240f02d7b21ab187a5b38271d3 Mon Sep 17 00:00:00 2001 From: J08nY Date: Thu, 27 Mar 2025 17:03:30 +0100 Subject: More details on ctr and non-uniqueness. --- epare/countermeasures.ipynb | 669 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 528 insertions(+), 141 deletions(-) diff --git a/epare/countermeasures.ipynb b/epare/countermeasures.ipynb index 3d931d2..f695521 100644 --- a/epare/countermeasures.ipynb +++ b/epare/countermeasures.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "code", - "execution_count": 204, + "execution_count": 2, "id": "33ee6084-2ac3-4f95-9610-0fbc06026538", "metadata": {}, "outputs": [], @@ -38,7 +38,7 @@ }, { "cell_type": "code", - "execution_count": 205, + "execution_count": 3, "id": "b1b9596c-1eba-4ace-af84-8cb279d84cc2", "metadata": {}, "outputs": [], @@ -49,7 +49,7 @@ }, { "cell_type": "code", - "execution_count": 206, + "execution_count": 4, "id": "b0afb195-8390-44c5-931e-75a70ccd4e9e", "metadata": {}, "outputs": [], @@ -61,7 +61,7 @@ }, { "cell_type": "code", - "execution_count": 207, + "execution_count": 5, "id": "52c877e1-5021-4ec2-9daa-dd20bec6bcb2", "metadata": {}, "outputs": [], @@ -1116,7 +1116,7 @@ }, { "cell_type": "code", - "execution_count": 226, + "execution_count": 6, "id": "20a26f27-620d-4d7f-92bd-b949482b5c9a", "metadata": {}, "outputs": [], @@ -1126,7 +1126,7 @@ }, { "cell_type": "code", - "execution_count": 227, + "execution_count": 7, "id": "144340bd-5372-4beb-a46e-fd60c596b254", "metadata": {}, "outputs": [], @@ -1141,7 +1141,7 @@ }, { "cell_type": "code", - "execution_count": 228, + "execution_count": 8, "id": "f103129c-17d3-4217-999b-94ecb4ec523d", "metadata": {}, "outputs": [ @@ -1185,7 +1185,7 @@ }, { "cell_type": "code", - "execution_count": 229, + "execution_count": 9, "id": "08d99bd5-2b87-4a04-995d-7a87f9b67102", "metadata": {}, "outputs": [], @@ -1197,7 +1197,7 @@ }, { "cell_type": "code", - "execution_count": 230, + "execution_count": 10, "id": "2a869bed-8e21-46af-8f70-065f4afd6a82", "metadata": {}, "outputs": [], @@ -1208,7 +1208,7 @@ }, { "cell_type": "code", - "execution_count": 231, + "execution_count": 11, "id": "e440399a-bc01-488b-8822-08cc0bf1672d", "metadata": {}, "outputs": [], @@ -1221,7 +1221,7 @@ }, { "cell_type": "code", - "execution_count": 232, + "execution_count": 12, "id": "7ea6d6ae-a6f5-4b53-8c40-787d79970cb6", "metadata": {}, "outputs": [ @@ -1229,7 +1229,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "3752128619\n", + "3188254931\n", "32\n" ] } @@ -1270,7 +1270,7 @@ }, { "cell_type": "code", - "execution_count": 233, + "execution_count": 13, "id": "b5f398fc-90d7-455e-97bd-62b682d55961", "metadata": {}, "outputs": [], @@ -1300,19 +1300,19 @@ }, { "cell_type": "code", - "execution_count": 234, + "execution_count": 17, "id": "5f03e586-33df-4525-a722-f5f63d6ca28d", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "e4879058a89a44af9abf2e7a58b1022f", + "model_id": "f6984b3117d940a98a6a79a427492f2d", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "Collecting scalarmults: 0%| | 0/1000 [00:00, ?it/s]" + "Collecting scalarmults: 0%| | 0/100 [00:00, ?it/s]" ] }, "metadata": {}, @@ -1321,12 +1321,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "69ff8872b4454bacb5f1c4a7503e6d3b", + "model_id": "d646ad0b77344351a0cf9acbbbaac484", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "Computing dlogs: 0%| | 0/1000 [00:00, ?it/s]" + "Computing dlogs: 0%| | 0/100 [00:00, ?it/s]" ] }, "metadata": {}, @@ -1343,7 +1343,8 @@ "source": [ "key = 0x20959f2b437de1e522baf6d814911938157390d3ea5118660b852ab0d5387006 # any key works\n", "msplit = MultiplicativeSplitting(mult, rand_bits=32) # change the mask size here to your liking\n", - "tries = 1000\n", + "tries = 100\n", + "num_workers = 20\n", "\n", "blens = [None for _ in range(tries)]\n", "ts = [None for _ in range(tries)]\n", @@ -1374,7 +1375,7 @@ " dlog = future.result()\n", " t = int((dlog - key) / 92)\n", " ts[i] = t\n", - " blens[i] = s.bit_length()\n", + " blens[i] = t.bit_length()\n", "\n", "mask_len = max(blens)\n", "print(mask_len)" @@ -1382,19 +1383,19 @@ }, { "cell_type": "code", - "execution_count": 235, + "execution_count": 20, "id": "5fbf8a38-983d-49a6-9cac-5350f960dc3e", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "89d1369c99644e88bd73b6230963716a", + "model_id": "4a1915bb130e4c68bd8c450c37f9fd25", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "Factoring: 0%| | 0/1000 [00:00, ?it/s]" + "Factoring: 0%| | 0/100 [00:00, ?it/s]" ] }, "metadata": {}, @@ -1402,15 +1403,15 @@ } ], "source": [ - "num_workers = 25\n", - "\n", "with TaskExecutor(max_workers=num_workers) as pool:\n", + " fulls = []\n", " for t in ts:\n", " full = t * (real_n + 92) + key\n", + " fulls.append(full)\n", " pool.submit_task(t,\n", " pari_factor,\n", " full)\n", - " facts = [None for _ in ss]\n", + " facts = [None for _ in ts]\n", " for t, future in tqdm(pool.as_completed(), desc=\"Factoring\", total=len(ts)):\n", " result = future.result()\n", " facts[ts.index(t)] = result" @@ -1418,7 +1419,7 @@ }, { "cell_type": "code", - "execution_count": 236, + "execution_count": 38, "id": "0973fe4b-cdf5-4e91-850b-25375eeabb7e", "metadata": { "scrolled": true @@ -1428,117 +1429,477 @@ "name": "stdout", "output_type": "stream", "text": [ - "Only one candidate, we got the mask: 3223834487 True\n", - "Only one candidate, we got the mask: 2377873873 True\n", - "Only one candidate, we got the mask: 2549271668 True\n", - "Only one candidate, we got the mask: 2536406777 True\n", - "Only one candidate, we got the mask: 3474268328 True\n", - "Only one candidate, we got the mask: 3550639425 True\n", - "Only one candidate, we got the mask: 3814005975 True\n", - "Only one candidate, we got the mask: 4238733795 True\n", - "Only one candidate, we got the mask: 4168083955 True\n", - "Only one candidate, we got the mask: 2761553491 True\n", - "Only one candidate, we got the mask: 3411331906 True\n", - "Only one candidate, we got the mask: 789326198 True\n", - "Only one candidate, we got the mask: 2285458765 True\n", - "Only one candidate, we got the mask: 774733453 True\n", - "Only one candidate, we got the mask: 3283055299 True\n", - "Only one candidate, we got the mask: 2838749009 True\n", - "Only one candidate, we got the mask: 3276117366 True\n", - "Only one candidate, we got the mask: 860570263 True\n", - "Only one candidate, we got the mask: 981664829 True\n", - "Only one candidate, we got the mask: 4134679928 True\n", - "Only one candidate, we got the mask: 3988645114 True\n", - "Only one candidate, we got the mask: 2280222647 True\n", - "Only one candidate, we got the mask: 3577824626 True\n", - "Only one candidate, we got the mask: 3679892960 True\n", - "Only one candidate, we got the mask: 1774221601 True\n", - "Only one candidate, we got the mask: 2623580147 True\n", - "Only one candidate, we got the mask: 1702008059 True\n", - "Only one candidate, we got the mask: 3933544069 True\n", - "Only one candidate, we got the mask: 3999529804 True\n", - "Only one candidate, we got the mask: 3480801033 True\n", - "Only one candidate, we got the mask: 3813421579 True\n", - "Only one candidate, we got the mask: 3417626666 True\n", - "Only one candidate, we got the mask: 4170438661 True\n", - "Only one candidate, we got the mask: 3502288943 True\n", - "Only one candidate, we got the mask: 2786122643 True\n", - "Only one candidate, we got the mask: 2127512283 True\n", - "Only one candidate, we got the mask: 2531786983 True\n", - "Only one candidate, we got the mask: 3983366093 True\n", - "Only one candidate, we got the mask: 2379294079 True\n", - "Only one candidate, we got the mask: 2930272946 True\n", - "Only one candidate, we got the mask: 2500319501 True\n", - "Only one candidate, we got the mask: 2947684105 True\n", - "Only one candidate, we got the mask: 3995028346 True\n", - "Only one candidate, we got the mask: 3421022802 True\n", - "Only one candidate, we got the mask: 3953171129 True\n", - "Only one candidate, we got the mask: 2982511438 True\n", - "Only one candidate, we got the mask: 2830285508 True\n", - "Only one candidate, we got the mask: 277646521 True\n", - "Only one candidate, we got the mask: 3775642326 True\n", - "Only one candidate, we got the mask: 3528903061 True\n", - "Only one candidate, we got the mask: 2433595133 True\n", - "Only one candidate, we got the mask: 2809043104 True\n", - "Only one candidate, we got the mask: 3918854258 True\n", - "Only one candidate, we got the mask: 2172498737 True\n", - "Only one candidate, we got the mask: 2614989645 True\n", - "Only one candidate, we got the mask: 3881796054 True\n", - "Only one candidate, we got the mask: 3763131597 True\n", - "Only one candidate, we got the mask: 3333059164 True\n", - "Only one candidate, we got the mask: 781918702 True\n", - "Only one candidate, we got the mask: 3898624034 True\n", - "Only one candidate, we got the mask: 2695908441 True\n", - "Only one candidate, we got the mask: 2428288661 True\n", - "Only one candidate, we got the mask: 380310234 True\n", - "Only one candidate, we got the mask: 3806008683 True\n", - "Only one candidate, we got the mask: 1583055543 True\n", - "Only one candidate, we got the mask: 3071695987 True\n", - "Only one candidate, we got the mask: 2466420323 True\n", - "Only one candidate, we got the mask: 3668827111 True\n", - "Only one candidate, we got the mask: 3030308051 True\n", - "Only one candidate, we got the mask: 4178268350 True\n", - "Only one candidate, we got the mask: 601467334 True\n", - "Only one candidate, we got the mask: 1756886305 True\n", - "Only one candidate, we got the mask: 3789366239 True\n", - "Only one candidate, we got the mask: 1709528826 True\n", - "Only one candidate, we got the mask: 4179236943 True\n", - "Only one candidate, we got the mask: 3246542896 True\n", - "Only one candidate, we got the mask: 1036989838 True\n", - "Only one candidate, we got the mask: 2843879303 True\n", - "Only one candidate, we got the mask: 2943368159 True\n", - "Only one candidate, we got the mask: 3694910341 True\n", - "Only one candidate, we got the mask: 3509390042 True\n", - "Only one candidate, we got the mask: 3797507269 True\n", - "Only one candidate, we got the mask: 3948777957 True\n", - "Only one candidate, we got the mask: 3649873740 True\n", - "Only one candidate, we got the mask: 2612080546 True\n", - "Only one candidate, we got the mask: 3671883118 True\n", - "Only one candidate, we got the mask: 2973101524 True\n", - "Only one candidate, we got the mask: 3724708289 True\n", - "Only one candidate, we got the mask: 4134344947 True\n", - "Only one candidate, we got the mask: 3489598522 True\n", - "Only one candidate, we got the mask: 3984902078 True\n", - "Only one candidate, we got the mask: 4259116327 True\n", - "Only one candidate, we got the mask: 3389988907 True\n", - "Only one candidate, we got the mask: 868217594 True\n", - "Only one candidate, we got the mask: 3729431567 True\n", - "Only one candidate, we got the mask: 3542657779 True\n", - "Only one candidate, we got the mask: 2695799377 True\n", - "Only one candidate, we got the mask: 3972219937 True\n", - "Only one candidate, we got the mask: 2701111433 True\n", - "Only one candidate, we got the mask: 3806713198 True\n", - "Only one candidate, we got the mask: 3503145915 True\n", - "Only one candidate, we got the mask: 2397268241 True\n", - "Only one candidate, we got the mask: 2919558765 True\n", - "Only one candidate, we got the mask: 543703399 True\n", - "Total recovered masks: 104 out of 1000\n" + "Only one candidate, we got the mask: 2921741201 True\n", + "Only one candidate, we got the mask: 2072087159 True\n", + "Several candidates for r\n", + "true r = 4039527236\n", + "t = 713461330\n", + "full = k + t (n + 92) = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "-----\n", + "candidate = 3539175297\n", + "candidate^-1 = 26490707025138842871232299283028891918970647143044648555061130998090929713163\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 1010980488\n", + "candidate^-1 = 65382395850142385046254203937937214383274413673251102786718616383197090673492\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 1131335308\n", + "candidate^-1 = 68241665580096390720464305945366132997268084763730630597092100846220368619186\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 1468796812\n", + "candidate^-1 = 42974788306596910581678149765329273626138664755529162589164596291869762059227\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 2262670616\n", + "candidate^-1 = 34120832790048195360232152972683066498634042381865315298546050423110184309593\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 2937593624\n", + "candidate^-1 = 59928865533177637950767892719235074044242216512664024713011202452441507430870\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 1123577112\n", + "candidate^-1 = 28797267645146503647782014101216400393084893568537834892905377895952751088363\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 2019763618\n", + "candidate^-1 = 14492196383530008016252425678693741785643004999654181923797869651794644589503\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 3394005924\n", + "candidate^-1 = 22747221860032130240154768648455377665756028254576876865697366948740122873062\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 1101597609\n", + "candidate^-1 = 57299717742129214108904199687105698168184886340705550118886128389159682745636\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 1179725099\n", + "candidate^-1 = 2589178315658163293839262175945801294566173159335058828325584381259536336976\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 3634715564\n", + "candidate^-1 = 63500943916056123744437126756972853187061581127739385731937263938095743759671\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 1804895148\n", + "candidate^-1 = 32692374163422277729585303046592231763960313081236584094052860741701608831649\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 4044771768\n", + "candidate^-1 = 52010472181905874507274875250078108352478979351338650049500167853209533299960\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 2726036673\n", + "candidate^-1 = 33412630048235921446011078560536554607851595990453256418011146175452156477886\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 4039527236\n", + "candidate^-1 = 45687569571644186668055030675917308123994386634726534380327839132403948696008\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 734398406\n", + "candidate^-1 = 9066633853435455843498663857517672789931561241259438341471383970726271315941\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 1203263432\n", + "candidate^-1 = 10597089865254233934449136733317910414767585486955432722650386806045786846217\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 1009881809\n", + "candidate^-1 = 28984392767060016032504851357387483571286009999308363847595739303589289179006\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 1697002962\n", + "candidate^-1 = 45494443720064260480309537296910755331512056509153753731394733897480245746124\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 2203195218\n", + "candidate^-1 = 28649858871064607054452099843552849084092443170352775059443064194579841372818\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 1817357782\n", + "candidate^-1 = 50118945072353882169016617840804831911777393985679884627016719263178234716829\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 2359450198\n", + "candidate^-1 = 1294589157829081646919631087972900647283086579667529414162792190629768168488\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 902447574\n", + "candidate^-1 = 65384748326844555459170606093184463527920626162473168188105721483403217663298\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 3609790296\n", + "candidate^-1 = 54787658461590321524721469359866553113153040675517735465455334677357430817081\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 2022385884\n", + "candidate^-1 = 27138001604053383694692114827015342242612190432878413262142527093405813797407\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 1348257256\n", + "candidate^-1 = 2265531026200892882109354403952576132745401514418176474784886333602094294854\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 848501481\n", + "candidate^-1 = 14105944680370155640761438920680636200678344748508620625931659181947238689735\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 3959673578\n", + "candidate^-1 = 8514341200062059445867282316798770218884343036808910622475199011346783490837\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 908678891\n", + "candidate^-1 = 23354947384949399018175600008468789361209019701560882417175629913343216631145\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 1011192942\n", + "candidate^-1 = 54276003208106767389384229654030684485224380865756826524285054186811627594814\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 3029645427\n", + "candidate^-1 = 9661464255686672010834950452462494523762003333102787949198579767863096393002\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 1979836789\n", + "candidate^-1 = 17028682400124118891734564633597540437768686073617821244950398022693566981674\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "candidate = 1258968696\n", + "candidate^-1 = 11695781644483879685362356889647048665988891413217912935596458034008096001175\n", + "(key * candidate^-1)_mod(n+92) * candidate = 54853006610429443711102562796765991385990914712382307462633349524199986834658739412728\n", + "above == full? True\n", + "-----\n", + "---------------------\n", + "Several candidates for r\n", + "true r = 2546266567\n", + "t = 1548864186\n", + "full = k + t (n + 92) = 119081236569616103969202985151515360402172033984486476071765168905412656991728103589856\n", + "-----\n", + "candidate = 3968039777\n", + "candidate^-1 = 47199999723628001336554368590553381329909688423987679279501585692741942222130\n", + "(key * candidate^-1)_mod(n+92) * candidate = 119081236569616103969202985151515360402172033984486476071765168905412656991728103589856\n", + "above == full? True\n", + "-----\n", + "candidate = 2546266567\n", + "candidate^-1 = 53261354779930768597409107118256662925077636528602413316194826191853234093722\n", + "(key * candidate^-1)_mod(n+92) * candidate = 119081236569616103969202985151515360402172033984486476071765168905412656991728103589856\n", + "above == full? True\n", + "-----\n", + "candidate = 2441870632\n", + "candidate^-1 = 57479263860955910841936440041364026045516801621530257119975624597452342910333\n", + "(key * candidate^-1)_mod(n+92) * candidate = 119081236569616103969202985151515360402172033984486476071765168905412656991728103589856\n", + "above == full? True\n", + "-----\n", + "candidate = 2857178584\n", + "candidate^-1 = 75748083438556289408418666080557136798495350712469032724680328085740307176009\n", + "(key * candidate^-1)_mod(n+92) * candidate = 119081236569616103969202985151515360402172033984486476071765168905412656991728103589856\n", + "above == full? True\n", + "-----\n", + "candidate = 1757828696\n", + "candidate^-1 = 17227168816999813895475622948114925759056198231882304548407742991291781760271\n", + "(key * candidate^-1)_mod(n+92) * candidate = 119081236569616103969202985151515360402172033984486476071765168905412656991728103589856\n", + "above == full? True\n", + "-----\n", + "candidate = 3736310456\n", + "candidate^-1 = 48879952893042060686454552217703589967985177807205861867478155758152793393123\n", + "(key * candidate^-1)_mod(n+92) * candidate = 119081236569616103969202985151515360402172033984486476071765168905412656991728103589856\n", + "above == full? True\n", + "-----\n", + "candidate = 3133866544\n", + "candidate^-1 = 33664482913723953820412695074440929318832358645764599964801070204254096100835\n", + "(key * candidate^-1)_mod(n+92) * candidate = 119081236569616103969202985151515360402172033984486476071765168905412656991728103589856\n", + "above == full? True\n", + "-----\n", + "candidate = 3515657392\n", + "candidate^-1 = 47055055788379089607666629310627900110700983250840595692632775802152517281392\n", + "(key * candidate^-1)_mod(n+92) * candidate = 119081236569616103969202985151515360402172033984486476071765168905412656991728103589856\n", + "above == full? True\n", + "-----\n", + "candidate = 3329733203\n", + "candidate^-1 = 63341901525758342256800386523708293549278712718872106311460104915244606307703\n", + "(key * candidate^-1)_mod(n+92) * candidate = 119081236569616103969202985151515360402172033984486476071765168905412656991728103589856\n", + "above == full? True\n", + "-----\n", + "candidate = 1566933272\n", + "candidate^-1 = 67328965827447907640825390148881858637664717291529199929602140408508192201670\n", + "(key * candidate^-1)_mod(n+92) * candidate = 119081236569616103969202985151515360402172033984486476071765168905412656991728103589856\n", + "above == full? True\n", + "-----\n", + "candidate = 1868155228\n", + "candidate^-1 = 20876963026325756053051468762266305473624587344612836898098502903292333983733\n", + "(key * candidate^-1)_mod(n+92) * candidate = 119081236569616103969202985151515360402172033984486476071765168905412656991728103589856\n", + "above == full? True\n", + "-----\n", + "---------------------\n", + "Several candidates for r\n", + "true r = 586356740\n", + "t = 404263194\n", + "full = k + t (n + 92) = 31080944018917461343795538061263727736823600975872546557801979004011543724824943696960\n", + "-----\n", + "candidate = 938170784\n", + "candidate^-1 = 52975562029403857607630522378170505964905977660731390116544502276802695405629\n", + "(key * candidate^-1)_mod(n+92) * candidate = 31080944018917461343795538061263727736823600975872546557801979004011543724824943696960\n", + "above == full? True\n", + "-----\n", + "candidate = 1876341568\n", + "candidate^-1 = 64929252394581111463744079025655690213625872965265138476701155444907974104071\n", + "(key * candidate^-1)_mod(n+92) * candidate = 31080944018917461343795538061263727736823600975872546557801979004011543724824943696960\n", + "above == full? True\n", + "-----\n", + "candidate = 437122240\n", + "candidate^-1 = 34960422445902541801696735185321223222583924317096364308996315884209127750875\n", + "(key * candidate^-1)_mod(n+92) * candidate = 31080944018917461343795538061263727736823600975872546557801979004011543724824943696960\n", + "above == full? True\n", + "-----\n", + "candidate = 1222440419\n", + "candidate^-1 = 68600022163021642948955277628963692751947775934147947283493669830758786832741\n", + "(key * candidate^-1)_mod(n+92) * candidate = 31080944018917461343795538061263727736823600975872546557801979004011543724824943696960\n", + "above == full? True\n", + "-----\n", + "candidate = 586356740\n", + "candidate^-1 = 23254545039239479916322727266560109973972949641331114716984956752473710406996\n", + "(key * candidate^-1)_mod(n+92) * candidate = 31080944018917461343795538061263727736823600975872546557801979004011543724824943696960\n", + "above == full? True\n", + "-----\n", + "candidate = 2444880838\n", + "candidate^-1 = 72741482461390004134406456651052283607146772101973417060175739221886019817627\n", + "(key * candidate^-1)_mod(n+92) * candidate = 31080944018917461343795538061263727736823600975872546557801979004011543724824943696960\n", + "above == full? True\n", + "-----\n", + "candidate = 1172713480\n", + "candidate^-1 = 11627272519619739958161363633280054986986474820665557358492478376236855203498\n", + "(key * candidate^-1)_mod(n+92) * candidate = 31080944018917461343795538061263727736823600975872546557801979004011543724824943696960\n", + "above == full? True\n", + "-----\n", + "candidate = 469085392\n", + "candidate^-1 = 29068181299049349895403409083200137467466187051663893396231195940592138008745\n", + "(key * candidate^-1)_mod(n+92) * candidate = 31080944018917461343795538061263727736823600975872546557801979004011543724824943696960\n", + "above == full? True\n", + "-----\n", + "candidate = 2345426960\n", + "candidate^-1 = 5813636259809869979080681816640027493493237410332778679246239188118427601749\n", + "(key * candidate^-1)_mod(n+92) * candidate = 31080944018917461343795538061263727736823600975872546557801979004011543724824943696960\n", + "above == full? True\n", + "-----\n", + "---------------------\n", + "Several candidates for r\n", + "true r = 4099981182\n", + "t = 2642778076\n", + "full = k + t (n + 92) = 203184555558590712836289545636923662903278351877540745889142089702149488986478501195426\n", + "-----\n", + "candidate = 3228686923\n", + "candidate^-1 = 67416396472256627079998760927485239166988608007947808690086396876984288458738\n", + "(key * candidate^-1)_mod(n+92) * candidate = 203184555558590712836289545636923662903278351877540745889142089702149488986478501195426\n", + "above == full? True\n", + "-----\n", + "candidate = 3923474478\n", + "candidate^-1 = 53037483928698273854873915437268008099102139343418152750051187589693742832853\n", + "(key * candidate^-1)_mod(n+92) * candidate = 203184555558590712836289545636923662903278351877540745889142089702149488986478501195426\n", + "above == full? True\n", + "-----\n", + "candidate = 2767445934\n", + "candidate^-1 = 27397167377793821380093463966638862719922863829406518913862257281139501333519\n", + "(key * candidate^-1)_mod(n+92) * candidate = 203184555558590712836289545636923662903278351877540745889142089702149488986478501195426\n", + "above == full? True\n", + "-----\n", + "candidate = 3082729947\n", + "candidate^-1 = 67502252272888712178930437829250192126129995527986739863701511477792036332722\n", + "(key * candidate^-1)_mod(n+92) * candidate = 203184555558590712836289545636923662903278351877540745889142089702149488986478501195426\n", + "above == full? True\n", + "-----\n", + "candidate = 4099981182\n", + "candidate^-1 = 53728758251263460792603093081868749337569947904541549081333778030796416192083\n", + "(key * candidate^-1)_mod(n+92) * candidate = 203184555558590712836289545636923662903278351877540745889142089702149488986478501195426\n", + "above == full? True\n", + "-----\n", + "---------------------\n", + "Only one candidate, we got the mask: 4240436952 True\n", + "Several candidates for r\n", + "true r = 1054759622\n", + "t = 694271292\n", + "full = k + t (n + 92) = 53377620017317855809796612613608262425705269850145672571876348376319535218874908447234\n", + "-----\n", + "candidate = 2082978083\n", + "candidate^-1 = 70926800923833726814245799453581520027922406161928168992184434104522114548589\n", + "(key * candidate^-1)_mod(n+92) * candidate = 53377620017317855809796612613608262425705269850145672571876348376319535218874908447234\n", + "above == full? True\n", + "-----\n", + "candidate = 1465316453\n", + "candidate^-1 = 60239579291535863658082545576886406273278056948782152971212929977157790371263\n", + "(key * candidate^-1)_mod(n+92) * candidate = 53377620017317855809796612613608262425705269850145672571876348376319535218874908447234\n", + "above == full? True\n", + "-----\n", + "candidate = 4165956166\n", + "candidate^-1 = 73904871841796046067051717563361197245134087215863527914521121358767683675551\n", + "(key * candidate^-1)_mod(n+92) * candidate = 53377620017317855809796612613608262425705269850145672571876348376319535218874908447234\n", + "above == full? True\n", + "-----\n", + "candidate = 1054759622\n", + "candidate^-1 = 32916166462770436865868266168928274812999826737500918380668592970627433533542\n", + "(key * candidate^-1)_mod(n+92) * candidate = 53377620017317855809796612613608262425705269850145672571876348376319535218874908447234\n", + "above == full? True\n", + "-----\n", + "candidate = 1150690474\n", + "candidate^-1 = 71499038532384546579941614468655340824282611408865892492623092957903951282093\n", + "(key * candidate^-1)_mod(n+92) * candidate = 53377620017317855809796612613608262425705269850145672571876348376319535218874908447234\n", + "above == full? True\n", + "-----\n", + "candidate = 2930632906\n", + "candidate^-1 = 68561261025647114488970090625013640367811912609290519904035369295085521586888\n", + "(key * candidate^-1)_mod(n+92) * candidate = 53377620017317855809796612613608262425705269850145672571876348376319535218874908447234\n", + "above == full? True\n", + "-----\n", + "candidate = 891931754\n", + "candidate^-1 = 71506829279038074109757883564477355140976176319499648868114881886397351037606\n", + "(key * candidate^-1)_mod(n+92) * candidate = 53377620017317855809796612613608262425705269850145672571876348376319535218874908447234\n", + "above == full? True\n", + "-----\n", + "candidate = 1582042478\n", + "candidate^-1 = 3588093433295855163732315625904528984462656656446659629430225432413461610135\n", + "(key * candidate^-1)_mod(n+92) * candidate = 53377620017317855809796612613608262425705269850145672571876348376319535218874908447234\n", + "above == full? True\n", + "-----\n", + "candidate = 2863810801\n", + "candidate^-1 = 68817051866482904589958336845935410415616665963668120410224486154991202020843\n", + "(key * candidate^-1)_mod(n+92) * candidate = 53377620017317855809796612613608262425705269850145672571876348376319535218874908447234\n", + "above == full? True\n", + "-----\n", + "candidate = 4027416659\n", + "candidate^-1 = 9445019186430103977146513323452829598031350649704699735484053900399235680239\n", + "(key * candidate^-1)_mod(n+92) * candidate = 53377620017317855809796612613608262425705269850145672571876348376319535218874908447234\n", + "above == full? True\n", + "-----\n", + "candidate = 791021239\n", + "candidate^-1 = 7176186866591710327464631251809057968925313312893319258860450864826923220270\n", + "(key * candidate^-1)_mod(n+92) * candidate = 53377620017317855809796612613608262425705269850145672571876348376319535218874908447234\n", + "above == full? True\n", + "-----\n", + "candidate = 1328364218\n", + "candidate^-1 = 61241335234879901001880976060972940299803372432205022907074540241147849493070\n", + "(key * candidate^-1)_mod(n+92) * candidate = 53377620017317855809796612613608262425705269850145672571876348376319535218874908447234\n", + "above == full? True\n", + "-----\n", + "candidate = 2538649658\n", + "candidate^-1 = 40460798138314952610978306328523747705796793263233053748780937033651947724626\n", + "(key * candidate^-1)_mod(n+92) * candidate = 53377620017317855809796612613608262425705269850145672571876348376319535218874908447234\n", + "above == full? True\n", + "-----\n", + "candidate = 1269324829\n", + "candidate^-1 = 4038653516871539902098976983906620949247818256667220660704065454290642646739\n", + "(key * candidate^-1)_mod(n+92) * candidate = 53377620017317855809796612613608262425705269850145672571876348376319535218874908447234\n", + "above == full? True\n", + "-----\n", + "candidate = 2131580798\n", + "candidate^-1 = 13269399537091224226648020073813398658821185281376945290634379651910514289428\n", + "(key * candidate^-1)_mod(n+92) * candidate = 53377620017317855809796612613608262425705269850145672571876348376319535218874908447234\n", + "above == full? True\n", + "-----\n", + "candidate = 1065790399\n", + "candidate^-1 = 26538799074182448453296040147626797317642370562753890581268759303821028578856\n", + "(key * candidate^-1)_mod(n+92) * candidate = 53377620017317855809796612613608262425705269850145672571876348376319535218874908447234\n", + "above == full? True\n", + "-----\n", + "---------------------\n", + "Several candidates for r\n", + "true r = 3634113672\n", + "t = 2680190962\n", + "full = k + t (n + 92) = 206060968331406077945547732896592415701478405398401148885296351493997971930068100577944\n", + "-----\n", + "candidate = 3634113672\n", + "candidate^-1 = 37634033022565823810085029464398851788513344511265489647294862481459002347491\n", + "(key * candidate^-1)_mod(n+92) * candidate = 206060968331406077945547732896592415701478405398401148885296351493997971930068100577944\n", + "above == full? True\n", + "-----\n", + "candidate = 4048089192\n", + "candidate^-1 = 71468722554076888672183327062398623529815128497721212450005095375489413086598\n", + "(key * candidate^-1)_mod(n+92) * candidate = 206060968331406077945547732896592415701478405398401148885296351493997971930068100577944\n", + "above == full? True\n", + "-----\n", + "candidate = 3735061274\n", + "candidate^-1 = 44928566482470354552499773065160058438807120959047383098649899561745326911344\n", + "(key * candidate^-1)_mod(n+92) * candidate = 206060968331406077945547732896592415701478405398401148885296351493997971930068100577944\n", + "above == full? True\n", + "-----\n", + "candidate = 3201481092\n", + "candidate^-1 = 1161365723043170098011311460592818537044462272356022390519677080027379528226\n", + "(key * candidate^-1)_mod(n+92) * candidate = 206060968331406077945547732896592415701478405398401148885296351493997971930068100577944\n", + "above == full? True\n", + "-----\n", + "---------------------\n", + "Several candidates for r\n", + "true r = 2376091517\n", + "t = 1953095034\n", + "full = k + t (n + 92) = 150159693718128688257542828458944146909547607961398772887284238536472708007326310110880\n", + "-----\n", + "candidate = 3246914120\n", + "candidate^-1 = 44590844092197648231531019613425704807242597656472481439265521332832917097606\n", + "(key * candidate^-1)_mod(n+92) * candidate = 150159693718128688257542828458944146909547607961398772887284238536472708007326310110880\n", + "above == full? True\n", + "-----\n", + "candidate = 2376091517\n", + "candidate^-1 = 19772973002144164969938083673165593098966704920762394800382781683851452496636\n", + "(key * candidate^-1)_mod(n+92) * candidate = 150159693718128688257542828458944146909547607961398772887284238536472708007326310110880\n", + "above == full? True\n", + "-----\n", + "candidate = 2597531296\n", + "candidate^-1 = 17297083735367877629484956680211693777880362935691158380652997359534519970751\n", + "(key * candidate^-1)_mod(n+92) * candidate = 150159693718128688257542828458944146909547607961398772887284238536472708007326310110880\n", + "above == full? True\n", + "-----\n", + "---------------------\n", + "Only one candidate, we got the mask: 3341139537 True\n", + "Only one candidate, we got the mask: 3722808561 True\n", + "Only one candidate, we got the mask: 2045751181 True\n", + "Only one candidate, we got the mask: 2166075112 True\n", + "Only one candidate, we got the mask: 1985265929 True\n", + "Only one candidate, we got the mask: 4284624218 True\n", + "Only one candidate, we got the mask: 3985300601 True\n", + "Only one candidate, we got the mask: 3864453118 True\n", + "Only one candidate, we got the mask: 2479654721 True\n", + "Total recovered masks: 12 out of 100\n" ] } ], "source": [ "candidate_amounts = []\n", - "for t, blen, r, (primes, powers), result in zip(ts, blens, rs, facts, results):\n", + "for t, blen, r, (primes, powers), full, result in zip(ts, blens, rs, facts, fulls, results):\n", " #print(primes, powers)\n", " #print(s, blen, r, r.bit_length())\n", " candidates = set()\n", @@ -1550,31 +1911,49 @@ " if len(candidates) == 1:\n", " candidate = candidates.pop()\n", " print(\"Only one candidate, we got the mask:\", candidate, candidate == r)\n", + " else:\n", + " if len(candidate_amounts) > 10:\n", + " # Do not print everything\n", + " continue\n", + " print(\"Several candidates for r\")\n", + " print(f\"true r = {r}\")\n", + " print(f\"t = {t}\")\n", + " print(f\"full = k + t (n + 92) = {full}\")\n", + " print(\"-----\")\n", + " for candidate in candidates:\n", + " print(f\"candidate = {candidate}\") \n", + " candidate_inverse = mod(candidate, real_n + 92).inverse() \n", + " print(f\"candidate^-1 = {candidate_inverse}\")\n", + " multiplied = candidate * int(candidate_inverse * key)\n", + " print(f\"(key * candidate^-1)_mod(n+92) * candidate = {multiplied}\")\n", + " print(f\"above == full? {multiplied == full}\")\n", + " print(\"-----\")\n", + " print(\"---------------------\")\n", " #print(\"--\")\n", "print(f\"Total recovered masks: {len(list(filter(lambda a: a == 1, candidate_amounts)))} out of {tries}\")" ] }, { "cell_type": "code", - "execution_count": 237, + "execution_count": 36, "id": "6274ff91-325f-4c6b-a4d7-d66b994d730f", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "d557894c3fbd4543b9fd6c240b676212", + "model_id": "aba07231a8d44a2f92c75ef741f73f50", "version_major": 2, "version_minor": 0 }, - "image/png": "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3LlauHCh3WpI0iOPPKLMzEytXLlSe/fu1cCBAxUXF6fjx4/XabyrHWtz587Vyy+/rKVLl2rnzp1q3ry54uPj9dNPP9ll/LKyMvXr10/PPfdcneZ/tRrnzp1Tbm6uUlNTlZubq3feeUcHDhzQ0KFD7VZDkjp37qxFixZp7969+vTTTxUSEqKBAwfq5MmTdqtx0fr167Vjxw4FBATUah9qWmPQoEGVjpe33nrLbuMfPnxY/fr1U9euXbV161Z9+eWXSk1NrfHjx2pS45dzLygo0GuvvSaLxaL77rvPbjWSk5OVkZGhVatWaf/+/Zo0aZLGjRunDRs22KWGYRhKSEjQv/71L7377rvas2ePgoODFRcXV+PPqZp8zk2ePFnvvfee1q1bp23btunEiRO69957a7wPTZqBWuvTp48xduxY288VFRVGQECAkZaW5pB6koz169c7ZOyLiouLDUnGtm3bHFrnxhtvNF599VW7j3vmzBkjNDTUyMzMNPr3729MnDjRbmPPmjXLCA8Pt9t4l5oyZYrRr18/h41flYkTJxo33XSTYbVa7TbmkCFDjIcffrhS27333muMHDnSbjXOnTtnODs7Gxs3bqzU3qtXL+PJJ5+85vEvPdasVqvh7+9vPP/887a206dPG+7u7sZbb711zeP/0pEjRwxJxp49e2o9bk1rXLRr1y5DknH06FGH1SgpKTEkGZs3b7ZrjX//+99Gu3btjH379hnBwcHGiy++WKfxq6uRlJRk3HPPPXUe82rjJyYmGr/97W/tMn51NS51zz33GHfeeadda3Tv3t344x//WKntWo7DS2scOHDAkGTs27fP1lZRUWG0bt3aWL58eZ1qXPo5d/r0acPV1dVYt26drc/+/fsNSUZ2dnadajQlrADW0vnz55WTk6O4uDhbm5OTk+Li4pSdnd2AM7s2JSUlkuSwL8auqKjQmjVrVFZW5pCv2hs7dqyGDBlS6f8Xezp06JACAgLUsWNHjRw5slana65mw4YNioqK0v333682bdrolltu0fLly+02/qXOnz+vVatW6eGHH5bFYrHbuLGxscrKytLBgwclSV988YU+/fRTDR482G41/vOf/6iiouKy1RJPT0+7rspedOTIERUWFlb678rHx0fR0dFN/ni3WCxq0aKFQ8Y/f/68li1bJh8fH4WHh9ttXKvVqgcffFApKSnq3r273ca91NatW9WmTRt16dJFv/vd7/Tdd9/ZZVyr1apNmzapc+fOio+PV5s2bRQdHW33S3x+qaioSJs2bdKYMWPsOm5sbKw2bNig48ePyzAMbdmyRQcPHtTAgQPtMn55ebkkVTrWnZyc5O7uXudj/dLPuZycHF24cKHS8d21a1cFBQU16eO7pgiAtXTq1ClVVFTYvoHkIj8/PxUWFjbQrK6N1WrVpEmT1Ldv30rflGIPe/fu1Q033CB3d3c99thjWr9+vbp162bXGmvWrFFubq7tawDtLTo6Wm+88YYyMjK0ZMkSHTlyRLfddpvOnDljl/H/9a9/acmSJQoNDdWHH36o3/3ud5owYYL+8pe/2GX8S6Wnp+v06dN66KGH7Dru1KlTNXz4cHXt2lWurq665ZZbNGnSJI0cOdJuNby8vBQTE6M//elPOnHihCoqKrRq1SplZ2eroKDAbnUuunhMX0/H+08//aQpU6ZoxIgR8vb2tuvYGzdu1A033CAPDw+9+OKLyszMlK+vr93Gf+655+Ti4qIJEybYbcxLDRo0SG+++aaysrL03HPPadu2bRo8eLAqKiqueezi4mKdPXtWc+bM0aBBg/TRRx9p2LBhuvfee7Vt2zY7zP5yf/nLX+Tl5WX305oLFy5Ut27d1L59e7m5uWnQoEFavHixbr/9druMfzGITZs2TT/88IPOnz+v5557Tv/+97/rdKxX9TlXWFgoNze3y/4h1JSP79poMl8FB8cZO3as9u3b55AVlC5duigvL08lJSX629/+pqSkJG3bts1uIfDYsWOaOHGiMjMza3UNTW38cgWrZ8+eio6OVnBwsN5++227/KvaarUqKipKzz77rCTplltu0b59+7R06VIlJSVd8/iXWrFihQYPHlyn66eu5O2339Zf//pXrV69Wt27d1deXp4mTZqkgIAAu+7HypUr9fDDD6tdu3ZydnZWr169NGLECOXk5NitxvXqwoULeuCBB2QYhpYsWWL38e+44w7l5eXp1KlTWr58uR544AHt3LlTbdq0ueaxc3Jy9NJLLyk3N9euK9eXGj58uO3PYWFh6tmzp2666SZt3bpVAwYMuKaxrVarJOmee+7R5MmTJUkRERHavn27li5dqv79+1/T+FV57bXXNHLkSLv//bhw4ULt2LFDGzZsUHBwsD7++GONHTtWAQEBdjkT4+rqqnfeeUdjxoxRy5Yt5ezsrLi4OA0ePLhON5Y58nOuqWIFsJZ8fX3l7Ox82V1CRUVF8vf3b6BZ1d24ceO0ceNGbdmyRe3bt7f7+G5uburUqZMiIyOVlpam8PBwvfTSS3YbPycnR8XFxerVq5dcXFzk4uKibdu26eWXX5aLi4td/tV+qRYtWqhz58765z//aZfx2rZte1kgvvnmm+16mvmio0ePavPmzXrkkUfsPnZKSoptFTAsLEwPPvigJk+ebPeV2Ztuuknbtm3T2bNndezYMe3atUsXLlxQx44d7VpHku2Yvh6O94vh7+jRo8rMzLT76p8kNW/eXJ06ddKtt96qFStWyMXFRStWrLDL2J988omKi4sVFBRkO9aPHj2qxx9/XCEhIXapUZWOHTvK19fXLse7r6+vXFxc6u14/+STT3TgwAG7H+8//vijpk+frvnz5+vuu+9Wz549NW7cOCUmJuqFF16wW53IyEjl5eXp9OnTKigoUEZGhr777rtaH+vVfc75+/vr/PnzOn36dKX+TfH4rgsCYC25ubkpMjJSWVlZtjar1aqsrCyHXNvmKIZhaNy4cVq/fr3+8Y9/qEOHDvVS12q12q7tsIcBAwZo7969ysvLs72ioqI0cuRI5eXlydnZ2W61Ljp79qwOHz6stm3b2mW8vn37XvZogoMHDyo4ONgu4//S66+/rjZt2mjIkCF2H/vcuXNycqr8V4qzs7Nt1cPemjdvrrZt2+qHH37Qhx9+qHvuucfuNTp06CB/f/9Kx3tpaal27tzZpI73i+Hv0KFD2rx5s1q1alUvde15vD/44IP68ssvKx3rAQEBSklJ0YcffmiXGlX597//re+++84ux7ubm5t69+5db8f7ihUrFBkZadfrMKWf/3u6cOFCvR3vPj4+at26tQ4dOqTdu3fX+Fi/2udcZGSkXF1dKx3fBw4cUH5+fpM6vuuKU8B1kJycrKSkJEVFRalPnz5asGCBysrKNHr0aLvVOHv2bKV/cR45ckR5eXlq2bKlgoKCrnn8sWPHavXq1Xr33Xfl5eVlu97Bx8dHnp6e1zy+JE2bNk2DBw9WUFCQzpw5o9WrV2vr1q12/cvay8vrsusWmzdvrlatWtntesY//OEPuvvuuxUcHKwTJ05o1qxZcnZ21ogRI+wy/uTJkxUbG6tnn31WDzzwgHbt2qVly5Zp2bJldhn/IqvVqtdff11JSUlycbH/oX/33XfrmWeeUVBQkLp37649e/Zo/vz5evjhh+1a58MPP5RhGOrSpYv++c9/KiUlRV27dq3z8Xe1Y23SpEl6+umnFRoaqg4dOig1NVUBAQFKSEiwy/jff/+98vPzbc/luxgO/P39a7wKcaUabdu21W9+8xvl5uZq48aNqqiosB3vLVu2lJub2zXXaNWqlZ555hkNHTpUbdu21alTp7R48WIdP368Vo8autrv6tLg6urqKn9/f3Xp0sUuNVq2bKnZs2frvvvuk7+/vw4fPqwnnnhCnTp1Unx8vF32ISUlRYmJibr99tt1xx13KCMjQ++99562bt1ql324+PlQWlqqdevWad68eTUetzY1+vfvr5SUFHl6eio4OFjbtm3Tm2++qfnz59utxrp169S6dWsFBQVp7969mjhxohISEmp8o8nVPud8fHw0ZswYJScnq2XLlvL29tb48eMVExOjW2+9tcb70WQ15C3ITdnChQuNoKAgw83NzejTp4+xY8cOu46/ZcsWQ9Jlr6SkJLuMX9XYkozXX3/dLuMbhmE8/PDDRnBwsOHm5ma0bt3aGDBggPHRRx/Zbfzq2PsxMImJiUbbtm0NNzc3o127dkZiYqLxz3/+027jG4ZhvPfee0aPHj0Md3d3o2vXrsayZcvsOr5hGMaHH35oSDIOHDhg97ENwzBKS0uNiRMnGkFBQYaHh4fRsWNH48knnzTKy8vtWmft2rVGx44dDTc3N8Pf398YO3ascfr06TqPd7VjzWq1GqmpqYafn5/h7u5uDBgwoFa/w6uN//rrr1f5/qxZs+xS4+LjZap6bdmyxS41fvzxR2PYsGFGQECA4ebmZrRt29YYOnSosWvXrhqPX5Pf1aXq8hiYK9U4d+6cMXDgQKN169aGq6urERwcbDz66KNGYWGhXfdhxYoVRqdOnQwPDw8jPDzcSE9Pt9s+XPTKK68Ynp6edT42rlajoKDAeOihh4yAgADDw8PD6NKlizFv3rxaPVrqajVeeuklo3379oarq6sRFBRkzJgxo1Z/n9Tkc+7HH380fv/73xs33nij0axZM2PYsGFGQUFBjWs0ZRbDsPNj+gEAANCocQ0gAACAyRAAAQAATIYACAAAYDIEQAAAAJMhAAIAAJgMARAAAMBkCIAAAAAmQwAE0GT86le/0qRJk2w/h4SEaMGCBVfcxmKxKD093aHzakxq8jsBAL4KDkCT9fnnn6t58+Z2HfOpp55Senq68vLy7DouADQmBEAATVbr1q0begoA0CRxChhArVmtVs2dO1edOnWSu7u7goKC9Mwzz9jenzJlijp37qxmzZqpY8eOSk1N1YULF2zvP/XUU4qIiNDKlSsVEhIiHx8fDR8+XGfOnLH1KSsr06hRo3TDDTeobdu2VX6p/aWnOw8dOqTbb79dHh4e6tatmzIzMy/b5kpze+ONNzR79mx98cUXslgsslgseuONNyRJp0+f1iOPPKLWrVvL29tbd955p7744otqf0fffvutLBaL3n77bd12223y9PRU7969dfDgQX3++eeKiorSDTfcoMGDB+vkyZO27T7//HP9+te/lq+vr3x8fNS/f3/l5uba3jcMQ0899ZSCgoLk7u6ugIAATZgwodp5vPrqq2rRooWysrIkSX/7298UFhYmT09PtWrVSnFxcSorK6t2ewDXJ1YAAdTatGnTtHz5cr344ovq16+fCgoK9M0339je9/Ly0htvvKGAgADt3btXjz76qLy8vPTEE0/Y+hw+fFjp6enauHGjfvjhBz3wwAOaM2eOLUimpKRo27Ztevfdd9WmTRtNnz5dubm5ioiIqHJOVqtV9957r/z8/LRz506VlJRUul6wJnNLTEzUvn37lJGRoc2bN0uSfHx8JEn333+/PD099cEHH8jHx0evvPKKBgwYoIMHD6ply5bV/q5mzZqlBQsWKCgoSA8//LD++7//W15eXnrppZfUrFkzPfDAA5o5c6aWLFkiSTpz5oySkpK0cOFCGYahefPm6a677tKhQ4fk5eWlv//973rxxRe1Zs0ade/eXYWFhdUG0blz52ru3Ln66KOP1KdPHxUUFGjEiBGaO3euhg0bpjNnzuiTTz4RXwkPmJABALVQWlpquLu7G8uXL6/xNs8//7wRGRlp+3nWrFlGs2bNjNLSUltbSkqKER0dbRiGYZw5c8Zwc3Mz3n77bdv73333neHp6WlMnDjR1hYcHGy8+OKLhmEYxocffmi4uLgYx48ft73/wQcfGJKM9evX12pu4eHhlfp88sknhre3t/HTTz9Var/pppuMV155pcpxjxw5YkgyXn31VVvbW2+9ZUgysrKybG1paWlGly5dqp1fRUWF4eXlZbz33nuGYRjGvHnzjM6dOxvnz5+vsv/F38kTTzxhtG3b1ti3b5/tvZycHEOS8e2331ZbD4A5sAIIoFb279+v8vJyDRgwoNo+a9eu1csvv6zDhw/r7Nmz+s9//iNvb+9KfUJCQuTl5WX7uW3btiouLpb08+rg+fPnFR0dbXu/ZcuW6tKlyxXnFRgYqICAAFtbTExMneZ2qS+++EJnz55Vq1atKrX/+OOPOnz48BW37dmzp+3Pfn5+kqSwsLBKbRf3W5KKioo0Y8YMbd26VcXFxaqoqNC5c+eUn58v6eeVyAULFqhjx44aNGiQ7rrrLt19991ycfn/v87nzZunsrIy7d69Wx07drS1h4eHa8CAAQoLC1N8fLwGDhyo3/zmN7rxxhuvuA8Arj9cAwigVjw9Pa/4fnZ2tkaOHKm77rpLGzdu1J49e/Tkk0/q/Pnzlfq5urpW+tlischqtdp9vnWZ26XOnj2rtm3bKi8vr9LrwIEDSklJueK2v9xPi8VSZdsv9zspKUl5eXl66aWXtH37duXl5alVq1a2OQYGBurAgQP685//LE9PT/3+97/X7bffXukay9tuu00VFRV6++23K83F2dlZmZmZ+uCDD9StWzctXLhQXbp00ZEjR67ymwNwvSEAAqiV0NBQeXp62m4quNT27dsVHBysJ598UlFRUQoNDdXRo0drVeOmm26Sq6urdu7caWv74YcfdPDgwWq3ufnmm3Xs2DEVFBTY2nbs2FHrubm5uamioqJSW69evVRYWCgXFxd16tSp0svX17dW+3Y1n332mSZMmKC77rpL3bt3l7u7u06dOlWpj6enp+6++269/PLL2rp1q7Kzs7V3717b+3369NEHH3ygZ599Vi+88EKlbS0Wi/r27avZs2drz549cnNz0/r16+26DwAaP04BA6gVDw8PTZkyRU888YTc3NzUt29fnTx5Ul999ZXGjBmj0NBQ5efna82aNerdu7c2bdpU64Bxww03aMyYMUpJSVGrVq3Upk0bPfnkk3Jyqv7frHFxcercubOSkpL0/PPPq7S0VE8++WSlPjWZW0hIiI4cOaK8vDy1b99eXl5eiouLU0xMjBISEjR37lx17txZJ06c0KZNmzRs2DBFRUXVav+uJDQ0VCtXrlRUVJRKS0uVkpJSadX1jTfeUEVFhaKjo9WsWTOtWrVKnp6eCg4OrjRObGys3n//fQ0ePFguLi6aNGmSdu7cqaysLA0cOFBt2rTRzp07dfLkSd188812mz+ApoEVQAC1lpqaqscff1wzZ87UzTffrMTERNt1bEOHDtXkyZM1btw4RUREaPv27UpNTa11jeeff1633Xab7r77bsXFxalfv36KjIystr+Tk5PWr1+vH3/8UX369NEjjzxS6dE0NZ3bfffdp0GDBumOO+5Q69at9dZbb8lisej999/X7bffrtGjR6tz584aPny4jh49aruuz15WrFihH374Qb169dKDDz6oCRMmqE2bNrb3W7RooeXLl6tv377q2bOnNm/erPfee++y6xMlqV+/ftq0aZNmzJihhQsXytvbWx9//LHuuusude7cWTNmzNC8efM0ePBgu+4DgMbPYhjc/w8AAGAmrAACAACYDAEQAADAZAiAAAAAJkMABAAAMBkCIAAAgMkQAAEAAEyGAAgAAGAyBEAAAACTIQACAACYDAEQAADAZAiAAAAAJkMABAAAMJn/A1cXgnhL9+q3AAAAAElFTkSuQmCC", + "image/png": "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s7O1b98+SVLnzp118803X4+yAAAAqIBDA2BhYaHuv/9+bd26VY0bN5YknT59WrfffrtWr16tZs2aObI8AAAAKuDQTwGPHz9eZ86c0VdffaUffvhBP/zwg/bu3avi4mJNmDDBkaUBAABQCYfuAKanp2vz5s3q2LGjra1Tp05asmSJBgwY4MjSAAAAqIRDdwCtVqtcXV0va3d1dZXVanVkaQAAAFTCoQHwjjvu0MSJE3X8+HFb27FjxzR58mT179/fkaUBAABQCYcGwMWLF6u4uFihoaFq06aN2rRpo1atWqm4uFiLFi2q1lhLlixRaGioPDw8FB0drZ07d16x/9q1a9WhQwd5eHgoPDxc77///mV99u3bpyFDhsjHx0cNGzZUjx49lJeXV615AQAA1DcOvQYwKChIOTk52rx5s7755htJUseOHRUbG1utcdasWaOkpCQtW7ZM0dHRSk1NVVxcnPbv3y8/P7/L+m/btk0jRoxQSkqK7rrrLq1atUrx8fHKyclRly5dJEmHDh1Snz59NGbMGM2ZM0fe3t766quv5OHhce0LBwAAqMMshmEYtT2Jq4mOjlaPHj20ePFiSb9eWxgUFKTx48dr6tSpl/VPSEhQSUmJNmzYYGu75ZZbFBERoWXLlkmS7r//frm6uuqNN96o8byKi4vl4+OjoqIieXt7V+mY0Kkba1zPbL6bO9jhNRz987geawAAVE9NXr9vNA59C1iSMjIydNddd9neAr7rrru0efPmKh9//vx5ZWdnl9s1dHJyUmxsrLKysio8Jisr67Jdxri4OFt/q9WqjRs3ql27doqLi5Ofn5+io6OVlpZW/QUCAADUMw4NgH/5y180cOBAeXl5aeLEiZo4caK8vb115513asmSJVUa49SpUyorK5O/v3+5dn9/f+Xn51d4TH5+/hX7FxYW6uzZs5o7d64GDhyojz76SEOHDtW9996rzMzMSudSWlqq4uLicg8AAID6xqHXAD7zzDN64YUXNG7cOFvbhAkT1Lt3bz3zzDMaO3asI8tX6uItaO655x5NnjxZkhQREaFt27Zp2bJl6tevX4XHpaSkaM6cOddtngAAAI7g0B3A06dPa+DAgZe1DxgwQEVFRVUaw9fXV87OziooKCjXXlBQoICAgAqPCQgIuGJ/X19fubi4qFOnTuX6dOzY8YqfAp42bZqKiopsj6NH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nTt32nX8Tz75RHfffbcCAwNlsVhsv8PYXlJSUtSjRw95eXnJz89P8fHx2r9/v11rLF26VF27drXdzDMmJkYffPCBXWtcau7cubZb/NjLk08+KYvFUu7RoUMHu40vSceOHdNvf/tbNW3aVJ6engoPD9euXbvsNn5oaOhla7BYLBo7dqzdapSVlWnmzJlq1aqVPD091aZNGz311FN2/12bZ86c0aRJkxQSEiJPT0/16tVLX3zxRY3Hu9q5ZhiGZs2apebNm8vT01OxsbE6ePCg3cZ/5513NGDAADVt2lQWi0W5ubl2XcOFCxc0ZcoUhYeHq2HDhgoMDNSoUaN0/Phxu9WQfj1POnTooIYNG+qmm25SbGysduzYYdca/+3RRx+VxWJRamqqXWs8+OCDl50nAwcOtOsa9u3bpyFDhsjHx0cNGzZUjx49lJeXZ7caFZ3rFotFzz33nN1qnD17VuPGjVPLli3l6empTp06admyZVUevyo1CgoK9OCDDyowMFANGjTQwIEDq3XuVeV17ueff9bYsWPVtGlTNWrUSMOGDbvsl0jcqAiANbBmzRolJSVp9uzZysnJUbdu3RQXF6fCwkK71SgpKVG3bt20ZMkSu4353zIzMzV27Fht375dmzZt0oULFzRgwACVlJTYrUbLli01d+5cZWdna9euXbrjjjt0zz336KuvvrJbjf/2xRdf6KWXXlLXrl3tPnbnzp114sQJ2+Ozzz6z29g//vijevfuLVdXV33wwQf6+uuvNX/+fN100012q/HFF1+Um/+mTZskScOHD7dbjWeffVZLly7V4sWLtW/fPj377LOaN2+eFi1aZLcakvTwww9r06ZNeuONN7Rnzx4NGDBAsbGxOnbsWI3Gu9q5Nm/ePL344otatmyZduzYoYYNGyouLk4///yzXcYvKSlRnz599Oyzz9Zo/lerce7cOeXk5GjmzJnKycnRO++8o/3792vIkCF2qyFJ7dq10+LFi7Vnzx599tlnCg0N1YABA3Ty5Em71bho3bp12r59uwIDA6u1hqrWGDhwYLnz5a233rLb+IcOHVKfPn3UoUMHbd26Vf/85z81c+bMKt9+rCo1/nvuJ06c0CuvvCKLxaJhw4bZrUZSUpLS09P15ptvat++fZo0aZLGjRun9evX26WGYRiKj4/Xv/71L7377rvavXu3QkJCFBsbW+XXqaq8zk2ePFnvvfee1q5dq8zMTB0/flz33ntvlddQrxmotp49expjx461fV1WVmYEBgYaKSkpDqknyVi3bp1Dxr6osLDQkGRkZmY6tM5NN91kvPzyy3Yf98yZM0ZYWJixadMmo1+/fsbEiRPtNvbs2bONbt262W28S02ZMsXo06ePw8avyMSJE402bdoYVqvVbmMOHjzYeOihh8q13XvvvcbIkSPtVuPcuXOGs7OzsWHDhnLt3bt3N5544olrHv/Sc81qtRoBAQHGc889Z2s7ffq04e7ubrz11lvXPP5/O3z4sCHJ2L17d7XHrWqNi3bu3GlIMo4cOeKwGkVFRYYkY/PmzXat8e9//9to0aKFsXfvXiMkJMR44YUXajR+ZTUSExONe+65p8ZjXm38hIQE47e//a1dxq+sxqXuuece44477rBrjc6dOxt/+tOfyrVdy3l4aY39+/cbkoy9e/fa2srKyoxmzZoZK1asqFGNS1/nTp8+bbi6uhpr16619dm3b58hycjKyqpRjfqEHcBqOn/+vLKzsxUbG2trc3JyUmxsrLKysmpxZtemqKhIkhz2i7HLysq0evVqlZSUOORX7Y0dO1aDBw8u93Oxp4MHDyowMFCtW7fWyJEjq/V2zdWsX79eUVFRGj58uPz8/HTzzTdrxYoVdhv/UufPn9ebb76phx56SBaLxW7j9urVSxkZGTpw4IAk6csvv9Rnn32mQYMG2a3GL7/8orKysst2Szw9Pe26K3vR4cOHlZ+fX+7/Kx8fH0VHR9f7891isahx48YOGf/8+fNavny5fHx81K1bN7uNa7Va9cADDyg5OVmdO3e227iX2rp1q/z8/NS+fXv9/ve/1/fff2+Xca1WqzZu3Kh27dopLi5Ofn5+io6OtvslPv+toKBAGzdu1JgxY+w6bq9evbR+/XodO3ZMhmFoy5YtOnDggAYMGGCX8UtLSyWp3Lnu5OQkd3f3Gp/rl77OZWdn68KFC+XO7w4dOig4OLhen99VRQCsplOnTqmsrMz2G0gu8vf3V35+fi3N6tpYrVZNmjRJvXv3LvebUuxhz549atSokdzd3fXoo49q3bp16tSpk11rrF69Wjk5ObZfA2hv0dHReu2115Senq6lS5fq8OHDuvXWW3XmzBm7jP+vf/1LS5cuVVhYmD788EP9/ve/14QJE/TXv/7VLuNfKi0tTadPn9aDDz5o13GnTp2q+++/Xx06dJCrq6tuvvlmTZo0SSNHjrRbDS8vL8XExOipp57S8ePHVVZWpjfffFNZWVk6ceKE3epcdPGcvpHO959//llTpkzRiBEj5O3tbdexN2zYoEaNGsnDw0MvvPCCNm3aJF9fX7uN/+yzz8rFxUUTJkyw25iXGjhwoF5//XVlZGTo2WefVWZmpgYNGqSysrJrHruwsFBnz57V3LlzNXDgQH300UcaOnSo7r33XmVmZtph9pf761//Ki8vL7u/rblo0SJ16tRJLVu2lJubmwYOHKglS5aob9++dhn/YhCbNm2afvzxR50/f17PPvus/v3vf9foXK/odS4/P19ubm6X/UOoPp/f1VFvfhUcHGfs2LHau3evQ3ZQ2rdvr9zcXBUVFenvf/+7EhMTlZmZabcQePToUU2cOFGbNm2q1jU01fHfO1hdu3ZVdHS0QkJC9Pbbb9vlX9VWq1VRUVF65plnJEk333yz9u7dq2XLlikxMfGax7/UypUrNWjQoBpdP3Ulb7/9tv72t79p1apV6ty5s3JzczVp0iQFBgbadR1vvPGGHnroIbVo0ULOzs7q3r27RowYoezsbLvVuFFduHBB9913nwzD0NKlS+0+/u23367c3FydOnVKK1as0H333acdO3bIz8/vmsfOzs7WwoULlZOTY9ed60vdf//9tj+Hh4era9euatOmjbZu3ar+/ftf09hWq1WSdM8992jy5MmSpIiICG3btk3Lli1Tv379rmn8irzyyisaOXKk3f9+XLRokbZv367169crJCREn3zyicaOHavAwEC7vBPj6uqqd955R2PGjFGTJk3k7Oys2NhYDRo0qEYfLHPk61x9xQ5gNfn6+srZ2fmyTwkVFBQoICCglmZVc+PGjdOGDRu0ZcsWtWzZ0u7ju7m5qW3btoqMjFRKSoq6deumhQsX2m387OxsFRYWqnv37nJxcZGLi4syMzP14osvysXFxS7/ar9U48aN1a5dO3377bd2Ga958+aXBeKOHTva9W3mi44cOaLNmzfr4YcftvvYycnJtl3A8PBwPfDAA5o8ebLdd2bbtGmjzMxMnT17VkePHtXOnTt14cIFtW7d2q51JNnO6RvhfL8Y/o4cOaJNmzbZffdPkho2bKi2bdvqlltu0cqVK+Xi4qKVK1faZexPP/1UhYWFCg4O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4hoA3Hi4BhBAtXh6el7x+aysLI0cOVJ33nmnNmzYoN27d+uJJ57Q+fPny/VzdXUt97XFYpHVarX7fGsyt0udPXtWzZs3V25ubrnH/v37lZycfMVj/3udFoulwrb/XndiYqJyc3O1cOFCbdu2Tbm5uWratKltjkFBQdq/f7/+8pe/yNPTU3/4wx/Ut2/fctdY3nrrrSorK9Pbb79dbi7Ozs7atGmTPvjgA3Xq1EmLFi1S+/btdfjw4at85wDcaAiAAKolLCxMnp6etg8VXGrbtm0KCQnRE088oaioKIWFhenIkSPVqtGmTRu5urpqx44dtrYff/xRBw4cqPSYjh076ujRozpx4oStbfv27dWem5ubm8rKysq1de/eXfn5+XJxcVHbtm3LPXx9fau1tqv5/PPPNWHCBN15553q3Lmz3N3dderUqXJ9PD09dffdd+vFF1/U1q1blZWVpT179tie79mzpz744AM988wzev7558sda7FY1Lt3b82ZM0e7d++Wm5ub1q1bZ9c1AKj7eAsYQLV4eHhoypQpevzxx+Xm5qbevXvr5MmT+uqrrzRmzBiFhYUpLy9Pq1evVo8ePbRx48ZqB4xGjRppzJgxSk5OVtOmTeXn56cnnnhCTk6V/5s1NjZW7dq1U2Jiop577jkVFxfriSeeKNenKnMLDQ3V4cOHlZubq5YtW8rLy0uxsbGKiYlRfHy85s2bp3bt2un48ePauHGjhg4dqqioqGqt70rCwsL0xhtvKCoqSsXFxUpOTi636/raa6+prKxM0dHRatCggd588015enoqJCSk3Di9evXS+++/r0GDBsnFxUWTJk3Sjh07lJGRoQEDBsjPz087duzQyZMn1bFjR7vNH0D9wA4ggGqbOXOmHnvsMc2aNUsdO3ZUQkKC7Tq2IUOGaPLkyRo3bpwiIiK0bds2zZw5s9o1nnvuOd166626++67FRsbqz59+igyMrLS/k5OTlq3bp1++ukn9ezZUw8//HC5W9NUdW7Dhg3TwIEDdfvtt6tZs2Z66623ZLFY9P7776tv374aPXq02rVrp/vvv19HjhyxXddnLytXrtSPP/6o7t2764EHHtCECRPk5+dne75x48ZasWKFevfura5du2rz5s167733Lrs+UZL69OmjjRs3asaMGVq0aJG8vb31ySef6M4771S7du00Y8YMzZ8/X4MGDbLrGgDUfRbD4PP/AAAAZsIOIAAAgMkQAAEAAEyGAAgAAGAyBEAAAACTIQACAACYDAEQAADAZAiAAAAAJkMABAAAMBkCIAAAgMkQAAEAAEyGAAgAAGAyBEAAAACT+X/vy2kjNTMj9AAAAABJRU5ErkJggg==", "text/html": [ "\n", "