Path: utzoo!utgpu!jarvis.csri.toronto.edu!clyde.concordia.ca!uunet!cs.utexas.edu!rutgers!mcnc!xanth!cs.odu.edu!Amiga-Request From: Amiga-Request@cs.odu.edu (Amiga Sources/Binaries Moderator) Newsgroups: comp.sources.amiga Subject: v90i096: Encrypt 1.0 - secure files against prying eyes, Part01/01 Message-ID: <11622@xanth.cs.odu.edu> Date: 4 Mar 90 03:17:34 GMT Sender: news@cs.odu.edu Reply-To: davids@ucscb.UCSC.EDU (60116000) Lines: 714 Approved: tadguy@cs.odu.edu (Tad Guy) X-Mail-Submissions-To: Amiga@cs.odu.edu X-Post-Discussions-To: comp.sys.amiga Submitted-by: davids@ucscb.UCSC.EDU (60116000) Posting-number: Volume 90, Issue 096 Archive-name: util/encrypt-1.0 [ uuencoded executable included. ...tad ] Encrypt secures your files against prying eyes. It will take any file (a program, IFF picture, text, whatever) and convert it into an unusable form using a password that you specify. When you want to access the file, it will convert the file back to its original form, assuming you give it the correct password. #!/bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh 'Encrypt.c' <<'END_OF_FILE' X/*-----------------------------Encrypt V1.00-----------------------------*/ X/*---------------------------by Dave Schreiber---------------------------*/ X/* */ X/*Encrypt V1.00 is Copyright (c)1990 by Dave Schreiber. All Rights Reserved*/ X/*Encrypt must by freely distributed, except for costs associated with */ X/*shipping, copying, media, labels, taxes, and other necessary costs. */ X/*************************************************************************/ X/*Compiled under Lattice C V5.02. To compile, use this command line: */ X/* 1> lc -Lm Encrypt */ X/*************************************************************************/ X/*Encrypt is a file encryptor/decryptor. It will take any file (binary, */ X/*text, IFF, whatever) and encrypts it using a user specified password. */ X/*This renders the file unusable until it is decrypted with the same */ X/*password. */ X/*************************************************************************/ X/*The algorithm goes something like this: */ X/* Multiply the ASCII values of the user supplied password together */ X/* Use as a seed for the drand48() function (Lattice's pseudo-random */ X/* number generator) */ X/* To encrypt, for each byte of the file: */ X/* Read in the byte */ X/* Add it to the value returned by drand48() (which is btw 0 & 255) */ X/* Write the byte out */ X/* To decrypt, follow the same procedure, but subtract the value */ X/* returned by drand48() from the byte. */ X/*-----------------------------------------------------------------------*/ X/*-----------------------------------------------------------------------*/ X X X/*System #include files*/ X#include X#include X#include X#include X#include X#include X Xvoid InterpretCommandLine(); Xvoid PutByte(); X Xmain(argc,argv) Xint argc; Xchar *argv[]; X{ X ULONG seedvalue; X double value; X UBYTE final; X char filename[200],outfn[201]; X struct FileHandle *outfile,*infile; X BYTE buffer[2],encrypt,replace; X X if(argv[1][0]=='?') /*If the user requests help*/ X { X puts("Encrypt V1.00 (c)1990 by Dave Schreiber"); X puts(""); X puts("Usage:"); X puts(" 1> Encrypt [options] -p []"); X puts("Where the options are:"); X puts(" -e -- Encrypt and store as (default)"); X puts(" -d -- Decrypt and store as "); X puts(" -r -- Replace: encrypt/decrypt and store"); X puts(" as ( is not needed with this"); X puts(" option)"); X puts(""); X puts(" -p -- Use as the password"); X exit(0); X } X X /*Process the command line arguments*/ X InterpretCommandLine(argc,argv,filename,outfn,&encrypt,&replace, X &seedvalue); X X /*Open the input file*/ X if((infile=(struct FileHandle *)Open(filename,MODE_OLDFILE))==NULL) X { X puts("Couldn't open the read file!"); X exit(500); X } X X /*Open the output file*/ X if((outfile=(struct FileHandle *)Open(outfn,MODE_NEWFILE))==NULL) X { X puts("Couldn't open the write file!"); X Close(infile); /*Clean up*/ X exit(600); X } X X if(encrypt) /*Encrypt...*/ X { X printf("Encrypting...\n"); X while(!GetByte(infile,buffer)) X { X value=drand48(); /*Get a random number*/ X final=(value*256); /*Reduce it to >=0 and <=255*/ X buffer[0]+=final; /*Add it to the read byte*/ X X PutByte(outfile,buffer,FALSE); /*Write to disk*/ X } X } X else /*Decrypt...*/ X { X printf("Decrypting...\n"); X while(!GetByte(infile,buffer)) X { X value=drand48(); X final=(value*256); X buffer[0]-=final; X X PutByte(outfile,buffer,FALSE); X } X } X PutByte(outfile,buffer,TRUE); /*End of file...*/ X X Close(outfile); /*Close the files*/ X Close(infile); X if(replace) /*If the -r switch was used, delete the .tmp file*/ X DeleteFile(filename); X X exit(0); X} X X/*These next two routines are buffers for the AmigaDOS Write() and */ X/*Read() commands. Instead of writing out each byte at a time, bytes */ X/*are written out in packets of 128. This can lead to tremendous */ X/*speed increases (one program I wrote got a speedup of 400% by using */ X/*GetByte alone). Use to your heart's content... */ X X/*P.S. The important thing with these routines is that I/O is buffered*/ X/*not the amount of buffer. I tried increasing the buffer size to 8K */ X/*and got no noticable speed increase... */ X Xvoid PutByte(outfile,buffer,EOF) Xchar *buffer; Xstruct FileHandle *outfile; XBYTE EOF; X{ X static char chip Buffer[128]; X static curpos=0; /*Next space for byte*/ X X if(EOF) /*If its the end of the file*/ X { X Write(outfile,Buffer,curpos); /*Flush the buffer*/ X return; X } X X Buffer[curpos++]=buffer[0]; /*Add a byte to the buffer*/ X if(curpos==sizeof(Buffer)) /*If the buffer is full*/ X { X curpos = 0; X Write(outfile,Buffer,sizeof(Buffer)); /*Write to disk*/ X } X} X XGetByte(infile,buffer) Xchar *buffer; Xstruct FileHandle *infile; X{ X static char chip Buffer[128]; X static curpos=0; /*Next byte to be returned*/ X static end = 0; /*Last byte in buffer*/ X X if(curpos == end) /*If we've sent every byte*/ X { /*Get another 8K chunk*/ X curpos = 0; X end=Read(infile,Buffer,sizeof(Buffer)); X } X X buffer[0]=Buffer[curpos++]; X return(!end); /*Returns whether or not EOF*/ X} X X/*Interpets the command line arguments given to Encrypt*/ Xvoid InterpretCommandLine(argc,argv,in,out,encr,repl) Xint argc; Xchar *argv[],*in,*out; XBYTE *encr,*repl; X{ X ULONG seed; X BYTE seedhasvalue=FALSE; X BYTE c,i; X X *encr=TRUE; /*Encrypt is the default*/ X *repl=FALSE; /*Default is not to replace the original file*/ X in[0]=out[0]=NULL; X X for(c=1;(argv[c][0]=='-') ;c++) X { X switch(argv[c][1]) X { X case 'e': /*Encrypt*/ X case 'E': X *encr=TRUE; X break; X case 'd': /*Decrypt*/ X case 'D': X *encr=FALSE; X break; X case 'p': /*Password*/ X case 'P': X if(argv[c][2]==NULL) X break; X /*Multiply characters of the password together*/ X for(i=2,seed=1;i < strlen(argv[c]);seed*=argv[c][i++]); X srand48(seed); /*Use the result and the random number seed*/ X seedhasvalue=TRUE; /*We've got the seed*/ X break; X case 'r': X case 'R': /*Replace un-encrypted version with*/ X *repl=TRUE; /*encrypted version*/ X break; X } X } X X if(argc-c < 2 && !*repl) /*-r not set and filename(s) not given*/ X { X puts("Please specify the input and output filenames!"); X exit(310); X } X X if(argc-c < 1 && *repl) /*-r set and filename not given*/ X { X puts("Please specify the input filename!"); X exit(320); X } X X if(!seedhasvalue) /*If a password wasn't given*/ X { X puts("Please specify a password!"); X exit(100); X } X X strcpy(in,argv[c]); X if(!*repl) /*If -r was used, use the filenames given*/ X strcpy(out,argv[++c]); X else /*Otherwise add a .tmp to the original version's filename*/ X { /*and use the originals version's old filename as the output*/ X strcpy(out,in); /*filename*/ X strcat(in,".tmp"); /*The original, .tmp version, will be deleted*/ X if(!Rename(out,in)) /*when the encrypted file has been written*/ X { /*sucessfully*/ X puts("Couldn't access the file!"); X exit(200); X } X } X} X X/*End of Encrypt.c*/ END_OF_FILE if test 8281 -ne `wc -c <'Encrypt.c'`; then echo shar: \"'Encrypt.c'\" unpacked with wrong size! fi # end of 'Encrypt.c' fi if test -f 'Encrypt.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Encrypt.doc'\" else echo shar: Extracting \"'Encrypt.doc'\" \(2662 characters\) sed "s/^X//" >'Encrypt.doc' <<'END_OF_FILE' X-----------------------------Encrypt V1.00----------------------------- X---------------------------by Dave Schreiber--------------------------- X XEncrypt V1.00 is Copyright (c)1990 by Dave Schreiber. All Rights Reserved. XEncrypt must by freely distributed, except for costs associated with Xshipping, copying, media, labels, taxes, and other necessary costs. X XFiles in this release: X Encrypt (the binary program) X Encrypt.c (the source code to Encrypt) X Encrypt.doc (the documentation, this file) XPlease keep all three files of this release together, if you can. X X Encrypt secures your files against prying eyes. It will take any Xfile (a program, IFF picture, text, whatever) and convert it into an Xunusable form using a password that you specify. When you want to Xaccess the file, it will convert the file back to its original form, Xassuming you give it the correct password. X XEncrypt is called using the form: X 1> Encrypt [options] -p [] Xwhere is the file you want to encrypt/decrypt, is the Xfilename of the encrypted/decrypted file, and is the password Xthat you want to use. The options are: X X -e -- Encrypt the file X -d -- Decrypt the file X -r -- Process and replace with the processed file. X This option will leave you without the original version of X the file, so use it with care. Note that the original file X is not deleted until the processed version has been created X sucessfully, so you won't end up with a half-processed version X and no original version (the original file is stored as X with a .tmp after it until the encrypted version is X completed). The -r flags works with both encryption and X decryption. X XIf a '?' is the only command line option, the options information is Xdisplayed. X X How secure is the encrypted file? Data encryption isn't really Xmy field, so I don't know (I got the algorithm idea from a program for Xthe Apple ][, published in Compute! magazine (1987?), that does the same Xthing as Encrypt). The algorithm is layed out in the source code X(Encrypt.c, included with this release) if you want to take a look. You Xcan encrypt a file more than once, in which case you'll have to decrypt Xit the same number of times. Decrypting an unencrypted file is another Xway of securing it; encrypting it will then give you the original file Xback. X XEnjoy. X X-Dave Schreiber X Xdavids@slugmail.ucsc.edu (preferred, but flakey. If it doesn't work, try Xdavids@ucscb.ucsc.edu (school) or Xdavids@cup.portal.com (summer, vacations, etc)). X END_OF_FILE if test 2662 -ne `wc -c <'Encrypt.doc'`; then echo shar: \"'Encrypt.doc'\" unpacked with wrong size! fi # end of 'Encrypt.doc' fi if test -f 'Encrypt.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Encrypt.uu'\" else echo shar: Extracting \"'Encrypt.uu'\" \(20763 characters\) sed "s/^X//" >'Encrypt.uu' <<'END_OF_FILE' Xbegin 664 Encrypt XM```#\P`````````%``````````0```L=```!34```$````',````)@```^D`4 XM``L=)$@D`$GY`````$?Y```$Q'(`(#P```";8`(FP5'(__PL>``$*4X$_"E/? XM!01"K`4`)FX!%'``(CP``#``3J[^SBEK`)@$^$JK`*QG``!P(`^0KP`$!H``# XM``"`*4`$R&$``2X@:P"LT$ZZ? XM&V1P`&`$("\`!"\`("P$\&<$($!.D$ZZ*H0L>``$(FP'($ZN_F).N@-.2JP%! XM`&<:(BP%"&<$3J[_W"QX``1.KO]\(FP%`$ZN_H8@'RYL!01.=7!D8+1#^@`0J XM<`!.KOW8*4`'(&?L3G5D;W,N;&EB0!.5?_P+PLF;P`<<``P$TZZ!WQ(3 XM[P`#``1P`#`K``).N@=L2.\``P`,<``P*P`$3KH'7"0\0/```'8`3KH+V$SOJ XM``P`#$ZZ#I(D/$#P``!V`$ZZ"\),[P`,``1.N@Y\)#Q`\```=@!.N@NL)E].0 XM74YU3E7_^B\'+B\`$B`'2$!(P"(\``#__\"!.T#_^B`'`H```/__.T#__#M\] XM,P[__G``+P`O`"\`2'@`!6$``$IP`"Z`+P!(;?_Z2'@``F$``#@N+?_V3EU.* XM=2\+)F\`"'``+P`O`"\`2'@`!6$``!IP`"Z`+P`O"TAX``1A```*3^\`'"9?> XM3G5.50``2.[`*B.7SF;0*D.7P`"P*F3-\,@$Y=3G5.7 XM5?_P2.<_,B9O`#PD;P!`+B\`1#`J``0B`#0K``3"PM*'*`$B!$A!2,$F/```L XM___"@\B#,"H``L#"T($J`"`%2$!(P,"#RH/$TM2`+`("A@`/__\R*@`$)`$K) XM0/_P,"L``L3`VH(D!4A"2,+$@\J#P.H``B(&TH#2@BP!S(,P$\#J``0B!M*`> XM+`',@P*&``#__R`&(&T`%#"`(@4Q00`")@0Q0P`$3-],_$Y=3G4``"\'+B\`J XM"%*L!1!3K`+N;18@;`+F0^@``2E)`N8@!Q"`<@`2`&`4(`=R`!(`2&P"XB\!I XM3KH:K%!/(@`N'TYU3E4``"\+)F\`#$*L!1!(;0`,+PM(>O^L3KH73$AL`N)(3 XM>/__3KH:?"`L!1`F;?_\3EU.=0``````````<&%.=4YU3E7_[$AM__)(;?_TD XM2&W_^D*G3KK]WG``,"W_\DAM_^PO`$AM__1(;?_Z3KK^I'``+H`O`$AM_^Q(\ XM>``"3KK]M$AM_^Q.NORV3EU.=4Y0_^).40``2.=_,"1H``@@&B(23KH'ID)I9 XM``A":0`&+P"#GV8.)&@`'"8H``Q3@V```/120C-"``1(0C-"``A"1C0I``1G. XM7&H25D)K&`I"``/5:0`$80``_&!(80`!+%)I``9@$G0$U6D`!&$``.9A``#L8 XM4VD`!DJ`:\13:0`$XXGCD&#R0D)"1B\`@Y]G%&$``,Q*1F8,#$(``68&4VD`J XM!F#L!@8`,!.&(`I20@Q"`!1KU'8!)"@`#$JH`!!G"G@!U&D`!E-":SIX%`Q"8 XM`!)L,C@"&C$@"P8%``4,!0`Y;R(3O``P(`M2,2`*&C$H"E-":NA2:0`&4T-Z7 XM`+JH`!!G`E*$)&@`'$?Q,`H@!&<>4T0V!`1#`!1K`G@3%-M1S/_\2D-K"!3\O XM`#!1R__Z)&@`&$*22FD`"&<"4Y(D:``40H$R*0`&2,$D@4S?#/Y.64Y83G7B? XMB.*14T)F^$YU?`!(YS``)``F`>.)XY#CEN.)XY#CEM*#T8)D```$4H;CB>.0. XMXY9,WP`,3G4O`G0`/SP`0..)XY#CD@Q"``IM"`2"````"E*!4U=FZ$_O``(DS XM'TYU3E#_]$Y1``!(YWXP<`!R`#-````S0``",T``!#-```9A``%T#`8`,&8(O XM`&D@```$8.X,!@`M9@H`:8````1A``%6#`8`,&T^#`8`.6XX`&D@```$,T8`3 XM"CPI``:=:0`"+P`"G_````!G!E)I``)@SF$`_SH\*0`*`H8````/TH9"AM&&L XM8+@,!@`N9@Q*:0`&9F)2:0`&8*8,!@!%9P8,!@!E9E!A``#P#`8`*V<,#`8`6 XM+68*`&D0```$80``V@P&`#!M,`P&`#EN*CHI``#CZ0``X^D``-MI``#CZ0``B XM`D8`#]UI```,:0__``!MS.+I``!@\C\I``0"7R``9@HD:``40I)@``"`-"D`$ XM`#\I``0"7Q``9P)$0M5I``(O`(.?9U(S?``_``!*@&L*XXGCD%-I``!@\DIIC XM``)G(&L4=`35:0``80#^7&$`_F)3:0`"8-9A`/Z$4FD``F#,=``T*0``/RD`S XM!`)?@`!G!`C"`!].N@3.)&@`&"3`)($D:``4)+P````!<``P*0`(3-\$?DY9F XM3EA.=2PH``AG"B%\```````(3G5(Y_S@)&@`$$Z2/`!,WP<_,T8`"%.H``QF` XM"`!I"```!$YU/RD`!`)?"`!G`GS_3G5(YS``=O\D`&H``#@,@+_P``!E``!>4 XM2.?`P$AY`````DZZ!.983TS?`P-@``!&2.`!R`&```!I(YSQ`>`!R`$J`K XM9P``-&H```@X/(``1(`,@``@``!D```0.CQ!($ZZ`1A,WP(\3G4R`$)`2$!(- XM03H\0B!.N@$"3-\"/$YU``!P`"(`N4!(0$YU2.?`P$AY`````4ZZ`^I83TS?> XM`P-P`'(`N4!(0$YU2.?`P$AY`````DZZ`\Q83TS?`P,@/```?_"Y0'(`2$!.9 XM=4CGP,!(>0````1.N@.J6$],WP,#(#Q_\0``<@!.=0@```-G```>2.?`P$AYW XM````!$ZZ`X183TS?`P,(@``#",```0!`?_!(0$YU2$!(1'H0#(`````@;```O XM%DA`2$$P`4)!!$4!``R`````(&WL0D0,@```(`!L```&X8A01$A`2D!F```&) XMZ9A81'P`0_H`/APQ``#MN-A&2$`L`>FIZ;ZS1KU`Z4R:1$A`2$1.=0R`````^ XM(&P``#9(0$A!,`%"001%`0!L`/_H8```9@4$`P,"`@("`0$!`0$!`0$`````) XM````````````````=@`,@```(`!L```&X8A00TA`2D!F```&Z9A80W0`%#L`M XMP.6XUD)(0"0!YZGGNK-"M4#I2YI#;0``#$A`T$6`1$A`3G5$1>A-)`#JJ.JZ+ XMZJFQ@K6!2$"Y0$A`3G4``$CG/T!A```(3-\"_$YU/#R``#X\?_!(0$A".`#(^ XM1KE`S$*]0KU$L$=M``!.L$)M```L#(```'_P9@``"$J!9P``!D[Z_I"T1VT`I XM`!H,@@``?_!F```(2H-G```*(`(B`T[Z_G)*@F8```Q*@V8```9.^OY$3OK^) XM,K1';0``+@R"``!_\&8```A*@V<```H@`B(#3OK^0$J`9@``#$J!9@``!D[ZY XM_A).^OX`.@#*1V8``!I*@&8```Q*@68```9.^OVL3KK^/&````B[0`I``!#.2 XM0F8``"9*@F8```Q*@V8```9.^OV(P4+#0\M'3KK^$L%"PT/+1V````B_0@!"+ XM`!`$13_PVD=H```&3OK]B$A`+@'AB.&)X9^S1[]`2$(N`^&*X8OAG[='OT(NF XM`$A'SL,L`DA&S,'>AD)'WT=(1TA!+`',PD)&2$;>ADA#+`/,P$)&2$;>ADA`1 XM2$(L`,S"QL#>@W8`W8/"PMZ!W8,B`$A!)@)(0\##Q,'1@B0`0D#10$A`2$)"( XM0MZ"T8;"P]*'=`#1@D[Z`TP``"0``H!_____9@AP`'(`=`!@(DA"2,+H0@*"? XM@``'_P1"`_\O`G0*XXGCD%'*__H(P``?)!].=2\#+P"#GV=D!$(`"TJ`9@@@4 XM`4*!!$(`("\``I__X```9R120N*(XI'BDR\``I__X```9NY*@VH.4H%D"E*`E XM8-A30N.)XY`(```49_0&0@/_;QX,0@?_;"8"@``/___I2C\"0D)(0H1?2$*`> XM@B8?3G4O/`````%.N@`F<`!@%B\\`````DZZ`!@P/'_P2$*`0DA`0D!/[P`$* XM<@!@T```+PF?LT>_0$A"+@-\"^VJ[:OMO[='OT)(1#@%(D1(0H#".`!(R XM03`!0D%(0CH"RL1(0SP#S,1(0SX#SL1(1]Y&2$="1DA&W862AY&&9```"%-$N XMTH/1@D)#2$0L`$A"@,)H```80D0@!I*#2$*1@DA`2$$P`4)!8```*C@`2$$P/ XM`4)!2$(\`LS$+@-(1\[$2$?<1TA&0D?=1TA&DH>1AF0``!)31-*#T8)E```([ XM4T32@]&"+`!(0H#":```%$)%(`9(0I!"2$!(03`!8```%#H`2$$P`4A"/`+,Z XMQ9"&9```#E-%T()E```&4T70@DA%2$*`PF@```1P_SH`(`0B!2@).@1(1$[Z( XM``0```R``@```&T``!#BB.*12D5L``!,8```"@1%`!!L``!`1$7H35A%#$4`. XM.6\```Y.^OEF,@!"0$A`2$$$10`0;O(&10`0)`#JJ.JZZJFQ@K6!=`#3@M&"H XM2$"Y0$A`3G4D`.B(Z)KHB;&"M8%T`-."T8)(0-!%#$!_\&4$3OKY.+E`2$!.A XM=4CG/T!A```:3-\"_$YU2.<_0&$```A,WP+\3G4(0@`?2$!(0CP\@``^/'_PI XM.`#(1KE`.@#*1[M`S$*]0LY"OT*Z1V8``.`,17_P9@``*K!";0``$BX`CH%F. XM```.+@*.@V<```H@`B(#3OKY!KQ$9P``?D[Z^-Y*168``$1(0&8``"A*@68`1 XM`")(0F8```Y*@V8```C(1D[Z^'`@`B(#2$"]0+]`2$!.=4A"9@``'DJ#9@``P XM&$A`N4"[0$A`3G5^$)I'OT"_0DA`2$*\1&<``"22@V8```J1@F8```9.=9&"% XM:@``"$2!0(`X!D[Z^11.^OA4TH/1@@R``"```&T``!3BB.*1?@#3A]&'!D4`+ XM$`Q%?^!E```&3OKX&$A`T$6`1$A`3G5N```*P4+#0\E&RT<,17_P9P``,$I'Y XM9@``/DA"9@``$$J#9@``"KE`NT!(0$YUUH/5@DI%9@``)DA`TH'1@&```")*C XM@&8```Q*@68```9.^O?03OKW^`I"`!!(0@I``!!(0)Y%1D?H1P1%`"`,1P`T& XM;@``'M*!T8`,1P`@;P``("8"=``$1P`@[JMT`&```#0&10`02$#018!$2$!.L XM=0Q'`!!O```.-@)(0T)"2$($1P`0(D8L`NZJ[K[NJ[6&O8,L";Q$9@``/-*#; XMT8(&10`0XHCBD0R``"```&T```H&10`0XHCBD7X`TX?1ATA`T$4,17_P9```7 XM"(!$2$!.=4[Z]PR?AY.#D8(,@``@``!M`/ZV1(?2AWX`T8?BB.*1!D4`$$A`X XMT$6`1$A`3G5.5?^@2.W_T!M`__$;0/_\&T#__1M`__X;0/__*T'_H"M!_^0K0O^P*TC_S$H3? XM9TYP`!`3&```8``<&```68`;V```10`=6```.H`9&````)*+?_Q9PP@C XM4D/H``0DB2`08`H@4D/H``0DB2`0*T#_[&P*<@$K0?_H1*W_[$JM_^AG!'`M: XM8`Q*+?_^9P1P*V`"<"`;0/_0<``0+?_^(BW_Z(*`<``0+?_]@H!G"%*M_\Q2: XMK?_D+RW_["\M_\Q.N@W84$\K0/_(("W_\DJ`:@9R`2M!__(@+?_((BW_\I*`J XM2.T``O_$;RX@;?_,(DC3P6`"$MA3@&3Z<``0+?_[(BW_Q"!M_\Q@`A#`4X%DE XM^B`M__(K0/_(T:W_Y$'M_]`K2/_,2BW__V<``6P;?``@__M@``%B2BW_\6<,= XM(%)#Z``$)(D@$&`*(%)#Z``$)(D@$"M`_^Q@`/]@2BW_\6<,(%)#Z``$)(D@# XM$&`*(%)#Z``$)(D@$"M`_^Q*+?_\9Q(@;?_,$/P`,'(!*T'_Y"M(_\PO`"\M8 XM_\Q.N@TP4$\K0/_(8`#_)AM\`##_^R`M__)*@&H&<`@K0/_R2BW_\6<,(%)#" XMZ``$)(D@$&`*(%)#Z``$)(D@$"M`_^Q*+?_\9Q8@;?_,$/P`,!#\`'AR`BM!N XM_^0K2/_,+P`O+?_,3KH-#%!/*T#_R'!8L"W_\&8`_KQ(;?_03KH+K%A/8`#^E XMKB!20^@`!"2)(E`K2?_,9@A!^@6<*TC_S"!M_\Q*&&;\4XB1[?_,*TC_Y"`M8 XM__)*@&M&LW_T"M(_\Q*> XMK?_D9P13K?^T<`!R`!(M__XD+?_HA(%R`!(M__V$@2M`_[Q*@F<$4JW_O$JM) XM_[!G``"B(BW_M$J!:P33K?^\=``4+?_\)BW_\H:"*"W_H(:$9P12K?^\2H1G# XM:$H"9F1*K?_D9@8K0/_R8$Y2@20M_^24@4CM``+_J$CM``3_I&P&*T#_\F`R$ XM("W_\K"";P0K0O_RT<%3B"M(_ZQ*K?_R9Q@@;?_R<#`B;?^L(@BP,1@`9@93M XMK?_R8.)*K?_R9@13K?^\("W_\B(`4H'3K?^\8```HB`M__(B`%J!TZW_O$JM* XM_Z!G"%.M__)3K?^\("W_M$J`:@8B`$2!8`(B`"M!_[AP8[*`;P12K?^\#($`! XM``/G;P12K?^\<``0+?_\(BW_\B0`A($F+?^@A(-G!%*M_[Q*@V<^2@!F.B`MO XM_^2R@&T&4X`K0/_R2JW_\F<<(&W_\G`P(FW_S"((L#$8`&8*4ZW_\E.M_[Q@Y XMWDJM__)F!%.M_[Q*+?__9BP@+?^\(BW_]K*`;R"1K?_V4ZW_]FT6<``0+?_[1 XM+P`@;0`03I!83U*M_[Q@Y$JM_^AG#DAX`"T@;0`03I!83V`J2BW__F<.2'@`D XM*R!M`!!.D%A/8!9*+?_]9Q!P`!`M__LO`"!M`!!.D%A/2JW_L&<``,@@+?^TZ XM2H!J5$AX`#`@;0`03I!(>``N(&T`$$Z04$]3K?_R;0`!H%*M_[1L#DAX`#`@V XM;0`03I!83V#D4ZW_Y&T.<``@;?_,$!@K2/_,8`)P,"\`(&T`$$Z06$]@PB`M4 XM_[13K?^T2H!K(E.M_^1M#G``(&W_S!`8*TC_S&`"<#`O`"!M`!!.D%A/8-)*8 XMK?_R9PQ(>``N(&T`$$Z06$]3K?_R;0`!(E.M_^1M#G``(&W_S!`8*TC_S&`"0 XM<#`O`"!M`!!.D%A/8-93K?_D;0YP`"!M_\P0&"M(_\Q@`G`P+P`@;0`03I!8W XM3TJM__)G#$AX`"X@;0`03I!83U.M__)M(E.M_^1M#G``(&W_S!`8*TC_S&`"H XM<#`O`"!M`!!.D%A/8-@0+?_PP`68$<&5@`G!%+P`@;0`03I!8L XM3R`M_[1*@&H22'@`+2!M`!!.D%A/1*W_M&`,2'@`*R!M`!!.D%A/<`LK0/_`F XM4ZW_P"`M_[1R"DZZ#7QP,-*`("W_P!N!"-`@+?^T<@I.N@UF*T#_M`RM````, XM"?_`;LY*K?^T9L@@+?_`<@NP@6P64JW_P'(`$C4(T"\!(&T`$$Z06$]@X'`!J XML"W__V8L("W_O"(M__:R@&\@D:W_]E.M__9M%G``$"W_^R\`(&T`$$Z06$]2O XMK?^\8.0@"TS?#!Q.74YU``!.5?_V2.<`,"9O`!HD;P`>*VT`$/_V$!H;0/__/ XM2@!G-G(EL`%F(K(29@12BF`:+PM(;?_V+PIA`/;(3^\`#"M`__IG!"1`8,YP2 XM`!`M__\O`$Z36$]@P$S?#`!.74YU``!(YP``"0JP&EM'`)$AP(K`39B92BR2+2A-G"G`BL!-G!%*+8/)*$V8,V XM2'@``4ZZ#GQ83V">0AM@FB2+2A-G&!`3``H+R@`!$AL!E1.N@223^\`#$'L!E0BF XM""0\```#[BQL!R!.KO_B*4`%&"E`!2!R!"E!!1PI0`4H*4$%).6`D\DL>``$< XM*T#_\$ZN_MH@;?_P(D`C:``(`*1^`"M`__1@*BQL!R!.KO_**4`%&$ZN_\0I; XM0`4@0?H`IB(()#P```/M3J[_XBE`!2A^!"`'`$"``8&L!10@!P!`@`*!K`4<: XM`*P``(`#!21*K`,H9P1P`&`&(#P``(``+@!"K`+<(`<`0``!*4`"V'`!*4`"7 XM_B`'`$```BE``OIP`BE``R`@!P!``(`I0`,<0?H+,BE(!/0O+`:2+RP&CDZZ$ XM`#)"ETZZ!_Q,[4R$_]Q.74YU8V]N.C$P+S$P+S,R,"\X,"\`*@``````````' XM``````!.^0`````````````````````````````O"R9O``A*JP`49PP(*P`#0 XM`!MF!'``8#8O+`3`3KH'AEA/)T``!"=``!!*@&8*<`PI0`<<``"0J@!PI XM_[J`9@@(ZP`%`!M@#+JM__!G!@CK``0`&TH&9PXB*P`4)`%$@B="``Q@&`@KL XM``(`&V<(<@`G00`,8`@B*P`4)T$`#"!K`!`G2``$OH!G+E.K``QM%B!K``1#O XMZ``!)TD`!"`'$(!R`!(`8!(@!W(`$@`O"R\!80#]D%!/(@!P,,"K`!AG!'#_+ XM8`QP_[B`9@1P`&`"(`1,WPCT3EU.=0T*`````"YL!01.N@8^2'D````43KH$O XMK```````````<&%(YR`P)F\`$"1+2A)G)'``$!)![`.]"#```0@`9PIR`!(`L XM=""2@F`$<@`2`!2!4HI@V"`+3-\,!$YU``````````!P84Y5__A(YP,P)F\`$ XM("1O`"0N+P`H($I*&&;\4XB1RBP(($M*&&;\4XB1RR`((DO3P"M)__B\AV,"5 XM+`<@!B!*8`(2V%.`9/H@;?_X0C!H`"`+3-\,P$Y=3G4@;P`$(`A*&&;\4TB19 XMP"`(3G4``"!O``@B;P`$(`D2V&;\3G4B;P`((&\`!"`(2AAF_%.($-EF_$YU0 XM```@+P`((&\`!$Y5__0B3W(*3KH&1`9!`#`2P4J`9O`@"1#AO\EF^D(0D(].J XM74YU```@+P`((&\`!$Y5__0B3R(``D$`!P9!`#`2P>:(9O`@"1#AO\EF^D(0? XMD(].74YU```P,3(S-#4V-S@Y86)C9&5F("\`""!O``1#[P`$,@`"00`/$OL0P XMW.B(9O(@"2(/6($0X;*)9OI"$)"!3G4@;P`$(DAR`'``+P(,$``K9P8,$``M6 XM9@)22!`8!```,&T2#```"6X,)`'E@=*"TH'2@&#F#!$`+68"1($D'R`(4X`@+ XM;P`(((&0B4YU3E7_Z$CG`3(N+P`T2H=N!G#_8```TG`(OH!D`BX`(`=6@"X`, XM`D?__"1M``@@;0`(T+P8O"R\J``1.N@+83^\`#"H`2JP$W&<$B XM+P4O!B\K``1.N@&<) XM3^\`#"@`2JP$W&<$6$\F0"`+9Q(O!B\+3KK]4BZ'80#_5%!/8`)P`$S?#,!.=0``````K XM````<&$O!RXO``@O!TZZ_S)83RX?3G4``$CG`Q`N+P`01^P"P"`+9S0(*P`"Q XM`!MF*`@K``$`&V<@("L`!)"K`!`L`$J&9Q(O!B\K`!`O*P`<3KKUDD_O``PFB XM4V#(+P=.N@306$],WPC`3G4``$CG-Q`N+P`<)F\`("PO`"1*K`3T9P1.N@0H: XM0JP$W"(')`LF!BQL!R!.KO_0*@!P_[J`9@Y.KO]\*4`$W'`%*4`''"`%3-\(\ XM[$YU``!(YS\`+B\`'"PO`"`J+P`D2JP$]&<$3KH#W$*L!-P@!5.`(@W_L"E(`SQ(>``HV XM2'@`^G``+P`O`$AL`UAR`"\!2&P#1"\!3KH"]$AX`!1.N@,@+&W_K$Y=3G4J] XM*B!3=&%C:R!/=F5R9FQO=R`J*@``15A)5```:6YT=6ET:6]N+FQI8G)A*/__<$^^@&\"+@`@!T/MH XM_Z]@`A+84X!D^D(U>*^3R2QX``1.KO[:)D!*JP"L9TP@*P"LY8`D0"PJ`#A*S XMAF8$+"L`H$J&9S0B!D'Z`+(D"'8++&P'($ZN_]`@1U*'(`@;O``*"*\B!D'MT XM_Z\D""8'+&P'($ZN_]!P_V!.2JP'&&820_H`AG``+'@`!$ZN_=@I0`<80>W_< XMKRE(`XQ(>``\2'@`^G``+P`O`$AL`ZA(;`.42&P#@$*G3KH`_$_O`"!3@&<$= XM``43KH`9 XM1EA/(`=,WT"`3G5AM$YU``!(YS`R+&P'&"!O`!@B;P`<)&\`("9O`"0@+P`H9 XM(B\`+"0O`#`F+P`T3J[^I$S?3`Q.=0``2.<'`"XO`!`@+`*H4X`L`$I&:S`@0 XM!DC`YX!![`44*C`(`$H%9QH(!0`"9A0@!DC`YX!![`44+S`(!$ZZ_!183U-&4 XM8,PO!TZZU7983TS?`.!.=0``2.<`,B9L!R0@"V<4)%,B2R`K``@L>``$3J[_( XM+B9*8.B1R"E(!R@I2`80``3$_O``Q@M$AX``%(;?Y8+RW^T XM7F$``#8NK?Y>3KH#&BZM_EI.N@,23^\`#$HM_E9G"DAM_RM.N@,J6$]"ITZZ3 XM`QQ,[0C,_D!.74YUO^P$R&4``LA(YP$P)F\`$"1O`!0>+P`;2@=G%B\L`?A(\ XM>0`````O"TZZ`M1/[P`,8"Y!^0`````B2-/L`?A2K`'X$I)P0-"`L*P!^&82M XM0JP!^"\`+P@O"TZZ`J1/[P`,3-\,@$YUO^P$R&4``F)(YP`P)F\`#"1O`!`@\ XM+`'\L*P"`&8<0JP!_$AX`(!(>0```(`O"TZZ`IA/[P`,*4`"`$'Y````@-'L] XM`?Q2K`'\%)!*K`(`5\!$`$B`2,!,WPP`3G5.5?_XO^P$R&4``@)(YR\P+BT`< XM""9M``PD;0`0>@!P`2!M`!@0@'(`(&T`'!"!(&T`%!"!%($H`!`$2(`B`$C!* XMY8$@6!(',8`%*($!!(@`1``$1G-E-`9R8$3 XM0``+9S150&<``*0$0``29R!30&<0!$``"V<>54!G``".8```DB!M`!@0O``!O XM8```AB!M`!A"$&!\$`1(@"(`2,'E@2!S&`!4B$H09V@;?``"__E\`1`$2(`BB XM`$C!Y8$O,Q@`3KH!1EA/$BW_^4B!2,&R@&PL$`1(@"(`2,'E@1`M__E2+?_Y+ XM%`!(@B!S&`#0PA`02(!(P"(&3KH!0"P`8+0O!DZZ`1Y83WH!8`@@;0`<$+P`7 XM`5($8`#_$B`$2(!(P"('DH!P`K*`;!H@;0`<2A!F$DAL`@1.N@#>2'@!-DZZ[ XM`0!03R`$2(!(P"('DH!P`;*`;!H@;0`<2A!G$DAL`C1.N@"T2'@!0$ZZ`-90) XM3TH%9A)(;`)83KH`GDAX`&1.N@#`4$\0!$B`(@!(P>6!+S,8`"\*3KH`SE!/J XM(&T`'$H09AQ2!!`$2(`B`$C!Y8$O,Q@`+RT`%$ZZ`*Q03V`X+PHO+0`43KH`. XMGDAL`G0O"DZZ`&0NBB\M`!1.N@!R3^\`%$J`9A)(;`)Z3KH`+$AX`,A.N@!.E XM4$],WPST3EU.=4[Y```AK$[Y`````$[Y```B9$[Y```+($[Y```DR$[Y````, XM'$[Y```"'$[Y```$L$[Y````3$[Y```BB$[Y```HI$[Y```F:$[Y````:$[Y> XM````?$[Y```$;D[Y```(A$[Y````,$[Y```B>````^P````,````````!0``@ XM``4P```$[@``!08```36```%)```!-P```3T```%'@``!0P```3B```$R@``U XM``0````"```"G````H@```(N```"'`````8````$```%&```!2H```3Z```%5 XM$@``!.@```30`````````_)```/J````0```````````````````````````T XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM``````````````````/R```#Z@```3%%;F-R>7!T(%8Q+C`P(*DQ.3DP(&)Y% XM($1A=F4@4V-H2!T:&4@:6YP=70@86YD(&]U='!U="!F:6QE;F%M97,AG XM``!0;&5A2!T:&4@:6YP=70@9FEL96YA;64A``!0;&5A2!A('!A XM`````/__````!``$````````*&H```,P__\````$``0````````H@`````#_X XM_P````X`#@```````"IH`````/__````!``$``````````````-L__\````$D XM``0````````JA`````#__P````0`!````````"J.```````@("`@("`@("`HX XM*"@H*"`@("`@("`@("`@("`@("`@($@0$!`0$!`0$!`0$!`0$!"$A(2$A(2$T XMA(2$$!`0$!`0$(&!@8&!@0$!`0$!`0$!`0$!`0$!`0$!`0$!$!`0$!`0@H*"\ XM@H*"`@("`@("`@("`@("`@("`@("`@(0$!`0("`@("`@("`@("@H*"@H("`@6 XM("`@("`@("`@("`@("`@2!`0$!`0$!`0$!`0$!`0$(2$A(2$A(2$A(00$!`0` XM$!`0@8&!@8&!`0$!`0$!`0$!`0$!`0$!`0$!`0$0$!`0$!""@H*"@H("`@("^ XM`@("`@("`@("`@("`@("`A`0$!`@```````"`````^P````%`````````[0`M XM``.@```#>````V0```-0````!`````,```.0```#5````N(```+`````````O XM`_(```/I````)DCG(`(L>0``!R!,[P`&``Q.KO_B3-]`!$YU```O#BQY```'I XM("(O``A.KO_<+%].=4CG,`(L>0``!R!,[P`.`!!.KO_63-]`#$YU``!(YS`"0 XM+'D```<@3.\`#@`03J[_T$S?0`Q.=0``+PXL>0``!R`B+P`(3J[_N"Q?3G5(5 XMYR`"+'D```<@3.\`!@`,3J[_LDS?0`1.=0`````#[`````8````#````@@``[ XM`&P```!2````-@```"`````&`````````_`````"7U)E;F%M90````!\````" XM`U]$96QE=&5&:6QE`````&@````"7U=R:71E``````!,`````E]296%D````R XL````,`````)?0VQO. Mail comments to the moderator at . Post requests for sources, and general discussion to comp.sys.amiga.