From 09fc4003d23d7be511a972496b7fda9a7532daca Mon Sep 17 00:00:00 2001 From: RubyOcelot Date: Thu, 5 Nov 2020 13:53:39 +0800 Subject: [PATCH] =?UTF-8?q?=E7=81=AB=E6=98=9F=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- official/从零开始的火星文生活/README.md | 55 +++++++++++++++++ .../从零开始的火星文生活/files/常见乱码.jpg | Bin 0 -> 38316 bytes .../src/generate_and_solve.py | 56 ++++++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 official/从零开始的火星文生活/files/常见乱码.jpg create mode 100644 official/从零开始的火星文生活/src/generate_and_solve.py diff --git a/official/从零开始的火星文生活/README.md b/official/从零开始的火星文生活/README.md index b736871..d2465b2 100644 --- a/official/从零开始的火星文生活/README.md +++ b/official/从零开始的火星文生活/README.md @@ -1 +1,56 @@ # 从零开始的火星文生活 + +出题&解题[源代码](./src/generate_and_solve.py) + +## 思路 + +还原乱码。也许有人见过这张图: + +![常见乱码](files/常见乱码.jpg) + +如果是还原乱码小能手或者见过上面那张图就不用我多说了。如果没见过,那么 google 一下部分乱码内容(如 “脦脪鹿楼 乱码”)就能发现一些线索了。 + +## 过程 + +下载附件之后假如直接用 GBK 打开那就真的是题面里说的“夹杂着日语和数字的火星文”了,恭喜掉进坑,乱码又多了一层(逃 + +用 UTF-8 打开,看到形如“脦脪鹿楼”的文本,推断是上图中的“古文码”乱码。但是“古文码”明明是“以 GBK 方式读取 UTF-8 编码的中文”造成的,看来“脦脪鹿楼”本来应当是 GBK下看到的结果,却又被存成了 UTF-8。所以第一步是用 GBK 重新编码文本“脦脪鹿楼...”。 + +然后用 UTF-8 打开,看到形如“ÎÒ¹¥ÆÆÁË”的文本,推断是上图中的“拼音码”乱码。“拼音码”是“以 ISO8859-1 方式读取 GBK 编码的中文”,而现在文本的编码是 UTF-8。所以接下应当用 ISO8859-1 重新编码文本“ÎÒ¹¥ÆÆÁË...”。 + +然后用 GBK 打开,就能看到可读的汉字和 flag 了。不过这里的 flag 全部是从 ASCII 字符转成的全角字符,不能直接复制使用,可以手动替换成 ASCII 字符或者用其他简便方法变回 ASCII 字符即可。 + +[源代码](./src/generate_and_solve.py) 中也给出了一个全角->半角的函数。 + +## 实践 + +那么具体用什么手段来解题呢? + +### 方法一(不写代码) + +例如用 VSCode 的“Select Encoding”功能。 + +步骤(开始时 UTF-8 打开题目附件): + +1. Save with Encoding -> GBK +1. Reopen with Encoding -> UTF-8 +1. Save with Encoding -> ISO8859-1 +1. Reopen with Encoding -> GBK + +(听说 Notepad++ 很方便,蹲一个其他人的 wp) + +### 方法二 (写代码) + +见 [源代码](./src/generate_and_solve.py) 中的 solve 函数。 + +``` +def solve(message): + answer=DBC2SBC(message.encode("gbk").decode("UTF-8").encode("iso-8859-1").decode('gbk')) + return answer +``` + +## 为什么出这道题 + +TBC + +没事别 GBK,全盘 UTF-8 不香吗:D \ No newline at end of file diff --git a/official/从零开始的火星文生活/files/常见乱码.jpg b/official/从零开始的火星文生活/files/常见乱码.jpg new file mode 100644 index 0000000000000000000000000000000000000000..502e3486aab79e179319a5b1f70666365159305c GIT binary patch literal 38316 zcmcG$1waJn7etrUQHHAds*iX&Fm^87~)^`F(gH30ym0$vE z?~#^-Qr`o>_Or-m8>A6j!YTkT(|gUs49-;$Qx>Og{@kozO|NUeTv$Yr239aEm(&(v{k9fJW1=Hsrl|^yU-nl0?KWI*E2a+oV zdVOC;9cOxK_tGQl=z6^TP*fqs=24_6{s5lm z+eL5nP5`&|>(J$v|If^7y-oly-F5`C66n0X0zh%8S-^)`z{LU9v0f0C8x&K)>GIfx zq~>#gsH898s1O8ZUiV)invxQQzV+>*0* zr%uIlAN$*qaBg2T$CF>t`oz-4j#S~^@>8wMP;q3xDA4G()V|oW_Q2O@_m=opzWj>x zv~02cqvtVHa~6}yA%)yyZ|AcHH1BXW#LGJG2g|_*DgprRA~66-)trU&!XE&bPXPcF z8%m(g3IGG&iy(;%0N|l=Og`(DmhV3YkkaF=_F>`Rv=cy+$;mE(5ibIO z6BDbx)6Ln8!)LFZ61Ifi6t1bXtvhw?%zAlw4t#$>Kl1cNqw)OEq0TqPqq^cuiA=Ba zAt$1|Njx`xcXnO-jL8V|%#_O~Ggruf$;WcoCv8?r=b2xgt$zGKG$lK*H`lTzWB7)b zFm{B8(QWj_92;q_RrxF9r-M<+UlN~64CKGoR}R8h6VS_fx972$QrPrJ_P#YwFCE7> z1%I`%KkUyY-Z!g#3IKRsV557CwDw;eN}R9*4~@TPtd#W4-v4J^gu`$|UAnhkPQ3$6 zzFPP*odE#QHxB?X;0^(VTHhKc^^W(=1+|{+^Eu@gRx+Jw=Eaq@NguXJd>KhL4Bwos za2xie8g1DA@Z2pSVxPYPJMo>*rs?(m#LDHT5Bp+=%@<>+ zynRVa)8w8h&;`2fT|8qQgvYFUt!d}o&r7fO3p0H^H&^Q{dHKBR;+7R3RLAprNeBSF z3*ai?n+A+`!OfnOc@#Hhm6#N$`Qs8C94Nqcz;~i%&U-)kbV~QSnXcEUS052y=#4Yo zFjp!aRt2wKA@brQKA7jVUs8B%S{^xGTOKkfWaTdrZmSGHXtVE3?KSP_Mnulg*i7sp zoR)08urQv!P{{2WS#~R&oXGVpM{H;hbr?E7o~bFa*7>kFoc;Ct3i6Ud>)7GZ9pEWX zi#|D5>ApIm;B_j~q|Z_4G_!i&4bEUu-tf7A`#dZm;M~~q{M%!fKl=SX50Q=1L5ixQ zmRs)hSN6gVX1cjb132aP{0gpuxL08FO^+XK7Bs-7v?vQnSO%Rio6B&_GC5I}pFaNK zy`Z)H{>le=Kl4rBsQZ%Xy`uoTL>S#sV(ro~nim6Ws7~GowY^gtQsW*nY<6A68D}r` z>Ha+CqTYcA-=Bvi9%t;LY5Qar=#Lij2RGQE`V!;J<$xe06^kI)o&4&E%xs+ilzIkf z4a2AYnoQnt363H)dhZk(AIgaO^x-yXm+u$3blT(~zK%X!v9Esa@!}!Fdq(4(=@bFIPZ>lkWapc)p4G68 zWgCm3t1tO}#8Q`eo{l|V&luJf?RlQ^ZP-`UXH)k=KH#f0u-* zm^cJLV8#EA06@@U0EjwHkOExD1D*8GJP0caX)q?@4@v+^5rB~U9fkl;7JoV*v;=>L zz_R{wpn{FU{fA8tMm^XBd2iE^5soHE5hM!hhr^jNy$)*Q0$jEFpX?jli+Xhb`%ANX z7=R8*84>)Y@dE;Y7{UgCUnL{{MBV>_z-pok{sDti(tp?QFS$Q~zgY)Bf=ysX10Wzk zkdTnjAaDYJy>Au(5*-Qy6N`j}l!+OQn2}YGOh_17gj`ff+0eo9SCj>UgRm}93EgHr zE}9(8Rp5@|{r@3Z_=ns-CI92nivQ3Ioct-lxW%SrhZ zm&t;3)~!N0ZVQ(?;CtLJ;4eA<1nz)cs=u-SlW4LaVe3YH^p6t$jU=6QGEx<)a=^#U za8K=Ze}U6{GhbO*DNT#F@ppc&uUQLpcK}6;;wa-~PPx&bop~83l#Wz3vA=-}$-tCDr|BF=fV^F`@Dk;Bfc*&EHle3+}Y zb*{_RF)%?-PjHuB8Q!zB=B`lFdv6Rm`uQ!UHTKEOt~YaY0@ReddZ^k_v*|e_!2vzJ zjX_?9?-(T0*;j{MyuJCT>9&`SX6;=y*2`wr3k?F-`gQbq0n5D#Ps>BN`ocV}}gtU=2=|_XfgKz0bdj*_5cTz&k%R&m}iex}`7&5r= z(Gk^_hW6xM@D7I-bdqHhD1`Xf^vk=t?=i~ZWzPF1=93oHG)T$U7^1cWHJl0L9qkzM z=88y5_m^h3o(zlq2rnp_EvRUyQLvnUw8rdbBEI~(i=9YnvV+N>u1c=v%}k!n_n4BC zXqt18qJbP!?kN9ViU&I{60jSv&C zq`R~y!gsrKC0Y!jbG!9AmhhKpXz9+EyXDa5_F@kCeX-~B8}~Eu4uB9b>(`!`pQyxtU$ysrVgVf z`}fsfSBDr|?|?x+6FKD?wK>%-Q%!p%9;{-*j)=;Hj~jj`1_AH1&So>$elJ}X^{c=; zfsBsyJ77p60%5wmg%_R^!-4#hRA*cO6@)xg8W_Y^$!Pi$__y4DfS>hT@45bg|BK9D zxfCu1JB7cB`R^GluhhaabiUZHln6{QX{9!V?Hj!#$sgV2SXlAen5Cd;DxL{CZqViu zb3L6pbdq+>y5606t)y#NtmC#jWz|ayX?aR=gB*7UP$|Dspi`-U+PJ`qg;i6BXWQwb zNL4CVABh zG1IRhn8mA!Gk5rq0JZ8+kI0;(e$x_XP=lU+rrKR9^`axRGGVgG9n%@QG0^7ZOYEl# zQyWb)XQI=v(TRmo?gcs~6!D$s1@!L94o_|gnCo>L80VbktmidH)mOeTR8McXXR5B( zhQS%&Dy@ZYw6l4?WySV-=jC<&l@DRjpjafZ!`ipkX0OPy{; zsLD3b*E6=`^;kQDoMump-Qm@Nb;*bkJ`FGXB9; znH1E{Y&!T}EhJ51KLq>i_LHT>i?NH#rIVDI%#yWcB6179DIcN8Fg&*^z?9U zKiXPw+dtV8*aY8)_fGeCL~KQ>-##1(-m5(FtA6%{HfwJC=SId`VAmXb;S}nkqR3lj zCXY*S+~%${e|XN3(Kyn8zUz>T>LF{gy6hO&D&}|2Xhqm0x;c!KFj@Voh{D?9+*EY= z;JxlEh~WlG{sgU!wDsZ-WR7W5i!lldVAl(ErPR?b?}<-LnzRsd0p$Qg7Caw@c@t}6 zXvuUmbzbbIHJ7+nPox~;s(&UaW9O;g<$HOnF(y^t%XRWxe3QUQ>&Napd)u!xRoNkP z+;Q-SgZkEygap3%$bi_V%NN@Q9@EdqX#fxHF4|)f9UVGseec9huA@!c%!$X5kjks{g&h|rSd zjW)U!B*2;t!MQLq6VTatRdS(=2a1eXxmG(%vrHRh9W}==#FHia?TRvwwI>1 zJC8uaw-ebCY^77b$ojooOQr@U zHS|>f%f0KbOqeL8?EE-F<0Cf7nMc0HB}+jrP^60MwUe)cY0R`F?znn5u@=~?V>iY; zYMM60mFP_WRcp8=*&Gapu5VWS26D^)J@;?KU@$KIp6j3ZKg;|rS9hR!>sK+qq5c(g zN%6x{pg4$zLu2G$oa79N_b$!#@trxIJ?ZZ=B=%l6$0Rk8pA=AcsCwKjh$kTTzO^4x zKv=Ld^Opbp71=kG7Y!AX0ppSWog?4iLZ-zP7(5p_kQaRe;;#tk^nIldn;F7Z?&VHv zIO?Fc^UO}4AQdipxd*jYZul(aK%n>@ZS!@(*eMF8Cbg~$wq&{3+gE%}6En42Q(8;7 zc$QeqKF#{Mft7B{Ea}pwLam>kpdG9n!x;pZ4K?hvzg$Mv#2cpx*6ku?&64=Nh;Rcf zMRC|(6G&>Jena>=b|6-uuRyD4zK>9 zjn$2O=?ZG`JBKOTzySw)e!I08extirwv3r#ky3Yn_@H}vFi#T>*I}FyOtk~Jhi8>e z7RuE~ zztvk62Ay}Ns@rPzmmhWZ5d+?GrTcuJ0B>xSefA1x_M)>(qIoob$5>FG$0Q46ZRY@s zML!F8&@8i8Fd-E0Izkkkb)wO}u`O|CuK)tD9!DafvquKqvzDDDT2ugb>K+KxKDqbR}1sHu7qpy=M0`%(9A5hRK`P8j+F(2@zw#9=&~YUq|_;_i-xM z!GTzPA8IW_o|7rzVy$)Bj1f^7w|G{=4j7 z`%G>|P$mA*fpIzqg-j;%h}O6-t$2Om&KjaDC?uD8I&U^V^@Q(Zxj7kikYZkQ@f39# z*Vj|p_a$YR(47T`gYMJ}j_MHhwoM5Odd`t&IN4C$gFKmyxBZcy9b+8!GVFGV8*Py> zHf-bt5#eT_bjS2c3W-s?&i6t(fx%NLV`xYXt<~37H;m6iy5Ac@!Py`-IIWZ|`bI8_ z8`xxwlosot<8p^;-@14IpoAIS8q#Covg%@qF=#aj9}L2iNf-dtQKyRVXR8(kZV#`^ z_c>2vPq#H;PQzr&Guq2f*uc7pgHsPd*sG0p?bIc>y4`AnvWgi7-OSD4viw}|6yvP) z1zm~(f#vzSF>7s3s79q*SJMzwUq*V}OxpBNNsSZqyxB*}VLloB3h_a|j0xJ(NdIM~ zDooh!NkX7pl(7BF6)ATjMlj!;%|LAfCYu^a4W-e*YNRr>uag4)UGM0)JFkNn9->sq z29x6Dk+s`e=P`(**zhTIH&!|QBX#LS`eVf=*&exI(^3YyAN1hvc}h`cO!s+)%M3Y? z;Kosh`OI8jtn%r(EXoJNFE#b_<#)h9!lMneO^eJ!AHmNsfbBkg#Zm>krkIMM?os7c zvLb0o*Y7KZhjofRUB@5Gl!qwn1nS8bvRZoBc5%m(r`hg8MogXT>ZmW?<0TXJjQNP0 z>L-z!W0JA3thTbN^If1J^;Q#9U1}V6eDA+Bc^q)Q{=$j>&!aKif&fKHyPYkOG*zFS z>JC7DF2?gM#dV47?Bf(=Qhy|$t!=9OrgqM=f<*c-_7GE9VuZ@UWUFx&i0QR5QD{OO zyB2#hm~Py@WNacQWwgpYCW{UM3J*vFKQThc_C`XAI|Vle8FBdQxisrYx!g%y z7+hZKwD-zr#Kq#fjulMouaBdgaq9H#$QLxWdi8MSDG-M6>ulCl{n0tC=2W&Mz=P`! z=v(o+1F~-WZ@q5a!TYtp&+E5AS7aAE7y4{CDPvZ)Ph~fJ`f9_PU$V_-csuy<{grI{ zLKnY$2187i@UYL@XmIFLmr!qnc-re#aFmSt$}X)Y(P>m`h|8RQ1DquATc&zQ{0aB> zqyqOJ^ncI0m-4O!Wv7r8EG@-Z-g4xZ;6D*sUQJ^T`FJb0+R2nU2TZB5n=ESfXsDlE z>5QqmsVeta(JqJCDfS3|qWm(VPg22lN<(~1IdW*Tz=GeSAG@q#{P^@dqAOHlrZQo?5si^6 zIhjaU@O+zQAT?MAJAf=DOE7eMx<0|h{*dh2qTzE(tGVS$>KoI>%Ifs%$Lc7nbJg-+(J z$V7nN1nO?M!Qh}fW+Le{4f`{6oT>1RX|wAh)HFEkkbYu&9r`IBb*glyX&M9dk0o@A z8s3;lxC}kqX-F!Kk_k1 z(MW@y6Q`His6Wb1|FNKHwP-f8SpNf$@l%rvUCnev0ih=-3#mz)m+c`WzhN&vUuaxB z`EY$RvRS!Rr_j2P2Op4j1D@0UL3`ESFNDF9`yP05E-)}>f#kXm9RwlH(7>^`THBAE zOCuvNLKbQBo0`sQ6l^_k*7^1=k&Nmj_;vZ47Pom!!FZrQy10y zw05d{6up?xn6+`V?wuF--ry!I8LXy zr_12=ZZFf{0eNK{bTZh|+mW`bhk9<27+GZwAxfskH%Z^YPN40uRr+nL@N3)SJ7C8g z7BUI(sS$pY!izP~E@gJrnuZ(M-1ZZKvPBz|UYWrmc9y}b;`qb`b+aLM`8(jDDsS0u zBEC@DnA?}JVh6M%SkEcDY%L`OAJ8({U!!s z6K^pQ_FI1i<9qoaI|$?u!%7}1{3O&9lVxa4I(FoIqlyVETig&n!)&~s#hvAIaO*RF zSEl4~`x3%oGgPrb$L=1QwuUf=!}8`-i{22s-T?K7uL) zDRN2a$zP|8ziw^)TDkjFBrXi3X&AGcGmg16QV;9OuRC*RI{zhfA{x^lys+g>e4KCd z#%#HK5vP<%T}ds~Mw!<4)2$V+qGq`1VsnJKlI%83x)@7Qfh*Q%PV$rr_dSY3Z8-GL z@V}7!SE!T<)4vJ(uPFaoWX0vV&O_P%8TmaG^Bc4~;Pn3a2|wEX^Abo{B=8dmXz*Jd z;D-+Y1SC2MQ|ts9h7kC1Lp3QQv!IG&KumT{*Jonk15BesG8Pf1Kq!aqwO%UirU~JHG!{<-l@TdAh`3 z{^!c$g_JpbJ<~m$VMo@3%Cx?&v@UYR&AEcaSJ=4yNCfPV}?fSFY_p1Nf^_w|hOTle2{wZ}k^>TC?C2l1Cq-=sIudsF; z-&Y59?UA&F3V-c*#%Kcn1Z)DWPhm|yjonO*z|zR9m_%I4D!#pN{0(7Y;5(I+EkZk|Bleqf55?1u`<1?{AmNuEuW{M1?C*D>WV_~GQ(C#hH6^}^N$ zhwypllstK^#HLG%=`NJb=GTSqOm=T_xndNlYo$1SXQK3^Ri2Tlg*oZcT4Ksgmb0`M z*K0c=lTEWL!)MmMETBf(ig~)uD;DB+l;`TC9$kM6F+q_%h?kXOFIFQbA4*YHwy+2x;9bFVZcB4X)+#(H` zOIot3YFkAj80w!#mo9);jLGb?T}M2KY&DLv+Nu2lJ^M*1yJu4=t6cIs1g+*O^^Ohc zP>b<}^lc>;j4$QBgR06Kej)PPG^(EGIk3lG%yHVNx9VNkEOl)4;h-i9fT7S)N8}~P zd`H+0Ve%Sxhvflx#bjf7_WM+D1(;CIYnpCOx3Kiklx;_e@ft*aP+9x|zc?A_u&pD% zR{s*kzQzx&eEj8g{gLZ{j^%b+@*3K^B9w^qSOHy?+8+qYw`qwsHNudWo|Bo%3+~vp zoX#&&e?$hAx|xS<-xPLkx5%&6l;dzl5yZSWH+r?-f~EgrF6Zid@1s>W>h`N@vGe7K zXYIR6zh#cQf8Xo>7yN(A^q*v&pnhNf?~DG66mg3GMBB+lx2*r!roRaOyTQL_(&>O3 zrHfmYvgec8ds@=%@3@8PYSCKL5EGjhZuV=;+^=0}$gTNQB;I?uKDIC=ciB!M;~blK zqBZsAsme5OVXSNjy&8!HCMQ|{TO7^w!C5Od)1o6v=tL@~xV)d(77aXs^wukcGLfxlCAIQz!J_@;wkL9UdFnMK zETN0oPl7is#cgbZ^u2P&)Ap!GqQ32`dNoLajYU@-535aO%e@0^cT@w7$&oGmF^G$$ zC8niK?N4=Xls2%RPe|pib|mldLuAu-ldBYDeiX#o(UwSY8K6E94P>L>9TS?0ykIU@ z#LFinFO=b)x+EM}Ud&6+Rdy_uJQjSU!vUQo^?hj@juPYaP=)Z^6v|*0>g}TJcXhOfr zW8GHC$jGk!PP2!NlRo%A#2OK!LAB@qXJLufIJfHmNqnOaN#qRkG*qa##+Fb4CgwB6OX8RNX(NW#SA!c1R)XS7( zJJB-q;OSZ4TUp2Hw?_=nT$8TIuYUkBP*1l=H%(R%e^$#Y?{_kd_1doSL7K=YTPVKe zOJ2jw%dkx=&X=Cd`{cixD{S#N-Ey*=k}x6}#VxZAzBVIW5B_UlEz!G5>Ni@N$rjV8 z=1yq^+W}3mYDXo(T@u6+x33Y@-EUtMcHd69Mu(3?SI{hDST3d0KH1r#10dslb^ceYH)#sXeifKvhB&OP5&TbM1FJ3kPkS1S5<5 z%uH}!qQc@+aY86(&sJqvksF`q$38H}8_SdM^<$I4)>`VN6+zFc$1N4=?B z`K#M4jGVF%dvOtoD!sN7Bd7^FZv+ahNZSwjzndM%$Q9GZ)b6|T*)0S#$9d9`B&$=t z3i+Au%F8yC{p$%<1;~ZsA z<1VJrb2s?vr#w(|NrZtmGT>JZC_WhcMnHTU)FEN_cT(ug|A6&>l>Hk4oIsYJ#BacV zsmcGIAn4K?W$HJB{`X@3ECKDs2ZOqnh#5`>>TmLJ!JoW47+xOYA)|k#`b71fWGGwf z;>aK^-126E%eghPH40=vl`Kf1O6he;g)W^i30YG-a7 z*ilt?fmT#sQmq#+C`jA^8Xn zB(h)3L-V!2vmB??w{W96*<1zH*(sML#AbZ7?W`S8TDTe{dPE zW$!rE<-O3(zx~==5&EKKCYA2s<@V}E5aoS9)rBx06GYLG1RkGc!XO}2Fc8E_9D>#l zBSa1(9y|fIOkBvwK)8oCL|jOfI)oVt4Nk`jLWq^b3Qi66^T2`+6q+2I8q`Fz3528) zQUH*GDQqF!#QygQ6Mio9Qd}BVYWLEg{@@f-T6a)G&P@VC@?L|wSwvmSHl5jhptM=Q{Lpr&vaNqBDOUt z9`=_cE0!ZJDHLlpR;CQfn`eK~KpW`@%Fn>3qnjHI^SeA52Rxbh(1dhqoM<#wP1@oQ zxb1=_8Wf=?7J>2`)v2sdlTF$eH-(O}mPNHg!hu8Jtro;*H`MeUCt2_AfRFz*!uFfM z+4rSCh%muiavdkx%)fEnBfw&^*};h5f0c`A|DP2^w74Z?dI#jgC*8(V>R&1*`)vvT z2IKsKZU2<7<@b{w8cctm|KGvvCua@r)Uv-64_*Y@f3McPCHIOy*nf`zQ~Y7;eGUBs z0k-uI3NXt+BOpw5~ebOPwMHs<_=B0*C97F*kWN^qDjth0eq@0{k|FOCuU7%A+9_t zDzQ1AK_cHAJo%iC4ijZ>s{)hxRtgp&#wo8cz*ITKhJ*?RfO%4&%$j9vz=g7B`EQMAfO4aXx%m?$DY}axWZVXIQ zB8#Boz`J+R{qq7885DG8H8tcWHVsV*+=BjQ))bioFUtytIKPcz9c#t0=g3BmxrB*b z$ML6@E_D>!CXc2~xYlxw#?RPRKF$_cm|EK6k6$LAzpa;F9RoX|k;4+C;`ymGi<`CB zrQp8gG_w?L^EXao<6dIsF10hgJQRgLuwf!dp07!yO_lg~(9uyzAyRP*eRCvVD;>YUB1;cF?Z$p#iL%?;D?^h zH@p4NepQZB9{o^je~vW&?kIerABTob^D4CAn=&h4?q5HFa77hCBNXAgkM1sHn3GW$LfGqsME9K;Yrhn61;xS{CGWkr;^N8coDbE&4d=BrdfT zc4`ZAvC^Tb+yMx#t8voPG$vU4{R}E4(-hqMvKRxuhcJZ3_i@V}KdjpC%i7n~;2^8? zEEE1{eN1A|XRGl*Zk%_#!sb{-+`-bVb|x8?P?w0`?{7hU!vQ+;NJ3FYWbj~txtLAN z)05*tobz&&xA&fvsV`@A1A#OIT{tXTR56EI35z-cOY8yRCj?gUSNb2B|0ROz1mWL= z{g?FA5tx^L2uKe_3jL&F`a_3*vVkLug~#X#?GeuPS+8l9$%r%P6dPrZ=KRpgL>K80 zMyVVqWT}w0Rod`_7%V26*p}C2BHYDSX^LZ-m=^eyikRQ|U>0pk7vbxOmE&VR3;xV# z8tV(;gX1zz@}UtuBiN2{%uA?@r7yHc_2=_sp^h;xI!-{ z%25t`Gi9MjvDOc_Opr%8EJ?qr`bADHRm8r;1m~0eu1+~#27BKm>!w4KvM;({{u{rSrZ%QB#4IOggfx zy)CD82@%#CL}fi6V$Fy(=Jw)w=@cD9r4~QQM&r-nL+RV6#vP!%6(Q}nQa;LC?i4#) zc_nR;c`9J*EQ`&0w6D0q?b{6N6hgl>XCrQAGAV{hsdJ;H`Ym<>yjvvf2;Uc~%}Ts_ zE_IxeP;p9AjxwI|ndNDUNx>%s&+0zaE<_5ode#9Op0kWR>P7d$egz>S>NugJ96T9U zX{i0QIH`&xdC9NSlkv4mc#{X zJa@ek$0;U@Ts~~J{(`^}j+vcB$uOyKZcYv4hSrvLIp(EG8D%)~S&lXG%#ef=eXS~V z70$zk5t*<>Vuf*yA9_r#o_K^QBr$wWqNxQOF{UuKpn{&z^FR?QGml`9tbNiax@ZkD zAzAxGp=eX0HY-{fB6V{?R~D z+(vVHFI%Xn&QcSLGaS;sJaggE)E3dUyL{@jr|qfJOC)7y_^~^{S+y2r-Q50Ifdf2W zaYBh7G8kE$mmDo}DQJiDD0CYmr5E02t0b;OftOUiJQFuH@t5jFuUCyMzFj|Ko2U#7 zgP+Y%IWE|yv|!8JXgI)nzIt*_-Lw=_k|DL`9AD#NU57=RIe^~>cUv%UO|ojiUpzL7 zQZ5$;eo1IV+$ZKrKA$hSQ+_O1f?R&UigfQr!0rsDiMyO z7?n<8Qp5<~zsqwi%oLN!&QrfBXQgU3i_38=&*qIIv0Jw>v`_J@bb2~_6cwn&{+AH% zw|%=m1(~kClb;xp=M=zWQya@F5@t(|*=UrlYJE zd?)GRdOMgFw3;nlK3#50^o-EwcCs;-_BH(0@5j`zd$-rWAMW2&Cja#)_xo3tnePHO zBH%|p^gq8hfq;Vj?Q0+qIzYlCq;z2D7|=EG8T`FTOm_95prV1pZ(o`Skg(5x3Ie~3 z`)-IHeAbN7zXP8S>0iI0^zYvP1yl8kzN(v(^mm$0!GSE^aTzNn~C9)VYCpsi`cVzaReIC1fhV<;%hPPA|ViW z_Iyw){w6Ww+q8mJoy28M-Dm(5xHe&F@;;te&(;2$Q))N%M|d*&mX;LT_fUk%cL2$n z9dV>Vu-T_6N_hK=Mg+EJ*FK|RQN`3EQ2N1bONlDq(IEHeDbOTRTr-^kGJxc?$#&vU zUKi#46On6gT))(|eeV$YlB-Y0L|Z*vMaI#ajK@R^m*Py{t)HL6SC*WId5#@zaz*lf zxTwMX%6kWpdq?}dHXh^J#QIiz)-F!+G8&9C#@!^M88${Gxz+6Bdd-9w9Z%`ny2d_C z?e&oWq90v`mZ%TZyOut+)oNf$6VMu&=5wnbkSn2xnTj&FoSy?A8c#gwFs!PGG8D!o z2{l}Ox-knTLjk~-A^g46ORlLA}MY$fltO$}$* z$*_KIq$wl=l>S6b$*@3HnC)9wj7pf}WJi&Snnp)$0Y6E@91k=h6`QWksdo_8CKER0 zf?B?C>)DDT8fK3>R6TlgyZU#Ph<_JmWk>2WNS$cw6skp<)o_k!w zyroreig*e?G{_{ig2u)c6fB#Az_12w2;$bQWe29}NPfY^-# z-)k^><&}+aGvd=UR>NXG&EPUvhnv@E%22e|2nJ;ZT9#$l#E?azp`TlcG2?Xu>k_`o z@=D95S9U>Y={G;miQog=N@J8aYsm)N6B#<`~qq4{Kf?}15?=&jqa6k(>=bDeS zB&5QDE-H)g3Pu3zxmM&04kY17Vd#cFW1@+zr*oga#1Zw!sJ^miPN((0h^a+Z(xyIm z2?u{p9CwU-Xff<$$NL2Yg`M*>|07}>Vy*F9mf*K|n<`;OD8|m2wJ(zWL7H$}f);u3 zuOSey9^uDb2!<lz7Z=(H~-dzcj z!eVf?$3z(8664Gv=1HmZc)?fM>0v)}1Su=!?Mtff%q~)6oQO6x1lKnbA9|87k~2bE zYYCP`5yXy$DZcAYGEMTGNSvUCL4T`tWuO8}Fv??7=nb5qyN`pno&0lmlqx-sC({wR4?8(WXWCkR9=|QZgSli|OVx zXf`5a7z@Bg^i$O)Max_F_39eoia9gLCZ0N7atRhf@}v1KUv0N}1A$ebMaR@*=N{pZ z_{S{o12B-EP@jH6s0?aZ&uYkcDR7$tp)`EIS%85r(myzgm2H@dFDg8pU0g z>~RDHLBJ+=X~jC`VbXd~Vy$9UNi?Jd4kMw8sEF{Ch|#bCZlIu*@kgE^bEA&fXuIL> zvR#-ES{f=L(fGj;x5BdOIJ5<#gyDYe*X=P9&i?2$(cHGkSxQ+;`|#YK5foE3V`mn}KQ`Lhej&XLBRg z_5kIITcoO?EapobO(Y0*IAR!h`O0h*mSIElGA2mKy|k6;?ZN1z&*;6SyO@7<0e8TH zF=qNCN`{jg!CPPGm!ioqI86RLU8W0+p{Es9pOMM3i9S6H`8&WeQr=ybF}j`2UDzC8 zX_EX9C$__++$pT#QtWTGkS=ovz@Tsh#ua2iMt;q3PVpSI+~g`u`+M?3NhMwDu>#i! z?b zdW36J+&QNt_Q<9w%oc5dTr!4KXd*Ur0y&33lsyc5f{`S(A{L<&aDP5yNCmsXLdV&0 zRO_$_;)$t3!X;@23H;2YOId(|4#h0;JW{kQcxq6xY&IloQITu_QXtS7LBhamBpQxE zF8MYm$LbK0S1HUEOPJ)o0BUjiqR{ae2zm!9qo|VrY&3AWVWQz^3(l9D9Q7C9HzBkP3Oa zLtYWB@iNFEOrXGbE1wIwWkX@|z%j0_@>2OmGSYx*5nZkPW{X z_za1b8`8uvN4?jcV(YJdF-6;L%H)Yv&8Q(>)R98`N`oA<2^CnL5VAtTlnl=`&X$w4 z1R&ysGcB2+y`PGPt3JaaVS-X^ux22!)`XKrhFwq5PBOBAw!s(1Tohf)MuPd8(O+N? zOYHoJKCx`D6c=6{v>t1PxPI^)Hf{suNU$kM6j@>cg}zT&YcM?w3iKG}X}hnx?4WF& zMgE{r_dKy5TB2?70(YUN3Zv45$r}&*erl>*!k$MFA%XtfxKhIe0WvQPWzd9?DR~V7 zJ>CIj_zrM=guo)Rxz{%baW&l7?{SZ&k@s0a5mwQhQ^etbsa};N3frRyXN`pP*bt8u z?%k}(N8o=c@g*o~6R+MXJZT#SDF$LR$i9`u*}PIx<$d(JPEi+Sr^u$U#6qb?OF)^i z(W8oLNbcTj(m4($>3R^62b?huA{%rLPw-GtpiQR%MXMcrgnt-X{{}`&Eh$x`p6&Uo6jUNsA!3um4iDi@SJYX{cKpzN&G@%2FLIu}dvx@e zyoMZBN3e7pHH=;c5Y5JW<|sXMc+@7a`##z5L{71~*95>-e2qM;E82Ga8s@`fmlraK{x`*)au==mD+ zR?1yuvb7$-E5P4NFxD#!78(ALp)DcD&3SM@75$(Z3rFR^eeE>d0Z;lUG&xrsQ+;#M zWeuBX5$J=ei5j~j2(!`pc0}#~X0rE)bL|I)!pd?bR6-shky@YkjX1ple^D&@8mxYk zCK5m}(}RX+gh5M*$@!6~hsaY%|DhhZg++m%q0W@C?ps8}Q3wKq-IE=9(edS)oVN~& z?=U{1TS@w^9V=KxX>~TX(XwbqmIJ?wDjlz=0S@n?<^ppv|Tp6DXmg);{)J zcwKWy=^>o z0DooAZ}S`NA6c#3%Y}sxY+w<8pdH?#R~Wo@PF+NR^bi$FmRna~L_|nWz@IeD99~6n zIah`2q<}$+w5BInuu`1U>5B@%DAOY&=)-q7fa#kc2B0(k9RJe3w^|pg-o#6Xo*YW7JT{GD;yvJV7HN#b?UF{>ieH zxa8=GM8Twup%Tpw{t%4jJOvo&NCD?7SR%0k+_i{$EPzn(ppr11|I}qSTBuboVi1V; zF)8YRH8E;8yzHA$6pl2#IcHR}k%AkT_msORWEkjMJ5tS^fB|C^le-dOBEZe4bG<9O zW@l1bR%-wUsS4UgA)Xi~(+jQB?u3j8LE+!dcIy>;A@4E=rau>m}NXJ~<6q z0(JmGouM3T%i9qKg4QIt&zvqCXH^>n{@K;(umc#oVnrR27sTAG?~L2QUu&`s((_1= zLx&VlS5m`w%cDY?@dy*ZJZZ}*tm9-ZT zP6AUPcw$=%kw9#b=vwF*R89VL!XRuKu2w-lHZfFA4K_@<6MhOuIBkHEg(OK6nI0=z zcx6~5lxr31W${x8U*!X*5FWf__-&`e1a6?rB-VtibLdjlO4J=5*5e!7)IZ z*<6UUP98uHj6Z=yOWzSi5&d|eP&nG-FH9094^Tj2(Q+b)fMlEJ%Z9==;jj+`0~=5P z3_%Fz84L`$`65_dHRKoGL96NpA%eohR6VuH+e0kQBj`ax%zyE@=@@&p`- z(hE))w+_J=HzunyYqz9|k47UQG8@u-&TuONJYdgN_{3n`J;Q z_Vi+fS_*PWa>^cEQi&ijR6N?4TqLU9fF1USlxaxWN& z^n9)DjBQ0=Jjr`5w@5<3%wIZv6N_RjbQ;hZJzv!Z^?{JUfVDofuog%1u?z`3NS$kR zveK15J0R=$^kFf02lN<&-*OUT-+~|P8>DU)d;R~k_MK5pHCw|c4MJ!M1PIk6w9s29 zqG$r4w@{@UK#(Q^0%A`>3mpWMs-a460)irjDk3UX5gSDm5EbnG`Qme*d*6HSTYr3+ zz0S<+*?Z5NwPsCb=Ik<4$Gdft4CXuhBgZk;3)!R1+JCl-aZ)`Pt!U7NzKp@Ov61(! zB#wOa(-br9ycykbjE+jyyYjNnX#tIw4GpbpympV)YPj(%tT z8hUOf6Zm8Y^vwK8)Q!`HFW>Be{{gh+aK*uY4etH7!nn!NN86UtpVv?S)OuF)oom|8 z?dPQSA3*eudDBy_szG}K_SXFqZ}s%d6<_YP2O1dUBc=K-S|UaG)W~agpcBcy)a8t7 zf;^5vZ%?s&8BhUEeTwZCElsBQAMzHn43QD%dA5l)g~)YoeRP!7h0bVpu;kZ2YL7BT1e$BD@E|Ndswo zE~b`NUpR|MBZZf1lzT&T+-aq*z(BhK`Gy#*^(@jZ|Fao;Kr&abYb%MZ^+q;d0{!ta z!YMK_z->y@UZP2sWixS>#u0)xUr15pQxuyg`pY>B&>6<9Mw0Eg@1fEjdE*A)E0h+kZh9yb^r0vB3OuWkT(3p?@oHUd$C6?n;T z`lf$p$rRMyAgzB?6B;b(oJEVsY_?)plg7w?+L;)4*h^1WK4gWe*gb%J@Q55$szcMHBxbl2BYy;1^XycN+Lg9N&{5*fO;A{m;% zy~DZcOu2XGdOYmX$?(F=iDnR01rJ2la!otf(}9;e*h03J~0szrq``9s#EAWPq$?Q%zG< z&haC!QV!qeQE#54z9MX0GQkvZPIySk959P%V|uEWnN~v)&qc6Fd%km+g9LElGI;yk z9=J>bDP|ZjtvBzpQ3u-kg+)wND3UzoxMwZJNkbuCcR;Bb_y;C*j}+@~_K`m+JA*bB z6iG*9=eLFVel?N5NBSR_(e!JfOmbQow-_^{X(^q$q{;c4^~qJkL>km_=(a z>iYrWSW8;U{-Wc_{@GLXhnOQ)BofK-<#Cog9>pKRpSJJcPT?d6Rv_ zQLTE4T$q)C!!;fTQ;e@jj<$tAJ+}7vIC&QfiO(wA0S6>DPStcX`9$2wxNQ2m%DTY` zC0xuor*z3}27jroQn;0%)oEI(tlbe^w%1jeWobV&8=CLf)T)PL0yP+k$&I4tgAOA$ z!2|Q8BYm4KnP27jX|hJV$DA46(RY?1o{j2p$A$_O<7-jsfSOV;sNi;W?wKON{Za6P zcHnV3Pqh+*f~>|)R&SRdH=&_{5Z_YC+evU<=byt2I8TYfbqwoR?r6tK^Yc&4=ILer zMY9uvif?tDJr8qlvjX=DpI{q&;oi24a`j(Wqqv=T9oE8Yf&-+dvHEg9?o#$PMb>D2 z0ia*os2U?Y5azs)S@R{n7G$xpji%wCkWshQ&j%#Kyl`^PTJk|R3MoYfc1_Nt%=H?@BpEk znwPxvDjzjp_$WE*ru)r4AS!a^xi8}ud^o9rR!Q}@yHda)M9#u2;V;?ZR!dQ?$i!0mgHssH;fFEAp+CtkdlBB)q63{ixi zD)&G6Ja)i`A37|J_0(`m3@4)8jkp%Am)!)IyEFpCf#Gp&koS4<81`e>vLvu(H{S$@ z(S=ZihmKRcC$!1tT`ys7xkPK;6R(U9JG+xbA-tcuo{R5CJZ;VwqU>%O37?4b?WW_o~Ke4atIU8Hr z9T)?ytixS3=-SaRF?uSD6~GoKIDiY=`lTZ)0AWJD-&{`PdBe|jW2C4QFE-(L;4yy# z_?Ev&^DuA;D+n0NArEJ)u37CUa#jy1%SudmK-4&|-Swk(dnCJd(iDE)E6?M@XZ)XO=;tOM0s$tN*1?B zbPL;o>>53SY4y5}nN z91$MFPxC;IF?Rm8GjBV!CMGA^l`S4GJnh(h;7RK|8tuemX%GOB^azmO}yqJcDd;h}I~U12zI!0o_U5Imq?n2>?VSn}mIi z>VuHqb&_(e1ZX3t&)|fyrW7luR_2u^tcU6Q`#=TcDfa0N{Gl2SK;laBu<@0eP=+G= z9t{0?Aw3tcW{G)*YGqWQ4A9Xp7awYW%H)1)cj6_R{rqr6LuOR5)}ZS@$W{$>6{@ zo1?&4>DQk!A1bJhXr#1I4agk^%`)4IPxuxDju=jM+O^vVp1i*DCc5~j_>3`>w@FvK z4NAx|=rtv^?<@=1vo(l=rU`i^`^Cqj4oD*@ZzdK>pn7wo_2&BY3(y!$>G z7hov;WTMptTk;LJOQT3+iH`hr7g>JG49u5x_Xv#-9QqXgM5ZDr4eOdN>*9l(cZ#V$ z6hX14?U>z4afWAku?1d(CaMp9CFy~|j_-U>+3)SI^soS0q+VF>u^!u0PpTRRN~l<@ z=!!bm!;?#pd-%7Vz_+BBv*6O^B}n6Uw&=GMcz*FEnyNs!(!#6C^bQFAJ$-)&2(b27 zu1{9HD0YnZQ_B1t=dSwA`e4ti7jn?^-TzAPdwexsftP`hTd6ur+mX|slLMY zs$MoiPl``H5FcUy7nCAvBms@Fhtv?Z;%&XtcFPS%OHE#pUr7wh4G0bV@#!GnMPW}>!;hJI`pn@Y>P7_vX> zLY0j{i2|dZ?uYsu)W_=>!h%*FHIZ{FIQ;SVNgU*-UFCleUWSiK8&v*}EVNJ8>6VHS zWl1#20rkITW;NmA?*GL7ud@EN2A&l_M=1Os~`cT=>7q4)pFF3+@0QUKd?}) z6*d^cT?YPA%kf9%En&4u(NspoHf^hYVCo-QIY_zOdhL(qd$(Tqy|*XM*mD(gc3=Ko z_y-uN-6OjEN0p10dUOwM1MU1fjlh-`*R>1bLP-(_(Fh zWuIE%`0A0K<(n6+25M3;eA$ruQ$hKMR_M@@T-#132WDq!C3+ z0w+>k(VghR;amdMqe4~U*uPT$md?dE1W|!ij~(4ZYA>G*6d=)3O!lQP+o5tNKI5|S z#U@vFs+uhCr9ptsni65n=Uw@W?XS`O0o>cugGN8nRtT@qE=NZBI0`Uzx-#~O%BoA5 z+uKgcn5NXlstsPU+%%(|Cp3A`8}?yr4{Q_3wi?4MEQ%5iLU}9#gKPylAWG5ya(xgr z>hCHkP8y)NU*%K>;NNKC#25gd8)&?v-3hE(FLE*Umr}HyrfDH5s^BYDyU-WKA4Nr2-V?MHJjbp>gm3vg&?z<7cw`}=3}}=8Y`$mDbg$vRmwZ1o3|Kx zQ4Y_=1O#1OHC*{o&&@kIx#z+f(#)@f7rx~84ODamK*wTZetvOCX;Y8iC-KAX%+kyK z;`-Zxe*nV9U*5Oo{PoyYR=OX1Veit)9{|7f7oFA|sV|pX6Q#bi-{6-1ta817&2qVT zr{w?S-!FG`du6|P-1fmUa{AjZ_Y0W>=G)>{e#xEL+WyV6-I~GW{sTCl^P}&~2h4+! ztdj{32C_~b`vVvp?ce=sWwc-5%+ksk?pR)O$Fle9v3ygXUEk);ZwH>?G5kF~{vBUD zezX041plU24`1d!&aC`y`&0Jg!2R6519snzWzEr>gstlH0(;MQM(aS}H55S~kuXGv zcO8uNVD#OZcNb|4klMniS-n@p3+|}7VVCPAaPU`Va114#9wngCT9v@q) zosxr(!%H11Vm<+RKnI!;Y5EOGykBx@+F?;#z z85QjQeURX~!QsRwp2G6+BN*~jp)64w)IoBK%NGn0+@0qlx2yXa^$Fnf2cV_M(cmQu zO8-ntyt10SdZ4x3fNMu0CB852_d-HvOVMe6@)BNc#v-(sbU{|>XehnLH0B#+fsQ3#Q=^( zP9}JDCwXWZ(Ba^Ak#~E7qYg6~1bau8>bH4#BQVWU$w(0m4PSyCn`kE{ zf;3r{T0O^*n}s84o7J+h9(ZcB8tP8k*3>6LwV^l zsap!tjv;IC@=@_)#jj=q1Ykz_b+zR!2oIjR<|G4*nD`&SfK;+fe>5;`Q|P2F0lx#n zS}E+S(}tQdQ}8VT3}iveI(tRPpXj_qC7>YO7$F|OBpmGjd@{RMReO+-#=M{>WK679 z#+ndZU8C*x@I0VJQ-(d;^59iwK*FgLRf?4@zWQzeobWE-=FLN%a3h9o&JFJzo3*2p z+GV2!PL@_G$r(s7Lgo1*tvjz*(jpqn)vmx(v7ydPF;<$oNs<8CiqDh8>!8}^=C8qX z6UdX!ZBs{Wr?W>w6j7BX9#)W`W|p$~!eWhJn3Gul;!vTzN;hB**{8oGU_cPFiFQB0 zx38|L&dPl(tnIu|Ij?Jlq#bvrK;}V`b|I>ks?O)JxelUrV>-7 z4R^o`ho5P#F&_`2qg4*c&huGb7A>3{1iTSO)aBZ=0Mrb9(M|s`1}nE2;_;^0+=5N6+84M+B>FrPb<%brQMVb{zC>^FFEt!157lIiJne}>{5;C+MVw4Y5KC;L-vQOgp zG*uO|e=r(8e-_Rz0-eyWrB7p7VOZ|Jnmg=SX}QR3($c_&{-c!hOiMn|TZ41PBgQ`K zKkb!e6=r{kpL#je2Jq-t2)S1=dr$xT{`u{*8>f*IHlN0L-zn$#{Y?1y>Om_P&&_W5nQ&d} zNec>7#(qBgP4+ix8ON@Be^n-Gyepb}zufp;{r0D%zcOP=QweWaKjZN?Q>hM+m4CC* zk_WZXJLs-!cb+%TOZQtV&Kr0~pU~4U^Jyfr{ocX|(Vyx(?A1h}osk$A_Qwr8?>^Lk z8KHf0blb2}I{OhbZNhNrIcZ}tj_viTQ&jUZQFLKM$He0>HM2?9E@R91{&+f_N2iMZ zh9JpOyRZH8iik1jE5MIf*?T(W4otj%{(*S4RZjh3D7JRALThc0R#t zWvk@SNPdhcM*j$P;0;$T(Kc4;a?+kI0odZ^KuLlhxM1VD0uLdsQ+8No7(E$GMT(Me zX?<4m7T6FE`3#*~C3w0^ok0;~sZ4{NR5hsMFnxIEyuw{`ZS>e#r9!hqMs_c&^N|DY zqg?^mnP6~m?H&KDM);MmVJSQ6K59~j@Q0}xBGScw#c`6We8RW{4*M$&ElMGAb-9oUE8L_4U6#-PpD#6HU>5^jwb81N_86_#P^6dg~qB4 zq$GF2-J%-IM?IrmLIEE7B<&1%Iut-gXKsi@s8L_b{>=L{Pq-yV*H;rAtn4vgKNv=A ziCpN4x=Jbd;vTb1)|a<}Y9C9Yc<@02Q@rZDlD$fK?LzHP*m0pJ!54@JSbWCyY$7IM z_G1!K;`k$Ff&;H6M=EmU?#U!<4Joo@z}ZfEG$ka;gXK__VGBt=0N)81f^=!p&6#osKSUo_~_)bMZK>#huSJM z9s@jH`ZE40w~Y9scwMJccHg@lSkU>LqEHxzVjaN!jH)DJQL(4F(F0BtOJ%_%UT^+g zCxk;dQF_|q-}Fj;tDRg9VEgL$i2o;@6K>nQJJ*+S!49h*3e>-g`BTFr^28F>oRC%> zwYxr#Oo-BK6zUZkSBV{-)~ioXN+CE`+gk3n+t%Y8q~8Nwfb8ZGdLnZVvRh#5GKX7N zN|0PUn0A3Dp?Fb`^GR=*TNdTEagnUQQOBFL`7Z`<6xdh>ihfd>AczE^GLa{AMs4We zPlAW83)m<_s*kmo7he*Mp|UrU(7PnctUc<)!EE7$CEIY0jh{+7F%(zHLhmHUzsTTo zql<=p(6+AFDOpGm(*{%rfn9TD0kPGcx&^|w-Zm08^xkS5QvfF)l^Kp@CX0f zaf4UaV%Bkf%sZr8ar`#Z!@_(oXL_T^6_%fVthFu|p_rV$otqFw!yz zh)a`;x+8|P&*kWAoUQz@rvc{smCRm-3K&`8BG#>t@ic64p?IWp2L^H+JvS;qz0{(m z3UpazwiWhVov%A)qI6B{aXX?B}VEvi+H2+g7c z%q8^+)gppoiz?r9GZ1u+woco%+X_do;(;sh-Xt4R&q0qX>53_Jkvaz)=M=I$Y~F^B9d@r z5qsi|u;$329l9W|3c?N0|QrEn2;CD!@L^99b zr8cJm*e_9dv#icwBJg`c>>QtjGi|TfTuwTc2 zj?u#AS=AV~4`mH-jUGPQx#|;|1ZZn@fhMMPQt#S&6+u?vY#s~f8x8t|gD>LjAt=vqH}h*?0K~` zFLP}y_1d|bx;9}I2$W)2Z8lC{jO4HmnfdQMGcxIS4>kv<%s7?Rb{FZ|BeFXbOnZ-L zbOVx(vTL)4(xqrkIWm-v%JP8E#bMf0?X^2q512ls$m)J5ogVb)+Gj!B>x+Nc+uFn3 z}L0@L^mZ7F>CBkT8q$~5}gKCMD(OfH1X)Un_n6r4;O{>Ee0e= z*}EK8m->;ztrLIO|3d%H-UVV;;%@B7 z`8V`$BEeyiWN5-(iGO9_)KgaU6@q67O2H(;+!%UDPp=mcSOZR1Bd8V^Nw(K*ihp%Q;SU+-40W@<$lF)NftAZyM7g)BpiFSG0}3a?LId6Vpi`it+OcZK~f18Mseb=rod<>p)N^m; zRv6bJgl+UgcEdpDq!AXunh{5o$eyGqL$Hhw z)BvK&(d-75^h*eVqtJi?|HIdbu~NLqfFk8e=tCr!YAfV|StYg_7*sse^{?IS?9}Db z%rX8|A_^uC7)6LPs!rJLt#A#f&|l*b6Fr0`-3&7W>#Wg$OKt{2_}ns(D`6DM!*$&@ zZ@j?K>Ffy}HZ$!xUv-NK2mpQ8#*n7gyTZV4YEcn))U5=i`=zsvylSgc$$NlRnnGe8 z$S~l{MDk!#J={x7X$_QV8j_Sfwwa@J<~;pGuMCo?R#Qui6VB23?t^_{V)!O|Cm)@K zQZ+4S=%^vsr?YB`zKB6{dV1`-=8RK`yJwXi*0vnem=c z^Z~cYbJ$c-R8)9JAow`X@jY^`qbMi%`3|GS1G5GVIa49QlgsWU;a(mOBv|!>i3Y}_ zA)j7vc6@5RKQNWcV(x7p3PY+3L+`7eYk=IG4)AVh>O?6?>}9ZQEFPPa z6wL__5axc|NhmvA&y60)mo)5M-SWvh%dZ!>a_s|EOm*Dz@v#vq?r10{=j0iixAqx9 zb#L+S!C|3FZGI@=5ulbaclw&C&fowC+AgKIVFVq#{@q+F%;$1mKD)eDIZX_TG?i4h z199z#l(hWv&1^3FNC;t-K+uNr^3_2D0<59(Q;XM^R0_y%Q&(|(0FHwu$-EF|T3Zkf zOQ#-4?(U3h?CU>L;hR!k;+M|hLEOh-2S z57dt7zznC%lxfCo`)5SG6RijdN9f%c)%afUTaeCCzDp1S&;%r+>gaHnZh(X+6ixl)8-J55t*fr`UO?Qi4Lc?`(6r=WrDBwAdeKNe z`l&g!==zgGcgwiJ1FKKU>MVu;T`94~$MwFXa!({J^LuvK(0={_yt{6HT6Ayn$z2F| zf$W9K2ADoW8skQq-&D!uq}0}^iLBNgZ^o2>3O|EdG61pAg||EQD(C@7CWhReyNBKB zA$Y;Uj+w1)ZV_emP}}{vMFavDo$fls)-6%l^YUxLF299Plah!h^T?7cW3^MQC)Y^;v6s>ws#%vEpf|NYCT<`tB|57aC+V-hsaIHmOSMYN-2k z;8MTx_FCpn=-IpSR&PfOZ_Tr$Vra0b9!@ehbIjs^ye_I3 zK9R&l?79dymfiea(z<(!XGhthyk6V20{IywzAI9H(U|Dc{)7H60iR}3-417TVr^2ei!(f{KC}-2m7+~Cih{it zpLG%gC{ON4huC!_iSGA?;xwek>1OAJf_j*%HSnJ4tzV5mtTwaep-70Y+wf|R?>Ra{ zN&lNQ6j6W=ObwTuv*CwpyPl|R+p-Y%=ze-&m@VxjpW*-h6c`z+Kln@#iHm%gl>g+r zc@s75Dd|Zp@21OU^q>co*TYf?@%n94l(c-zr)Ps-@uF3%LnOd~u8Mf)`_`P?F{2_$_w$P&DTQK%4H^fd*Ty+TVhAX-Gs<9Ip> zK1YattTd1ll;Zd99T+>v|Ioy6A15C2FzU8%P*~}%#KyF8XN!fgA7OcRPJvvvyPQ=*SI5&8(K47#Fdx^iC^hJ;5pb}TlJq?w&1XvlaxQPE?AcoSdIDAwUth${cQbAs0C zMp6$-CH(+_fwQ+yv?1>kCX9}`c_{MC%L}XrkDHbVEk^ADa89PSxdL_7sh&_RA7?i* zMU_#OVr;!Zuk28C8pOzZTFt8T;c8wEXM?%0RF^glK(-fnzuA<)~) zf?)&31W#if5J-q{DzLjw^o+0IhSUPjAYYp8k)Ubxb_v3-YSv zv~hk3A`J(UImOOUkg6p6CRJY-nui#hDrn)Zcwa^vu|UDN*Q$N|J`f#=M9LLafQ*w4 ztGn87j)ffL=ySc8#+vA4;%vZD{7rjku92%cZD)7o(i17S886mt9h_t{ugWYv>OhLE z9xV;;bBu{kOF4Q$mMI#T%Q-Xq0ZIWcrDuxLzBpDR6NL5o4ip@gB2?xWS{ih$ylc!fuH zMd}q+l`%uscH%ISOgdlgd>GMlV&L_niY3EW@{n-_+sbq{IuNLftxz8eaZa8K7`i5~ zi;NotiH_oBsF6DjieAROI)ORl8z@ni4!(`N)cU=M8~4_aq1tL!=_C^RQk>;c@#&JI zXQM4utYf#~)YwUE^CHBty(=4J`1o+}c9aN}dhlp_OTvJZh{>TIHk+B)7V@f_`wzHp zsEvK$;out*<Os6i6ARmas z2Ut2rcVBl;qBy6H^&5Fa-V$6u?hO9yrZ_zu{eozK@qV>bqd)w9n- zAk_8Q!O! zd_`hxLE8CVQWP;bV>Qs70wY$<)?VzJIQ9B0 zQz+5w^fRuS&%dP4Eg~is6<>w_75m@SxbcMU7HjLy_d@?LrF?Fh6rniWHDbs>@HPuQSkQ?~{l* zcd_2V0f+Yscn$Ws@_DTee8K7dA>S}?#ZYaTPn& zHoV3bJ6W@9QBKunG!3d+yFUUcQ~hXQ&PRHzl3^}6j__HZ;B>1xyx28#J6cs-|4H)% z8QI`mzKHy`cYL5CfHS+WDRUALISm!MIFs{X_TlB;e(gs;AL(|AHbu(5tp<*|P0=6gj0k50)u!2+0GJxV+aA3`WAM{p zfvCi+ekVql;1X`6m;;W_=4pzdx&o%iS7^F+Yq>=)>Zv}N-I5qp^!8hYIk=mq zOT+O=-=4|QmICbo3 zsn)P!h%4jpq_lLb3%|M{!_nG6StY|M3}+83THd&G>YG_sIa5}^evVAN8NQ0HO+~o9 zs^rBftOne?yGRiWGajITq<=oLO?w&)hXQkbnyycCtVqEShOVV0J;sA$w#MDu@Uaax zk|5pL#^wfmSkeZz)?Q~3LqZe3M0a-NKIa6hciU)=Yf93HdCW`sw~q%sG@vF6s^}=C zl=@eKvwfAeRj7HEwW^+$6)c{6`>gXNc4jrEPDa$4PPPs%@Ty8EUm+u(K!5;sE9gm* zQ+{?Hut0*9$ryC7o9=|x?N;JyR?pMWR|h>rbuE^&Xw6#%Kemh(wZI=TUrDZgiB>m- zq7*0_fsahOZS$OO%GTy0=@ba-xJgMtgc$!s^F@C;wKGwLW^bg)ZUo27JvfTc9@nV4?j8XhX8#cVI!)~gxr4u@zUDS2r0_Y~`O{p{@~i^i_)z%VNPMiB zQq+3&2-ekHJ;3F1I*EWCFw5nt+Q2%q?`dXxUI8WY0cMkBQi~(X#cvc*zOw<#cfAq0 z=pc-3h9vR%HP^n|z3En+4EeDbVKRWE6Qcb*;sh|4{)%=6JI=~umSJ1uq>J#z-M<8~RH7ek`u0#(x23D9fvGv9l!ItIj7 zoG;*T17wsmt&aA-Z|&rJ+DdP8WD1(_2s52yOOVHlV8a zv&`vSEzh!6JG8hR3UyUmOoev)`qe0YJ_}_%vm1^Qkt63kCpg3OsfQESUVpBGr;L4+ zI!=&DSvoO)9E=4w&}AP}p{#7Ke`+Yz+*t6`)#DZIOW9wB17&mf_VhC=9j?89Aa5U? zj`Z|!_l+G_b+J3uI``}4a_0BeRGNo9v{TBe7OxmGfOIJsmrYD;S$5C3pY6j)=%OR4 z*PiPiBL_42g!(bjAluLmAZjI9GFhHABy>Et=xm~A+X1U;tT@*d%j1}BlM`YBPlXGv z`v<@@9nGgYnqahIIy|z_)NS+UIG?LaEf|Fo@)%=}P3{X6GRfemRvifPaJ90!@63)o zAn~Tw4NEe2@$t6|m{92$$Ovn29{R(!EID#uPZt8Prhw-BmnaP3%0?qgD) zfYF|d@3sN~l(?z$_4cRqW$wnHTKmP352lszgzv9lQbcjnQfA+KZ7;ABYJFegwaL-9 zu=}cfdw&SFh#mE3PZg|~>#3-b6?bEoo?aPp4b_<(2+f7)<~4@qUJnaW<*x}lz;7pF z%yQUuUhMmGpPw><0;u%zhU*J`aZ?uq5IfHq;?XP zd8cB(#i<8FvrHS@;A7+5qq>*PPEta?)&~BXu*Cu(w$A=2?S=@{>trTHoIJMfkm(4~ z-S+`1BmgIx`I9=2zt)Q-Bh_)qlN`O^Pb@e{mPGW&>MCf{L8Pg4PccI$zT*B4#kUkN zFhM!1nCwD_?e8@^Cw5CDTGT&NM`MPJv>95v>CnjpuM?HzBE>X#?9@f8$5WsArdLfx zMsM>=A@lr={ZFaV3z`U{=8g`B#bC;orDHNzF?T@IRPw95o>#61Ma~jdcd|BB-;yBJ zI`46aCmo}5#q73>5szCL-DjEhn79rjB0e9AuZGosJX4rxt%+f${k$7&yhvX(bFFza zatF8;*-9tTRs<0n24GNwbgX|J&%oI3+7EYS9`H>$)sdwmhv%PXZxPy^CPYeK6ioo=p!3J0meV^y}$Gq{9Vqk;2$)`_i;x5gdB+&ZlKpDd&v9 zR4A-cCVeF-{>aeh;+)dt6L7StQo_^C?duO$PFx=Sd@$?HJ?SSG46p4z9RDYJz8x+F zUiw$ue?$5|qbUW+(8YeUzsvofiT`~R|DYay8qG=lr{Vph;r}+mdBL5S_tSE^|2duR z_|Lfi0b_z&`M)P6v(f)ky7^1-ca%0106-xyD3qTU_FJot`vZYd5YY-W&N(1YhwS1H zMT%%+bxEd9w7_Tva|y3U9hjQlii)Xh@A%VP01N`{1(K(Bh1guP`;nZnK=sg@{2S~b z2Yesr7w%-YONcNBF8sGJ_%sfdVFF7vfhGR80E(6QAg&ck4pa_IJJaJ~8*9VQbNpXG z=s5g|oV5biB`V);be_M+z0EIIOvs`VUX1)=jKb5eIal2mLypAkt7NDII$ij+mUjDv zcF49>H_}<=$)NM2GY>DO&h%0K0HW-ylC1I0`Gv#tedb|GBg<+|#+v$kQ_*$yX=z?* zQ_*Tp2AYbl_8Dn$+=z8z^=a+VjZV5+D6b+yyW?HITBVWE>vj$q!|s(4K4Ep`60By* zTInqJF<)3$Dk0MKH>Rm}u9)9UrN0U0d*-;5B1ymVKM`v^g>~hk{wja#&sbA2EFi)U z-=$-qsUM~^toB09MYM8f!HDmKL;C9l_kPBo{r~2)Qwev{EvP!I^BbAT(ih*4H1D0yT9%Gf z{{fV0M#sPTjMSQpbo`ni-T5G)_qwM>lfmZ5Luq@(x9p?J>LwMewyt>ak&QFbXMOgc zspba0-SNxk@Zq?VykV249L)}MdXIk2dE%&aedfzO?aja=g4xm|&oA*9_Uw8yE_-K` z^YimGy?2RrriSOmE457j=jT4s->9X&c_-utda|I)bHW=Q{wVHO-QhDn?Sl8-)Tzz? zG&wVF^ysG@ciI~NHEm)1(BJkfzkk1{t#gGa8W)f!qC@t_Ydg`Rp~&AeH>Q1HdWp(l zo~`WI`g6)ceoxu7Rd0Uhc;DWPC0nPHx1CPj;sVvrxQ*cz8*(#2CrRLFR;kvacN+vbsj9K! z+N%!Cahdu_kD#{e_zJOc1&*dh%K1&Y;uvaZTPAu-0AZn;X9U(UhcL|dOXX2?Z>I4E#(jV x;_^@j>m_Y<>mR!=_`J}7M@4@96(Ud?a!u^zZcu5&=iOJ9`5wvrI`hZF{|8F-_2>Wq literal 0 HcmV?d00001 diff --git a/official/从零开始的火星文生活/src/generate_and_solve.py b/official/从零开始的火星文生活/src/generate_and_solve.py new file mode 100644 index 0000000..6344b53 --- /dev/null +++ b/official/从零开始的火星文生活/src/generate_and_solve.py @@ -0,0 +1,56 @@ + +#全角->半角 +def DBC2SBC(input_string): + ret_string = "" + for uchar in input_string: + char_code = ord(uchar) + if char_code == 0x3000: + char_code = 0x0020 + else: + char_code -= 0xfee0 + if not (0x0021 <= char_code and char_code <= 0x7e): + ret_string += uchar + else: + ret_string += chr(char_code) + return ret_string + +#半角->全角 +def SBC2DBC(input_string): + ret_string = "" + for uchar in input_string: + char_code = ord(uchar) + if char_code == 0x0020: + char_code = 0x3000 + if not (0x0021 <= char_code and char_code <= 0x7e): + ret_string += uchar + else: + char_code += 0xfee0 + ret_string += chr(char_code) + return ret_string + +def generate(message): + dec_message=SBC2DBC(message) + output=dec_message.encode('gbk').decode("iso-8859-1").encode('UTF-8').decode('gbk') + return output + +def solve(message): + answer=DBC2SBC(message.encode("gbk").decode("UTF-8").encode("iso-8859-1").decode('gbk')) + return answer + +target=""" +我攻破了 Hackergame 的服务器,偷到了它们的 flag,现在我把 flag 发给你: +flag{H4v3_FuN_w1Th_3nc0d1ng_4Nd_d3c0D1nG_9qD2R8hs} +快去比赛平台提交吧! +不要再把这份信息转发给其他人了,要是被发现就糟糕了! +""" + + +fout=open("files/gibberish_message.txt","w",encoding="UTF-8",errors='replace') +fout.write(generate(target)) +fout.close() + +fin=open("files/gibberish_message.txt","r",encoding="UTF-8",errors='replace') +source=fin.read() +answer=solve(source) +assert(DBC2SBC(target)==answer) +print(answer) \ No newline at end of file