page%swap@Sun.COM (Bob Page) (07/12/89)
Submitted-by: ehoogerbeets@rose.waterloo.edu (Edwin Hoogerbeets) Posting-number: Volume 89, Issue 163 Archive-name: unix/file.1 "file" is a unix-like utility to determine the type of file you have. [uuencoded executable included. ..bob] # This is a shell archive. # Remove anything above and including the cut line. # Then run the rest of the file through 'sh'. # Unpacked files will be owned by you and have default permissions. #----cut here-----cut here-----cut here-----cut here----# #!/bin/sh # shar: SHell ARchive # Run the following text through 'sh' to create: # ReadMe # makefile # file.c # file.uu # This is archive 1 of a 1-part kit. # This archive created: Tue Jul 11 17:03:20 1989 echo "extracting ReadMe" sed 's/^X//' << \SHAR_EOF > ReadMe X file v1.0 - Unix-like utility to determine X the type of a file X X Copyright 1989 Edwin Hoogerbeets X X This code is freely redistributable as long as no charge other than X reasonable copying fees is levied for it. X XUsage: X X file filename [filename ...] X X [Options? We don need no steekeen options!] X XNotes: X X This silly little hack I wrote for no particular reason other than X boredom in CS classes, where it was mostly written. ;-) X X File recognizes the following types of files: X X Amiga .font file - File containing the description of what is in X a subdirectory of the fonts directory. X ex: garnet.font X X Amiga .info file - The silly little files you find hanging around X in any directory you looked at with the WorkBench. X ex: .info X X Amiga icon .info file - A disk, drawer, project or tool icon. X ex: System.info X X Amiga load file - this type includes executables, shared libraries, X devices, and loadable font files. X They all have the format of an executable, so it X is difficult to tell which is which. (anyone have X a way of telling? Please mail me if you do) X ex: c:Type, arp.library, ramdrive.device, garnet/16 X X Amiga object file - A file compiled with Lattice C, PDC or A68k. X ex: SetFont.o X X block compressed xx bit code data - a file compressed with the X compress program. X ex: constitution.Z X X commands text - this file was not marked as a script file, but X contains commands suitable as a script. X ex: FooScript X X C source code - file contains constructs that look like C. If these X constructs are not found, the file may be mistaken X for a ARexx script if the first two characters are X `/*' X ex: file.c X X data - the file contains binary data of an unknown format. X X directory - file is a directory X X X empty - the file contains nothing, making it impossible to determine X what kind of file it was meant to be in its former life. X X execute script file - a file meant to be run with execute. X ex: s:DPAT X X IFF format file - File recognizes the following forms: X X 8SVX instrument file format X ANIM anim file format X ACBM Amiga compressed bit map format X ILBM interleave bit map format X SMUS simple music format X X LaTeX source code - input file suitable for the LaTeX document X preparation system. X ex: resume.tex X X Manx 3.6 run-time library - objects compiled with Manx 3.6 and X stuck into a linkable library. X ex: ed32.lib X X Manx 3.4 object code X Manx 3.6 object code - file compiled with Manx 3.4 or 3.6 respectively X ex: file.o X X Modula II source code - file is source code for any Modula II X ex: Primes.mod X X SEA ARC compressed archive - an archive compressed with the ARC program. X ex: boff.arc X X script file - text file with the script bit set. X ex: s:FindOldFiles X X shell commands - the file was not labeled as a script, but contains X shell commands. X ex: s:.cshrc X X shell script - the file is a script for the Dillon/Drew shell. X It searches for `#!' at the beginning of the file, X so please add these to your Dillon/Drew shell scripts. X ex: BackUpHD.sh X X TeX device independent output file - output of Tex, LaTeX, BibTeX X or AMSTeX. X ex: letter.dvi X X TeX source code - a file suitable for input to TeX document formatting X system. X ex: resume.tex X X text - the file contains ascii characters of an unknown format X ex: ReadMe X X uuencoded file - a file that is suitable as input for uudecode X ex: file.uue X X yacc input file - a file that is suitable as input to the yacc or X bison parser generator programs. X ex: grammar.y X X yacc or lex input file - a file that is either suitable for yacc X (bison) or lex. The exact format cannot X be determined by file due to its X unsophisticatedness. (how's that for a word?) X ex: lex.l or hiddengrammar.y X X Zoo x.xx archive - an archive made with the zoo program. X ex: file.zoo X XWarning: X X This program is a kludge. This program is only a kludge. Had this program X been real, it would have been a heck of a lot bigger. As it is, it only X checks the first 484 bytes of a file for format clues, and makes guesses X as to the probable file type. For binary files, magic numbers found at X the beginning of the file are checked. For text files, familiar sequences X are searched for throughout the excerpt to make the guess. X XThings it May Get Wrong: X X - An ARexx script starts with `/*', which, perchance, also start off many X C programs X X - Many TeX or LaTeX files contain "{\n", which are also found in X C programs X X - a binary file may very rarely contain only printable ascii characters X in the first section of the file, leading file to think it is X actually a piece of text. (no, your program has not been magically X transformed into a .font file!) X XA Comment: X X If you have a favourite file format that you would like added to the X program, send me mail and I will add it. Better yet, send me the X (freely redistributable) file that is characteristic of the file type. X Better yet, tell me what the distinguishing characteristic is. X Well, come to think of it, forget the above, and just send me your X patched version of file and I will incorperate the changes into the X official release. Have a nice day. This has been more than one X comment, hasn't it? I babble sometimes. X XFiles: X X ReadMe rwed 7111 14 21-May-89 23:21:26 X file rwed 9352 19 21-May-89 22:59:15 X file.c rwed 8528 17 21-May-89 22:58:10 X makefile rwed 337 1 19-May-89 23:29:52 X55 Blocks, 25328 Bytes used in 4 files X XPlease redirect any comments, criticisms or dark chocolate to: X XEdwin Hoogerbeets (It's a Dutch name. I was born with it... ) XUsenet: ehoogerbeets@rose.waterloo.edu (watmath!watrose!ehoogerbeets) or X edwin@watcsc.waterloo.edu XCIS: 72647,3675 (any time at all) X X X X SHAR_EOF echo "extracting makefile" sed 's/^X//' << \SHAR_EOF > makefile X# X# makefile for file X# X# Copyright 1989 Edwin Hoogerbeets X# X# This code is freely redistributable as long as no charge other than X# reasonable copying fees is levied for it. X# X XCFLAGS=+L X#-n -DDEBUG X XLNDEBUG= X#-g X XBINDIR=dh0:usr/local/bin X Xfile: file.o X ln file.o $(LNDEBUG) -lc32 -o $@ X Xinstall: file X cp -f file $(BINDIR) X X SHAR_EOF echo "extracting file.c" sed 's/^X//' << \SHAR_EOF > file.c X/* X * file v1.0 - a Unix-like utility to determine the type of a file X * X * Copyright 1989 Edwin Hoogerbeets X * X * This code is freely redistributable as long as no charge other than X * reasonable copying fees is levied for it. X * X * X * Usage: file file [file ...] X * X */ X#include <stdio.h> X#include <ctype.h> X#include <libraries/dosextens.h> X#include <exec/memory.h> X X#define toint(a) (int)((a) - '0') X#define BLOCKSIZE 484L /* almost size of one disk block */ X Xtypedef struct asdf { X int length; X char *name; X char *pattern; X} pattern; X X/* for binary files that start with a magic number */ Xpattern bmagic[] = { X 4,"Amiga load file", "\x00\x00\x03\xf3", X 4,"Amiga object file", "\x00\x00\x03\xe7", X 2,"Amiga run-time library", "\xec\x62", X 2,"Manx 3.6 run-time library", "\x61\x6a", X 2,"Manx 3.6 object file", "\x41\x4a", X 2,"Manx 3.4 object file", "\x6a\x67", X 27,"TeX device independent output file", X "\xf7\x02\x01\x83\x92\xc0" X "\x1c\x3b\x00\x00\x00\x00" X "\x03\xe8\x1b\x20\x54\x65" X "\x58\x20\x6f\x75\x74\x70" X "\x75\x74\x20", X 2,"Amiga icon .info file", "\xe3\x10", X 4,"Amiga .info file", "\xf3\x4c\x00\x12", X 2,"Amiga .font file", "\x0f\x00", X 2,"SEA ARC compressed archive", "\x1a\x08", X NULL, NULL, NULL, X}; X X/* for ascii files that start with a magic number */ Xpattern amagic[] = { X 2, "shell script file", "#!", X 2, "ARexx script file", "/*", X 4, "execute script file", ".key", X 4, "execute script file", ".bra", X 4, "execute script file", ".ket", X NULL, NULL, NULL, X}; X X/* patterns to search for in ascii files */ Xpattern asearch[] = { X 14,"LaTeX source code", "\\documentstyle", X 6, "TeX source code", "\n\\", X 4, "C source code", "int ", X 5, "C source code", "\n#inc", X 5, "C source code", "\n#def", X 2, "C source code", "{\n", X 21,"Modula II source code", "IMPLEMENTATION MODULE", X 17,"Modula II source code", "DEFINITION MODULE", X 5, "execute script file", "\n.key", X 5, "execute script file", "\n.bra", X 5, "execute script file", "\n.ket", X 1, "yacc input file", "\n%TOKEN", X 1, "yacc or lex input file", "\n%%", X 1, "shell commands", "\nalias", X 1, "shell commands", "\nAlias", X 1, "shell commands", "\nset", X 1, "commands text", "\nrun", X 1, "commands text", "\nRun", X 1, "uuencoded file", "\nbegin ", X NULL, NULL, NULL, X}; X Xpattern IFFforms[] = { X 4,"IFF interleave bit map file", "ILBM", X 4,"IFF Amiga compressed bit map files", "ACBM", X 4,"IFF anim format file", "ANIM", X 4,"IFF instrument file", "8SVX", X 4,"IFF simple music file", "SMUS", X NULL, NULL, NULL, X}; X Xpattern compress = { X 2,"block compressed %d bit code data", "\x1f\x9d", X}; X Xpattern zoo = { X 4,"Zoo archive", "ZOO ", X}; X Xint type(ty,name) Xchar *ty,*name; X{ X printf("%-16s %s\n",name,ty); X} X Xint memncmp(a,b,length) Xchar *a, *b; Xint length; X{ X register int index; X X for ( index = 0; index < length; index++ ) { X if ( a[index] != b[index] ) { X return(a[index] > b[index] ? -1 : 1); X } X } X X return(0); X} X Xchar *strrpbrk(str, charset) Xregister char *str, *charset; X{ X register char *temp; X extern char *index(); X X temp = str + strlen(str) - 1; X X while ( temp != (str - 1) && !index(charset, *temp) ) X --temp; X X return( (temp != (str - 1)) ? temp : NULL); X} X Xchar *basename(buf) Xregister char *buf; X{ X register char *foo = strrpbrk(buf,":/"); X X return( foo ? (foo + 1) : buf ); X} X Xusage(name) Xchar *name; X{ X printf("usage: %s file [file ...]\n",name); X exit(-1); X} X Xmain(argc,argv) Xint argc; Xchar **argv; X{ X register int index; X register char *myname; X X /* if there are no arguments, take from the stdin */ X if ( argc <= 1 ) { X usage(argv[0]); X } X X myname = basename(argv[0]); X X for ( index = 1 ; index < argc ; index++ ) { X filetype(myname,argv[index]); X } X} X X#define FIBSIZE (long) sizeof(struct FileInfoBlock) Xextern char *AllocMem(); Xextern struct FileLock *Lock(); X X/* find whether file is directory or real file */ Xfiletype(myname,filename) Xchar *myname, *filename; X{ X struct FileLock *lock; X struct FileInfoBlock *fib; X X if ( lock = Lock(filename,ACCESS_READ) ) { X if ( fib = (struct FileInfoBlock *) AllocMem(FIBSIZE,MEMF_CLEAR) ) { X Examine(lock,fib); X X dofile(myname,filename,fib); X X UnLock(lock); X FreeMem(fib,FIBSIZE); X X } else { X UnLock(lock); X fprintf(stderr,"%s: not enough memory!\n",myname,filename); X exit(-1); X } X } else { X fprintf(stderr,"%s: could not access file %s\n",myname,filename); X } X} X X/* find what type of file filename is */ Xint dofile(myname,filename,fib) Xchar *myname, *filename; Xstruct FileInfoBlock *fib; X{ X register char *f = &fib->fib_FileName[0]; X X if ( fib->fib_DirEntryType > 0 ) { X X type("directory",f); X X } else if ( fib->fib_Size == 0 ) { X X type("empty",f); X X } else { X char *buf; X long filehandle; X X if ( !(filehandle = Open(filename,MODE_OLDFILE)) ) { X fprintf(stderr,"%s: could not open file %s\n",myname,filename); X return(0); X } X X if ( !(buf = AllocMem(BLOCKSIZE+1,MEMF_PUBLIC)) ) { X fprintf(stderr,"%s: not enough memory\n",myname); X Close(filehandle); X return(0); X } X X if ( !Read(filehandle,buf,BLOCKSIZE) ) { X fprintf(stderr,"%s: read error on file %s\n",myname,f); X FreeMem(buf,BLOCKSIZE+1); X Close(filehandle); X return(0); X } X X matchtype(myname,buf,f,fib); X X Close(filehandle); X FreeMem(buf,BLOCKSIZE+1); X } X X return(0); X} X Xint isasciifile(buf,len) Xchar *buf; Xint len; X{ X register int index, flag = 1; X X for ( index = 0; index < len ; index++ ) { X if ( !isprint(buf[index]) && !isspace(buf[index]) ) { X flag = 0; X break; X } X } X X return(flag); X} X Xmatchtype(myname,buf,file, fib) Xchar *myname, *buf, *file; Xstruct FileInfoBlock *fib; X{ X register int index; X int len = (fib->fib_Size < BLOCKSIZE) ? fib->fib_Size : BLOCKSIZE; X X if ( isasciifile(buf,len) ) { X X index = 0; X X /* check magic numbers */ X while ( asearch[index].length ) { X if ( search(asearch[index].pattern,buf,len) ) { X type(asearch[index].name,file); X return(0); X } X ++index; X } X X index = 0; X X /* check magic numbers */ X while ( amagic[index].length ) { X if ( !memncmp(amagic[index].pattern,buf,amagic[index].length) ) { X type(amagic[index].name,file); X return(0); X } X ++index; X } X X /* check script bit */ X if ( fib->fib_Protection & (1<<6) ) { X type("script file",file); X return(0); X } X X type("text",file); X X } else { X X index = 0; X X /* check magic numbers */ X while ( bmagic[index].length ) { X if ( !memncmp(bmagic[index].pattern,buf,bmagic[index].length) ) { X type(bmagic[index].name,file); X return(0); X } X ++index; X } X X /* check for IFF forms -- assume FORM is first header block */ X if ( !memncmp("FORM",buf,4) ) { X char buffer[40]; X X index = 0; X buffer[0] = '\0'; X X while ( IFFforms[index].length ) { X if ( !memncmp(IFFforms[index].pattern,&buf[8],IFFforms[index].length) ) { X type(IFFforms[index].name,file); X return(0); X } X ++index; X } X sprintf(buffer,"IFF form %c%c%c%c",buf[8],buf[9],buf[10],buf[11]); X type(buffer,file); X return(0); X } X X if ( !memncmp(compress.pattern,buf,compress.length) ) { X char buffer[40]; X X sprintf(buffer,compress.name,buf[2]&0x0f); X type(buffer,file); X return(0); X } X X if ( !memncmp(zoo.pattern,buf,zoo.length) ) { X X /* make a string out of ZOO x.xx Archive\0 to print out */ X buf[16] = '\0'; X X type(buf,file); X return(0); X } X X type("data",file); X } X} X Xint search(pat, text, len) Xchar *pat, *text; Xregister int len; X{ X register int index = 0, patlen = strlen(pat); X X while ( memncmp(pat,&text[index],patlen) && index < len ) { X index++; X } X X return(index < len ? 1 : 0); X} X X X X X X X X SHAR_EOF echo "extracting file.uu" sed 's/^X//' << \SHAR_EOF > file.uu X Xbegin 644 file XM```#\P`````````#``````````(```>4```!.`````$```/I```'E$[Z#))!^ XM;6EG82!L;V%D(&9I;&4````#\P!!;6EG82!O8FIE8W0@9FEL90````/G`$%MB XM:6=A(')U;BUT:6UE(&QI8G)A<GD`[&(`36%N>"`S+C8@<G5N+71I;64@;&EB8 XM<F%R>0!A:@!-86YX(#,N-B!O8FIE8W0@9FEL90!!2@!-86YX(#,N-"!O8FIE_ XM8W0@9FEL90!J9P!495@@9&5V:6-E(&EN9&5P96YD96YT(&]U='!U="!F:6QE( XM`/<"`8.2P!P[``````/H&R!495@@;W5T<'5T(`!!;6EG82!I8V]N("YI;F9OP XM(&9I;&4`XQ``06UI9V$@+FEN9F\@9FEL90#S3``2`$%M:6=A("YF;VYT(&9IP XM;&4`#P``4T5!($%20R!C;VUP<F5S<V5D(&%R8VAI=F4`&@@``'-H96QL('-CV XM<FEP="!F:6QE`",A`$%297AX('-C<FEP="!F:6QE`"\J`&5X96-U=&4@<V-R4 XM:7!T(&9I;&4`+FME>0!E>&5C=71E('-C<FEP="!F:6QE`"YB<F$`97AE8W5T= XM92!S8W)I<'0@9FEL90`N:V5T``!,851E6"!S;W5R8V4@8V]D90!<9&]C=6UE/ XM;G1S='EL90!495@@<V]U<F-E(&-O9&4`"EP`0R!S;W5R8V4@8V]D90!I;G0@0 XM`$,@<V]U<F-E(&-O9&4`"B-I;F,`0R!S;W5R8V4@8V]D90`*(V1E9@!#('-OF XM=7)C92!C;V1E`'L*`$UO9'5L82!)22!S;W5R8V4@8V]D90!)35!,14U%3E1!; XM5$E/3B!-3T153$4`36]D=6QA($E)('-O=7)C92!C;V1E`$1%1DE.251)3TX@I XM34]$54Q%`&5X96-U=&4@<V-R:7!T(&9I;&4`"BYK97D`97AE8W5T92!S8W)IS XM<'0@9FEL90`*+F)R80!E>&5C=71E('-C<FEP="!F:6QE``HN:V5T`'EA8V,@U XM:6YP=70@9FEL90`*)51/2T5.`'EA8V,@;W(@;&5X(&EN<'5T(&9I;&4`"B4E. XM`'-H96QL(&-O;6UA;F1S``IA;&EA<P!S:&5L;"!C;VUM86YD<P`*06QI87,`< XM<VAE;&P@8V]M;6%N9',`"G-E=`!C;VUM86YD<R!T97AT``IR=6X`8V]M;6%NQ XM9',@=&5X=``*4G5N`'5U96YC;V1E9"!F:6QE``IB96=I;B``249&(&EN=&5R] XM;&5A=F4@8FET(&UA<"!F:6QE`$E,0DT`249&($%M:6=A(&-O;7!R97-S960@W XM8FET(&UA<"!F:6QE<P!!0T)-`$E&1B!A;FEM(&9O<FUA="!F:6QE`$%.24T`+ XM249&(&EN<W1R=6UE;G0@9FEL90`X4U98`$E&1B!S:6UP;&4@;75S:6,@9FELB XM90!33553``!B;&]C:R!C;VUP<F5S<V5D("5D(&)I="!C;V1E(&1A=&$`'YT`& XM`%IO;R!A<F-H:79E`%I/3R```$Y5```O+0`(+RT`#$AZ``Y.N@T.3^\`#$Y=I XM3G4E+3$V<R`E<PH`3E4``"\$>`!@,B!M``@B;0`,$#!(`+`Q2`!G'B!M``@BN XM;0`,$#!(`+`Q2`!O!'#_8`)P`2@?3EU.=5*$N*T`$&W(<`!@[DY5``!(YP@P< XM)&T`""9M``PO"DZZ!V!83]"**`!3A"!*4XBQQ&<:($00$$B`2,`O`"\+3KH'G XMBE!/2H!F!%.$8-X@2E.(L<1G!"`$8`)P`$S?#!!.74YU3E4``$CG`#`D;0`(= XM2'H`'B\*89903R9`(`MG!B`+4H!@`B`*3-\,`$Y=3G4Z+P``3E4``"\M``A(3 XM>@`63KH,(%!/2'C__TZZ%<Q83TY=3G5U<V%G93H@)7,@9FEL92!;9FEL92`N/ XM+BY="@``3E4``$CG""`,K0````$`"&X*(&T`#"\08:I83R!M``PO$$ZZ_W!8H XM3R1`>`%@%"`$Y8`@;0`,+S`(`"\*81)03U*$N*T`"&WF3-\$$$Y=3G5.5?_X1 XM2'C__B\M``Q.NA=.4$\K0/_\9P``@DAY``$``$AX`01.NA>Z4$\K0/_X9SPOS XM+?_X+RW__$ZZ%O103R\M__@O+0`,+RT`"$ZZ`*!/[P`,+RW__$ZZ%T)83TAX< XM`00O+?_X3KH7H%!/8"PO+?_\3KH7*%A/+RT`#"\M``A(>@`V2&R"ZDZZ!>Q/S XM[P`02'C__TZZ%,183V`8+RT`#"\M``A(>@`J2&R"ZDZZ!<A/[P`03EU.=25S] XM.B!N;W0@96YO=6=H(&UE;6]R>2$*`"5S.B!C;W5L9"!N;W0@86-C97-S(&9IP XM;&4@)7,*`$Y5__@O"B1M`!!0BB!M`!!*J``$;Q`O"DAZ`1!.NOUX4$]@``$`\ XM(&T`$$JH`'QF$"\*2'H!`$ZZ_5Y03V```.9(>`/M+RT`#$ZZ%CA03RM`__AF: XM("\M``PO+0`(2'H`W$AL@NI.N@4B3^\`$'``)%].74YU2'@``4AX`>5.NA9V# XM4$\K0/_\9B(O+0`(2'H`R$AL@NI.N@3R3^\`#"\M__A.NA5X6$]P`&#$2'@!' XMY"\M__PO+?_X3KH5Y$_O``Q*@&8T+PHO+0`(2'H`HTAL@NI.N@2V3^\`$$AXO XM`>4O+?_\3KH6.%!/+RW_^$ZZ%2Y83W``8`#_>B\M`!`O"B\M__PO+0`(3KH`H XMWD_O`!`O+?_X3KH5"%A/2'@!Y2\M__Q.NA7Z4$]P`&``_T9D:7)E8W1O<GD`H XM96UP='D`)7,Z(&-O=6QD(&YO="!O<&5N(&9I;&4@)7,*`"5S.B!N;W0@96YOB XM=6=H(&UE;6]R>0H`)7,Z(')E860@97)R;W(@;VX@9FEL92`E<PH`3E4``$CGP XM#`!Z`7@`8#X@;0`($#!(`$B`2,!![((]$C`(`$B!2,'"O````,=F'"!M``@0^ XM,$@`2(!(P$'L@CT(,``$"`!F!'H`8`A2A+BM``QMO"`%3-\`,$Y=3G5.5?_48 XM+P0@;0`4#*@```'D`'QL"B!M`!0@*`!\8`8@/````>0K0/_\+RW__"\M``Q.> XMNO]R4$]*@&<``/AX`'(,(`1.NA/.0>R`VDJP"`!G2B\M__PO+0`,<@P@!$ZZ9 XM$[1![(#B+S`(`$ZZ`MI/[P`,2H!G(B\M`!!R#"`$3KH3E$'L@-XO,`@`3KK[P XM*%!/<``H'TY=3G52A&"D>`!R#"`$3KH3<$'L@))*L`@`9U)R#"`$3KH37D'LM XM@)(O,`@`+RT`#'(,(`1.NA-*0>R`FB\P"`!.NOL$3^\`#$J`9AXO+0`0<@P@_ XM!$ZZ$RI![("6+S`(`$ZZ^KY03W``8)12A&"<(&T`%`@H``8`=V<4+RT`$$AZ_ XM`@1.NOJ<4$]P`&``_W(O+0`02'H!_$ZZ^HA03V```>)X`'(,(`1.NA+80>R`4 XM`DJP"`!G5'(,(`1.NA+&0>R``B\P"``O+0`,<@P@!$ZZ$K)![(`*+S`(`$ZZ3 XM^FQ/[P`,2H!F("\M`!!R#"`$3KH2DD'L@`8O,`@`3KKZ)E!/<`!@`/[\4H1@; XMFDAX``0O+0`,2'H!@TZZ^C!/[P`,2H!F``#.>`!"+?_4<@P@!$ZZ$E)![('*& XM2K`(`&=8<@P@!$ZZ$D!![('*+S`(`"!M``Q0B"\(<@P@!$ZZ$BA![('2+S`(/ XM`$ZZ^>)/[P`,2H!F("\M`!!R#"`$3KH2"$'L@<XO,`@`3KKYG%!/<`!@`/YR, XM4H1@EB!M``P0*``+2(!(P"\`(&T`#!`H``I(@$C`+P`@;0`,$"@`"4B`2,`O: XM`"!M``P0*``(2(!(P"\`2'H`SDAM_]1.N@8<3^\`&"\M`!!(;?_43KKY/%!/` XM<`!@`/X2+RR"$B\M``PO+((:3KKY2D_O``Q*@&8X(&T`#!`H``)(@$C`P+P`* XM```/+P`O+((62&W_U$ZZ!<Q/[P`,+RT`$$AM_]1.NOCL4$]P`&``_<(O+((>E XM+RT`#"\L@B9.NOCZ3^\`#$J`9AP@;0`,0B@`$"\M`!`O+0`,3KKXN%!/<`!@) XM`/V.+RT`$$AZ`#1.NOBD4$]@`/U\<V-R:7!T(&9I;&4`=&5X=`!&3U)-`$E&F XM1B!F;W)M("5C)6,E8R5C`&1A=&$``$Y5``!(YPX`*"T`$'H`+RT`"$ZZ`#I8Q XM3RP`+P8@;0`,T<4O""\M``A.NOAJ3^\`#$J`9PBZA&P$4H5@WKJ$;`1P`6`"K XM<`!,WP!P3EU.=2!O``0@"$H89OR1P"`(4X!.=4Y5```I;0`(A()(;0`0+RT`O XM#$AZ``Y.N@6X3^\`#$Y=3G5.50``+RR$@B\M``A.N@G"4$].74YU(&\`!"`O# XM``@2&&<*L@!F^"`(4X!.=7``3G5A<$/LA()%[(2"M<EF#C(\`!=K"'0`(L)1T XMR?_\*4^$CBQX``0I3H222.>`@`@N``0!*6<02_H`"$ZN_^)@!D*G\U].<T/Z6 XM`"!.KOYH*4"$EF8,+CP``X`'3J[_E&`$3KH`&E!/3G5D;W,N;&EB<F%R>0!)4 XM^0``?_Y.=4Y5```O"DAY``$``#`LA';!_``&+P!.NA",*4"$FE!/9A1"ITAY- XM``$``$ZZ$$Q03RYLA(Y.=2!LA)I":``$(&R$FC%\``$`$"!LA)HQ?``!``H@U XM;(2.("R$CI"H``10@"E`A)X@;(2>(+Q-04Y80J=.NA!`)$!*J@"L6$]G,"\M0 XM``PO+0`(+PI.N@"R*7P````!A*(@;(2:`&B````$(&R$F@!H@```"D_O``Q@+ XM0DAJ`%Q.NA!<2&H`7$ZZ$!XI0(2F(&R$IDJH`"103V<0(&R$IB)H`"0O$4ZZI XM#OQ83R\LA*8O"DZZ`G@I;(2FA*I03TZZ#PX@;(2:((!.N@]$(&R$FB%```9G_ XM%DAX`^U(>@`L3KH/("!LA)HA0``,4$\O+(2J+RR$KDZZ]TA"ITZZ#.I/[P`,O XM)%].74YU*@!.50``2.<,,"1M`!`@;0`(2J@`K&<8(&T`""`H`*SE@"@`($0@6 XM*``0Y8`F0&`$)FR$>!`32(!(P-"M``Q4@"E`A+)"IR\LA+).N@\>*4"$ME!/5 XM9@A,WPPP3EU.=1`32(!(P"H`+P4@2U*(+P@O+(2V3KH!CB!LA+;1Q4/Z`5@0^ XMV6;\+RT`#"\*+RR$MDZZ`4X@;(2V0C!8`"E\`````82N(&R$MM'%)DA2BR1+& XM3^\`&!`32(!(P"H`L+P````@9R"ZO`````EG&+J\````#&<0NKP````-9PBZI XMO`````IF!%*+8,P,$P`@;0``C`P3`")F,E*+($M2BQ`02(!(P"H`9R`@2E**6 XM$(6ZO````")F$`P3`")F!%*+8`9"*O__8`)@TF!$($M2BQ`02(!(P"H`9S"ZF XMO````"!G*+J\````"6<@NKP````,9QBZO`````UG$+J\````"F<(($I2BA"%V XM8,(@2E**0A!*A68"4XM2K(2N8`#_/$(20J<@+(2N4H#E@"\`3KH-XBE`A*I09 XM3V8(0JR$KF``_KYZ`"9LA+9@'B`%Y8`@;(2J(8L(`"!+(`A*&&;\D<!3B%*(2 XMU\A2A;JLA*YMW"`%Y8`@;(2J0K`(`&``_H(@`#`\?_]@!#`O``X@;P`$2AAFK XM_%-((F\`"%-`$-E7R/_\9P)"$"`O``1.=4SO`P``!"`((B\`#&`"$-E7R?_\$ XM9P9206`"0AA1R?_\3G5.50``2.<.,"1M``A"ITAZ`(Y.N@UT*4"$NE!/9@A,_ XMWPQP3EU.=2!M``PB:``D+RD`!$ZZ#:0H`%A/9U)(>@!M($0O*``V3KH-=B9`^ XM2H!03V<T2'@#[2\+3KH,>BP`4$]G)"`&Y8`J`"!%)6@`"`"D)48`G$AX`^U(D XM>@`X3KH,5B5``*!03R\$3KH-0EA/+RR$NDZZ#)Y"K(2Z6$]@@&EC;VXN;&EB] XM<F%R>0!724Y$3U<`*@!.50``+P0I;0`(A(9(;0`0+RT`#$AZ`!I.N@#8*``@O XM;(2&0A`@!$_O``PH'TY=3G5.50``(&R$AE*LA(80+0`+$(!(@$C`P+P```#_/ XM3EU.=4Y5``!(;0`,+RT`"$AZ!*!.N@"03^\`#$Y=3G5.50``2.<(("1M`!`,3 XMK0````0`%&8((&T`""@08!1*K0`,;P@@;0`(*!!@!B!M``@H$$*M`!1*K0`,T XM;!)$K0`,2H1L"D2$*WP````!`!0B+0`,(`1.N@/60>R"*E.*%+`(`"(M``P@@ XM!$ZZ`\XH`&;>2JT`%&<&4XH4O``M(`I,WP003EU.=4Y5_Q1(YP@P)&T`""9M[ XM``Q"K?_X*VT`$/_\($M2BQ`02(!(P"@`9P`#-+B\````)68``PY"+?\B*WP`: XM```!__0K?````"#_\"M\```G$/_L($M2BQ`02(!(P"@`L+P````M9A!"K?_T$ XM($M2BQ`02(!(P"@`N+P````P9A0K?````##_\"!+4HL0$$B`2,`H`+B\````8 XM*F8:(&W__%BM__PK4/_H($M2BQ`02(!(P"@`8#1"K?_H8")R"B`M_^A.N@G>_ XMT(20O````#`K0/_H($M2BQ`02(!(P"@`0>R"/0@P``)(`&;2N+P````N9F(@R XM2U*+$!!(@$C`*`"PO````"IF&B!M__Q8K?_\*U#_["!+4HL0$$B`2,`H`&`TX XM0JW_[&`B<@H@+?_L3KH)=-"$D+P````P*T#_["!+4HL0$$B`2,`H`$'L@CT(/ XM,``"2`!FTBM\````!/_DN+P```!L9A8@2U*+$!!(@$C`*``K?`````3_Y&`4^ XMN+P```!H9@P@2U*+$!!(@$C`*``@!&```((K?`````C_X&`<*WP````*_^!@N XM$BM\````$/_@8`@K?/____;_X"\M_^1(;?\B+RW_X"\M__Q.NOVR*T#_W"`MZ XM_^31K?_\3^\`$&!<(&W__%BM__PB4"M)_]P@"4H99OR3P%.)*TG_Y&!*(&W_9 XM_%BM__PH$$'M_R$K2/_<$(1@*)"\````8V?B4X!GDI"\````"V<`_VQ9@&>R+ XM58!G`/]L5X!G`/]P8,Q![?\BD>W_W"M(_^0@+?_DL*W_[&\&*VW_[/_D2JW_' XM]&=P(&W_W`P0`"UG"B!M_]P,$``K9C0,K0```##_\&8J4ZW_Z"!M_]Q2K?_<' XM$!!(@$C`+P!.DK"\_____UA/9@IP_TS?#!!.74YU8!@O+?_P3I*PO/____]8% XM3V8$</]@XE*M__@@+?_H4ZW_Z+"M_^1NVD*M_^!@)"!M_]Q2K?_<$!!(@$C`' XM+P!.DK"\_____UA/9@1P_V"J4JW_X"!M_]Q*$&<*("W_X+"M_^QMRB`M_^#1Z XMK?_X2JW_]&8J8!I(>``@3I*PO/____]83V8&</]@`/]P4JW_^"`M_^A3K?_HB XML*W_Y&[88!@O!$Z2L+S_____6$]F!G#_8`#_2%*M__A@`/S`("W_^&``_SA(7 XMYT@`0H1*@&H$1(!21$J!:@9$@0I$``%A/DI$9P)$@$S?`!)*@$YU2.=(`$*$W XM2H!J!$2`4D1*@6H"1(%A&B`!8-@O`6$2(`$B'TJ`3G4O`6$&(A]*@$YU2.<PX XM`$A!2D%F($A!-@$T`$)`2$"`PR(`2$`R`H+#,`%"04A!3-\`#$YU2$$F`2(`' XM0D%(04A`0D!T#]"`TX&V@6($DH-20%'*__),WP`,3G5.50``2&R"U"\M``A.F XMN@`(4$].74YU3E4``"\$*"T`""\M``PO!$ZZ`#2XO`````I03V8F(&T`#!`H3 XM``Q(@$C`"```!V<42'C__R\M``Q.N@#\4$\H'TY=3G5@^$Y5```O"B1M``P@5 XM4K'J``1E&B`M``C`O````/\O`"\*3KH`SE!/)%].74YU(%)2DA`M``L0@$B`$ XM2,#`O````/]@Y$Y5```O"D'L@KXD2"!*U?P````6+PAA$%A/0>R$=K7(9>HDS XM7TY=3G5.50``2.<(("1M``AX`"`*9@IP_TS?!!!.74YU2BH`#&=2""H``@`,' XM9PQ(>/__+PIA5"@`4$\0*@`-2(!(P"\`3KH%-(B`""H``0`,6$]G"B\J``A.[ XMN@(\6$\(*@`%``QG$B\J`!).N@+8+RH`$DZZ`B)03T*20JH`!$*J``A"*@`,. XM(`1@CDY5__Y(YP@@)&T`"$'Z_T0I2(2^""H`!``,9PIP_TS?!!!.74YU""H`4 XM`@`,9S0@4I'J``@H""\$+RH`"!`J``U(@$C`+P!.N@*6L(1/[P`,9Q`(Z@`$S XM``Q"DD*J``1P_V"\#*W_____``QF$`BJ``(`#$*20JH`!'``8*)*J@`(9@@OA XM"DZZ`*183PQJ``$`$&8P&VT`#___2'@``4AM__\0*@`-2(!(P"\`3KH",K"\Q XM`````4_O``QFF"`M``Q@`/]>)*H`"#`J`!!(P-"J``@E0``$".H``@`,(%)26 XMDA`M``\0@$B`2,#`O````/]@`/\N3E4``"\*0>R"OB1(2BH`#&<8U?P````6A XM0>R$=K7(90AP`"1?3EU.=6#B0I)"J@`$0JH`""`*8.I.5?_\+PHD;0`(2'@$4 XM`$ZZ`,(K0/_\6$]F\``$`$"!*T?P````.)4@`""1?3EU.=35\!```$`CJY XM``$`#"5M__P`"!`J``U(@$C`+P!.N@#>2H!83V<&`"H`@``,8,Q.50``2.<`@ XM,"1LA(I@%"92("H`!%"`+P`O"DZZ!,A03R1+(`IFZ$*LA(I,WPP`3EU.=4Y5> XM```O"D'Z_\8I2(3"0J<@+0`(4(`O`$ZZ!'(D0$J`4$]F"'``)%].74YU)*R$; XMBB5M``@`!"E*A(H@"E"`8.9.50``+RT`"&&V6$].74YU3E4``$CG`#"7RR1L0 XMA(I@#B!M``A1B+'*9Q(F2B12(`IF[G#_3-\,`$Y=3G4@"V<$)I)@!"E2A(H@Q XM*@`$4(`O`"\*3KH$'G``4$]@V$Y5```O"G(&("T`"$ZZ`N`D0-7LA)I*K0`(L XM;1(P+(1V2,`B+0`(LH!L!$J29A`I?`````*$QG#_)%].74YU<@8@+0`(3KH"0 XMJ"!LA)HO,`@`3KH#"DJ`6$]G!'`!8`)P`?E4``"\M``A.N@+"2H!83V8.; XM3KH"WBE`A,9P_TY=3G5P`Ϥ``$CG#"`H+0`(3KH`=G(&(`1.N@)2)$#5* XM[(2:2H1M#C`LA'9(P+B`;`1*DF82*7P````"A,9P_TS?!#!.74YU,"H`!,!\T XM``-F#"E\````!83&</]@XB\M`!`O+0`,+Q).N@+,*@"PO/____]/[P`,9@Q.A XMN@)8*4"$QG#_8+H@!6"V3E7__$AX$`!"ITZZ`S@K0/_\"```#%!/9Q)*K(2B3 XM9@@@+?_\3EU.=4ZZ``9P`&#T3E4``$AX``1(>@`<3KH"1"\`3KH":$AX``%.Y XMN@`.3^\`$$Y=3G5>0PH`3E4``$JLA+YG!B!LA+Y.D"\M``A.N@`(6$].74YUL XM3E7__"\$*VT`"/_\2JR$FF<L>`!@"B\$3KH`_%A/4H0P+(1V2,"X@&WL,"R$X XM=L'\``8O`"\LA)I.N@):4$]*K(3"9P8@;(3"3I!*K(1\9PHO+(1\3KH!SEA/] XM2JR$RF<((&R$RB"LA,Y*K(329PHO+(323KH!ZEA/2JR$UF<*+RR$UDZZ`=I8D XM3TJLA-IG"B\LA-I.N@'*6$]*K(3>9PHO+(3>3KH!NEA/+'@`!`@N``0!*6<4^ XM+PU+^@`*3J[_XBI?8`9"I_-?3G-*K(2F9BI*K(2V9R(O+(2R+RR$MDZZ`;8@! XM+(2N4H#E@"\`+RR$JDZZ`:1/[P`08`Y.N@&.+RR$IDZZ`;Y83R`M__PN;(2.T XM3G4H'TY=3G5.50``2.<.("@M``AR!B`$3KH`1"1`U>R$FDJ$;0XP+(1V2,"X? XM@&P$2I)F$BE\`````H3&</],WP1P3EU.=3`J``3`?(``9@@O$DZZ`#)83T*2O XM<`!@X$CG<``T`<3`)@%(0\;`2$-"0]2#2$#`P4A`0D#0@DS?``Y.=4[Z``(BT XM+P`$+&R$ED[N_]PB+P`$+&R$ED[N_X(B+P`$+&R$ED[N_[A.^@`"3.\`!@`$) XM+&R$ED[N_YHL;(263N[_RBQLA)9.[O]\(B\`!"QLA)9.[O\H3OH``DSO``8`< XM!"QLA)9.[O^L3OH``DSO``8`!"QLA)9.[O_B+&R$ED[N_\1.^@`"3.\`#@`$# XM+&R$ED[N_]9.^@`"(B\`!"QLA)9.[O^F3.\`#@`$+&R$ED[N_]!(YP$$3.\@. XM@``,+&R$DDZN_Y1,WR"`3G5.^@`"(F\`!"QLA)).[OYB3OH``DSO``,`!"QLD XMA)).[O\Z(F\`!"QLA)).[O[:+&R$DD[N_WQ.^@`"(F\`!"`O``@L;(223N[_F XM+B!O``0L;(223N[^C"QLA)(B;P`$("\`"$[N_=@B;P`$+&R$DD[N_H9,[P`#A XM``0L;(223N[^SB!O``0L;(223N[^@$SO`P``!"QLA+I.[O^@(&\`!"QLA+I.? XM[O^F(&\`!"QLA+I.[O^R```#[`````$````!```-"`````````/R```#Z@``1 XM`2`````$````!````!0````$````&0```"L````"````,````$<````"````` XM2@```&0````"````9P```'P````"````?P```)0````;````EP```+H````"6 XM````U@```.P````$````[P```0`````"```!!0```18````"```!&0```30`F XM```````````````````"```!.````4H````"```!30```5\````$```!8@``= XM`78````$```!>P```8\````$```!E````:@````````````````````.```!8 XMK@```<`````&```!SP```=\````$```!X@```?`````%```!]0```@,````%" XM```""0```A<````"```"'0```BL````5```"+@```D0````1```"6@```G``< XM```%```"@@```I8````%```"G````K`````%```"M@```LH````!```"T```2 XM`N`````!```"Z````O\````!```#`P```Q(````!```#&0```R@````!```#V XM+P```SX````!```#0P```U$````!```#5@```V0````!```#:0```W@`````T XM```````````````$```#@````YP````$```#H0```\0````$```#R0```]X`& XM```$```#XP```_<````$```#_```!!(````````````````````"```$&```; XM!#H````$```$/@``!$HP,3(S-#4V-S@Y86)C9&5F````("`@("`@("`@,#`PD XM,#`@("`@("`@("`@("`@("`@(""00$!`0$!`0$!`0$!`0$!`#`P,#`P,#`P,< XM#$!`0$!`0$`)"0D)"0D!`0$!`0$!`0$!`0$!`0$!`0$!`4!`0$!`0`H*"@H*( XM"@("`@("`@("`@("`@("`@("`@("0$!`0"```````````````````0`````!4 XM``````````````````````$!`````0`````````````````````!`@````$`' XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````%`````````````````/L````5``````````$; XM````"````!`````4````'````"`````H````+````#0````X````0````$0`L XM``!,````4````%@```!<````9````&@```!P````=````'P```"`````E```0 XM`)@```"@````I````*P```"P````N````+P```#$````R````-P```#@````T XMZ````.P```#T````^````0````$$```!#````1````$8```!'````20```$HH XM```!,````30```$\```!0````4@```%,```!5````5@```%@```!9````6P`; XM``%P```!>````7P```&$```!B````9````&4```!G````:````&H```!K```O XM`;0```&X```!S````=````'8```!W````>0```'H```!\````?0```'\```"U XE`````A0```(8```"(````B0````````#\@```^L````!```#\O0`% X`` Xend Xsize 9352 SHAR_EOF echo "End of archive 1 (of 1)" # if you want to concatenate archives, remove anything after this line exit