[comp.sources.amiga] v91i101: virt alpha - virtual device driver, Part02/04

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.