amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (05/08/91)
Submitted-by: grahamw@cpsc.ucalgary.ca (William Graham) Posting-number: Volume 91, Issue 101 Archive-name: devices/virt-alpha/part02 #!/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 <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 2 (of 4)." # Contents: learn.asm virt_mean.uu # Wrapped by tadguy@ab20 on Tue May 7 20:50:17 1991 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'learn.asm' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'learn.asm'\" else echo shar: Extracting \"'learn.asm'\" \(23663 characters\) sed "s/^X//" >'learn.asm' <<'END_OF_FILE' X Xr_mine equr d0 X X;learn.asm X; A robust utility to copy all the qualities of a file X; other than the contents to another file. Acts X; exactly like a copy command (because the poor thing once X; was a copy command...). Accepts wildcards, handles X; sub directories. X; X; (used to be ARP copy, before RESOURCE and ANSELM got to it...) X X X XLEARN = 1 ; do my version, or else just do ordinary ARP cp X ; (if unset will compile so closely that "diff" can't detect any diff.) X X;COALESCE = 1 X X; X; The Arp Copy Command as bastardized by Yours Truly X; X; (Source code fd-generated from Resource) X; Jan 19 1991 AH X; X; Compilation generated with genim2 X; X; "Diff" verified that there is no difference between X; this resourced and recompiled version, and the original X; (with the LEARN flag unset) X; X; acts as normal, but if name of command is "learn" X; or some such thing then it outputs smart info... X; X X;a little talk about object oriented programming: X; X; qualitatively, what i am trying to do here - by tagging X; my little bit of code into the copy function - is to X; access the wildcard and file-pointing functionality X; of the copy function without having to force my code X; to have any particular awareness of it. X; X; this is representative of a dilemma in computer schlockience X; which is that there is no clear cut way of visible X; seperating the "strands" of functionality. Even C++ X; fails to address the issue. X; X; More and more as I program I see myself simply being X; a weaver, weaving together of strings of code from X; different functions, such that they run interleaved X; and perform my composite operation. X; X; the point is that it would be nice if I didn't have to X; do that. If i could access wildcarding, recursive X; directory searching, source file opening, dest X; file opening in an implicit manner, and allow my X; compiler to do the final weaving. It might mean X; a revolution as significant as the spinning jenny. X; X X X X X IFND EXEC_TYPES_I XEXEC_TYPES_I SET 1 XEXTERN_LIB MACRO X XREF _LVO\1 X ENDM XSTRUCTURE MACRO X\1 EQU 0 XSOFFSET SET \2 X ENDM XBOOL MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+2 X ENDM XBYTE MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+1 X ENDM XUBYTE MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+1 X ENDM XWORD MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+2 X ENDM XUWORD MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+2 X ENDM XSHORT MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+2 X ENDM XUSHORT MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+2 X ENDM XLONG MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+4 X ENDM XULONG MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+4 X ENDM XFLOAT MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+4 X ENDM XAPTR MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+4 X ENDM XCPTR MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+4 X ENDM XRPTR MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+2 X ENDM XSTRUCT MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+\2 X ENDM XLABEL MACRO X\1 EQU SOFFSET X ENDM XBITDEF MACRO * X BITDEF0 \1,\2,B_,\3 X\@BITDEF SET 1<<\3 X BITDEF0 \1,\2,F_,\@BITDEF X ENDM XBITDEF0 MACRO * X\1\3\2 EQU \4 X ENDM XLIBRARY_VERSION EQU 33 X ENDC EXEC_TYPES_I X X XZAPTR MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+\2*4 X ENDM X XZLONG MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+\2*4 X ENDM X XZDOUB MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+\2*8 X ENDM X XZWORD MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+\2*2 X ENDM X XZBYTE MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+\2 X ENDM X X X; IFD LEARN X Xmax_PathLen equ 1024 Xmax_CommentLen equ 80 X X ; X ; Virtual Info Block Aggregate X ; X ; An attempt to store all possible evidence required to X ; positively identify a specific instance of a file. X ; X ; This includes the physical media block number and X ; other static absolutes. X ; X ; This also includes looking at the file to determine X ; overt file type if any, TEXT,IFF,ARC etc. X ; X ; If a file is flagged as in an archive then the name of X ; that archive is added to the path just prior to the filename. X ; X ; If an entire physical media is to be remembered, then X ; whatever positive identification is stored about that media. X ; X X X STRUCTURE DateStamp,0 X LONG ds_Days X LONG ds_Minute X LONG ds_Tick X LABEL ds_SIZEOF X X STRUCTURE FileInfoBlock,0 X LONG fib_DiskKey ; device specific id? X LONG fib_DirEntryType ; < 0 = file, > 0 = directory X STRUCT fib_FileName,108 ; name X LONG fib_Protection ; sparwed X LONG fib_EntryType ; ??? X LONG fib_Size ; byte size X LONG fib_NumBlocks ; block size X STRUCT fib_DateStamp,ds_SIZEOF ; last date X STRUCT fib_Comment,80 ; null terminated comments X STRUCT fib_padding,36 ; unused X LABEL fib_SIZEOF X X X STRUCTURE VirtualInfoBlock,0 X LONG vir_MyID ; junk X X ; Used by COALESCE: X LONG vir_CheckSum ; Checksum of Entire File X LONG vir_Size ; File Byte Size X X ; Used by other junk: XCOALSIZE = 12 X X ZLONG vir_Type,2 ; BITDEFS (IFF/ZOO/NDOS...) X ZWORD vir_IncSum,8 ; Incremental checksums X X ; FIB (more or less): X ; File Positive ID: X LONG vir_DiskKey ; Disk Physical Address X LONG vir_DirEntryType ; < 0 = File, > 0 = Directory X LONG vir_Protection ; xSPARWED X LONG vir_EntryType ; ??? (why bother?) X X LONG vir_NumBlocks ; File Block Size X STRUCT vir_DateStamp,ds_SIZEOF ; File DateStamp X ; Volume Positive ID: X STRUCT vir_VolID,ds_SIZEOF ; Volume DateStamp Positive ID X LONG vir_VolType ; Volume Type X LONG vir_VolDiskType ; Volume Disk Type 'NDOS'... X ; Indeterminate Length Stuff: X LABEL vir_Path ; Device:path (may have spaces),0 X LABEL vir_Comments ; Comments if any,0 (terminate) X ; Align (always force even) X LABEL vir_SIZEOF ; Warning: Variable Size! X X; ENDC X X X_LVOAvailMem equ -$D8 ; exec X X_LVORead equ -$2A Xdat_SIZEOF equ $1A X_LVOExamine equ -$66 X_LVOUnLock equ -$5A X_LVOIsInteractive equ -$D8 X_LVOPathName equ -$14a X_LVODosFreeMem equ -$15C X_LVOArpExit equ -$17A X_LVOArpAlloc equ -$180 X_LVOArpOpen equ -$18C ; misc X_LVOArpQSort equ -$1aa X_LVOArpPMatch equ -$1b0 X_LVOFindFirst equ -$1B6 X_LVOFindNext equ -$1BC X_LVOAddDANode equ -$1FE X_LVOWrite equ -$30 X_LVOPuts equ -$F0 X_LVODeleteFile equ -$48 X_LVOPrintf equ -$E4 X_LVOOpenLibrary equ -$228 X_LVOFreeTrackedItem equ -$1E0 Xan_SIZEOF equ $14 X_LVOCheckAbort equ -$10E X_LVOGADS equ -$FC Xfr_SIZEOF equ $1A X_LVOIoErr equ -$84 X_LVOLock equ -$54 X_LVOAlert equ -$6C X_LVOFreeDAList equ -$1F8 X_LVOMakeLibrary equ -$54 X X********************************************************************** X XProgStart X movem.l d0/a0,-(sp) X lea arplibrary.MSG(pc),a1 X moveq #$1F,d0 X dc.w $2c78,$0004 ; move zero page (4) to a6 X jsr _LVOOpenLibrary(a6) X tst.l d0 X bne.s lbC000022 X addq.w #8,sp X move.l #$38036,d7 X jmp _LVOAlert(a6) ; arp missing? X XlbC000022 move.l d0,a6 X movem.l (sp),d0/a0 X lea -8(sp),sp X lea usageCopywild.MSG(pc),a1 X move.l sp,a2 X lea FROMTOAALLSQU.MSG(pc),a3 X jsr _LVOGADS(a6) ; parse! X tst.w d0 X lea usageCopywild.MSG(pc),a1 X ble lbC000210 X move.l 12(sp),d6 X add.l d6,d0 X moveq #0,d7 X move.l #$31C,d0 X X; a0 = base pointer X; d0 = number of elements in region to sort X; d1 = size of sorted elements in bytes? X; a1 = user function to perform the comparison X X jsr _LVOArpQSort(a6) X X rts X X jsr _LVOArpAlloc(a6) X move.l d0,a2 X moveq #$67,d2 X tst.l d0 X beq lbC000234 X move.l #$FF,$10(a2) X move.w #13,-2(a2) X move.l 4(sp),a5 X sub.l a4,a4 X move.l a5,a0 ; wildcard source XlbC000076 move.b (a0)+,d0 X beq.s lbC0000E2 ; parse done? X cmp.b #'#',d0 X bne.s lbC000090 X move.b (a0)+,d0 X beq.s lbC0000E2 X cmp.b #'?',d0 X bne.s lbC000090 X clr.b -2(a0) X bra.s lbC000096 XlbC000090 cmp.b #'*',d0 X bne.s lbC000076 XlbC000096 move.l a0,a4 ; handle wildcard source X clr.b -(a0) XlbC00009A move.l (sp),a0 X move.l a0,d0 X bne.s lbC0000A6 X lea lbB00045B(pc),a0 X move.l a0,(sp) XlbC0000A6 moveq #-$1,d5 X moveq #0,d1 XlbC0000AA moveq #0,d4 XlbC0000AC move.b (a0)+,d0 ; wildcard something or other X beq.s lbC0000DC ; done? X cmp.b #':',d0 X beq.s lbC0000A6 X cmp.b #'/',d0 X beq.s lbC0000A6 X cmp.b #'*',d0 X beq.s lbC0000D4 X cmp.b #'#',d0 X beq.s lbC0000CE X addq.l #1,d1 X addq.l #1,d4 X bra.s lbC0000AC XlbC0000CE tst.b (a0)+ X bne.s lbC0000D4 X subq.w #1,a0 XlbC0000D4 tst.l d5 X bpl.s lbC0000AA X move.l d1,d5 X bra.s lbC0000AA X X X XlbC0000DC tst.l d5 X blt.s lbC00010E X bra.s lbC000112 X XlbC0000E2 move.l a5,d1 ; lock or file X moveq #-$2,d2 X jsr _LVOLock(a6) ; thing exists? X move.l d0,d1 X beq.s lbC00009A ; ??? X move.l d1,d3 X lea $14(a2),a0 X move.l a0,d2 X jsr _LVOExamine(a6) ; examine thing X tst.l d0 X beq.s lbC000108 ; failed? X tst.l $18(a2) X blt.s lbC000108 ; file or dir check??? X move.w #$FFFF,d7 XlbC000108 move.l d3,d1 X jsr _LVOUnLock(a6) XlbC00010E moveq #0,d4 X moveq #0,d5 XlbC000112 move.l (sp),d0 X move.l a2,a0 X jsr _LVOFindFirst(a6) X move.l (a2),d3 X bne.s lbC000120 X moveq #1,d6 XlbC000120 move.l d0,d2 ; build dir X bne.s lbC000150 X bsr.s lbC00017A X lea $318(a2),a1 X lea $118(a2),a0 X moveq #0,d1 X tst.l $18(a2) X blt.s lbC00013C X tst.l d3 X bne.s lbC000146 X moveq #1,d1 XlbC00013C moveq #0,d0 X jsr _LVOAddDANode(a6) X tst.l d0 X beq.s lbC00014E XlbC000146 move.l a2,a0 X jsr _LVOFindNext(a6) X bra.s lbC000120 ; end loop X XlbC00014E moveq #$67,d0 XlbC000150 move.l d0,d2 X cmp.w #$E8,d2 X beq.s lbC000182 ; enter copy loop XlbC000158 move.l $318(a2),a1 X jsr _LVOFreeDAList(a6) X tst.w d2 X beq lbC000214 ; exit X lea Cantopens.MSG(pc),a0 ; failure, exit X cmp.w #$CD,d2 X bra failure X XlbC000172 jsr _LVOPuts(a6) ; some checkabort weird X moveq #0,d2 X bra.s lbC000158 X XlbC00017A lea lbC000172(pc),a1 ; checkabort X jmp _LVOCheckAbort(a6) X X X X ;---------------------------------------------------->>> XlbC000182 move.l $318(a2),d0 ; next! X beq lbC000214 ; exit X move.l d0,a3 X bsr.s lbC00017A ; check abort X lea 6(a3),a0 XlbC000192 move.l a0,a1 XlbC000194 move.b (a0)+,d0 ; end of string? X beq.s lbC0001A6 X cmp.b #'/',d0 X beq.s lbC000192 ; skip crap, termstart X cmp.b #':',d0 X beq.s lbC000192 ; skip crap, termstart X bra.s lbC000194 ; skip crap X XlbC0001A6 move.l a1,-(sp) ; a1 = valid term start X lea $218(a2),a1 X move.l a5,a0 X bra.s lbC0001B4 ; enter "make dest term" X X X ; destination term = dest term + wildcard substitution...cool... X XlbC0001B0 move.b (a0)+,d0 X move.b d0,(a1)+ XlbC0001B4 tst.b (a0) ; copy to end of term X bne.s lbC0001B0 X move.l (sp)+,a0 X move.l d7,d1 ; something... X bne.s lbC0001E4 X move.l a4,d1 X beq.s lbC0001F4 X cmp.b #'/',d0 X beq.s lbC0001D0 X cmp.b #':',d0 X beq.s lbC0001D0 X add.w d5,a0 XlbC0001D0 move.b (a0)+,(a1)+ ; done? X bne.s lbC0001D0 X subq.w #1,a1 X move.l a4,a0 X tst.b (a0) X beq.s lbC0001DE X sub.w d4,a1 XlbC0001DE move.b (a0)+,(a1)+ X bne.s lbC0001DE X bra.s lbC0001F4 X XlbC0001E4 moveq #':',d0 X cmp.b -1(a1),d0 X beq.s lbC0001F0 X move.b #'/',(a1)+ XlbC0001F0 move.b (a0)+,(a1)+ X bne.s lbC0001F0 XlbC0001F4 lea 6(a3),a0 ; a0 = source name X lea $218(a2),a1 ; a1 = dest name X bsr DoCopy X move.l $318(a2),a1 X move.l (a1),$318(a2) X jsr _LVODosFreeMem(a6) X bra lbC000182 X ;----------------------------------------------------<<<< X X X;***************************************************************************** X;***************************************************************************** X;***************************************************************************** X;***************************************************************************** X X ; X ; exit stuff X ; X XlbC000210 jsr _LVOPuts(a6) ; success XlbC000214 moveq #0,d0 XlbC000216 jsr _LVOArpExit(a6) ; bye Xfailure lea Cantopens.MSG(pc),a4 ; failure XlbC00021E jsr _LVOIoErr(a6) X move.l d0,d2 XlbC000224 move.l $318(a2),a1 X jsr _LVOFreeDAList(a6) X move.l a4,a0 X move.l sp,a1 X jsr _LVOPrintf(a6) XlbC000234 moveq #$14,d0 X bra.s lbC000216 X Xfailure100 lea Outofmemory.MSG(pc),a4 ; failure X moveq #$67,d2 X bra.s lbC000224 X Xfailure200 lea Cantopens.MSG(pc),a4 ; failure X addq.w #4,sp X bra.s lbC00021E X Xfailure300 lea s.MSG(pc),a0 ; aborted X moveq #0,d0 XlbC00024E move.l a1,-(sp) X move.l sp,a1 X move.l d0,d2 X jsr _LVOPrintf(a6) X addq.w #8,sp X move.l a5,a1 X jsr _LVOFreeTrackedItem(a6) X move.l (sp),d1 X jsr _LVODeleteFile(a6) X lea Destinationfi.MSG(pc),a4 X bra.s lbC000224 X Xfailure500 jsr _LVOIoErr(a6) ; failure X lea Errorwritings.MSG(pc),a0 X move.l 4(sp),a1 X bra.s lbC00024E X Xfailure400 jsr _LVOIoErr(a6) ; failure X lea Errorreadings.MSG(pc),a0 X move.l (sp),a1 X bra.s lbC00024E X X X X;****************************************************************************** X;****************************************************************************** X;****************************************************************************** X;****************************************************************************** X; start of modified zone jan 19 91 AH all mods are enclosed by >>><<< X X ; a0 = source name X ; a1 = dest name XDoCopy move.l d5,-(sp) X movem.l a0/a1/a3-a5,-(sp) X tst.l d6 X bne.s DoCopy100 ; say stupid message? X move.l sp,a1 X lea s.MSG0(pc),a0 ; say " c:gumby..." X jsr _LVOPrintf(a6) X ; get file size X ; d0 = lock XDoCopy100 move.l (sp),d1 ; d1 = name X moveq #-$2,d2 ; d2 = mode X jsr _LVOLock(a6) ; d0 < lock or fail X move.l d0,d1 ; d1 = lock X beq failure X move.l d0,-(sp) X X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> X IFD LEARN X X ; X ; Given Lock: X ; X ; GET PATH X ; X ; GET VOLUME_NODE (the devices) -> DATESTAMP (for Positive ID) X ; X ; X X ;Length = PathName(Lock, Destination, NumberNames) X ; D0 D0 A0 D1 X X ; Get Path: X ; d0 = lock X lea PathBuffer(pc),a0 ; a0 = dest X move.l #max_PathLen/32,d1 ; d1 = max paths (16 of em) X jsr _LVOPathName(a6) X lea PathSuccess(pc),a0 X move.l d0,(a0) ; save success state + size X ; Alternatively ARP discusses a technique of retrieving the X ; File Path by setting AP_LENGTH to declare AP_BUF space post FIB X ; (but I don't feel like doing that) X ; Extract some junk from Lock: X move.l (sp),a1 ; A1 = Lock << APTR X add.l a1,a1 X add.l a1,a1 X lea VIB(pc),a0 X ;move.l 4(a1),vir_DiskKey(a0) ; DiskBlock (done later also) X move.l 16(a1),a1 ; A1 = Volume Node << APTR X add.l a1,a1 X add.l a1,a1 X move.l 4(a1),vir_VolType(a0) ; Volume->Type (must == 2!) X move.l 16(a1),vir_VolID(a0) ; Volume->VolDays X move.l 20(a1),vir_VolID+4(a0) X move.l 24(a1),vir_VolID+8(a0) X move.l 64(a1),vir_VolDiskType(a0) ; Volume->DiskType X X move.l (sp),d0 ; (restore) X move.l d0,d1 ; (restore) X ENDC X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< X X ; d1 = Lock X lea $14(a2),a0 ; (that weird arp thing) X move.l a0,d2 ; d2 = FIB X jsr _LVOExamine(a6) X move.l (sp),d1 X move.l d0,(sp) X jsr _LVOUnLock(a6) X move.l (sp)+,d0 X beq failure X X move.l $90(a2),d5 ; d5 = sizeof file (max ram) X ble failure X X IFD COALESCE X move.l #COALSIZE,d5 ; all i need X move.l d5,$90(a2) X ENDC X X move.l #$20001,d1 ; get some ram X move.l a6,-(sp) X dc.w $2c78,$0004 ; move zero page (4) to a6 X jsr _LVOAvailMem(a6) X move.l (sp)+,a6 X lsr.l #1,d0 X sub.l #$1388,d0 X move.l #$3D0,d1 X cmp.l d1,d0 X bgt.s 1$ X move.l d1,d0 X1$ cmp.l d0,d5 X blt.s 2$ X move.l d0,d5 X2$ move.l d5,d0 X X ; COALESCE just needs to open a tiny bit of the file to X ; examine its checksum and size info for validity... X ; but must be at least this size! X X IFD COALESCE X cmp.l #COALSIZE,d0 X bne failure100 X ENDC X X jsr _LVOArpAlloc(a6) X tst.l d0 X beq failure100 X X move.l d0,a3 X move.l (sp),d1 X move.l #1005,d2 ; open old X jsr _LVOArpOpen(a6) X tst.l d0 X beq failure X move.l a1,a4 X move.l 4(sp),d1 X move.l #1006,d2 ; open new X X IFD COALESCE X move.l #1005,d2 ; (coalesce just compares) X ENDC X X jsr _LVOArpOpen(a6) X move.l d0,d1 X beq failure200 X move.l a1,a5 X X X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> X IFD LEARN X lea csumstuff(pc),a1 ; wipe csums for new file X clr.l (a1) X clr.l 4(a1) X ENDC X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< X X ; loop... copy it XDoCopy200 sub.l a1,a1 X jsr _LVOCheckAbort(a6) X tst.l d0 X bne failure300 X move.l (a4),d1 ; d1 = file handle X move.l a3,d2 ; d2 = dest ram X move.l d5,d3 ; d3 = max size X jsr _LVORead(a6) ; read from old X tst.l d0 X blt failure400 X beq DoCopy900 X move.l d0,d3 ; d3 = actual size got X sub.l a1,a1 X jsr _LVOCheckAbort(a6) X tst.l d0 ; d0 = actual size writ X bne failure300 X move.l (a5),d1 X ; d1 = file handle X ; d2 = source/dest ram X ; d3 = size X IFND COALESCE X IFND LEARN X jsr _LVOWrite(a6) ; write to new X cmp.l d0,d3 ; writ = wrot? X bne failure500 ; write error X ENDC X ENDC X X X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> X; X; a truly crude coalesce routine X; X; later should rely on externally known virtual token rather X; than one imbedded in file X; X; and handle proper paths, and smarter messaging... X; X X IFD COALESCE X ; d1 = file handle X ; d2 = dest ram X ; d3 = size X lea somespace(pc),a0 X move.l a0,d2 X move.l #COALSIZE,d3 X jsr _LVORead(a6) ; didn't read enuf X cmp.l d0,d3 X bne failure500 X X movem.l d0-d3/a0-a1,-(a7) X X lea somespace(pc),a0 X move.l a3,d2 ; d2 = dest ram X cmp.l #'VIRT',(a3) ; src is virtual? X beq coal100 X move.l sp,a1 X lea srcnot(pc),a0 X jsr _LVOPrintf(a6) X bra coal900 Xsrcnot dc.b "source file is not virtual\n",0 X even Xdestnot dc.b "dest file is not virtual\n",0 X even Xarediff dc.b "file x is different from file y\n",0 X even Xaresame dc.b "file x is same as file y\n",0 X even Xcoal100 cmp.l #'VIRT',(a0) ; dest is virtual? X beq.s coal200 X move.l sp,a1 X lea destnot(pc),a0 X jsr _LVOPrintf(a6) X bra coal900 X Xcoal200 move.l vir_CheckSum(a0),d0 X cmp.l vir_CheckSum(a3),d0 X bne coal300 X move.l vir_Size(a0),d0 X cmp.l vir_Size(a3),d0 X beq coal400 Xcoal300 move.l sp,a1 X lea arediff(pc),a0 X jsr _LVOPrintf(a6) X bra coal900 Xcoal400 move.l sp,a1 X lea aresame(pc),a0 X jsr _LVOPrintf(a6) X bra coal900 X Xcoal900 movem.l (a7)+,d0-d3/a0-a1 X bra DoCopy900 X X ENDC X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< X X X X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> X IFD LEARN X; X; checksum a word every 4096 bytes or last, keep building long checksum X; output to file X; X; checksum is a cyclic redundancy checksum, in such a way that later on X; if i have one of the sources i wish to compare it against it can be X; "dismantled" and act as a "diff" (not quite a zero-sum-proof but...). X; X ; d1 = file handle X ; d2 = source ram X ; d3 = size X movem.l d0-d3/a0-a1,-(a7) X move.l d2,a0 X lea csumstuff(pc),a1 X movem.l (a1),d1/d2 X moveq #0,d0 X bra.s csum100 Xcsum800 move.b (a0)+,d0 ; read source X add.l d0,d2 ; add to csum X ror.b d1,d0 ; prevent additive swap errors X addq.l #1,d1 Xcsum100 dbf d3,csum800 X movem.l d1/d2,(a1) ; write csum X movem.l (a7)+,d0-d3/a0-a1 X move.l d3,d0 ; (feign _LVOWrite success) X ENDC X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< X X X cmp.l $90(a2),d0 ; did it in one pass? wow! X bne DoCopy200 XDoCopy900 X X X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> X; rather than copying the file, write out a virtual info block only. X X IFD LEARN X X ; add checksums X lea VIB(pc),a0 X move.l csumstuff+4(pc),vir_CheckSum(a0) X move.l csums(pc),vir_IncSum(a0) X move.l csums+4(pc),vir_IncSum+4(a0) X move.l csums+8(pc),vir_IncSum+8(a0) X move.l csums+12(pc),vir_IncSum+12(a0) X X ; do file info block stuff X lea $14(a2),A1 X move.l #'VIRT',vir_MyID(a0) X move.l fib_DiskKey(a1),vir_DiskKey(a0) X move.l fib_DirEntryType(a1),vir_DirEntryType(a0) X move.l fib_Protection(a1),vir_Protection(a0) X move.l fib_EntryType(a1),vir_EntryType(a0) X move.l fib_Size(a1),vir_Size(a0) X move.l fib_NumBlocks(a1),vir_NumBlocks(a0) X move.l fib_DateStamp(a1),vir_DateStamp(a0) X move.l fib_DateStamp+4(a1),vir_DateStamp+4(a0) X move.l fib_DateStamp+8(a1),vir_DateStamp+8(a0) X X ; path is already added X X ; Add Comments (after path) X lea vir_Path(a0),a0 X move.l PathSuccess(pc),d0 ; d0 <= max_Pathlen (invariant) X move.l #max_PathLen-1,d1 X cmp.l d1,d0 X bmi.s 0$ X move.l d1,d0 X0$ add.l d0,a0 ; get to end of path name X clr.b (a0)+ ; terminate path X lea fib_Comment(a1),a1 X moveq #max_CommentLen-2,d0 ; room is sufficient to hold me? X1$ move.b (a1)+,d1 X beq.s 2$ X move.b d1,(a0)+ X dbf d0,1$ X2$ clr.b (a0)+ ; terminate comments X X lea VIB(pc),a1 ; get size X sub.l a1,a0 X move.l a0,d3 X cmp.l #vir_SIZEOF+max_PathLen+max_CommentLen,d3 X bcc.s 3$ ; DEBUG X X ; Write Virtual stuff part X move.l (a5),d1 ; d1 = file handle X move.l a1,d2 ; d2 = source ram X jsr _LVOWrite(a6) ; d3 = length X cmp.l d3,d0 X bne failure500 X3$ X ENDC X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< X X move.l a5,a1 X jsr _LVOFreeTrackedItem(a6) ; release dest X move.l a4,a1 X jsr _LVOFreeTrackedItem(a6) ; release src X move.l a3,a1 X jsr _LVOFreeTrackedItem(a6) ; release work RAM X tst.w d6 ; say stupid message? X bne.s 5$ X lea copiedtos.MSG(pc),a0 ; "...copied to x:dumby" X lea 4(sp),a1 X jsr _LVOPrintf(a6) X5$ movem.l (sp)+,a0/a1/a3-a5 X move.l (sp)+,d5 X rts X X X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> X IFD LEARN XVIB dcb.b vir_SIZEOF,0 XPathBuffer dcb.b max_PathLen,0 XCommentsBuffer dcb.b max_CommentLen,0 XPathSuccess dc.l 0 ; success in building path? Xcsumstuff dc.l 0,0 ; counter.l, master checksum.l Xcsums dcb.w 8,0 ; incremental checksums.w X ENDC X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< X X X X IFD LEARN XusageCopywild.MSG dc.b 'usage: Learn (wildcards) [TO] (wildcards or dir' X ENDC X X IFND LEARN XusageCopywild.MSG dc.b 'usage: Copy (wildcards) [TO] (wildcards or dir' X ENDC X X dc.b ') [ALL] [QUIET]',0 XCantopens.MSG dc.b 'Can''t open %s',$A,0 XOutofmemory.MSG dc.b 'Out of memory',$A,0 XErrorreadings.MSG dc.b 10 X dc.b 'Error reading %s',$A,0 XErrorwritings.MSG dc.b 10 X dc.b 'Error writing %s',$A,0 XDestinationfi.MSG dc.b 'Destination file "%s" removed',$A,0 Xarplibrary.MSG dc.b 'arp.library',0,0 XFROMTOAALLSQU.MSG dc.b 'FROM,TO/A,ALL/S,QUIET/S' XlbB00045B dc.b 0 Xs.MSG dc.b 10 X dc.b '%s',$A,0 Xs.MSG0 dc.b ' %s..',0 X IFD LEARN Xcopiedtos.MSG dc.b 'learnt to %s',$A,0 X dc.b 0 X ENDC X IFND LEARN Xcopiedtos.MSG dc.b 'copied to %s',$A,0 X dc.b 0 X ENDC X X IFD COALESCE Xsomespace dcb.b COALSIZE,0 X ENDC X X END X X X;end of modified zone jan 19 91 AH X;****************************************************************************** X;****************************************************************************** X;****************************************************************************** X;****************************************************************************** X X X i need a utility which accepts a path, possibly wildcarded, and possibly X with "all" set, and that returns to me a lock on each file it finds in X turn. X X X END_OF_FILE if test 23663 -ne `wc -c <'learn.asm'`; then echo shar: \"'learn.asm'\" unpacked with wrong size! fi # end of 'learn.asm' fi if test -f 'virt_mean.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'virt_mean.uu'\" else echo shar: Extracting \"'virt_mean.uu'\" \(20996 characters\) sed "s/^X//" >'virt_mean.uu' <<'END_OF_FILE' Xbegin 666 virt_mean.wp XM@(`*"@K#`"H>PR)625(Z(B!4:&4@5FER='5A;"!$979I8V6#"@K#`"HGPZD@* XM;W(@J8,*"L,`*A_#(")0;V]R($UA;G,@1FQO<'1I8V%L(H,*"@H*"@H*"L,`7 XM*A[#4')O:F5C="!#;VYC97!T($1O8W5M96YT@PH*PP`J(\-">2!!;G-E;&T@R XM2&]O:X,*"L,`*B##3&%S="!%9&ET.B!&96(@-R`Q.3DQ@PH*"@H*4')O;&]G, XM=64Z"JFIJ:FIJ:FIJ0H*"51H:7,@<')O<&]S86P@8V]N=&%I;G,@87,@:71SW XM(&UA:6X@=&AE<VES(&%N(&]U=&QI;F4@;V8@=&AE#79I<G1U86P@9&5V:6-E^ XM(&1R:79E<BX@(%1H:7,@<')O<&]S86P@86QS;R!C;VYT86EN<R!O=71L:6YEP XM<R!F;W(-82!N=6UB97(@;V8@861D:71I;VYA;"!U=&EL:71I97,@<F5L871EX XM9"!T;R!T:&4@5FER='5A;"!$979I8V4L#7=H:6-H(&UA>2!I;B!F86-T(&)E. XM('-T<F]N9V5R('-E;&QI;F<@<&]I;G1S('1H870@=&AE(%9)4CH@1&5V:6-E, XM#6ET<V5L9BP@8G5T(&%R92!N;W0@87,@;F]V96PN"@H)26X@<F5A9&EN9R!T\ XM:&ES('!R;W!O<V%L(')E;65M8F5R('1H870@22!U<V4@=&AE(%9)4CH@9&5VU XM:6-E#65V97)Y(&1A>2P@87,@=V5L;"!A<R!O=&AE<B!U=&EL:71I97,@9&5S) XM8W)I8F5D(&AE<F5I;B`H<W5C:"!A<PU%;F-R>7!T*2X*"@E)(&1E9GD@64]5' XM+"!T:&4@<F5A9&5R+"!T;R!R96%D('1H:7,@<')O<&]S86P@86YD(')E='5R8 XM;B!T;PUY;W5R(&-O;7!U=&5R('=I=&AO=70@82!S:6=N:69I8V%N="!P87)A$ XM9&EG;2!S:&EF="!I;B!T:&4@=V%Y('EO=0UP97)C96EV92!Y;W5R('=O<FMS* XM<&%C92$*"E9)4CHL(')E;&%T960@=71I;&ET:65S(&%N9"!R96QA=&5D(&UEH XM;7,*J:FIJ:FIJ:FIJ:FIJ:FIJ:FIJ:FIJ:FIJ:FIJ:FIJ:FIJ:FIJ:FIJ0H*F XM5DE2.@JIJ:D*"51H92!V:7)T=6%L(&1E=FEC92!I<R!A('!I96-E(&]F('-OU XM9G1W87)E('=H:6-H('!R;W9I9&5S(&$-9F%S8VEM:6QE('=O<FMS<&%C92!W) XM:71H:6X@=VAI8V@@86QL('EO=7(@9FEL97,@87!P96%R('1O(&)E+B`-4F5Q0 XM=65S=',@=&\@<F5A9"]W<FET92!A8W1U86P@9&%T82!A<F4@<&%T8VAE9"!O! XM;G1O('1H92!R96%L#6UE9&EA('=H:6-H(&]W;G,@=&AA="!D871A+@H*"51HO XM92!625(Z(&1E=FEC92!I<R!E;G1I<F5L>2!S;V9T=V%R92P@86YD(&AA<R!T" XM:&5S92!M96US.@H*"59I<G1U86S<:@```````-R,":FIJ:FIJ:D*"@E4:&4@I XM5FER='5A;"!$979I8V4@86QL;W=S('1H92!C;&EE;G0@=&\@<F5A9"]W<FET] XM92!F:6QE<PUW:&EC:"!A<F4@;F]T(&YE8V5S<V%R:6QY(&]N;&EN92P@=VET( XM:&]U="!T:&%T(&-L:65N="!H879I;F<@=&\-:VYO=R!T:&4@;&]C871I;VX@6 XM;V8@=&AE('!H>7-I8V%L(&UE9&EA(&]N('=H:6-H('1H92!F:6QE<PUR97-I7 XM9&4N("!2871H97(@=&AE(%9I<G1U86P@1&5V:6-E(&MN;W=S('1H92!M961IG XM82!L;V-A=&EO;@UI='-E;&8@86YD(')E<75E<W1S(&ET(&EF(&ET(&ES(&YO_ XM="!O;FQI;F4N("!7:&5R92!T:&4@=7-E<B!A;F0-=&AE(&1E=FEC92!D<FEV( XM97(@<VAA<F4@82!M=71U86QL>2!A9W)E960@=7!O;B!M971H;V0@9F]R#7)E^ XM9F5R:6YG('1O(&%N9"!R971R:65V:6YG(&]F9FQI;F4@;65D:6$N"@H)5')A% XM;G-P87)E;G0*":FIJ:FIJ:FIJ:FI"@H)5&AE(%9I<G1U86P@1&5V:6-E(&%PG XM<&5A<G,L(&%N9"!I<RP@:G5S="!A;F]T:&5R(&1E=FEC92!O;@UT:&4@<WES3 XM=&5M+"!M=6-H(&QI:V4@(D,Z(B!I<R!J=7-T(&%N;W1H97(@9&5V:6-E+B`@6 XM5&AI<R!M96%N<PUT:&%T(&YO;JEH=6UA;B!C;&EE;G1S(&-A;B!I<W-U92!RV XM97%U97-T<R!I;B!A(&1A=&&I=')A;G-P87)E;G0-;6%N;F5R+@H*"4ET<R!II XM;7!O<G1A;G0@=&\@=6YD97)S=&%N9"!T:&%T('1O(&-A;&P@=&AE(%9I<G1U[ XM86P@1&5V:6-E#6$@1FEL92]$:7-K($UA;F%G97(@:7,@;F]T('%U:71E(')I0 XM9VAT+B`@07,@9F%R(&%S('1H92!S>7-T96T@8V%N#61E=&5C="!I="!I<R!T] XM:&4@<&AY<VEC86P@<F5S:61E;F-E(&9O<B!A;&P@=&AE(&9I;&5S(&ET(&-L< XM86EM<PUT;R!H879E+B`@5&AI<R!M86ME<R!I="!A;B!E>'1E;G-I;VX@;V8@3 XM=&AE('5S97)S(&5N=FER;VUE;G0L(&YO=`UM97)E;'D@82!M96UO<GD@86EDZ XM+@H*"5L@66]U)VQL(&AA=F4@=&\@8F5A<B!W:71H(&UE(&EF('1H:7,@86QLQ XM('-E96US('!A=&5N=&QY#6]B=FEO=7,N(%T*"@E&;&%T"@FIJ:FI"@H)5DE2V XM.B!P<F5S96YT<R!A(&9L870@9&%T87-P86-E('1O('1H92!C;&EE;G0L('1H' XM870@:7,@9FEL97,-:6YS:61E(&]F(&%R8VAI=F5S(&%R92!V:7-I8FQE(&%N, XM9"!A8V-E<W-I8FQE('1O('1H92!C;&EE;G0N(`U&:6QE<R!P86-K960@;VYT< XM;R!T87!EJ6)A8VMU<"P@;W(@;W1H97)W:7-E(&1I9F9I8W5L="!T;R!A8V-E( XM<W,-8V]N=F5N=&EO;F%L;'D@86QS;R!A<'!E87(@=&\@8F4@=FES:6)L92!A) XM;F0@86-C97-S:6)L92!T;R!T:&4-8VQI96YT("AW:&5R92!625(Z(&%U=&]MD XM871E<R!T:&4@<')O8V5S<R!O9B!U;G!A8VMI;F<I+@H*"4QE87)N"@FIJ:FI? XMJ0H*"59)4CH@86-Q=6ER97,@:VYO=VQE9&=E(&]F(&$@9FEL92!B>2!A('5S( XM97(@97AP;&EC:70-8V]M;6%N9"X@($ET('-T;W)E<R!A<R!M=6-H(&EN9F]RO XM;6%T:6]N(&%S('!O<W-I8FQE(&%B;W5T('1H90UF:6QE+"!W:71H('1H92!ET XM>&-E<'1I;VX@;V8@=&AE(&9I;&4@8V]N=&5N=',@:71S96QF+B`@270@87-S' XM:6=N<PUO<B!A8V-E<'1S(&$@;65D:6$@;G5M8F5R(&9O<B!T:&%T(&1I<VME4 XM='1E("AO<B!T:&EN9RDN"@H)5DE2.B!W:6QL('!E97(@:6YS:61E(&]F('9A[ XM<FEO=7,@='EP97,@;V8@;F]NJ7-T86YD87)D#6%R8VAI=F5S(&%N9"!M961I5 XM82!A<R!P87)T(&]F(&ET<R!D=71Y("A!4D,O3%I(+U%"04LO0TA%151!2"DNX XM"@H)1VEV96X@=&EM92!Y;W4@8V%N('1E86-H('1H92!625(Z(&5V97)Y('-I, XM;F=L92!S;V9T=V%R90UP<F]P97)T>2!Y;W4@;W=N+@H*"4-O86QE<V-E"@FI: XMJ:FIJ:FIJ0H*"4)Y(&UA:6YT86EN:6YG(&$@=FER='5A;"!R969E<F5N8V4@] XM;V8@979E<GD@<VEN9VQE(&9I;&4@:6[<:@```````-P+>6]U<B!S;V9T=V%R; XM92!U;FEV97)S92!T:&4@5DE2.B!D979I8V4@:7,@86)L92!T;R!A8W0@87,@1 XM82!V97)Y#6EN=&5L;&EG96YT(&-O86QE<V-E<BX@($%B;&4@=&\@<W!O="!E4 XM=F5R>2!S:6YG;&4@9'5P;&EC871E+"!O<@UN96%R(&1U<&QI8V%T92!I;G-T< XM86YC92!O9B!E=F5R>2!F:6QE('1H870@>6]U)W9E(&5V97(@=&%U9VAT(&ETC XM+@I!;F0@8VAA:6X@86QL(&UU;'1I<&QE(')E9F5R96YC97,@=&\@;VYL>2!O) XM;F4@<F5A;"!I;G-T86YC92P@;W(-=&\@9&5L971E(&%L;"!R961U;F1A;G0@: XM<F5F97)E;F-E<R!I9B!Y;W4@=VES:"X@(%9)4CH@*FYE=F5R*@UD96QE=&5S) XM(&]R:6=I;F%L(&UE9&EA+"!I=',@;6]R92!L:6ME(&$@0T2I5T]232!I;B!TJ XM:&%T(&ET(&IU<W0-9F]R9V5T<R!T:&4@*G)E9F5R96YC92HN"@H)5&AI<R!A/ XM8FEL:71Y(&ES('!A<G1I8W5L87)I;'D@=7-E9G5L(&EF('EO=2!W86YT('1OK XM(&ME97`*96YT:7)E(&-O<&EE<R!O9B!E;G9I<F]M96YT<R!O;FQI;F4L(&)U0 XM="!D;VXG="!W86YT('1H92!O=F5R:&5A9`UO9B!A8W1U86P@9'5P;&EC871EP XM(&EN<W1A;F-E<R!O9B!A;GD@=71I;&ET:65S('1H97D@;6EG:'0@<VAA<F4NU XM"@H)22!F:6YD(&ET(&5X=')A;W)D:6YA<FEL>2!U<V5F=6P@87,@82!T;V]LL XM('1O('-O<G0@86QL('1H90UU;FEQ=64@8V]N=&5N=',@;V8@86QL('1H92!D* XM:7-K<R!))W9E(&%C8W5M=6QA=&5D(&]V97(@=&AE('EE87)S+@H*"5-E8W5R; XM90H)J:FIJ:FI"@H)5&AE(%9I<G1U86P@1&5V:6-E(&)U:6QD<R!U<"!I;F-R7 XM96UE;G1A;"!C:&5C:W-U;7,@86-R;W-S#65A8V@@9FEL92!I="`B;&5A<FYS9 XM(BP@86YD(&%S('-U8V@@8V%N(&%C="!A<R!A;B!I;7!L:6-I="!,:6YKJ0U6J XM:7)U<R!$971E8W1I;VX@J2!B96EN9R!A8FQE('1O(&1O(&-R=61E(")D:69FH XM<R(@87,@=V5L;"!A<PUA8G-O;'5T92!C;VUP87)E<RX*"@H)5VAA=$ES"@FI8 XMJ:FIJ:D*"@E3;VUE('!E;W!L92!M87D@9FEN9"!I="!U<V5F=6P@=&\@=7-EL XM('1H92!625(Z(&-A<&%C:71Y(&9O<@UD971E<FUI;FEN9R!F:6QE('1Y<&4@F XM*'=H:6-H(&ET(&1O97,@87,@<&%R="!O9B!I=',@87%U:7-I=&EO;@UP:&%S2 XM93L@;75C:"!L:6ME('1H92!53DE8(")W:&%T:7,B/R!C;VUM86YD*2X*"@E2O XM96)O;W0*":FIJ:FIJ0H*"4ET('=O=6QD(&)E(&YI8V4@=&\@<W5P<&]R="!!. XM551/J4)/3U1)3D<@<')O9'5C=',L('=H97)E('1H90U625(Z(&-O=6QD('-AR XM>2`B4&QE87-E(&EN<V5R="!D:7-K(%@B+"!A;F0@=&AE;B!R97%U97-T(&$@' XM4D5"3T]4+@H*"E)E;&%T960@571I;&ET:65S.@JIJ:FIJ:FIJ:FIJ:FIJ:FI( XMJ:D*"@E4:&4@5FER='5A;"!$979I8V4@:7,@<V\@=')I=FEA;&QY('-I;7!L* XM92!T;R!W<FET92!T:&%T(&ETB0UR96%L;'D@;F5E9',@<V]M971H:6YG('1O` XM(")P=70@<V]M92!M96%T(&]N(&ET<R!B;VYE<R(N"@H)5&AE<V4@87)E('-O: XM;64@;W1H97(@<F5L871E9"!B:71S(&]F(&-O9&4@86YD(&ED96%S('1H870-N XM22=V92!F;W5N9"!M>7-E;&8@;F5E9&EN9R!O<B!W86YT:6YG(&%T('9A<FEO` XM=7,@=&EM97,N"@H)5&]O;"!";W@*":FIJ:FIJ:FI"@H)06X@24-/3B!T;V]LJ XM(&)O>"P@82=L82!.95A4+"!E>&-E<'0@<G5N;FEN9R!O9F8@<V-R:7!T<R!N0 XM;W2)#6UE<F5L>2!E>&5C=71I;F<@=&AE(&YA;65D(&EC;VXN"@H)5&AE($YE! XM6%0@96YV:7)O;65N="!S=6-C97-S9G5L;'D@<V5P97)A=&5S('1H92!I9&5A8 XM(&]F(&'<:@```````-P+=&]O;'-P86-E(&9R;VT@82!D871A<W!A8V4N("!/% XM;B!T:&4@3F585"!I=',@87,@:68@=&AE('5S97(@:&%S#6$@=VEN9&]W(&9L5 XM>6EN9R!T:')O=6=H('1H96ER(&1A=&%S<&%C92P@=VET:"!A;&P@=&AE:7(@7 XM=&]O;',-:&%N9'D@;V9F('1O(&]N92!S:61E+B`@5VAE<F%S(&]N(&]T:&5RN XM('-Y<W1E;7,@<W5C:"!A<R!T:&4@34%##6%N9"!!34E'02!A;F0@24)-+"!T; XM:&4@=&]O;&)O>"!A;F0@9&%T87-P86-E(&%R92!M:7AE9"!U<"P@86YD#71H) XM92!P;V]R('5S97(@:7,@9F]R979E<B!S:'5F9FQI;F<@=VEN9&]W<R!A8F]U1 XM="!T;R!C;&EC:R!O;@UE>&5C=71A8FQE<RX*"@E4:&4@5&]O;"!";W@@=V]UJ XM;&0@9F5A='5R92!A(&-L;V-K+"!A('1R87-H8V%N+"!A;F0@86QS;R!T:&4-F XM96YT<GD@<&]I;G0@=&\@5DE2.B!P<FEV:6QI9V5D(&-O;6UA;F1S+"!S=6-H* XM(&%S($Q%05).+"!#3T%,15-#12X*"@E&:6YA;&QY('1H92!4;V]L($)O>"!WJ XM;W5L9"!H879E(&$@<&]W97(@;V9F(&)U='1O;BP@=VAI8V@-=V]U;&0@:7-SC XM=64@86X@;W)C:&5S=')A=&5D('!O=V5R(&]F9B!R97%U97-T('1O('1H92!EK XM;G1I<F4-<WES=&5M+"!S=6-H('1H870@<&%R=&EA;"!W<FET97,@=&\@2$%2M XM1"!-141)02!A<F4@<')E=F5N=&5D+B`-5&AI<R!F96%T=7)E(&%L;VYE('-HR XM;W5L9"!T<FEG9V5R(&$@<W!E;F1I;F<@<W!R964@86UO;F<@0D)3#6]W;F5RA XM<RX*"@E!9&1I=&EO;F%L;'D@J2!A;F0@=&AI<R!I<R!H:6=H;'D@;W!T:6]NJ XM86P@J2!W:71H(&$@8FET(&]F#6AA<F1W87)E(&ET(&-O=6QD('1U<FX@;V8@4 XM>6]U<B!H87)D9')I=F4@=VAE;B!I="!W87-N)W0@:6X@=7-E"BAO<B!E=F5NP XM(&1O(&$@<&%R:R]S:'5T9&]W;B!S=7!P;W)T960@:6X@<V]M92!D<FEV97,@+ XM<V]F='=A<F4I+@H*"4%20TA)5D%,"@FIJ:FIJ:FIJ0H*"4%R8VAI=F%L(*D@T XM<&%R=&EC=6QA<FEL>2!O;B!T:&4@06UI9V$@J2!I<R!O;F4@;V8@=&AE(&UO; XM<W0-<&]O<FQY(&%D9')E<W-E9"!I<W-U97,N("!)('1H:6YK('=E(&%L;"!P^ XM<F5T='D@;75C:"!K;F]W('=H870-;6%K97,@82!G;V]D(&%R8VAI=F%L('!R, XM;V=R86TN("!4:&EN9W,@;&EK93H*"@D)2&]L;V=R87!H:6,@(*D@(%)E=&%ID XM;FEN9R!S;VUE(&EM86=E(&]F('1H92!M87-T97(*"0D)"0D@9&ES:RP@;W(@T XM870@;&5A<W0@=&AA="!P87)T:6-U;&%R(&1I<VMS"@D)"0D)(&-O;G1E;G1SY XM('-U8V@@=&AA="!A(&QO<W,@;V8@=&AE(&UA<W1E<@H)"0D)"2!D:7-K(&1O] XM97-N)W0@<F5S=6QT(&EN(&-O;7!L971E(&9A:6QU<F4*"0D)"0D@;V8@=&AEE XM(&5N=&ER92!A<F-H:79E+@H*"0E!=71O;6%T960)("`@J2`@0F5I;F<@86)LG XM92!T;R!P97)F;W)M(&1E;'1A(&%R8VAI=F5S"@D)"0D)(&]N(&$@<F5G=6QAW XM<B!B87-I<R!W:71H;W5T(&AU;6%N"@D)"0D)(&EN=&5R=F5N=&EO;BX*"@D)A XM0V]M<')E:&5N<VEV92"I(%)E86P@0F%C:W5P<R!F;W(@4F5A;"!096]P;&4A? XM("!*=7-T"@D)"0D)(&$@9V5N97)A;"!C;VUP;&%I;G0@86)O=70@<&]O<@H)Q XM"0D)"2!O<'1I;VX@<V5L96-T86)I;&ET>2`H9&5G<F5E(&]F"@D)"0D)(&-O] XM;7!R97-S:6]N+"!S<&5E9"!E=&,N*0H*"0E":6=G97-T"2`@(*D@($)E:6YG2 XM(&%B;&4@=&\@:VYO=R!J=7-T(&5X86-T;'D@=VAI8V@*"0D)"0D@9FEL92!I) XM="!I<R!T:&%T(&ES(&-O;G1R:6)U=&EN9R!T:&4*"0D)"0D@;W1H97(@.34S0 XM(&1I<VMS('1O('1H92!O=&AE<G=I<V4*"0D)"0D@<VEN9VQE(&1I<VL@87)C6 XM:&EV92`H05)'(2DN"@H)5&AE($%M:6=A($-O;6UU;FET>2!I<R!C<GEI;F<@P XM;W5T(&9O<B!A(&1E8V5N="!!<F-H:79A;`U5=&EL:71Y+"!)(&AA=F4@<V]MF XM92!N:6-E(&]N97,@;VX@=&AE($U!0RP@86YD('-O;64@3TL@;VYE<R!O;@UTH XM:&4@24)-+"!B=70@22!J=7-T(&AA=F5N)W0@<V5E;B!A;GET:&EN9R!R96%L) XM;'D@8V]M<')E:&5N<VEV90UF;W(@=&AE($%M:6=A('EE="X*"@E*54Y+"@FIB XMJ:FIW&H```````#<C`H)"55N9&5L971E"@D)J:FIJ:FIJ:D*"@E3=&%N9&%R) XM9"!&:6QE(%5N9&5L971E"@H)"4YO<G1O;B!$:7(*"0FIJ:FIJ:FIJ:FI"@H)2 XM02!P<F]P97(@9&ER96-T;W)Y(&%N9"!S=6)D:7(@9&ES<&QA>2P@87,@=V5L( XM;"!A<R!S;VUE(&]T:&5R#4YO<G1O;B!T>7!E(%5T:6QI=&EE<RX*"@D)1&5FD XM<F%G9V5R"@D)J:FIJ:FIJ:FI"@H)02!P<F]P97(@9W)A<&AI8V%L(&AA<F1D) XM:7-K(&1E9G)A9V=E<CL@;VYE('1H870@<'5T<R!A;&P@=&AE#69R965D('-PX XM86-E(&YE>'0@=&\@=&AE('1A:6P@;V8@=&AE(&UO<W0@<F5C96YT;'D@86-C\ XM97-S960@9FEL97,N"@H)"5)E86P@0V]P>0H)":FIJ:FIJ:FIJ0H*"4$@9&ESE XM:R!C;W!I97(@=&AA="!D:7-P96YS97,@=VET:"!T:&4@8V]M;6]N(&ED:6]C: XM>2!O9@UP<F]T96-T:6]N('-C:&5M97,@8GD@<V-A;FYI;F<@=')A8VMS(&9O3 XM<B!W96%KJ6)I=',@86YD('1H96X-9'5P;&EC871I;F<@=&AE(&UE9&EA(&%C] XM<F]S<R!T:&4@<V%M92!W<FET9:ES<&QI8V4L('1H=7,-96UU;&%T:6YG('=H$ XM870@=&AE(&AE879Y(&EN9'5S=')Y(&UE9&EA(&1U<&QI8V%T;W)S(&1O+@TH5 XM8F%S:6-A;&QY(&$@<&5R9F5C="!C;W!I97(I("A)(&AA=F4@;F\@:61E82!WE XM:'D@;F]B;V1Y(&AA<R!D;VYE#6ET+"!E>&-E<'0@=&AA="!F97<@;W1H97(@" XM<&5O<&QE(&AA=F4@:&%D('1O(&9I9VAT('=I=&@@=&AO<V4-;6]N<W1R;W-IE XM=&EE<R!T;R!G970@=&AE;2!T;R!R96-O9VYI>F4@82!P<F]T96-T960@9F]RA XM;6%T*2X*"@D)16YC<GEP=`H)":FIJ:FIJ:D*"@E)=',@<&]S<VEB;&4@=&\@0 XM96YC<GEP="!A;B!E;G1I<F4@;65D:6$@<&%R=&ET:6]N('-U8V@@=&AA=`IT7 XM:&4@96YT:7)E(&UE9&EA(&%P<&5A<G,@=&\@8F4@9V%R8F%G92!U;FQE<W,@- XM9&5C;V1E9"!A9V%I;G-T(&$-<')O<&5R(&ME>2X*"@E4:&ES(&ME>2!T:&5NY XM(&EN(&$@<V5N<V4@8F5C;VUE<R!A('9E<GD@<V5C=7)E('!A<W-W;W)D+B`-P XM4VEN8V4@86QL('1H92!D871A(&]N('1H92!P:'ES:6-A;"!M961I82!I<R!C@ XM>6-L:6-A;&QY(')U;B!L96YG=&@-96YC;V1E9"!A9V%I;G-T('1H92!P87-S[ XM=V]R9"!I="!B96-O;65S(&YO="!P;W-S:6)L92!T;R!S:6UP;'D-(G!A<W,@P XM=&AR=2!A(&=A=&5W87DB('1O(&-R86-K('1H92!M961I82X@(%)A=&AE<B!T( XM:&4@96YT:7)E#6UE9&EA(&ES(&)Y(&ET<R!V97)Y(&YA='5R92!O<&5N+"!Y4 XM970@<V5C=7)E+@H*"4D@:&%V92!A;B!I;7!L96UE;G1A=&EO;B!O9B!T:&ES: XM('-C:&5M92!A<R!O<FEG:6YA;&QY#6-O;F-E:79E9"!O9B!B>2!286YD>2!,: XM:6YD96XL(&%N9"!)(&AA=F4@8F5E;B!R=6YN:6YG(&ET(&9O<B!O=F5R#3(@T XM>65A<G,@87,@82!W87D@;V8@<V5C=7)I;F<@;7D@9&%T87-P86-E(&%G86ENK XM<W0@97)R86YT('!I<F%T97,-86YD('!O;&EC92X*"@E3;R!F87(@:71S('!E2 XM<F9O<FUE9"!F;&%W;&5S<VQY+B`@22!G;R!T:')U(&-U<W1O;7,@=VET:"!M\ XM>0TQ,S`@;65G86)Y=&5S(&]F('%U87-IJ6QE9V%L(&-O9&4@=VET:&]U="!QA XM=6%L;2P@86YD($D@;&5A=F4-;W1H97(@<&5O<&QE(&%C8V5S<R!T;R!M>2!CV XM;VUP=71E<B!F;W(@:&]U<G,@;VX@96YD('=I=&AO=70-8V]N8V5R;BX*"@E)5 XM9&5A;&QY('1H92!P87-S=V]R9"!I<R!N;W0@;VYL>2!S96-U<F4L(&)U="!A] XM;'-O('-L:6=H=&QY#7)E9'5N9&%N="P@:&%V:6YG(&$@=F%L:61I='D@8VAE0 XM8VMS=6T@:6UB961D960@:6X@:71S96QF('-U8VC<:@`````"`-P+=&AA="!A# XM;B!I;F%D=F5R=&%N="!T>7!I;F<@97)R;W(@9&]E<VXG="!E;F0@=7`@8V]R' XM<G5P=&EN9R!Y;W5R#65N=&ER92!M961I82`H;75C:"!L:6ME('-O8VEA;"!S4 XM96-U<FET>2!N=6UB97)S*2X*"@E)(&UE;G1I;VX@16YC<GEP="!I;B!S=6-H' XM(&1E=&%I;"!B96-A=7-E(&ET<R!A(&)I9R!I9&5A+"!B=70-=&AE(&%C='5A4 XM;"!C;V1E(&ES(&]N;'D@,C<P,"!B>71E<R!L;VYG('5N9&5R(&UY(&EM<&QE` XM;65N=&%T:6]N+@H*"2A.;W<@:&]W(&1O('EO=2!P<F]T96-T(#(W,#`@8GET- XM97,@9G)O;2!P:7)A8WD_/S\@J2!I;6)E9"!I=`T)(&EN(&$@;75C:"!L87)G9 XM97(@<')O9'5C="$I+@H*"5!R;V1U8W0@1V5N97)A;`H)J:FIJ:FIJ:FIJ:FI+ XMJ:FI"@H)5&AE('!R;V1U8W0@<VAO=6QD(&AA=F4@86X@05)%6%@@<&]R="`H1 XM9F]R($%M:6=A;VED<RDN"@H)5&AE('!R;V1U8W0@:7-N)W0@;F5C97-S87)I- XM;'D@06UI9V$@4W!E8VEF:6,L(&)U="!A="!T:&4-<V%M92!T:6UE($D@9&]NC XM)W0@=&AI;FL@:71S(&$@=V5A:VYE<W,@=&\@861D<F5S<R!T:&4@06UI9V$-! XM36%R:V5T(&]N;'DL(&EF('1H92!D979E;&]P;65N="!C;W-T<R!A<F4@;&]W; XM(&5N;W5G:"X@($DG9`UP97)S;VYA;&QY(&QI:V4@=&\@=&%C:VQE('1H92!-H XM04,@87,@82!S96-O;F0@;W!T:6]N("AS:6YC92!M:6YE#6ES(&$@<W1U;FYI< XM;F=L>2!U;F)E;&EE=F%B;&4@;W)G86YI>F%T:6]N86P@8V%T87-T<F]P:&4AI XM*2X*"@E!<R!A(&9I;F%L('!O:6YT+"!I;6%G:6YE+"!N;W<@=&AA="!Y;W4@1 XM:&%V92!Y;W5R(&5N=&ER90US>7-T96T@;VX@5DE2.BP@86YD('EO=2=V92!P" XM97)F;W)M960@82!T;W1A;"!#3T%,15-#12!O;@UE=F5R>71H:6YG+B`@3F]WI XM('EO=2!W86YT('1O(&UA:V4@82`B<F5A;"(@8F%C:W5P('1O('EO=7(@8G)A^ XM;F0-;F5W+"!J=7-T('!U<F-H87-E9"P@1FQO<'1I8V%L(&AA<F1D<FEV92X@K XM(%=H870@9&\@>6]U(&1O/R`-4VEM<&QY(&1R86<@=&AE(%9)4CH@9&5V:6-E[ XM(&EC;VX@;W9E<G1O<"!T:&4@1FQO<'1I8V%L($EC;VXN"@H*06YS96QM($AO# XM;VL*J:FIJ:FIJ:FIJ:D*"@E)('=A;G0@=&\@96UP:&%S:7IE(&UY<V5L9B!A! XM(&QI='1L92!B:70@:&5R92!B96-A=7-E(&ET<PUI;7!O<G1A;G0@=&\@;6%K` XM92!C;&5A<B!M>2!C;VUP971E;F-E(&EN(')E;&%T:6]N('1O('1H:7,-<')O# XM:F5C="X*"@E))W9E('=R:71T96X@82!F97<@87)C861E(&=A;65S(&AE<F4@= XM86YD('1H97)E+"!C97)T86EN;'D-=V]R:V5D(&]N(&$@;&]T+"!S=6-H(&%S[ XM+"!6241%3ZE+2413+"!:3T]-+"!35T]21"!/1B!33T1!3B!!34E'02P-2%E"H XM4DE3+"!"05143$4@4U%504123TXL($1204=/3E,@3$%)4B!)22P@5D]25$58+ XM+"!$051!4U1/4DTL($U3#5!!0R!-04X@4T5'02X*"@E"=70@8F5F;W)E(&%LZ XM;"!T:&%T($D@<W!E;G0@=VAA="!I<R!S=&EL;"!T:&4@;6%J;W)I='D-<&]R6 XM=&EO;B!O9B!M>2!P<F]G<F%M;6EN9R!C87)E97(@=V]R:VEN9R!I;B!T:&4@C XM3VEL(%!A=&-H.R!W:&5R90U)(&1I9"!T:&4@;6%I;B!B;V1Y(&]F(&UY('=O& XM<FL@*&)U="!O9B!C;W5R<V4@;7D@86-C;VUP;&ES:&UE;G1S#71H97)E(&%R> XM96XG="!R96%L;'D@=FES:6)L92!T;R!A;GEB;V1Y(&]U='-I9&4@;V8@=&AEQ XM(&-O;7!A;GD@9F]R#7=H;VT@22!W;W)K960I+B`@5&AI<R!M96%N<R!T:&%T/ XM(&UY(&-O9&4@:7,@=F5R>2!C;&5A;BP@86YD#7-H87)A8FQE.R!Y970@;F]TR XM(&)I>GIA<F5L>2!O8F9U<V-A=&EN9RDN"@H)22=V92!W;W)K960@870@82!L> XM;W0@;V8@9&EF9F5R96YT($-O;7!A;FEE<RP@22!A8W1U86QL>2!S965M#71O\ XM(&AA=F4@82!B860@:VYA8VL@;V8@8F%N:W)U<'1I;F<@86QL(&UY($5M<&QOJ XM>65R<R"I(&YO(&9A=6QT(&]F#6UI;F4@22!A<W-U<F4@>6]U(2`@22!T:&EN& XM:R!T:&%T($D@:&%V92!A('1E;F1E;F-Y('1O(&]V97)W:&5L;0UT:&5M('=I; XM=&@@:61E87,@86YD('1H97D@:G5S="!E>'!L;V1E(*D@;F%T=7)A;"!C875S2 XM97,N+BX*"@E"=70@8GD@=V]R:VEN9R!A="!S;R!M86YY(&1I9F9E<F5N="!OX XM<F=A;FEZ871I;VYS+"!A;F0@;V9T96X-870@<W5C:"!C;&]S92!D:7-T86YC% XM92!T;R!T:&4@97AE8W5T:79E+"!))W9E(&=A:6YE9"!Q=6ET92!A;@UI;G-I1 XM9VAT(&EN=&\@=VAA="!M86ME<R!A($-O;7!A;GD@=V]R:RP@86YD('=H870@P XM;6%K97,@<')O9'5C='/<:@`````"`-P+=V]R:RX*"@E!="!T:&4@;6]M96YTH XM($D@9FEN9"!M>7-E;&8@=F5R>2!F<G5S=')A=&5D(&)E8V%U<V4@22!K;F]WD XM#7!R96-I<V5L>2!E>&%C=&QY('1E8VAN:6-A;&QY('=H870@=&\@9&\@=&\@4 XM<'5T(&$@<')O9'5C=`UT;V=E=&AE<BP@8G5T($D@<VEM<&QY(&1O;B=T(&AA- XM=F4@=&AE('1I;64@=&\@861D<F5S<R!A;&P@=&AE#7!R;V1U8W1S('1H870@` XM22!W:7-H('1O(&1O+@H*"4EF('EO=2!W:7-H('1O('-E92!A('!I8W1U<F4@) XM;V8@;64@9V]T;R!Y;W5R(&YE87)E<W0-<V]F='=A<F4@<F5T86EL97(@86YDD XM('1A:V4@82!L;V]K(&%T('1H92!I;G-I9&4@:F%C:V5T(&]F(%-%1T$-4U=/: XM4D0@3T8@4T]$04XN"@H)5VAA="!%;'-E($D@:VYO=SH*":FIJ:FIJ:FIJ:FI` XMJ:FIJ:FI"@H)2&]W('1O('=R:71E(&%N(&5X=&5N9&5D($1/4R!H86YD;&5RS XM(&9O<B!T:&4@24)-(&EN(#@P,C@V#6UA8VAI;F4@8V]D92$@*&EN8VQU9&EN[ XM9R!215-%5"!T;R!L96%V92!04D]414-4140@34]$12$I("AW;W<A*2X*"@E-: XM>2!I;G1E<F5S=',*":FIJ:FIJ:FIJ:FIJ0H*"4DG;2!C=7)R96YT;'D@<'5RR XM<W5I;F<@82!B:70@;V8@56YI=F5R<VET>2!%9'5C871I;VXN"@H)22=M(&UO] XM<W0@:6YT97)E<W1E9"!I;B!T:&4@;F%T=7)E(&]F(&-O;7!U=&5R(&QA;F=U` XM86=E<RP@86YD#6QA=&5L>2!))W9E(&)E96X@97AP;&]R:6YG('1H92!%249&O XM14P@3T]04R!S>7-T96TN"@H)5&AE(&ED96$@;V8@0UE"15)34$%#12!E>&-I5 XM=&5S(&UE+"!A;'1H;W5G:"!)(&)E;&EE=F4@=&AE#79E<FYA8W5L87(@<&5R3 XM8V5P=&EO;B!O9B!I="!I<R!A(&)I="!U;F-L96%R+B`@22!B96QI979E(&ENT XM('1H90UI9&5A(&]F(&%N($%N=&EC:7!A=&]R>2!$96UO8W)A8WD@86)O=F4@` XM86YD(&)E>6]N9"!T:&4@:61E82!O9@U#>6)E<G-P86-E("AB=70@=&AE;B!#P XM>6)E<E-P86-E(&ES(&IU<W0@;F]W(&AI='1I;F<@8V]M;6]N('!R97-S#7=HM XM97)E87,@(G5S(&AA8VME<G,B('=E<F4@97AP;W-E9"!T;R!T:&4@:61E82!ON XM=F5R(&$@9&5C861E(&%G;RDN(`U))V0@;&EK92!T;R!S964@=&5C:&YO;&]G[ XM>2!L:6ME('1H:7,@:&5L<"!M86YK:6YD(&-H87)T(&$@8V]U<G-E#6]U="!OY XM9B!T:&4@=')E86-H97)O=7,@>65A<G,@86AE860@*'=O=6QD;B=T('=E(&%L( XM;"DN"@H)22!E;FIO>2!T96%C:&EN9RP@22!A;2!T>7!I8V%L;'D@82!F86ER2 XM;'D@<'5B;&EC('!E<G-O;B!W:71H#6UY('!R;V=R86T@8V]D92!I;B!T:&%TE XM('=A>2P@<V5E(&UY(%!$(%1%5%))4R!O;B!&<F5D($9I<V@@(S,R-`TH;W)I2 XM9VEN86P@=6ZI>6%N:V5D(&5D:71I;VYS*2!O<B!$24U%3E-)3TY3(&]N($9R* XM960@1FES:"`C,30N("!)#6QI:V4@=&\@=&5A8V@@8F5C875S92!)('=A;G0@' XM=&\@:&5L<"!O=&AE<B!P96]P;&4@;W5T(&]F('!O;W(-<VET=6%T:6]N<R!L, XM:6ME($D@=V%S(&]N8V4@:6XN"@H)0V]M;75N:71Y"@FIJ:FIJ:FIJ:D*"@E#] XM86QG87)Y(&ES(&UY(&AO;64@;V8@8VAO:6-E+"!W92!H879E(&%N(')O8G5SQ XM="!!;6EG80U#;VUM=6YI='D@:&5R92!W:71H('1H92!!+DTN52Y#('5S97)SH XM(&=R;W5P+"!3=&5V92!697)M=6QE;@TH17AP<F5S<R!086EN="D@86YD(&$@F XM9V5N97)A;&QY('9E<GD@:&5A;'1H>2!!;6EG82!-87)K970N"@H)37D@9F%TG XM:&5R(&]W;G,@5&AE($-O;7!U=&5R(%-H;W`L($YO<G1H($%M97)I8V$G<R!/" XM;&1E<W0*0V]M<'5T97(@4F5T86EL97(L(&]P96YE9"!I;B`Q.3<V(&%N9"!SH XM=&EL;"!G;VEN9R!S=')O;F<N("!)=',-:&5R92!T:&%T($DG=F4@8F5E;B!MX XM87-S:79E;'D@97AP;W-E9"!T;R!V:7)T=6%L;'D@979E<GD@;F5W#7)E=&%IN XM;"!S;V9T=V%R92!P<F]D=6-T(&EN(&5X:7-T86YC92`H87,@=V5L;"!A<R!H? XM879I;F<@;7D@<&EC:PUO9B!T:&4@8VAO:6-E<W0@:&%R9'=A<F4I+@H*"4]NV XM92!O9B!M>2!S96QF(&1E<')E8VEA=&EN9R!J;VME<R!I<R!T:&%T($D@=7-E8 XM9"!T;R!B92!O;F4-;V8@=&AO<V4@5VAI>B!+:61S+"!B=70@;F]W($DG;2!J4 XM=7-T(&]L9"$@($)U="!A="`R,R!Y96%R<R!O9B!A9V7<:@`````"`-P+22=M3 XM('!R;V)A8FQY(&]N92!O9B!T:&4@;6]S="!E>'!O<V5D(&]L9'-T97)S(&%RQ XM;W5N9"X@($%N9"!H97DA#6]N;'D@,B!M;W)E('EE87)S('1I;&P@<F5T:7)EV XM;65N="$@*$%P<&%R96YT;'D@;6]S="!H:6=H#7!R97-S=7)E('!R;V=R86UMK XM97)S(&MI8VL@:70@870@86=E(#(U("AE:71H97(@8G5R;F]U="!O<B`D)"D@\ XM*2X*"@D)"0D)"0D)"0E9;W5R<R!4<G5L>0H*"0D)"0D)"0D)"4%N<V5L;2!(= XM;V]K"@H*4W5P<&QE;65N=&%R>2!-871E<FEA;',*J:FIJ:FIJ:FIJ:FIJ:FI3 XMJ:FIJ:FIJ:D*"@EC;W!Y(&]F(&PZ5FER='5A;*E(86YD;&5R"@EC;W!Y(&]FL XM(&1E=G,Z;6]U;G1L:7-T"@EC;W!Y(&]F(&,Z;&5A<FX*"6-O<'D@;V8@8SICP XM;V%L"@EC;W!Y(&]F(&,Z96YC<GEP="`@("@@3D]4($E.0TQ51$5$*0H*"7!IA XM8W1U<F4@;V8@=&]O;&)O>"`@*"!.3U0@24Y#3%5$140@*0H)<&EC='5R92!O' XM9B!A<F-H:79A;"!D979I8V4@*"!.3U0@24Y#3%5$140@*0H*"DUO;F5Y(&%N_ XM9"!4:6UI;F<*J:FIJ:FIJ:FIJ:FIJ:FIJ0H*"5!R;VIE8W0@0V]M<&]N96YT- XM<SH*"0E625(Z"@D)":D^('1O(&UA8VAI;F4@8V]D92`H8W5R<F5N=&QY(&EN: XM($,I"@D)":D^(')E8V]G;FEZ92!A<F-H:79E<RP@=VAA=&ES"@D)":D^(&1E$ XM8VED92!G;V]D(&1A=&%B87-E(&9O<FUA="`H<&5R9F5C="!H87-H/RD*-2!W/ XM965K<PH)"51/3TP@0D]8.@H)"0FI/B!O<F-H97-T<F%T960@<&]W97(@;V9FA XM("A!4D586"`G96TI"@D)":D^($%215A8"@D)":D^($-L;V-K("\@1V%R8F%G1 XM90H)"0FI/B!38W)I<'1S"C$@=V5E:PH)"4%20TA)5D4Z"@D)":D^($)A8VMUJ XM<`H)"0FI/B!#;VUP<F5S<VEO;@H)"0FI/B!!=71O;6%T960*."!W965K<PH)2 XM"4]42$52.@H)"0FI/B!U;F1E;&5T92]D:7(*"0D)J3X@9&5F<F%G"@D)":D^6 XM(')E86QC;W!Y"@D)":D^(&5N8W)Y<'0*,B!W965K<PH*J:FIJ:FIJ:D*"C$V" XM('=E96MS(&%T("0T,#`P(&$@;6]N("AM:6XI(&9O<B!M>7-E;&8@86YD(&%NU XM;W1H97(@<')O9W)A;6UE<BX*"JFIJ:FIJ:FIW&H```````#<C"0Q-C`P,"!D5 XM;VQL87)S(%53('1O=&%L(&1E=F5L;W!M96YT(&-O<W0*"DYO="!C;W5N=&EN: XM9R!B;VYU<ZET;ZES=&%R=`I.;W0@8V]U;G1I;F<@;7D@;W9E<FAE860@*'1IL XM;64O=')A:6YI;F<O:&%R9'=A<F4I+@H*4V\@:70@;&]O:W,@;&EK92!A="!A' XM(&UI;FEM=6T@:70@=V]U;&0@=&%K92`T(&UO;G1H<R!A;F0@)#@P,#`-9&]LA XM;&%R<R!T;R!P<F]D=6-E('1H:7,@<&%C:V%G92!A<W-U;6EN9R!T:&%T($D@L XM9FEN9"!A(&=O;V0-<')O9W)A;6UE<B!A="!P<F]J96-T('-T87)T+@H*3F]W$ XM($1I<V-O=F5R>2!S;VQD(#4P,#`P('5N:71S(&]F($UA<F%U9&5R(&EN:71I5 XM86QL>2P@86YD('-I;F-E#71H97D@9&ED(&1I<W1R:6)U=&EO;B!T:&5Y(&=O+ XM="`D,34@<&5R('5N:70L('-O('1H871S(&%B;W5T#20Q-3`P,#`P(&]F9B!T( XM:&%T('!R;V1U8W0N("!4:&5Y(&5N9&5D('5P(&AA=FEN9R!A('1O;B!O9B!SB XM86QE<PUD=64@=&\@=&AE(&)R86EN9FEL97,@979E;G1U86QL>2`H=')A;G-I5 XM=&EV92!P<F]P97)T>2!O9B!F<F5E#75P9W)A9&5S($D@<')E<W5M92DN"@I3$ XM;R!A="`D,3`@<&5R('5N:70@=&AE(&1I<W1R:6)U=&EN9R!C;VUP86YY('-H[ XM;W5L9"!G96YE<F%T92!A8F]U=`TD-3`P,#`P(&1O;&QA<G,N("!3;R!)(&=U6 XM97-S('1H870@)#@P,#`@87-K:6YG('!R:6-E(&ES(&$@8FET#6QO=RP@22=D3 XM('-U9V=E<W0@=')Y:6YG('1O(&=E="!A8F]U="!D;W5B;&4@=&AA="X*"D%T@ XM('1H92!S86UE('1I;64@=&AE<F4@:7,@=&AE('!R;V)L96T@;V8@<V-O<&4LW XM('1H92!625(Z(&1E=FEC90UI<R!A('-I;7!L92!L:71T;&4@:61E82P@86YDP XM('-H;W5L9"!B92!M87)K971A8FQE(&%S('!E<FAA<',-<V5P97)A=&4@;V8@0 XM=&AE(&]T:&5R(&ED96%S(&]N8V4@=&AE<V4@:VEN9',@;V8@;G5M8F5R<R!S$ XM=&%R="!T;PUB92!T:')O=VX@87)O=6YD+@H*665T('1H97)E(&ES;B=T(&%N= XM>7=A>2!T;R!P<F]T96-T('1H92!P<F]D=6-T(&%G86EN<W0@<F%M<&%N=`UP' XM:7)A8WD@=6YL97-S('1H92!P86-K86=E(&AA<R!S;VUE(&UO<F4@9W)A;F1IW XM;W-E('1H96UE+@H*26X@=VAI8V@@8V%S92!I="!B96-O;65S(&%N(&%D=F5R^ XM=&ES:6YG('!R;V)L96T@;V8@=')Y:6YG('1O#65X<')E<W,@=&AE(&9U;F1AZ XM;65N=&%L(&%P<&QI8V%B:6QI='D@;V8@<')O9'5C=',@87,@9&EV97)S92!A8 XM<R!A#2)625(Z(B!D979I8V4L(&$@(E1O;VQ";W@B(&%N(")!<F-H:79A;"!4G X:;V]L(B!A;F0@86X@(D5N8W)Y<'1E<B(N"@I"2 X`` Xend Xsize 14966 END_OF_FILE if test 20996 -ne `wc -c <'virt_mean.uu'`; then echo shar: \"'virt_mean.uu'\" unpacked with wrong size! fi # end of 'virt_mean.uu' fi echo shar: End of archive 2 \(of 4\). cp /dev/null ark2isdone MISSING="" for I in 1 2 3 4 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 4 archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 -- Mail submissions (sources or binaries) to <amiga@uunet.uu.net>. Mail comments to the moderator at <amiga-request@uunet.uu.net>. Post requests for sources, and general discussion to comp.sys.amiga.misc.