stuart@gargoyle.UChicago.UUCP (Stuart A. Kurtz) (03/18/85)
Here's the listing of the bug fix program for MacModula-2's interpreters.
The compiled (m-code) version is also being posted in BinHex4.0 form.
(It's difficult but possible to compile on a 128K Mac.) See note in
net.micro.mac.
Stuart Kurtz ihnp4!gargoyle!stuart
Dept. of Computer Science stuart@uchicago.csnet
University of Chicago
------------------------------[cut here]------------------------------
(* This program patches a number of potential problems in MacModula-2...
1- Fixes a problem of the interpreter crashing at
exit on some systems on a 128K Mac.
2- Fixes SystemEvent trap.
3- Fisex GetNamedResource trap.
4- Fixes local variable problem in NewProcess
*)
MODULE Patch;
FROM InOut IMPORT ClearScreen, WriteString, ReadString, WriteLn,
WriteCard, Read, WriteInt, Write;
FROM ResourceManager IMPORT SizeResource, OpenResFile, GetResource,
ChangedResource, CloseResFile, ResError;
FROM Strings IMPORT StrModToMac;
FROM MacSystemTypes IMPORT Str255, Handle;
FROM MemoryManager IMPORT HNoPurge, HPurge;
CONST
Same = 11; (* Number of similiar patch bytes for both *)
bigCnt = 5; (* Number of patch bytes for Modula-2 *)
smallCnt = 6; (* Number of patch bytes for Modula 2 *)
Max = Same + bigCnt + smallCnt;
GrandSum = 8587; (* Total vertical checksum *)
TYPE
patchRec = RECORD
where : CARDINAL; (* Byte location of byte to be
* changed *)
bad : CARDINAL; (* Original value *)
good : CARDINAL; (* New value to replace original
* value *)
chksum: CARDINAL;
END;
buffer = POINTER TO ARRAY [0..32767] OF CHAR;
bufhdl = POINTER TO buffer;
VAR
Data : ARRAY [1..Max] OF patchRec;
RsrcHdl1, RsrcHdl2 : bufhdl;
res1, res2 : INTEGER;
ch : CHAR;
PROCEDURE ChangeByte(Hdl : bufhdl; i : CARDINAL);
VAR where : CARDINAL;
BEGIN
WITH Data[i] DO
IF CHAR(bad) # Hdl^^[where] THEN (* Verify old byte is bad *)
IF CHAR(good) = Hdl^^[where] THEN (* Byte must be already changed *)
WriteString('Patch #'); WriteCard(i,0);
WriteString(' has already been patched!'); WriteLn;
ELSE
WriteString('Patch #'); WriteCard(i,0);
WriteString(' has wrong byte! File must be corrupt!');
WriteLn;
Error;
END;
END;
Hdl^^[where] := CHAR(good); (* Change byte in resource *)
END;
END ChangeByte;
PROCEDURE OpenResourceFiles;
VAR macstr : Str255;
BEGIN
StrModToMac(macstr,'Modula-2');
res1 := OpenResFile(macstr); (* Open resource fork of Modula-2 *)
IF res1 = -1 THEN
WriteString('Could not open resource: Modula-2');
WriteLn;
Error;
END;
CheckError;
RsrcHdl1 := GetResource('CODE',1); (* Get the machine code *)
IF RsrcHdl1 = NIL THEN
WriteString('Cannot read code resource for Modula-2');
WriteLn;
Error;
END;
CheckError;
HNoPurge(Handle(RsrcHdl1)); (* Lock our resource into memory *)
StrModToMac(macstr,'Modula 2');
res2 := OpenResFile(macstr); (* Open resource fork of Modula 2 *)
IF res2 = -1 THEN
WriteString('Could not open resource: Modula 2');
WriteLn;
Error;
END;
CheckError;
RsrcHdl2 := GetResource('CODE',1); (* Get the machine code *)
IF RsrcHdl2 = NIL THEN
WriteString('Cannot read code resource for Modula 2');
WriteLn;
Error;
END;
CheckError;
HNoPurge(Handle(RsrcHdl2)); (* Lock our resource into memory *)
END OpenResourceFiles;
PROCEDURE FixBigInterp;
VAR i : CARDINAL;
BEGIN
FOR i := 1 TO Same DO (* Change the similiar bytes *)
ChangeByte(RsrcHdl1,i);
END;
FOR i := Same TO Same + bigCnt DO (* Change the unique bytes *)
ChangeByte(RsrcHdl1,i);
END;
WriteString('Changing resource'); WriteLn;
ChangedResource(Handle(RsrcHdl1)); (* Flag the resource as changed *)
CheckError;
HPurge(Handle(RsrcHdl1)); (* Let the resource be purged *)
END FixBigInterp;
PROCEDURE CheckError;
VAR err: INTEGER;
BEGIN
err := ResError();
IF err # 0 THEN
WriteString('error = ');
WriteInt(err,0); WriteLn;
Error;
END;
END CheckError;
PROCEDURE FixSmallInterp;
VAR i : CARDINAL;
BEGIN
FOR i := 1 TO Same DO (* Change the similiar bytes *)
ChangeByte(RsrcHdl2,i);
END;
FOR i := Same + bigCnt + 1 TO Same + bigCnt + smallCnt DO
ChangeByte(RsrcHdl2,i);
END;
WriteString('Changing resource'); WriteLn;
ChangedResource(Handle(RsrcHdl2)); (* Flag the resource as changed *)
CheckError;
HPurge(Handle(RsrcHdl2)); (* Let the resource be purged *)
END FixSmallInterp;
PROCEDURE Error;
VAR ch : CHAR;
BEGIN
WriteString('Hit any key to Halt...(Files will probably not be updated)');
Read(ch);
HALT;
END Error;
PROCEDURE CheckData; (* Verify that the data has been entered correctly *)
VAR i, calcSum : CARDINAL;
BEGIN
WriteString('Checking data...'); WriteLn;
calcSum := 0;
FOR i := 1 TO Max DO
WITH Data[i] DO
IF where + bad + good # chksum THEN
WriteString('Inconsistant data in array element: ');
WriteCard(i,0); WriteLn;
WriteString('Check the data initialization section carefully!');
WriteLn;
Error;
END;
(* Perform an XOR checksum *)
calcSum := CARDINAL(BITSET(calcSum) / BITSET(chksum));
END;
END;
IF calcSum # GrandSum THEN
WriteString('Total checksum (');
WriteCard(calcSum,0);
WriteString(') does not equal correct amount(');
WriteCard(GrandSum,0);
WriteString(').');
WriteLn;
Error;
ELSE
WriteString('Data is OK -- Patching can proceed.'); WriteLn;
END;
END CheckData;
BEGIN
ClearScreen;
(* Data Initialization Section *)
Data[1].where := 3358; Data[1].bad := 32;
Data[1].good := 103; Data[1].chksum := 3493;
Data[2].where := 3359; Data[2].bad := 68;
Data[2].good := 26; Data[2].chksum := 3453;
Data[3].where := 3361; Data[3].bad := 104;
Data[3].good := 68; Data[3].chksum := 3533;
Data[4].where := 3362; Data[4].bad := 0;
Data[4].good := 32; Data[4].chksum := 3394;
Data[5].where := 3363; Data[5].bad := 118;
Data[5].good := 104; Data[5].chksum := 3585;
Data[6].where := 3364; Data[6].bad := 50;
Data[6].good := 0; Data[6].chksum := 3414;
Data[7].where := 3365; Data[7].bad := 40;
Data[7].good := 118; Data[7].chksum := 3523;
Data[8].where := 3366; Data[8].bad := 0;
Data[8].good := 50; Data[8].chksum := 3416;
Data[9].where := 3367; Data[9].bad := 8;
Data[9].good := 40; Data[9].chksum := 3415;
Data[10].where := 3368; Data[10].bad := 66;
Data[10].good := 0; Data[10].chksum := 3434;
Data[11].where := 3369; Data[11].bad := 130;
Data[11].good := 8; Data[11].chksum := 3507;
Data[12].where := 8608; Data[12].bad := 32;
Data[12].good := 34; Data[12].chksum := 8674;
Data[13].where := 8613; Data[13].bad := 16;
Data[13].good := 17; Data[13].chksum := 8646;
Data[14].where := 10611; Data[14].bad := 194;
Data[14].good := 178; Data[14].chksum := 10983;
Data[15].where := 15881; Data[15].bad := 2;
Data[15].good := 3; Data[15].chksum := 15886;
Data[16].where := 4279; Data[16].bad := 38;
Data[16].good := 40; Data[16].chksum := 4357;
Data[17].where := 3370; Data[17].bad := 52;
Data[17].good := 36; Data[17].chksum := 3458;
Data[18].where := 4558; Data[18].bad := 34;
Data[18].good := 50; Data[18].chksum := 4642;
Data[19].where := 4602; Data[19].bad := 34;
Data[19].good := 50; Data[19].chksum := 4686;
Data[20].where := 4646; Data[20].bad := 34;
Data[20].good := 50; Data[20].chksum := 4730;
Data[21].where := 7426; Data[21].bad := 49;
Data[21].good := 33; Data[21].chksum := 7508;
Data[22].where := 10385; Data[22].bad := 2;
Data[22].good := 3; Data[22].chksum := 10390;
CheckData;
OpenResourceFiles;
WriteString('Patch Modula-2? ');
Read(ch); Write(ch); WriteLn;
IF CAP(ch) = 'Y' THEN
FixBigInterp;
END;
WriteString('Patch Modula 2? ');
Read(ch); Write(ch); WriteLn;
IF CAP(ch) = 'Y' THEN
FixSmallInterp;
END;
WriteString('Patching has been completed successfully!');
WriteLn;
WriteString('Hit any key to halt...');
Read(ch);
HALT; (* Note: Program is intended to terminate with HALT *)
END Patch.stuart@gargoyle.UChicago.UUCP (Stuart A. Kurtz) (03/18/85)
Here's a BinHex4.0 version of the Patch program for MacModula-2.
Stuart Kurtz ihnp4!gargoyle!stuart
Dept. of Computer Science stuart@uchicago.csnet
University of Chicago.
------------------------------[cut here]------------------------------
(This file must be converted with BinHex 4.0)
:#9"KG'0S,Na24!"-6d4&66*0-J#3""9Z!*!%Gdm!!rm8!!!"b!!-!Ed!!*M!m!"
3BA4MD!#3$!3!!3#3"`)"b3!3!#X!C9"KG'0S)#-!)'KKFb"KE(*PB@4j)'*PC@i
JF'&dBfKPC#%!!&"KG'0S)#-!)'KKFb"hFQpZCb"LHA4P)5"'D@aP)'eeFh3JBQ8
JBfpbFR9`G#%!N!-k!G$V"MJa"N%%+!'j%"A'!VkeZ"%a#L%+B5%'JL%+B"*rrmD
&b4Sr)3TL)3D#)3TJ%RrraSA)'KK"!JEY&3`S!1d9$S3%%"RY&3cY&3XE&i35"Zd
9$#J!l481K"B3*Hd9$1d9#rBK"S)K#Q!5Irr')3TLPH`!!J(+!))!@`#26@pNG@a
K,6)!!%0[G@aN)'j[G#"[F'9Z)(*PFfpeFQ0P1L"0Ef4eE'%Y-J"$6d4&!!"$B@j
ZEh3JFQ9KC#"MEf4P)(*PFfpeFQ0P)'C[FL"0Ef4eE'%Y-J!!6@pNG@aK)$)!!%0
[G@aN)'j[G#"[F'9Z)(*PFfpeFQ0P1L"0Ef4eE'%J-J"$6d4&!!"$B@jZEh3JFQ9
KC#"MEf4P)(*PFfpeFQ0P)'C[FL"0Ef4eE'%J-J#3!dN##HX#%)$U-3BK"S3U"qd
@"l)K"Zd'","D5K,rrmJD$)3[%#$Y&3cY&3[fp,+%3!(Y"Jqa83C""Y@-'Jb%3a!
Pl48-l48,p[4""Zd5&#%'K&F(l4B(XL%'l3B%X&Y,%[rrb"S-K&`3)1d9$1d9#rE
dXS4Y!Hd'$l&4#%%)eB`D$)4`%#AY&3cY&3[fp%%)l4)8l!!#!FX"%J!+!1P$D'&
ZCfPZCb"bCA0[GA*MC3!!(J*4k`%8"J%,`!!!#N%'*[("!Irk&!B,%"$!!!!+33B
QmF%"rrU%K"!3l48-l48,33EY"KRd33EY%K2XhJ!#!F`"6!!'!2*PFR*[FL!p)!#
3!a!#EZX"XZd'"V!f*J$*'K#%M3IY&3`Q!1d9$Hd9#rEXhJ!#!Fd"DJ!+!2G$D'&
ZCfPZCb"bCA0[GA*MC3!!(J*pk`%8"J%,`!!!#N%)*[("!Irk&!B3%4!@`!!!#N%
)*[("!IrkK*)3%1d9$1d9#d%)l3BCp%%)l4)6l!!#!Fi"T!!I!3")DA3JB@jj)'Y
PH5"dEb")B@ad,T!$+%CTE'9c)(GTE'`JF(*[BQ&LE(NJEQpd)'*P)(9`C'&dC@3
T!*!$#J+Dk`'%Qa!jl48-&!EY&38+a1cH!!)"c`'f!'3"(N0SC@0VD@jR)'4KG'%
ZN!-!!%PZBfpZFfPcG'&ZG#"NBA4K)'PZ)'&bFQ&j)'9XC@ePER3k)!!!3fKPBfX
JG'KP)'4KG'%JD@jTG'PKE'PkBA4TEfiJFf9MG'P[EL"MBA*PCR9XE(NK!!"8Eh4
KE#"MD'9MDh0eE5!S!!!T)'4[CA-JEQpd)'9aG@&X)'0[FR*PBh3JB@e[G@jd+!!
!+5i!!%4KG'%JDA-J6dXJ,5dJ8'&dBfKTEQFJBf&Z)("bEf0PC@3Z!!"3!U2V")5
j$qd9$1d9#`!h&!B"%"E!!!"'333Q!EN3&FB#[V@i%6%))3KJ)3KKZ#%)BVJK#'2
*'KZ%`K!Ml48-*J$Y&3lY&3Z%e4![l48-l48,pLFK#'240m%"rliR%L',b4SXK1i
2l48-*`$Y&3k%pa!Il48-%L',!1d9$N%#%`!!!K#)!Hd9$1d9#rBE%8%#%`!!!K5
)%#,Y&3cY&3[XhJ!#!FJ#9!!d!B&3BA4MD#"0Ef4eE'%Y-MmJ!!"3BA4MD#"0Ef4
eE'%J-MmJ!!"3BA4MD'PZCb"SBA-JBQ9PEL"MEfe`E'9dC@3JFh9MBf9cFfCeE'a
j)3")DA3JB@jj)'YPH5"dEb"SB@ad,T!$!!!"@3,bk`!9!C3D!Z`9$D"4""CB83,
Y&3$Y"J$Y!3$Y&J$Y%J$Y&4*""")0(R""""!JF8%%%'Gb3335$D9c3335$4pd333
34(9"""!DGN%%%JepGd%%%JdKH%%%%'Kj33334(T""")0cAY""")0)Ra""!"p333
3)(j""")03Rp""")0)j!!%%%%%(D3!"&""""SN!!53335$J'3!"0""")0**!!&%%
%%$+3!"9""!#3!"C""")09T!!&d%%%JdPN!!B3333+*!!'8%%%(D3!"T""")0`j!
!'d%%%JdQN!!F333!N!!G3333-T!!(N%%%JeBN!!I3335$5H3!#"""!L3!#&"""!
SN!!L3335$9H3!#0""")0+*!!*%%%%%+3!#9""!#3!#C""")0DT!!*d%%%JdTN!!
S3333JT!!+8%%#*!!+N%%%JfcN!!V3335)D#3!#a"""!JN!!Y3333)T!!,N%%%L(
LN!![3335)D@3!$""""!3N!!a3333%C!!-N%%%L('N!!c3335+A13!$4"""$#N!!
e3333XT!!0N%%%LVRN!!h33352JQ3!$K""!+3!$P""!13!$T""")q$T!!1d%%%K#
hN!!m3333*T!!28%%%#L3!$j""")4"C!!2d%%%JdUN!"!33330*!!38%%%#53!%*
""")0JT!!3d%%%K(1N!"%3333)T!!48%%%$+3!%C""")5)T!!4d%%%K(kN!")333
3)T!!58%%%$+3!%T""")56T!!5d%%%K)QN!"-3333)T!!68%%%$+3!%j""")5HT!
!6d%%%Kd#N!"33333-C!!88%%%#'3!&*""")G9*!!8d%%%LL4N!"8333#N!"9333
$N!"@3335+*D3!&IhmN%#%`!!!ML)$qd9$"8-l48&61d9#Zd9#d`3Ap)3@FJD![0
"!K-!!!*+L!rY&3`9$1d9"8cY&3VY&3Y-%&r5%&R)'J,e33)6!!!#A)J3+1d9$1d
9#d%#%`!!!SD)%"AY&3`9$1d9"3V%l!!$ra8%5JBJ!!`'&DPq!(idJ%PZ6h9d!*!
-"!4,!*!(!JBc!$3!U`Bkk`N`#$%')3BJ#!'r!ELh"K!4kM%0!$N9#1d!!dJ0b"S
%%"YB5"!JV4i%5!M)'MK)#-JD%#N!V"S*#1d!!5N"Z6NE(8J3)+dI"5N32kSD%8M
Y!!&"#LN32mC)P5N"Z$N9#1d!!ae"!#QU(a-T%$qU(`e"#LN"Z4!raS83,XJD-J!
k33ST%$r')3BU+-D&P5%'+LM'KHd!!5N"Z$NU!EJk+L%'Y,DdYLLX(J8T%$r)(#j
"#LN32mB!P3!k!$`U+DSI!bcA'K*"#LS32mD&%$V)2#S"Z$SG'5`DDa3,!#S"ZFI
!!!!8)3dV%#$'33SV%$r'KCA"!Ir`)3dU%#$'!*88#bV(+FI!!!!@33SV+VN32mC
"#LX32mD&PF%"rqj"$L%0%#$Y&JF!XN%1%[rrl4%$X-K84"S0!,*"$K85l4%#X-K
8'`G!%e!5!94"$%%+%$rY&JIXhJ!#"L%"L!!6"BGTEMiJ!!!JGQpXG@eP)'j[G#"
QEh9ZC!!JEQpd)'C[G@jN!*!$-!ENk`3`#$%')3BJ#!'r!ELh"N%#!qdA"5%'+2!
65"!Eb4SR40FD$)3$%"$Y&`8"14XB!,*"$%!5&3EY%3L`b6NT'JH%$!RY&`AY&`B
Teai&5"!Eb"a$5"!Eb9!33""8l!!#"L)"jJ!T"CP[GA3q)!!JGQpXG@eP)'j[G#"
QEh9ZC!!JEhCPFRGbDA4P2b!!!%9%593!!&4&@&3!!#"MB@jZEh3JBh*PBA4P)3!
JBf&ZEQpd)'p`C@iK!!"L"a2V"6!)-3BK"L!)!Em"Z,F'K")%l4F&)3BSm"0%eaS
-K"83%1dA"3%j'i4)%"[*'RX!XN%-3")9"qd4#,$*15RA'MH%(J[Y&`89#1d!!dJ
3Ap)3@FJH#%J3Ap)36XJF&NMY!!&)%&r5%%l)'JZb4qd4%,!k%"YB'c1b33a!%S3
PK#MY%3H`!-Nj+4S*K#X1l4F&'aLb33a!%K8(l4%)X!$*15ND"i3c$1dA"HdA"LR
A(J9)%"[)(+C)%"[*8"&!%96XhJ!#"L-#U!!+"h6V!8!3'JZb4Zd4%,!f!&!3l0i
!!JBN!VS!#JGpk`&!%4S,XNIY%4#`0J"3%HcH!!)'*3,-!"i(KZX&-3C!%"SU343
a#5%*!(!K#3&a!,*'3438#1d4#E$)9#%'+!LrF%6A'J8K"J"`'`JK"Zd!!`&8l0i
!!JBT!`B!&3A"BA4dC@e`)(4[)(*PB@3JB5"A6e*%)'CbEfdJG'KP)'YPH@*[BA*
N!!!D"k2V"$%'3"!D)d%@-3JK#!"`)3J#F8!B(`d!XNC"&L%'l4%*X-K84&!B'`H
%1K!Qm"RXhJ!#"LB$1!"4"lcV"M!)-3B!15%'Y,DdYLJk3"!D,K3,p5X3)+`H!d6
A(!`V%##X(`*%'KBT+UXD$#%'+5M'+j8T!EJj&![e(4dE6"3,l3!$+a!JV"i&+a!
Eb"`3+a!JV"i%+`M)'M!V#-JD%#N!V"S*+3'j13MY!!%E&5NUUaS3)3BT+-BVP5N
"Z$NVl3!"&![Y!!-G15N!b93T+UXD##%'+5M'!*8V9HcH!!)'032B!!i)$1X#-3B
K"ZQ"#HPS%"r'KA$T&JLJB!'iF1cH!!)'0!2b!!F)'HX!k3"ikB%*%"rfl!!#"LF
$rJ!i#"rV"c%'%"$U-3R`&#%'!("%eaS#l"3,m"8V`J!6!6`8#r!9``!m&![`&F-
!2--!+`!YrrRrm2rerq83-#ZV(`8V%$QV9"!`+kXI"5X31DXD&#%')3CJ#YSV%$$
Cf(!8#r!9(4iX'JJK"L%'B-p`l!!#"MF%E!!1#&EV!M%')3ETJ3RTD"!IaS9`k4B
)S'!"Z($XhJ!#"MB%KJ!(#'2V!1N!H1Q"#4!IpZ`!!JBS"*)!)`KTk`Ba"K!3kM%
*m"BK"J"`40FD!Z`8#r!A%$!VUam&+a!jUe33-#ZV(`8V%$QV'K3K"L%'B!Uk+a!
`ZEK`&![`&adHl0i!!JBU"0B!&JL,k`8f3"%D(N%8-3NK#3"`)3N"F5B)[MHb4d%
8&!IY%3U`1"X&*Zd!!HcH!!)'-38!!"3&e@&dG'9YF#"dEb"hFQPdC5"K)&G28N3
JG'mJG'KP)&0MFQ9PEJ#3!a8)S1X%0N!4'KT"&M%))3J!F#%)!R'b4d%@&!EY%3U
`0aX(K%i3)r!Cl0i!!JBV"5J!"!Ldk`!0qZcH!!)',!8Z!"d)YqX&-!Ja"L%')!J
"[`'iY`B!15%'Y,DdYLJk+5UV(`NK"LNSaS8!V"S1)3BT+-D&qLN"Z$NG'qcH!!)
',39Q!#d)dqX'0cB%kM%+!$JQcXFj)3SS"XBT#V`3-,L9+3Ul15J"Z$JT!-JF'#B
!bKS0)3SS"XB3,C8S!EJi*bLX'JSR!ENh%#$k(3dS!ENi)3SS"XD&qLJ!b"`2l0i
!!JBZ"Ei!)JMrk`8h0JIU-3N!1#%*+!E'*JUmPLB+ZcBS!EJi*J$)("8R++`D#LF
"Z6F3)2SG$5J"Z6JK#5J'aSB3-,Mk+!$)(",X!!)',`B!!#8*)1X&0cB'kM%*&!J
(*mI!!!!*%#$k`3(rqa3)!!A!!!!6)3NS"FBQ"p+@*J1r0X%"rr%8#!8!`!%!%#%
*+!A'KK!`Z2V"rrrdl!!#"MJ'5!!2#86V!6BQ$p)f*JUU'JJQ%$#i0KX'*K!hZ$B
QqZcH!!)'-!CN!"8*8ZX$0cB8#!8Ram!!!!N3)2V"!Irl*Jbrm"JQ#,r`'#B%[r!
B*[!Bl0i!!JBb"S`!"`PQk`"!%GFD"3cY!!(X!!)'13DB!!X&k%PZ6h9d,5"'394
"6#"&8P*28MS!!"3*E1X$-!Ja"L%')!J"[`'iY`EY&`D%B4!5l4F&)3BSl4F&l4F
'#X6X!!)')!Dq!"J&mN0KEQj[G#"bC@&N)'4PCQ&eE(3JGQpXG@eP)'jeE@*PFL"
fD@%J4f9d9QpX)3!!+`Prk`!9!C3D!Z`9'D"4#KBJS&%-&S#J83i@J+"4&"B#S&%
@&J*4!ZdA!1d!!1d"!1d#!1d4!1d@!!"3%!"3%3"8!,*"$K86l4%#X-ND"i4V%#c
`'HcH!!2r&JQT#F!!$!QeU9-!*6(%8h4bD@jRF`#3#J3*UJ#3"`)*`3!8!")*bZX
$%)#h"K3)!5%'!)A(`!!!%#%'+"$raSAY!!("!Irdl0i!!JR#!$B!)JREk`B3J,F
)-3Db)3J!K4$r)3B!KERjX$X8#J%Vam!!!"NK"L%'!)8UZ"$raL%)+K$raS@9`3(
rkb%'!#%'!)8VZ*AX!!)*b3"i!!S*r1X#0cBQ*kSD"5EX'`-Rl!R%hJ!##F-!LJ!
D#JAV"$!)-3BK"L!)!Em"Z,F'!$NT)3DdYV5f++XI#5%'+5M'K3$*'JFT!EJj(4S
Tl!R%hJ!##F3![!!d#KlV#6!,-3NK#5!,!Em"Z,F*-!Ja"V)K"LMcX$iK"V5fY,B
S!EJZZ6d!2#`YUKm8,#%*Y,DdYLZV(`NK#5`VaS8!b4S9)3BZ,,JSaL%*,#['KC8
X!EJm(5dX,DSD#L%',Lbi+-B!PH`!!JR&!5)!&3T4k`83J,F)-3B8#J!K#!#&am!
!!"3K"LS3rmBK##S3rmD&PF%"rr$XhJ!##FB"5J!X#QAV#$!,-3NK#5!,!Em"Z,F
*-!Ja"V)K"V5fY,BS!ELb)3NVml$jX!(C243-!#h!!!!5)3BX+-BK#5`VaS@9`3(
rmL%'Y,DdYLJYc"S+)3BY!GJSaJ#9l!!##FF"S!!Q#T!!k`B`#M%))3JJ#J'r!EL
h#$%'!$XV%2qU(a3V)3LdYV5f+UXI#5%)+bV'K3$*'KBK"LX"Z"$raL%)+bV'KC8
V!EJl(5mK"J!VPH`!!JR)!HS!*3Uek`B3J,F*-!Ja"J!l+b%'Y,DdYLLV(`FV)3N
!KDSD&L%'+bM')3NV!EJ3rmD&P5X"Z$XG*bXK"V5fY,BSUaS))3BV+-B!PHcH!!)
*`!)b!!`+fHX!&3'8'J,X&344!Zd"!1d!!1d#!1`!!rmA#Z3,!!!-#[@TIJ"[8N4
8CA*YD@jKE!#3#33+j3#3"`),!3!8!!i,#ZX#-3C%'JNK"N9`!&3E#L%'l3!$)3C
J9HcH!!),!J!Z!"%,&qX#-3C%'JNK"N9`!&3E%5%'l3!%)3CJ!-ND"5%'B&AX!!)
,!`"1!!3,*qX!!96XhJ!##`3!9!!&#bVV!6BQl3!"l!!##`8!A!!G#blV"6!)-3B
K"L!)!Em"Z,F'!$NK"V5fY,BS1LNUUam*)3BT+-D&!+`D$L%'+5M'KI3T!EJj(4[
XhJ!##`B!P!!%#dVV!!hdl0i!!JX(!*S!"!Y0k`!-p1cH!!),#!#J!!3,81X!"r6
XhJ!##`N!TJ!$#e2Y!!MX!!),!!#U!!i,9HX!&3'8'J,X&3C4!Zd!!1d"!1d#!!"
8!&AX!!ErmJYL!!!,E`*8#hB!N!3J03!!!: