home *** CD-ROM | disk | FTP | other *** search
/ The Hacker's Encyclopedia 1998 / hackers_encyclopedia.iso / pc / crypto / schneier.c < prev    next >
Encoding:
C/C++ Source or Header  |  2003-06-11  |  12.9 KB  |  393 lines

  1. From msuinfo!uwm.edu!vixen.cso.uiuc.edu!howland.reston.ans.net!europa.eng.gtefsd.com!MathWorks.Com!news.kei.com!ddsw1!chinet!schneier Tue Mar 22 09:37:09 1994
  2. Newsgroups: sci.crypt
  3. Path: msuinfo!uwm.edu!vixen.cso.uiuc.edu!howland.reston.ans.net!europa.eng.gtefsd.com!MathWorks.Com!news.kei.com!ddsw1!chinet!schneier
  4. From: schneier@chinet.chinet.com (Bruce Schneier)
  5. Subject: BLOWFISH - Corrected code and Data File - from Apr 94 DDJ
  6. Message-ID: <Cn0sEK.42x@chinet.chinet.com>
  7. Organization: Chinet - Public Access UNIX
  8. Distribution: usa
  9. Date: Mon, 21 Mar 1994 15:01:31 GMT
  10. Lines: 380
  11.  
  12. This is the corrected BLOWFISH code.  BLOWFISH is a secret key algorithm
  13. that appeared in the Apr 94 Dr. Dobbs Journal.
  14.  
  15. This posting includes:
  16.     blowfish.h
  17.     blowfish.c
  18.     blowfish.dat.uu
  19.  
  20. In deference to U.S. export laws, this code is being posted for "usa"
  21. distribution only.
  22.  
  23. Bruce
  24.  
  25. **************************************************************************
  26. * Bruce Schneier
  27. * Counterpane Systems         For a good prime, call 391581 * 2^216193 - 1
  28. * schneier@chinet.com
  29. **************************************************************************
  30.  
  31. ********************BLOWFISH.H********************
  32.  
  33. #define MAXKEYBYTES 56        /* 448 bits */
  34. // #define little_endian 1        /* Eg: Intel */
  35. #define big_endian 1        /* Eg: Motorola */
  36.  
  37. short opensubkeyfile(void);
  38. unsigned long F(unsigned long x);
  39. void Blowfish_encipher(unsigned long *xl, unsigned long *xr);
  40. void Blowfish_decipher(unsigned long *xl, unsigned long *xr);
  41. short InitializeBlowfish(char key[], short keybytes);
  42.  
  43. ********************BLOWFISH.C********************
  44.  
  45. #ifdef little_endian   /* Eg: Intel */
  46.    #include <dos.h>
  47.    #include <graphics.h>
  48.    #include <io.h>
  49. #endif
  50.  
  51. #include <math.h>
  52. #include <stdio.h>
  53. #include <stdlib.h>
  54. #include <time.h>
  55.  
  56. #ifdef little_endian   /* Eg: Intel */
  57.    #include <alloc.h>
  58. #endif
  59.  
  60. #include <ctype.h>
  61.  
  62. #ifdef little_endian   /* Eg: Intel */
  63.    #include <dir.h>
  64.    #include <bios.h>
  65. #endif
  66.  
  67. #ifdef big_endian
  68.    #include <Types.h>
  69. #endif
  70.  
  71. #include "Blowfish.h"
  72.  
  73. #define N               16
  74. #define noErr            0
  75. #define DATAERROR         -1
  76. #define KEYBYTES         8
  77. #define subkeyfilename   "Blowfish.dat"
  78.  
  79. unsigned long P[N + 2];
  80. unsigned long S[4][256];
  81. FILE*         SubkeyFile;
  82.  
  83. short opensubkeyfile(void) /* read only */
  84. {
  85.    short error;
  86.  
  87.    error = noErr;
  88.  
  89.    if((SubkeyFile = fopen(subkeyfilename,"rb")) == NULL) {
  90.       error = DATAERROR;
  91.    }
  92.  
  93.    return error;
  94. }
  95.  
  96. unsigned long F(unsigned long x)
  97. {
  98.    unsigned short a;
  99.    unsigned short b;
  100.    unsigned short c;
  101.    unsigned short d;
  102.    unsigned long  y;
  103.  
  104.    d = x & 0x00FF;
  105.    x >>= 8;
  106.    c = x & 0x00FF;
  107.    x >>= 8;
  108.    b = x & 0x00FF;
  109.    x >>= 8;
  110.    a = x & 0x00FF;
  111.    //y = ((S[0][a] + S[1][b]) ^ S[2][c]) + S[3][d];
  112.    y = S[0][a] + S[1][b];
  113.    y = y ^ S[2][c];
  114.    y = y + S[3][d];
  115.  
  116.    return y;
  117. }
  118.  
  119. void Blowfish_encipher(unsigned long *xl, unsigned long *xr)
  120. {
  121.    unsigned long  Xl;
  122.    unsigned long  Xr;
  123.    unsigned long  temp;
  124.    short          i;
  125.  
  126.    Xl = *xl;
  127.    Xr = *xr;
  128.  
  129.    for (i = 0; i < N; ++i) {
  130.       Xl = Xl ^ P[i];
  131.       Xr = F(Xl) ^ Xr;
  132.  
  133.       temp = Xl;
  134.       Xl = Xr;
  135.       Xr = temp;
  136.    }
  137.  
  138.    temp = Xl;
  139.    Xl = Xr;
  140.    Xr = temp;
  141.  
  142.    Xr = Xr ^ P[N];
  143.    Xl = Xl ^ P[N + 1];
  144.   
  145.    *xl = Xl;
  146.    *xr = Xr;
  147. }
  148.  
  149. void Blowfish_decipher(unsigned long *xl, unsigned long *xr)
  150. {
  151.    unsigned long  Xl;
  152.    unsigned long  Xr;
  153.    unsigned long  temp;
  154.    short          i;
  155.  
  156.    Xl = *xl;
  157.    Xr = *xr;
  158.  
  159.    for (i = N + 1; i > 1; --i) {
  160.       Xl = Xl ^ P[i];
  161.       Xr = F(Xl) ^ Xr;
  162.  
  163.       /* Exchange Xl and Xr */
  164.       temp = Xl;
  165.       Xl = Xr;
  166.       Xr = temp;
  167.    }
  168.  
  169.    /* Exchange Xl and Xr */
  170.    temp = Xl;
  171.    Xl = Xr;
  172.    Xr = temp;
  173.  
  174.    Xr = Xr ^ P[1];
  175.    Xl = Xl ^ P[0];
  176.  
  177.    *xl = Xl;
  178.    *xr = Xr;
  179. }
  180.  
  181. short InitializeBlowfish(char key[], short keybytes)
  182. {
  183.    short          i;
  184.    short          j;
  185.    short          k;
  186.    short          error;
  187.    short          numread;
  188.    unsigned long  data;
  189.    unsigned long  datal;
  190.    unsigned long  datar;
  191.  
  192.    /* First, open the file containing the array initialization data */
  193.    error = opensubkeyfile();
  194.    if (error == noErr) {
  195.       for (i = 0; i < N + 2; ++i) {
  196.          numread = fread(&data, 4, 1, SubkeyFile);
  197.    #ifdef little_endian      /* Eg: Intel   We want to process things in byte   */
  198.                            /*   order, not as rearranged in a longword          */
  199.          data = ((data & 0xFF000000) >> 24) |
  200.                 ((data & 0x00FF0000) >>  8) |
  201.                 ((data & 0x0000FF00) <<  8) |
  202.                 ((data & 0x000000FF) << 24);
  203.    #endif
  204.  
  205.          if (numread != 1) {
  206.             return DATAERROR;
  207.          } else {
  208.             P[i] = data;
  209.          }
  210.       }
  211.  
  212.       for (i = 0; i < 4; ++i) {
  213.          for (j = 0; j < 256; ++j) {
  214.              numread = fread(&data, 4, 1, SubkeyFile);
  215.  
  216.    #ifdef little_endian      /* Eg: Intel   We want to process things in byte   */
  217.                            /*   order, not as rearranged in a longword          */
  218.             data = ((data & 0xFF000000) >> 24) |
  219.                    ((data & 0x00FF0000) >>  8) |
  220.                    ((data & 0x0000FF00) <<  8) |
  221.                    ((data & 0x000000FF) << 24);
  222.    #endif
  223.  
  224.              if (numread != 1) {
  225.                return DATAERROR;
  226.             } else {
  227.                S[i][j] = data;
  228.             }
  229.          }
  230.       }
  231.  
  232.       fclose(SubkeyFile);
  233.  
  234.       j = 0;
  235.       for (i = 0; i < N + 2; ++i) {
  236.          data = 0x00000000;
  237.          for (k = 0; k < 4; ++k) {
  238.             data = (data << 8) | key[j];
  239.             j = j + 1;
  240.             if (j >= keybytes) {
  241.                j = 0;
  242.             }
  243.          }
  244.          P[i] = P[i] ^ data;
  245.       }
  246.  
  247.         datal = 0x00000000;
  248.       datar = 0x00000000;
  249.  
  250.       for (i = 0; i < N + 2; i += 2) {
  251.          Blowfish_encipher(&datal, &datar);
  252.  
  253.          P[i] = datal;
  254.          P[i + 1] = datar;
  255.       }
  256.  
  257.       for (i = 0; i < 4; ++i) {
  258.          for (j = 0; j < 256; j += 2) {
  259.  
  260.             Blowfish_encipher(&datal, &datar);
  261.    
  262.             S[i][j] = datal;
  263.             S[i][j + 1] = datar;
  264.          }
  265.       }
  266.    } else {
  267.       printf("Unable to open subkey initialization file : %d\n", error);
  268.    }
  269.  
  270.    return error;
  271. }
  272.  
  273. ********************BLOWFISH.DAT.UU********************
  274.  
  275.  
  276. begin 0700 "Blowfish.dat"
  277. Mic]JBhvCbmlsfxHN`WaSqjpinbhIGSgpbb[ZFnQn;hEejbgFnm`s=[YtyL\T
  278. MZpQLPjPIM\E\tmT_AmvUMt<ieYhvU=Fi>?L;TsdkIIC?MzPO_wk;TaK?M[CA
  279. MK^UJiGZvNGRpq?dL?YDDHyEgLYeL]P@a\NjeCOPvxVD@VgewsFFDvoZC]il]
  280. M?@Vu=h]RCKyx<xOmvhhurNY[ujp=PEIyMyPPUsDJ\F`sQ=fPhRA@A?cjpwDx
  281. MNmLX[XYYWka@nA@n;iXnB[`>BC[wew?aOsekiWBOk]IuxeQ@YEtE\ZIuJYqw
  282. MriABx^@tpewjnvHJJQbVMlQ<maeaZlZAuhzO?gkID[oNeaeC;[PJjZGewwpx
  283. Ml?;nwcXvFX>sgJ_vNCmLil]<>Cis@rBuAG<[CTBxzTNYK\r_ZaMFjbfsx=@i
  284. MSoLAJyeh?jQ@w>R`lN^dwuWIAwvQWbxC`NMEfX@CBsZaTYzLQp]M;_nc]dhY
  285. Mk@Md@Jrdh`qIRoajGA^;wBgfzdkVZvRzyPR<xzOsBoaJtzcrVepOzixoIRBK
  286. MtsnC;N\k;amZn^rZn_ap?OLJFjgQyqTYKPeVyLIyoHiccHBl[Hxyqv^?MgVd
  287. MI<l[BUZ^Xf]UVhwahgm`fDr?uLeJID[sJFhVoW<ff_[?<Dj;`CTWTm<DT`Hr
  288. MrmLoZMmi\<b;aUmRRxbyfWLEUgGx]NC>]^o^taJV>tP[EVS@Ops`aKKaJt^V
  289. Mpi]@QeY<GLhyzBqCzoMOKSYLt[tsn;kKnUkL;VW\tq^;litLSheeqj]>OpF^
  290. MX]`dWCmj_vxoj`<ykDNSPlNHuTwh=`_rbU\YN=o[VUuYPkTzxchjUJd`QD`L
  291. M<GEGGRw^^Q^CShZEZ?C;lBkXogtvW_UAzQtOta[hKpurJSh]M?K]hX=@tSe[
  292. MrcX`WXj>we>[RF^lHaJguB[?eVG;UtjH]BA^_\nLySkfCd]u<VE;i[b[RECh
  293. MX?^Cw;CPdz`p^CVx_rfcNdK\MvPMT=m;FEoD>;;XqvwrCDF\r_NwDng=\MJD
  294. MRWXSxOLsp<[DQNCOhlKzmG=l`=a^GOXK\q^TE=OzszZpDyCJKxYQzYouHmbn
  295. MT=bOQRw@CCQ;kXYUEk>o]Nk[\AhKyhBhNajpc?`<sZU>HfBoPQSqS_fqLZCa
  296. MKr\OhAB^cA=WZGtM_HLbgZgEHlPoMv]TZaBL\];nB>jyMjAoXoTsXk=\QcNa
  297. MTJVHVqy?HFz`Ew<eD\QSebdzeg?FKraE=[wZAL=tpOw[GswoZ\VOcgL^Bzcv
  298. MpqOsKAY^rp`EcBT@<;m>hF@`NU>XXj\Dycz;\`FYgEuCDqUyWZzJ>lecB=Ez
  299. MtW\@?uNB`NvYQxlF`WyBE<^Id<@yzdYSrDfSqRWj>QrIrAMq`ejztRDuU@]w
  300. Mo[R;QNpKxjqV@>yT``BZ;[uwf^D?\I;LzRHmVqvVxVtAY[GYMO\Tar[eAuyD
  301. Mt[`MwzF?CZdhND>y;HtgzDMZ<nFULREdVWtikLpyiBnM;JzPrz???ySNxkBo
  302. M[;iF[jJl<vFze_]vyeiLPKf>XqDV`JuUbtPIHeDspnpxnCX_uiBzvTj=yvNo
  303. MYmzy]S_vH=j<a^_HloumksCF\bu=PtS=hhzd<nLFxXkIQ@h>SeXizfL_oKKO
  304. MRsRwfaqKzGbAzg\UAej@XHzWGeleJE`gmSXgAaQ_WJY<CGUd[e<v\KBPnMHW
  305. M\e`lc?`<gPpb`ko_K@SUfCRU=khE@WIxW`DAO=fqd_E\Jr_VEcig<RkUqPdZ
  306. MY>vam\kzWlBU=Crz\]VGJtqAq@_p`P[LRl<^Igt>p>hXSyD[Z@XOlHb[Hq@^
  307. MLSenuhLXsVVYbf]bcpoVb@r_kk@rDbrw?gEv>;aROj^iK]Zz=Q_yDP@pLXNN
  308. MdMSooRYudGh?kFMQie`zW>z?AlVg>EAgfgphVA>\GYJ\ZtM]CnQZ[cK;AqWZ
  309. MxPEcyLqDP]kOgaAglAwybmUcnS<DPKHvdJempRIEQeepE``bdSKDWwg?^iXp
  310. MltYu@zQWUE\qfyLdmu;QUZogzSPqfcMyijti\H_F[y?Q^_J>NK\LgAt\;H;C
  311. MqwcJZv^QA@Y>bEH^jKmWg^<<sCTf^BEEWkFyYQTo@cZiUEiFRbtNslEXGabS
  312. MzLxucKJtXNIXI?P\tQXjk?sR]TZGmATKoqDYi@\yPGE@tBnGbo<sdK;KK?YN
  313. MZLl?yNn\qyvF>\BcLw\WTpfl_RCclMWOOFQzIvuxhxuHJY@b[LZEc]LOEsLJ
  314. M[WVMvVXOAatAMB@IaVeP[mUg=vf?eq`sSj@PZVf]E@lT_AZJ`VooMwm<DdQP
  315. MHCGuGIXkRZK>en[lAKQ@xBRGGjM<J[kSAfYDBQZOf;WPRJ`Cz;EEvKMppfAz
  316. MlCPJMklQGNGuPbfX]YMtbQFgwZbyE?>y?Fh]?zCXmXBzE^lM=QgMDU\vzaja
  317. McCvhj<?Fg]zvWM^A>eBZFu?UAjt;hGiCFXoc_QKbqI;mLPKKtRXPuh_yrnqM
  318. MOcdHvnOR[Ssf_^K^jnUA[GP\<UUjemGHyk?CpAa=eb`^d^ae[NjVHZJKZMML
  319. MsQwZRT_pQTkTpN]JN[uEsSL=p<TAa=@>>yZfAtWgYdMgzCVaxEcoxJgRvXTF
  320. MqORh@ZcaQ[zC?QtDPVGk=iigAhHkuIjRApE;OPbMftB=efjQ=bnbc@axpHTJ
  321. McewUZAVM]cXCoWaAlWkPDHVs?Dgvw^SQ;bh[VWS>mUGk[Gq@phwRI\YWlFZF
  322. MaXbdf?ApGNCOVeuAVy<UJvFGJLtlaLizajO\@`OjWiYd>B[cqsrd_=uGapX>
  323. MGLG;<]OsdevhSv=?VGGCyTm`Q<pTywd^nm@]joB>\vW_hat^h>>oLcUjYNn?
  324. Mj]NcK??IouIHEhe`]_yliARtzrDTpqt@]WxbUo>\]fLNUjh`zmphigdShoqJ
  325. Mp[?tMU``xz\>n?xNERqeqApAsWr_BXA`syw\gyzUDz]P]mWsyJ`Oq;^\b>Pc
  326. MOy>e?ZQMTcgkAprvZR>Su?TYp=HEq^zKR@JzjeaXiuldj?pjkh;zZ;yM^VC<
  327. MefkwrfD`z`[`Ib>AC>Yoo_ZBZh>MCkvlX`yZ]mzVJLX>?mlWw^Sn>jnypfLJ
  328. MpBc^GCwy\XvY[CGwJSLrsHL=R?KWrVTxuBzCyCgJXY>RnF[Z=mU;pSiHp>?W
  329. MRG@@^_Lj]t[x_KnwqtavKkIhEr=utSHZhhnmA_YKJ;?pEIukuzAGOjduFECl
  330. MJrECF>g;lZxJrEx_lrwYwOq^gi`IlwS]^n@bab<O<hb[euPejbSCE<durnsf
  331. M;rihPql_QP^fW`?YR>Yaaa\opd=YIeVh;A<RwUgKUyO`T?j\Px]adsuDiwMX
  332. Mmf`JGfc?^nBCgVmLfPXrMlhbXsj>KVyoT<Kq@quKhYw@lSZrXsLDbVkNOKDB
  333. MA;jBcNzZcyG><@RlkzkWjm`r>dvuMYs]ygThxN?l]?atrzmOAWUh^Ln=_r?S
  334. MoHT>bD=CpyDN_WpZ;VZK]oC]mZ@rWfbAZ]WXFqOAsmMNzPWf>Utp;v<LmR=E
  335. MUcO<Tn@d\rDmQ\P`_ZnUnp^rzp_MbVy[G_OnVWV<Higob]DuwJn[dR^htuNM
  336. MigNt>;]Vn];KmSDNL\PqvwF`iNjw]bXQkvAbKz?fzBL[dGulSg@N\qQJdDhW
  337. MMYiqYPzAN^yk^VmpfFLpfagj[?H]i;WxXNgcRtqbeEDjdAnfVpSL;MvKZBID
  338. MKV=nVHzHw[Z_ZxADYlo^G;R`u_cWPhy@>gOXx`m@s=g]@T;Vna^P=TvNam<V
  339. M_lRcpFLS\aZK<;b`px<\`eY?=ZawOKWHKBquqDjyOU@NxtYx]h_RW?VB]gsO
  340. Mnh>iO<isyOGcRknn=kqU\Euf_mFY>NLFxxL=WXrdz@YYDu^uXDyNvxX@Me=P
  341. MCmuuD<DbWDRYbZSANXheTafHxDAU=jF>MW\yMNbIW`EFkpFAQcifl^AzgPhi
  342. M\kZlrIF@iqUN_A`zNsT=bZvDWZff\@\HzoeIWk?z@U<YaOZAXLZ;s\U_tE`q
  343. Mw@fGaHoZH`jUQ`WFTb>z^hPG=S^fp<m@s`yAJ`zU\a=ZjlcUAN``xeBJlmQ]
  344. MxAgFGM<CnnICt\k=ElkbeCr[R^YvDkRVWNO\?zgnvqUV;PwDbtM\`x@Y<@H]
  345. M?ii\ih;C<E]RsyVYfLe;Mmn>NoSMueuXboREM=@]?mmmKp_dgEcOwKeAYOBB
  346. MAqsy;edsof_uQ^=vXt[dmBJ_SMWfRc?wFChTDFnbdF<n^HY`x`c@nCGnm]oZ
  347. M]<^KPG<WvLtMfURPyYYoHS=bTXhGpiF\F[[udxZ=OP]Se=xMgg[g`lq[MXP;
  348. MzRfADdvR;Kf^zCyNMe=hJR^\EfYYQJmVTFuiPLAsc_CNqHW>?=uSbAUlTdWf
  349. MjsF[VZFZqEbLEr;HOE[CajgZU?aJkufzx^^lXIJf[Bk`B<jXpRpN]Jt>`ZJ<
  350. M\MbD@\aANIOIzDVoYqupNFq;UB@FHOFGnCKArZFuAN]uxNGgk^_s]UkWVC\d
  351. M;VEW^@Iy@nrIex>PA@f;b>zMnS[ED^Fp_uJ>mm>wkobWVphKBUfvUzPZ`wVF
  352. M?=gooMy\?rTHgY\ESZWRNiMzUKqRvHCUsn`IKgg@fzwFq[bL_>Vs^IOHT\rm
  353. MjcMwSoCuyBEYdRXH>e\aD>UUxewWE@YdX]m>Cate;=rh]fVZ`ZeAipuD\kWc
  354. MZYXuoiawHI<GfNRIn@<JfS]MFQYCh?wUGf;[iMSSfwtSVrBQu?WU`UxT@HJZ
  355. MokLHtw<qP@Ky^jOltv?lKyi?s>@wts@PWhXWGuABDRcYD>IZDlk[oGOntrgn
  356. Myg=oOCjHMNm^PRD]qDC>tVEDd^z`HJXhdmUMLBqIArW]bp<AyKnzq@IDq<c=
  357. MvfS>SQP@RjY;OO?=fUBmplSr`w]KMnn[WziJ?CIy_Tt^mpIdOksmUwkJSJCZ
  358. Myhr[CvxrKK\\;T?rF^qCub]=GJ[b=QOVsFmP=`XmC>=;dU?X<AyQKUm]wta`
  359. MRPAnMnklmmifz@duKXsAL`pHEy@ZgpzXG[sn;Jah;S\[@Ct@JXhafAUkiWhG
  360. M^fduxkgGDS_<NSIYjSqei;V@BcGAt<YYrR\RR;>@g[KiXaSh?KSgT?;o`qgc
  361. MH>BJQQJpATGts[VzTmK>R]tjVC@cn<lJQIdVyXWYlwS@LrMo]YYyMToUNSKR
  362. MUqG_i]EeGk^whBPuYOPJcYg\<yNterwZYymASKz<Z\jHyeDrNJCqMLdgwNle
  363. Mz@PpTEaERPnDpNcL;@XvFmL[siB@OCiXZvr?gYtRXmnrW]n@mbNi<?h>fPIT
  364. MptNCmhSeOGd@PWxRVm\UGXV;Fr\NY@MOqP_C\qWEsmItgMKxD<YB><_moGYO
  365. MeABQyOTLgpvdC]ke]OLBF?tC\U>FlGxCDZ@Ulu;lSpjL\heBvGwKMvXvmI>h
  366. MTGolWIyBDHfYr=alti`;<<yven;fQ[TR>Apjq>gpaLoR>YKiJEo]xJ@o`kLE
  367. MO^hUO=kV<qiIa;hd`BjVR\]\Swz<jUlqoL`vpnosnjN]xbugK?bZnbb<]T;n
  368. M=G>OH<t@=va@A<O^sHKHC=AZJOFPsoFJ?AEhPEPb^XJl`<mJYm;KX?FpUoAI
  369. MIES>Hc\iirWbbnz?MTYAlLYWXEMwC]_CnLmRYK@ZRPh@`CEZ;L;[v__oUmUl
  370. MOU[q]c_E@C[TZblMerKPYQCi<eF]Fb`?rIUBYZtINHGAihT[^hyvQqemcKQl
  371. M[AxcsxHYhnqX@NFNC[WCJ]P?;zt>tEVRNNda^fYZ;yQHJr<h_mDIokPlLcRf
  372. M^jBMkb\`pD[KRLMekxGl<?SuGg^q?PxBOfVjbkfcsrdRzhsj@NnJR_mWAOkZ
  373. MkjMNo<YsvMgRbLxgQKCAsUZTnhYWtarFyvyE][yjp^rZncTaLNpp>xZRFf^p
  374. MG@RDgWLW=RPrxcbebh<xQn?qOtaE_\ZcDOVjJC;qj[shR=bys[bWeoEHfoFE
  375. MnyB@HwCfiHrHgHKI<OzXpEZV>BGtAEt;UQFOlLfiUqqua=RaUsYhpD[zMY;O
  376. MqJaiCPmF?>[>`ZPjL\rw<SUseJBqljBoSixdq`KnZXDZ=RvXjPX>]ITPjERn
  377. MY[Am[UHQLi;iZ_BmtrUXCGY``NZgXbKVPUBANPkHUZ_?G[cG>pZtjCL\fKKf
  378. M_Z>OG?>v^sh;Nypa=jBH[rhvkl_QNYGzJmuqImwDr^S=X^RHc<ti`YoN\Gir
  379. MosgtCCH<hDZVwFarPZpAb<lOar[CBnV??JFqQB^w=[u;HatlOjlZ[ftEWSfc
  380. M@TnISBzsxJVk`sptbXWUSXd>G_uyeG\eyc@r]naxBEjPR[CIqn];eJmSQnVA
  381. M??S^ZOukR[Zg<^orQsg<TewdyREr=T\Zu\IKPdy]nCLD=XpEMYD>FMVbwb;D
  382. MtLCN_jS>gHrcnOmAhqTceSkal<RMLD?FaKZl<rLY\xBT[SDZG\WeQwuqzq_V
  383. MFt\Y@IRPdpeE<SmcR^MAT]bTqolj[ZBN<WtJnAR=Mk<iemzKipRenWlHru^t
  384. MC]jD[xYL]UgDPRb[==GjHknkIviBsHrPo^ZHaVYTHg_E@cG@cc;_VO@c<Qmx
  385. MN>yQN=KdSARRvQcMs=ouL?SRMhafmouYi>Kd`jFLu>IRBsk?a@p=auTQ]pke
  386. Mn<kCjXGyVUOlbIC`v_UOfRtfhBXAO@Y@ESLd[mujy[uoYCBF[vxuFaJqbEVr
  387. MDHVL;\zwYSQCKtuNWU]e>Heetx=zylTPF?eIM?fjCgoNbUYwmH]L>?r[>EEy
  388. kiJJTGLzjRoS[@`a
  389. `
  390. end
  391.  
  392.  
  393.