dillon@CORY.BERKELEY.EDU (Matt Dillon) (10/31/87)
Here's a neat little program that you can use to encrypt files. It's basically a modified DES algorithm.. Take DES, remove the 32-48-32 submaster permutation core, and add a dynamically changing master permutation array. It's rather slow, but that's the tradeoff when you do a 64 bit permutation. Oh yah, I almost forgot... I read the entire source file into memory so if you are encrypting 100K files you should remember that. You can encrypt a file on floppy (since it reads the whole file in there isn't a lot of seeking). If a write error occurs writing the file back you loose the file. I encourage all those who are serious about encryption to modify the program. Don't forget your passwords! -Matt #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create: # encode.c # bmov.asm # bset.asm # encode.uue # This archive created: Fri Oct 30 17:47:00 1987 export PATH; PATH=/bin:/usr/bin:$PATH echo shar: "extracting 'encode.c'" '(5236 characters)' if test -f 'encode.c' then echo shar: "will not over-write existing file 'encode.c'" else cat << \!Funky!Stuff! > 'encode.c' /* * ENCODE key file file file ... file encrypt specified files * DECODE key file file file ... file decrypt specified files * * Aztec Compilation please. Use the +L option (32 bit ints). * * Both are the same program. The program looks at Arg0 to tell whether * it is encrypting or decrypting. If arg0 is one of "uUdD" it decrypts, * else encrypts. Files are a couple of bytes larger after encryption. * * The method used is a variation of the DES algorithm. Take your * everyday DES, remove the 32->48->32 submaster permutation core, and * add a dynamically changing permutation table... simple. * * Feel free to modify the algorithm! * * Matthew Dillon * * ...!ihnp4!ucbvax!dillon */ #include <stdio.h> #include <fcntl.h> #define FUNC(b48,b32) (b48.b[0] ^ b32) typedef unsigned long ulong; typedef unsigned short uword; typedef unsigned char ubyte; typedef ulong B32; typedef struct { ulong b[2]; } B48; typedef struct { ulong b[2]; } B56; typedef struct { ulong b[2]; } B64; extern ubyte *malloc(); /* * Top level permutation (sets of 64 bits). Mix it up as much as you * want! */ static ubyte Perm[64] = { 9,57,25,38,13,31,44,32,11,29, 8, 5,37,16,40,62,41, 0,53,47,48,22,24, 54,45,39,52,34,43,12,63,36,10,55,51,33,28, 3,50,58,35,61,21, 6,26, 2, 19,23,17, 1,27,42,49,14,56,60,18, 4, 7,20,59,46,15,30 }; static ubyte Iperm[64]; B48 SubMaster[16]; /* The SUB-MASTER keys */ ubyte Decrypt; main(ac,av) char *av[]; { register short i; register ubyte *buf; long len, elen, cnt; B64 key; ubyte padchar; if (av[0][0] == 'd' || av[0][0] == 'D' || av[0][0] == 'u' || av[0][0] == 'U') Decrypt = 1; if (ac == 1) { puts("DES key [files...]"); exit(1); } bzero(&key,sizeof(key)); bmov(av[1],&key,((strlen(av[1])>sizeof(key))?sizeof(key):strlen(av[1]))); makeiperm(); makesubmaster(&key); for (i = 2; i < ac; ++i) { int fd = open(av[i], O_RDWR); if (fd > 0) { /* * We encrypt at least one more byte than the filesize, and * additionaly pad to 8 byte boundries. This last byte is * the 'pad' byte and is different from the last byte in the * file... thus allowing the decrypt to restore the file * completely. */ len = lseek(fd, 0L, 2); elen = (len + 8) & ~7; if (buf = malloc(elen)) { lseek(fd, 0L, 0); read(fd, buf, len); close(fd); padchar = buf[len-1] + 1; bset(buf+len,elen-len,padchar); for (cnt = 0; cnt < elen; cnt += 8) cypher(buf+cnt); fd = open(av[i], O_WRONLY|O_CREAT|O_TRUNC); if (fd >= 0) { if (Decrypt) { padchar = buf[(elen=len)-1]; while (elen && buf[elen-1] == padchar) --elen; } write(fd, buf, elen); } else { printf("Unable to reopen for write: %s\n", av[i]); } } else { printf("Unable to allocate memory for %s\n", av[i]); } close(fd); } else { printf("Unable to open %s\n", av[i]); } } } makeiperm() { register short i; for (i = 0; i < 64; ++i) Iperm[Perm[i]] = i; } cypher(b64) B64 *b64; { B64 Tmp; register B32 A,B,T; register short i; ulong dmod; for (i = 0; i < 64; ++i) setbit(&Tmp,i,getbit(b64,Perm[i])); A = Tmp.b[0]; B = Tmp.b[1]; if (Decrypt) { for (i = 15; i >= 0; --i) { T = B; B = A; A = T ^ FUNC(SubMaster[i],A); } } else { for (i = 0; i < 16; ++i) { T = A; A = B; B = T ^ FUNC(SubMaster[i],B); } } dmod = (Tmp.b[0] ^ A) >> 8; Tmp.b[0] = A; Tmp.b[1] = B; for (i = 0; i < 64; ++i) setbit(b64,i,getbit(&Tmp,Iperm[i])); /* * Swap two entries in the Perm/IPerm array depending on dmod: */ { short a = dmod & 63; short b = (dmod >> 6) & 63; short t; t = Perm[a]; Perm[a] = Perm[b]; Perm[b] = t; a = Perm[a]; b = Perm[b]; t = Iperm[a]; Iperm[a] = Iperm[b]; Iperm[b] = t; } } /* * Generate SubMaster keys */ makesubmaster(key) B64 *key; { static ubyte smiperm[64] = { /* initial sub-master permutation */ 5,40,29,53, 2,39,25,42,46,35,23,16,49,62,34,63,17, 7,55,11,19,32, 28, 4, 9, 3,22,21,38,41,20,58,45,37,24,36,57,15,26,54,10, 0,47,14, 60,12,43, 6, 1,30,31,51,48, 8,44,13,50,61,59,52,18,33,27,56 }; static ubyte smselect[48] = { /* sub-master select bits */ 39,13,15, 4,45,32, 8,62,46,41,20,42,52,54,28, 5,25, 0,31, 2, 30,36,23, 1,56,37,43,50,34,10, 9,55,51,58,47,26,24, 6,48,49, 35,14,44, 3,38,60,63,17 }; static short shift[16] = { 2,2,1,1,1,1,1,1,2,1,1,1,1,1,1,2 }; B64 icd; register short i, j; for (i = 0; i < 64; ++i) setbit(&icd,i,getbit(key,smiperm[i])); for (i = 0; i < 16; ++i) { for (j = shift[i]; j; --j) { icd.b[0] = (icd.b[0] << 1) | (icd.b[0] >> 31); icd.b[1] = (icd.b[1] << 1) | (icd.b[1] >> 31); } for (j = 0; j < 48; ++j) setbit(&SubMaster[i],j,getbit(&icd,smselect[j])); } } /* * Set/get bit in 64 bit quantities * * 63....0 * */ setbit(ptr,bno,val) ubyte *ptr; short bno; ubyte val; { if (val) ptr[7-(bno>>3)] |= 1 << (bno&7); else ptr[7-(bno>>3)] &= ~(1 << (bno&7)); } getbit(ptr,bno) ubyte *ptr; short bno; { if (ptr[7-(bno>>3)] & (1 << (bno&7))) return(1); return(0); } !Funky!Stuff! fi # end of overwriting check echo shar: "extracting 'bmov.asm'" '(1176 characters)' if test -f 'bmov.asm' then echo shar: "will not over-write existing file 'bmov.asm'" else cat << \!Funky!Stuff! > 'bmov.asm' ;BMOV.ASM ; 4 8 12 ;BMOV(src,dest,bytes) ; ; Matthew Dillon ; ; -Handles ascending/descending moves ; -Optimizes the move if addresses longword boundries and #bytes ; is a multiple of 4. ; -Completely tested xdef _bmov _bmov movem.l 4(A7),A0/A1 ;source, destination move.l 12(A7),D0 ;bytes clr.b D1 ;long word boundry flag andi.b #3,15(A7) ;byte count multiple of 4? bne notlwb andi.b #3,7(A7) ;source mulitple of 4? bne notlwb andi.b #3,11(A7) ;destination multiple of 4? seq.b D1 ;set longword boundry flag if true notlwb cmp.l A0,A1 beq end ;trivial case ble ascend ;ascending copy add.l D0,A0 ;descending copy add.l D0,A1 decend tst.b D1 ;DESCEND beq decbyte declong lsr.l #2,D0 ;DESCEND LONGWORD bra ab00 ab0 move.l -(A0),-(A1) ab00 dbf.w D0,ab0 sub.l #$10000,D0 bpl ab0 end rts ab1 move.b -(A0),-(A1) ;DESCEND BYTE decbyte dbf.w D0,ab1 sub.l #$10000,D0 bpl ab1 rts ascend tst.b D1 ;ASCEND beq ascbyte asclong lsr.l #2,D0 ;ASCEND LONGWORD bra ab22 ab2 move.l (A0)+,(A1)+ ab22 dbf.w D0,ab2 sub.l #$10000,D0 bpl ab2 rts ab3 move.b (A0)+,(A1)+ ;ASCEND BYTE ascbyte dbf.w D0,ab3 sub.l #$10000,D0 bpl ab3 rts !Funky!Stuff! fi # end of overwriting check echo shar: "extracting 'bset.asm'" '(1076 characters)' if test -f 'bset.asm' then echo shar: "will not over-write existing file 'bset.asm'" else cat << \!Funky!Stuff! > 'bset.asm' ;BSET.ASM ;BZERO.ASM ; ; Uses longword operations if data is aligned on a longword boundry ; and the size is a mulitple of 4. Otherwise, uses byte operations. xdef _bset xdef _bzero _bzero clr.l D1 bra begin _bset move.b 15(A7),D1 ;12(A7)-> msb . . lsb (D1 = data) begin move.l 4(A7),A0 ;A0 = address move.l 8(A7),D0 ;D0 = byte count andi.b #3,11(A7) ;byte count on long word boundry? bne drop andi.b #3,7(A7) ;address on longword boundry? bne drop bra lwb loop move.b D1,(A0)+ ;BYTE SET LOOP drop dbf.w D0,loop ;remember, only effects lower word sub.l #$10000,D0 ;for buffers >65535 bpl loop ;branch to loop because D0.W now is FFFF rts lwb lsr.l #2,D0 ;byte count / 4 (longword chunks) tst.l D1 ;BZERO beq dropl move.b D1,14(A7) ;15(A7) already contains the byte move.w 14(A7),D1 ;D1 0..15 set swap D1 move.w 14(A7),D1 ;D1 16..31 set bra dropl loopl move.l D1,(A0)+ ;BYTE SET LOOP dropl dbf.w D0,loopl ;remember, only effects lower word sub.l #$10000,D0 ;for buffers >65535 bpl loopl ;branch to loop because D0.W now is FFFF rts !Funky!Stuff! fi # end of overwriting check echo shar: "extracting 'encode.uue'" '(10663 characters)' if test -f 'encode.uue' then echo shar: "will not over-write existing file 'encode.uue'" else cat << \!Funky!Stuff! > 'encode.uue' begin 644 encode M```#\P`````````#``````````(```:L```!#`````$```/I```&K$[Z!LA. M5?_F2.<(("!M``PB4`P1`&1G)"QM``PB5@P1`$1G&"QM``PB5@P1`'5G#"QM M``PB5@P1`%5F!AE\``&#J@RM`````0`(9A1(>@(B3KH,R%A/2'@``4ZZ%W98 M3TAX``A(;?_L3KH&"%!/(&T`#"\H``1.NA(^6$^PO`````AC!'`(8`X@;0`, M+R@`!$ZZ$B183R\`2&W_["!M``PO*``$3KH%3D_O``Q.N@(J2&W_[$ZZ`]Q8 M3W@"8``!GDAX``(P!$C`Y8`@;0`,+S`(`$ZZ"B)03RM`_^9*K?_F;P`!8$AX M``)"IR\M_^9.N@EN3^\`#"M`__P@+?_\4(#`O/____@K0/_X+RW_^$ZZ%0!8 M3R1`2H!G``$$0J="IR\M_^9.N@DX3^\`#"\M__PO"B\M_^9.N@L:3^\`#"\M M_^9.NA>46$\@2M'M__P0*/__4@`;0/_K<``0+?_K+P`B+?_XDJW__"\!($K1 M[?_\+PA.N@4"3^\`#$*M__1@$B!*T>W_]"\(3KH!>%A/4*W_]"`M__2PK?_X M;>1(>`,!,`1(P.6`(&T`#"\P"`!.N@E&4$\K0/_F2JW_YFU&2BR#JF<L(&W_ M_"M(__C1RAMH____ZTJM__AG%B!*T>W_^!`H__^P+?_K9@93K?_X8.0O+?_X M+PHO+?_F3KH4]D_O``Q@&#`$2,#E@"!M``PO,`@`2'H`;TZZ"_103V`8,`1( MP.6`(&T`#"\P"`!(>@!U3KH+VE!/+RW_YDZZ%IQ83V`8,`1(P.6`(&T`#"\P M"`!(>@!S3KH+ME!/4D0P!$C`L*T`"&T`_EI,WP003EU.=41%4R!K97D@6V9I M;&5S+BXN70!5;F%B;&4@=&\@<F5O<&5N(&9O<B!W<FET93H@)7,*`%5N86)L M92!T;R!A;&QO8V%T92!M96UO<GD@9F]R("5S"@!5;F%B;&4@=&\@;W!E;B`E M<PH`3E4``"\$>`!@%$'L@`)P`!`P0`!#[(,B$X0(`%)$N'P`0&WF*!].74YU M3E7_[DCG#P!^`&`L0>R``G``$#!P`"\`+RT`"$ZZ`IQ03R\`,`=(P"\`2&W_ M^$ZZ`C!/[P`,4D>^?`!`;<XH+?_X*BW__$HL@ZIG(GX/8!@L!2H$,`=(P.>` M0>R#L"(P"`"]@;.$4T=*1VSD8")^`&`8+`0H!3`'2,#G@$'L@[`B,`@`O8&S MA5)'OGP`$&WB("W_^+F`X(@K0/_T*T3_^"M%__Q^`&`L0>R#(G``$#!P`"\` M2&W_^$ZZ`@!03R\`,`=(P"\`+RT`"$ZZ`91/[P`,4D>^?`!`;<X@+?_TP+P` M```_.T#_\B`M__3LB,"\````/SM`__`P+?_R0>R``G(`$C```#M!_^XP+?_P M0>R``C(M__)#[(`"$[```!``,"W_\$'L@`(1K?_O```P+?_R0>R``G(`$C`` M`#M!__(P+?_P0>R``G(`$C```#M!__`P+?_R0>R#(G(`$C```#M!_^XP+?_P M0>R#(C(M__)#[(,B$[```!``,"W_\$'L@R(1K?_O``!,WP#P3EU.=4Y5__A( MYPP`>`!@+$'L@$)P`!`P0``O`"\M``A.N@$,4$\O`#`$2,`O`$AM__A.N@"@ M3^\`#%)$N'P`0&W.>`!@?C`$2,#C@$'L@+(Z,`@`8"H@+?_XXX`B+?_X=!_D MJ8"!*T#_^"`M__SC@"(M__QT'^2I@($K0/_\4T5*16;2>@!@-$'L@()P`!`P M4``O`$AM__A.N@"44$\O`#`%2,`O`#($2,'G@4'L@[#2B"\!81Y/[P`,4D6Z M?``P;<921+A\`!!M`/]\3-\`,$Y=3G5.50``2BT`$V<F<`<R+0`.2,'F@9"! M(&T`"-'`-"T`#DC"Q+P````'=@'EHX<08"9P!S(M``Y(P>:!D($@;0`(T<`T M+0`.2,+$O`````=V`>6C1H/'$$Y=3G5.50``,"T`#DC`P+P````'<@'AH70' M-BT`#DC#YH.4@R!M``AV`!8P*`#"@V<&<`%.74YU<`!@^$SO`P``!"`O``Q" M`0(O``,`#V80`B\``P`'9@@"+P`#``M7P;/(9QQO+-'`T\!*`6<6Y(A@`B,@ M4<C__)"\``$``&KR3G43(%'(__R0O``!``!J\DYU2@%G%N2(8`(BV%'(__R0 MO``!``!J\DYU$MA1R/_\D+P``0``:O).=4*!8`02+P`/(&\`!"`O``@"+P`# M``MF#`(O``,`!V8$8!`0P5'(__R0O``!``!J\DYUY(A*@6<2'T$`#C(O``Y( M03(O``Y@`B#!4<C__)"\``$``&KR3G5A<$/L@R)%[(,BM<EF#C(\`$-K"'0` M(L)1R?_\*4^#9BQX``0I3H-J2.>`@`@N``0!*6<02_H`"$ZN_^)@!D*G\U]. M<T/Z`"!.KOYH*4"#;F8,+CP``X`'3J[_E&`$3KH`&E!/3G5D;W,N;&EB<F%R M>0!)^0``?_Y.=4Y5```O"DAY``$``#`L@Q[!_``&+P!.NA*X4$\I0(-R9A1" MITAY``$``$ZZ$GQ03RYL@V9.=2!L@W)":``$(&R#<C%\``$`$")L@W(S?``! M``H@;(-F("R#9I"H``10@"E`@W8@;(-V(+Q-04Y80J=.NA)L6$\D0$JJ`*QG M,"\M``PO+0`(+PI.N@"T3^\`#"E\`````8-Z(&R#<@!H@```!"!L@W(`:(`` M``I@1$AJ`%Q.NA*$6$](:@!<3KH21%A/*4"#?B!L@WY*J``D9Q`@;(-^(F@` M)"\13KH1/EA/+RR#?B\*3KH%+%!/*6R#?H."3KH1/B!L@W(@@$ZZ$6P@;(-R M(4``!F<62'@#[4AZ`"Q.NA%(4$\@;(-R(4``#"\L@X(O+(.&3KKWEE!/0J=. MN@]<6$\D7TY=3G4J`$Y5``!(YPPP)&T`$"!M``@@*`"LY8`H`"!$("@`$.6` M)D`0$TB`2,#0K0`,5(`I0(.*0J<O+(.*3KH16%!/*4"#CF8(3-\,,$Y=3G40 M$TB`2,`O`"!+4H@O""\L@XY.N@%:3^\`#$AZ`5`0$TB`2,#0K(..+P!.N@00 M4$\O+0`,+PHO+(..3KH#W$_O``Q"K(.&)FR#CB1+$!-(@$C`*@"PO````"!G M(+J\````"6<8NKP````,9Q"ZO`````UG"+J\````"F8$4HM@S`P3`"!M``", M#!,`(F8R4HL@2U*+$!!(@$C`*@!G("!*4HH0A;J\````(F80#!,`(F8$4HM@ M!D(J__]@`F#28$0@2U*+$!!(@$C`*@!G,+J\````(&<HNKP````)9R"ZO``` M``QG&+J\````#6<0NKP````*9P@@2E**$(5@PB!*4HI"$$J%9@)3BU*L@X9@ M`/\\0A)"IR`L@X92@.6`+P!.NA`D4$\I0(."9@A"K(.&8`#^QGH`)FR#CF`: M(`7E@"!L@X(ABP@`+PM.N@B<6$]2@-?`4H6ZK(.&;>`@!>6`(&R#@D*P"`!@ M`/Z.(`!,[P,```0@""(O``Q@`A#95\G__&<&4D%@`D(84<G__$YU3E4``$CG M#"`H+0`(3KH-"G(&(`1.N@ZZ)$#5[(-R2H1M#C`L@QY(P+B`;`1*DF82*7P` M```"@Y)P_TS?!#!.74YU("T`$%.`+P`O+0`,+Q).N@\43^\`#"H`L+S_____ M9@Q.N@Z\*4"#DG#_8,Q"IT*G+Q).N@[P3^\`#&"\3E4``"\M``Q(>`,!+RT` M"&$(3^\`#$Y=3G5.50``2.</,"1M``A.N@QR)FR#<G@`8!!R!B`$3KH.&DJS M"`!G$E*$,"R#'DC`N(!MYGH&8```T`@M``$`#F<T2'C__R\*3KH.5%!/+`!G M)"\&3KH.B%A/+PI.N@X86$]*@&803KH.(BH`L+P```#-9@``E$AX`^TO"DZZ M#BY03RP`2H9F9`@M````#F8$>@%@=$AX`^XO"DZZ#A!03RP`9@A.N@WD*@!@ M7$AX`"%(>@">3KH.J%!/+@!G"B\'3KH.4EA/8")(>``!2'H`CB\&3KH.%D_O M``Q(>/__0J<O!DZZ#>Q/[P`,8"H@+0`,P+P```4`L+P```4`9A@O!DZZ#5Q8 M3WH$*46#DG#_3-\,\$Y=3G5R!B`$3KH-'B>&"`!R!B`$3KH-$B!`T<LQ;0`. M``0(+0`#``YG$$AX``%"IR\&3KH-BD_O``P@!&"^9&]S+FQI8G)A<GD```!. M50``2.<,("@M``A.N@L6<@8@!$ZZ#,8D0-7L@W)*A&T.,"R#'DC`N(!L!$J2 M9A(I?`````*#DG#_3-\$,$Y=3G4P*@`$2,#`O`````.PO`````%F#"E\```` M!8.2</]@V"\M`!`O+0`,+Q).N@SV3^\`#"H`L+S_____9@Q.N@RL*4"#DG#_ M8+`@!6"L,#Q__V`$,"\`#B!O``1*&&;\4T@B;P`(4T`0V5?(__QG`D(0("\` M!$YU(&\`!"`((F\`"!#99OQ.=4Y5```O"B1M``A*$F<D($I2BA`02(!(P"\` M3KH%DEA/L+S_____9@AP_R1?3EU.=6#82'@`"DZZ!7983V#L3E4``$CG#C`D M;0`(0J=(>@".3KH,YE!/*4"#K&8(3-\,<$Y=3G4@;0`,(F@`)"\I``1.N@T6 M6$\H`&=22'H`;2!$+R@`-DZZ#.A03R9`2H!G-$AX`^TO"TZZ"^Y03RP`9R0@ M!N6`*@`@125H``@`I"5&`)Q(>`/M2'H`.$ZZ"\I03R5``*`O!$ZZ#+183R\L M@ZQ.N@P86$]"K(.L8(!I8V]N+FQI8G)A<GD`5TE.1$]7`"H`3E4``$AM``PO M+0`(2'H$KDZZ`)!/[P`,3EU.=4Y5``!(YP@@)&T`$`RM````!``49@@@;0`( M*!!@%$JM``QO""!M``@H$&`&(&T`""@00JT`%$JM``QL$D2M``Q*A&P*1(0K M?`````$`%"(M``P@!$ZZ`])![(#24XH4L`@`(BT`#"`$3KH#RB@`9MY*K0`4 M9P93BA2\`"T@"DS?!!!.74YU3E7_%$CG"#`D;0`()FT`#$*M__@K;0`0__P@ M2U*+$!!(@$C`*`!G``,PN+P````E9@`#"D(M_R(K?`````'_]"M\````(/_P M*WP``"<0_^P@2U*+$!!(@$C`*`"PO````"UF$$*M__0@2U*+$!!(@$C`*`"X MO````#!F%"M\````,/_P($M2BQ`02(!(P"@`N+P````J9AH@;?_\6*W__"M0 M_^@@2U*+$!!(@$C`*`!@-$*M_^A@(G(*("W_Z$ZZ"<#0A)"\````,"M`_^@@ M2U*+$!!(@$C`*`!![(#E"#```D@`9M*XO````"YF8B!+4HL0$$B`2,`H`+"\ M````*F8:(&W__%BM__PK4/_L($M2BQ`02(!(P"@`8#1"K?_L8")R"B`M_^Q. MN@E6T(20O````#`K0/_L($M2BQ`02(!(P"@`0>R`Y0@P``)(`&;2*WP````$ M_^2XO````&QF%B!+4HL0$$B`2,`H`"M\````!/_D8!2XO````&AF#"!+4HL0 M$$B`2,`H`"`$8'XK?`````C_X&`<*WP````*_^!@$BM\````$/_@8`@K?/__ M__;_X"\M_^1(;?\B+RW_X"\M__Q.NOVT3^\`$"M`_]P@+?_DT:W__&!:(&W_ M_%BM__PK4/_<+RW_W$ZZ`AQ83RM`_^1@2B!M__Q8K?_\*!!![?\A*TC_W!"$ M8"B0O````&-GXE.`9Y20O`````MG`/]N68!GM%6`9P#_;E>`9P#_<F#,0>W_ M(I'M_]PK2/_D("W_Y+"M_^QO!BMM_^S_Y$JM__1G<"!M_]P,$``M9PHB;?_< M#!$`*V8T#*T````P__!F*E.M_^@@;?_<4JW_W!`02(!(P"\`3I)83["\____ M_V8*</],WPP03EU.=6`8+RW_\$Z26$^PO/____]F!'#_8.)2K?_X("W_Z%.M M_^BPK?_D;MI"K?_@8"0@;?_<4JW_W!`02(!(P"\`3I)83["\_____V8$</]@ MJE*M_^`@;?_<2A!G"B`M_^"PK?_L;<H@+?_@T:W_^$JM__1F*F`:2'@`($Z2 M6$^PO/____]F!G#_8`#_<%*M__@@+?_H4ZW_Z+"M_^1NV&`8+P1.DEA/L+S_ M____9@9P_V``_TA2K?_X8`#\Q"`M__A@`/\X2.=(`$*$2H!J!$2`4D1*@6H& M1($*1``!83Y*1&<"1(!,WP`22H!.=4CG2`!"A$J`:@1$@%)$2H%J`D2!81H@ M`6#8+P%A$B`!(A]*@$YU+P%A!B(?2H!.=4CG,`!(04I!9B!(038!-`!"0$A` M@,,B`$A`,@*"PS`!0D%(04S?``Q.=4A!)@$B`$)!2$%(0$)`=`_0@-.!MH%B M!)*#4D!1RO_R3-\`#$YU(&\`!"`(2AAF_)'`(`A3@$YU3E4``$AL@7PO+0`( M3KH`"%!/3EU.=4Y5```O!"@M``@O+0`,+P1.N@`T4$^XO`````IF)B!M``P0 M*``,2(!(P`@```=G%$AX__\O+0`,3KH`_E!/*!].74YU8/A.50``+PHD;0`, M(%*QZ@`$91H@+0`(P+P```#_+P`O"DZZ`-!03R1?3EU.=2!24I(0+0`+$(!( M@$C`P+P```#_8.1.50``+PI![(%F)$@@2M7\````%B\(81!83T'L@QZUR&7J M)%].74YU3E4``$CG""`D;0`(>``@"F8*</],WP003EU.=4HJ``QG5`@J``(` M#&<,2'C__R\*85903R@`$"H`#4B`2,`O`$ZZ!0A83XB`""H``0`,9PHO*@`( M3KH"/%A/""H`!0`,9Q0O*@`23KH"V%A/+RH`$DZZ`B!83T*20JH`!$*J``A" M*@`,(`1@C$Y5__Y(YP@@)&T`"$'Z_T(I2(.6""H`!``,9PIP_TS?!!!.74YU M""H``@`,9S(H$IBJ``@O!"\J``@0*@`-2(!(P"\`3KH"ED_O``RPA&<0".H` M!``,0I)"J@`$</]@O@RM_____P`,9A`(J@`"``Q"DD*J``1P`&"D2JH`"&8( M+PI.N@"D6$\,:@`!`!!F,!MM``___TAX``%(;?__$"H`#4B`2,`O`$ZZ`C)/ M[P`,L+P````!9I@@+0`,8`#_8"2J``@P*@`02,#0J@`()4``!`CJ``(`#"!2 M4I(0+0`/$(!(@$C`P+P```#_8`#_,$Y5```O"D'L@68D2$HJ``QG&-7\```` M%D'L@QZUR&4(<``D7TY=3G5@XD*20JH`!$*J``@@"F#J3E7__"\*)&T`"$AX M!`!.N@#"6$\K0/_\9A@U?``!`!`@"M"\````#B5```@D7TY=3G4U?`0``!`( MZ@`!``PE;?_\``@0*@`-2(!(P"\`3KH`WEA/2H!G!@`J`(``#&#,3E4``$CG M`#`D;(-B8!0F4B`J``10@"\`+PI.N@1\4$\D2R`*9NA"K(-B3-\,`$Y=3G5. M50``+PI!^O_&*4B#FD*G("T`"%"`+P!.N@0J4$\D0$J`9@AP`"1?3EU.=22L M@V(E;0`(``0I2H-B(`I0@&#F3E4``"\M``AAMEA/3EU.=4Y5``!(YP`PE\LD M;(-B8`X@;0`(48BQRF<2)DHD4B`*9NYP_TS?#`!.74YU(`MG!":28`0I4H-B M("H`!%"`+P`O"DZZ`])03W``8-A.50``+PIR!B`M``A.N@*T)$#5[(-R2JT` M"&T2,"R#'DC`(BT`"+*`;`1*DF80*7P````"@Y)P_R1?3EU.=7(&("T`"$ZZ M`GP@;(-R+S`(`$ZZ`LA83TJ`9P1P`6`"<`!@UDY5```O+0`(3KH"DEA/2H!F M#DZZ`IPI0(.2</].74YU<`!@^$Y5``!(YPP@*"T`"$ZZ`'9R!B`$3KH")B1` MU>R#<DJ$;0XP+(,>2,"X@&P$2I)F$BE\`````H.2</],WP0P3EU.=3`J``3` M?``#9@PI?`````6#DG#_8.(O+0`0+RT`#"\23KH"B$_O``PJ`+"\_____V8, M3KH"%BE`@Y)P_V"Z(`5@MDY5__Q(>!``0J=.N@+L4$\K0/_\"```#&<22JR# M>F8(("W__$Y=3G5.N@`&<`!@]$Y5``!(>``$2'H`'DZZ`?HO`$ZZ`B1/[P`, M2'@``4ZZ``Q83TY=3G5>0PH`3E4``$JL@Y9G!B!L@Y9.D"\M``A.N@`(6$]. M74YU3E7__"\$*VT`"/_\2JR#<F<L>`!@"B\$3KH`SEA/4H0P+(,>2,"X@&WL M,"R#'L'\``8O`"\L@W).N@(,4$]*K(.:9P8@;(.:3I!*K(.>9PHO+(.>3KH! MPEA/2JR#HF<*+RR#HDZZ`;)83TJL@Z9G"B\L@Z9.N@&B6$\L>``$""X`!`$I M9Q0O#4OZ``I.KO_B*E]@!D*G\U].<TJL@WYF*DJL@XYG(B\L@XHO+(..3KH! MEE!/("R#AE*`Y8`O`"\L@X).N@&"4$]@#DZZ`7(O+(-^3KH!GEA/("W__"YL M@V9.=2@?3EU.=4Y5``!(YPX@*"T`"'(&(`1.N@!$)$#5[(-R2H1M#C`L@QY( MP+B`;`1*DF82*7P````"@Y)P_TS?!'!.74YU,"H`!,!\@`!F""\23KH`+EA/ M0I)P`&#@2.=P`#0!Q,`F`4A#QL!(0T)#U(-(0,#!2$!"0-""3-\`#DYU(B\` M!"QL@VY.[O_<(B\`!"QL@VY.[O^"(B\`!"QL@VY.[O^X+&R#;D[N_\HL;(-N M3N[_?"(O``0L;(-N3N[_*$SO``8`!"QL@VY.[O^L3.\`!@`$+&R#;D[N_^(L M;(-N3N[_Q$SO``X`!"QL@VY.[O_63.\`#@`$+&R#;D[N_[XB+P`$+&R#;D[N M_Z9,[P`.``0L;(-N3N[_T$CG`01,[R"```PL;(-J3J[_E$S?((!.=4[Z``(B M;P`$+&R#:D[N_F),[P`#``0L;(-J3N[_.B)O``0L;(-J3N[^VBQL@VI.[O]\ M(F\`!"`O``@L;(-J3N[_+B!O``0L;(-J3N[^C"QL@VHB;P`$("\`"$[N_=@B M;P`$+&R#:D[N_H9,[P`#``0L;(-J3N[^SB!O``0L;(-J3N[^@$SO`P``!"QL M@ZQ.[O^@(&\`!"QL@ZQ.[O^F(&\`!"QL@ZQ.[O^R``````/L`````0````$` M``<^`````````_(```/J````R`DY&28-'RP@"QT(!240*#XI`#4O,!88-BTG M-"(K##\D"C<S(1P#,CHC/14&&@(3%Q$!&RHQ#C@\$@0'%#LN#QX%*!TU`B<9 M*BXC%Q`Q/B(_$0<W"Q,@'`0)`Q85)BD4.BTE&"0Y#QHV"@`O#CP,*P8!'A\S M,`@L#3(].S02(1LX)PT/!"T@"#XN*10J-#8<!1D`'P(>)!<!."4K,B(*"3<S M.B\:&`8P,2,.+`,F/#\1``(``@`!``$``0`!``$``0`"``$``0`!``$``0`! M``(P,3(S-#4V-S@Y86)C9&5F````("`@("`@("`@,#`P,#`@("`@("`@("`@ M("`@("`@(""00$!`0$!`0$!`0$!`0$!`#`P,#`P,#`P,#$!`0$!`0$`)"0D) M"0D!`0$!`0$!`0$!`0$!`0$!`0$!`4!`0$!`0`H*"@H*"@("`@("`@("`@(" M`@("`@("`@("0$!`0"```````````````````0`````!```````````````` M``````$!`````0`````````````````````!`@````$````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` 9````````%``````#\@```^L````!```#\@`` ` end !Funky!Stuff! fi # end of overwriting check exit 0 # End of shell archive