From 078b03d56d3d1ed49eab97e6c5e2745b29a77302 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Mon, 20 Jun 2016 23:05:20 -0400 Subject: [PATCH] ksp: start work on 6502 assembly version --- ksp/asm/Makefile | 73 ++++++ ksp/asm/apple2_c00.inc | 12 + ksp/asm/ksp.s | 528 +++++++++++++++++++++++++++++++++++++++++ ksp/asm/ksp_1.3.7.dsk | Bin 0 -> 143360 bytes 4 files changed, 613 insertions(+) create mode 100644 ksp/asm/Makefile create mode 100644 ksp/asm/apple2_c00.inc create mode 100644 ksp/asm/ksp.s create mode 100644 ksp/asm/ksp_1.3.7.dsk diff --git a/ksp/asm/Makefile b/ksp/asm/Makefile new file mode 100644 index 00000000..7ae93f3b --- /dev/null +++ b/ksp/asm/Makefile @@ -0,0 +1,73 @@ +PCX2HGR = ../../hgr-utils/pcx2hgr +DOS33 = ../../dos33fs-utils/dos33 +TXT2BAS = ../../asoft_basic-utils/tokenize_asoft +SHAPETABLE = ../../hgr-utils/shape_table +MAKEB = ../../dos33fs-utils/make_b +LD65 = /usr/local/bin/ld65 +AS65 = /usr/local/bin/as65 + +DISKNAME=ksp_1.3.7.dsk + +all: $(DISKNAME) + +KSP: ksp + $(MAKEB) ./ksp ./KSP 0xC00 + +ksp: ksp.o + $(LD65) -o ksp ksp.o -C ./apple2_c00.inc + +ksp.o: ksp.s + $(AS65) -o ksp.o ksp.s -l ksp.lst + + +$(DISKNAME): KSP \ + ROCKET.SHAPE \ + VAB.SHAPE \ + GLOBE.HGR LAUNCHPAD.HGR ORBIT_TOP.HGR ORBIT_RIGHT.HGR \ + LOADING.HGR SQUAD.HGR TITLE.HGR \ + VAB.HGR + $(DOS33) -y $(DISKNAME) SAVE B KSP + $(DOS33) -y $(DISKNAME) SAVE B LOADING.HGR + $(DOS33) -y $(DISKNAME) SAVE B SQUAD.HGR + $(DOS33) -y $(DISKNAME) SAVE B TITLE.HGR + $(DOS33) -y $(DISKNAME) SAVE B VAB.HGR + $(DOS33) -y $(DISKNAME) SAVE B GLOBE.HGR + $(DOS33) -y $(DISKNAME) SAVE B LAUNCHPAD.HGR + $(DOS33) -y $(DISKNAME) SAVE B ORBIT_RIGHT.HGR + $(DOS33) -y $(DISKNAME) SAVE B ORBIT_TOP.HGR + $(DOS33) -y $(DISKNAME) SAVE B ROCKET.SHAPE + $(DOS33) -y $(DISKNAME) SAVE B VAB.SHAPE + + +ROCKET.SHAPE: ../ship2.table + $(SHAPETABLE) -b < ../ship2.table > ROCKET.SHAPE + +VAB.SHAPE: ../ship.table + $(SHAPETABLE) -b < ../ship.table > VAB.SHAPE + +LAUNCHPAD.HGR: ../launchpad.pcx + $(PCX2HGR) ../launchpad.pcx > LAUNCHPAD.HGR + +ORBIT_TOP.HGR: ../orbit_top.pcx + $(PCX2HGR) ../orbit_top.pcx > ORBIT_TOP.HGR + +ORBIT_RIGHT.HGR: ../orbit_right.pcx + $(PCX2HGR) ../orbit_right.pcx > ORBIT_RIGHT.HGR + +GLOBE.HGR: ../globe.pcx + $(PCX2HGR) ../globe.pcx > GLOBE.HGR + +LOADING.HGR: ../loading.pcx + $(PCX2HGR) ../loading.pcx > LOADING.HGR + +SQUAD.HGR: ../squad.pcx + $(PCX2HGR) ../squad.pcx > SQUAD.HGR + +TITLE.HGR: ../title.pcx + $(PCX2HGR) ../title.pcx > TITLE.HGR + +VAB.HGR: ../vab.pcx + $(PCX2HGR) ../vab.pcx > VAB.HGR + +clean: + rm -f *~ *.o *.lst KSP ksp *.HGR *.SHAPE *.BAS diff --git a/ksp/asm/apple2_c00.inc b/ksp/asm/apple2_c00.inc new file mode 100644 index 00000000..72588b0d --- /dev/null +++ b/ksp/asm/apple2_c00.inc @@ -0,0 +1,12 @@ +MEMORY { + ZP: start = $00, size = $1A, type = rw; + RAM: start = $C00, size = $8E00, file = %O; +} + +SEGMENTS { +CODE: load = RAM, type = ro; +RODATA: load = RAM, type = ro; +DATA: load = RAM, type = rw; +BSS: load = RAM, type = bss, define = yes; +ZEROPAGE: load = ZP, type = zp; +} diff --git a/ksp/asm/ksp.s b/ksp/asm/ksp.s new file mode 100644 index 00000000..f59c9633 --- /dev/null +++ b/ksp/asm/ksp.s @@ -0,0 +1,528 @@ +; ********************************************* +; *** KSP by Vince Weaver, vince@deater.net *** +; *** *** +; *** A VMW Software Production *** +; ********************************************* +; +; http://www.deater.net/weave/vmwprod/ksp/ +; https://github.com/deater/dos33fsprogs +; +; Note: you'll want to run this through my tokenize_asoft +; routine to remove these comments and create a proper +; Applesoft BASIC file +; Why not use REM statements? They take up valuable space +; in RAM (we optimistically only have around 12kB to play with) +; as well as slow down execution as BASIC is interpreted. +; +; Variable List: (Note, in Applesoft only first 2 chars matter) +; A$ = keypressed +; AN$ = astrounat name +; C$ = contract name +; D$ = ASCII(4) indicating we have a DOS command +; AD() = astronaut dead +; AN = rocket angle +; AX/AY= rocket x/y acceleration +; BF = bingo fuel (out of fuel) in stage +; C = temp color +; CQ = current quadrant (i.e. background to display) +; DT = delta time (for time acceleration) +; DV() = deltaV +; EM() = per-stage empty mass +; FM() = per-stage fuel mass +; EN() = engines per stage +; FF() = fuel flow +; FL = fuel left (percent) +; FT() = fuel tanks per stack +; G = gravity +; GA = gravity angle (radians) +; GX/GY= gravity X/Y vector +; H = horizon +; HX/HY= orbital points in orbit mode +; I = loop iterator +; J = loop iterator +; KE = astronaut eyes +; KR = planet radius +; LN = launched +; MX = maximum altitude reached +; OM = orbit mode (view) +; P = number of parachutes +; PD = parachutes deployed +; RA = distance to center of planet +; RR = altitude +; RX/RY= rocket x,y position +; S = Current Stage Number +; SR = Number of struts +; SS = Number of stages +; TH() = stage thrust +; TR = engines are thrusting +; T = time +; SM() = per-stage stage mass +; ST() = Stacks per stage +; TM() = per-stage total mass +; TV = terminal velocity +; TW() = thrust/weight ratio +; V = velocity magnitude +; VX/VY= velocity x/y vector +; W = Which astronaut +; X/Y = temp X/Y +; ZX/ZY= Vx0 and Vy0 +; +; Clear screen +; 10 HOME:HGR:D$=CHR$(4) +; *** REM *** SQUAD LOADING SCREEN *** +; 100 PRINT D$"BLOAD SQUAD.HGR,A$2000" + jsr BLOAD +; *** REM *** Randmoize the start of the witty loading comments +; 580 S=0:I=INT(RND(1)*8)+1 +; *** REM *** Prepare for the status bar +; 590 VTAB 21: PRINT " ";:FOR I=1 TO 32: PRINT ".";: NEXT I +; *** REM *** LOADING SCREEN *** +; 700 FOR J=1 TO 32 +; 708 IF J=16 THEN PRINT: PRINT D$"BLOAD LOADING.HGR,A$2000" +; 710 HTAB J+4:VTAB 21 +; 720 INVERSE: PRINT " ";: NORMAL +; 790 S=S+1: IF S=4 THEN S=0 +; 795 IF S<>1 GOTO 840 +; 800 I=I+1: IF I > 8 THEN I=1 +; 802 VTAB 22: HTAB 1:PRINT " "; +; 805 ON I GOSUB 850,851,852,853,854,855,856,857 +; *** REM *** Slow down so we don't load so fast +; 840 FOR T=1 TO 250: NEXT T +; 842 NEXT J +; 845 GOTO 900 +; 850 HTAB 10:PRINT "Adding Extraneous Ks":RETURN +; 851 HTAB 14:PRINT "Locating Jeb":RETURN +; 852 HTAB 11:PRINT "Breaking Quicksaves":RETURN +; 853 HTAB 12:PRINT "Patching Conics":RETURN +; 854 HTAB 12:PRINT "Spinning up Duna":RETURN +; 855 HTAB 11:PRINT "Warming up the 6502":RETURN +; 856 HTAB 10:PRINT "Preparing Explosions":RETURN +; 857 HTAB 10:PRINT "Unleashing the Kraken":RETURN +; *** REM *** TITLE SCREEN *** +; 900 HOME: PRINT: PRINT D$"BLOAD TITLE.HGR,A$2000" +; 905 HTAB 25:VTAB 24: PRINT "VERSION 1.3.7.1"; +; *** REM **************** +; *** REM KSP THEME MUSIC +; *** REM SEE http://eightbitsoundandfury.ld8.org/programming.html +; *** REM This loads an assembly language routine that generates +; *** REM Square waves on the speaker output +; *** REM **************** +; 910 FOR L = 770 TO 790: READ V: POKE L,V: NEXT L +; 920 DATA 173,48,192,136,208,5,206,1,3,240,9 +; 930 DATA 202,208,245,174,0,3,76,2,3,96 +; *** REM on qbasic this would be PLAY "L2ECGL4CEGL2B-AGL4CEGL2B-AGCD" +; 940 FOR I=1 TO 17: READ F: READ D: POKE 768,F: POKE 769,D: CALL 770: NEXT I +; 950 DATA 202,216,255,216,170,216 +; 955 DATA 255,108,202,108,170,108 +; 960 DATA 143,216,152,216,170,216 +; 965 DATA 255,108,202,108,170,108 +; 970 DATA 143,216,152,216,170,216,255,216,227,255 +; *** REM *** DONE LOADING *** +; *** REM *** Wait for keypress +; 990 VTAB 1: GET A$ +; ******************* +; *** VAB *** +; ******************* +;**** REM *** Point to shape table location and load in VAB table +;1000 POKE 232,0:POKE 233,16 +;1015 PRINT:PRINT D$"BLOAD VAB.SHAPE,A$1000" +;1035 HGR : ROT= 0: SCALE= 2 +;1037 PRINT D$"BLOAD VAB.HGR,A$2000" +;1150 X=132:Y=28 +;1155 XDRAW 1 AT X,Y+2 +;1200 HOME: INVERSE : VTAB 21: HTAB 7: PRINT " VEHICLE ASSEMBLY BUILDING " +;1205 NORMAL:PRINT:PRINT "HOW MANY STAGES? (1-3)";:INPUT S +;1230 FOR I = 1 TO S +;1240 PRINT "HOW MANY STACKS, STAGE ";I;" (1-3)";:INPUT T:ST(I) = T +;1260 PRINT "HOW MANY FUEL TANKS PER STACK, STAGE ";I;" (1-2)"; +;1265 INPUT F: FT(I) = F +;1268 FOR J = 1 TO F +;1270 XDRAW 2 AT X, Y+13*J +;1272 IF T >1 THEN XDRAW 2 AT X-14, Y+13*J +;1274 IF T >2 THEN XDRAW 2 AT X+14, Y+13*J +;1278 NEXT J +;1279 Y=Y+13*F +;1280 PRINT "HOW MANY ENGINES, STAGE ";I;" (1-";T;")";:INPUT E +;1285 EN(I) = E +;1290 XDRAW 1 AT X, Y+8 +;1292 IF E >1 THEN XDRAW 1 AT X-14, Y+8 +;1294 IF E >2 THEN XDRAW 1 AT X+14, Y+8 +;1297 Y=Y+6 +;1300 NEXT I +;1330 PRINT "HOW MANY PARACHUTES? (0-3)";:INPUT P +;1350 PRINT "HOW MANY STRUTS? (0-20000)";:INPUT SR +;1370 SS=S +; ********************************* +; *** ASTRONAUT COMPLEX *** +; ********************************* +;1500 TEXT: HOME: HTAB 11 +;1515 INVERSE: PRINT "ASTRONAUT COMPLEX": NORMAL +;1520 PRINT:PRINT "CHOOSE ONE KERBAL FOR THIS MISSION:":PRINT +;1530 FOR I=1 TO 8 +;1540 IF AD(I) GOTO 1600 +;1550 ON I GOSUB 1641,1642,1643,1644,1645,1646,1647,1648 +;1560 PRINT " ";I;". ";AN$,AJ$;" S: ";AS$;" C: ";AC$ +;1600 NEXT I +;1605 PRINT: INPUT W +;1615 IF W<1 OR W>8 THEN PRINT "INVALID INPUT, PLEASE TRY AGAIN!": GOTO 1610 +;1630 ON W GOSUB 1641,1642,1643,1644,1645,1646,1647,1648 +;1630 GOTO 1776 +;1641 AN$="JEBEDIAH" :AJ$="PILOT":AS$="****":AC$="****":RETURN +;1642 AN$="VALENTINA":AJ$="PILOT":AS$="****":AC$="****":RETURN +;1643 AN$="KAI" :AJ$="SCI ":AS$="*** ":AC$="***":RETURN +;1644 AN$="KUROSHIN" :AJ$="ENGR ":AS$="** ":AC$="*":RETURN +;1645 AN$="DESKTOP" :AJ$="ENGR ":AS$="* ":AC$="***":RETURN +;1646 AN$="SLASHDOT" :AJ$="SCI ":AS$="*** ":AC$="*":RETURN +;1647 AN$="ZURGTROYD":AJ$="PILOT":AS$="** ":AC$="***":RETURN +;1648 AN$="DAPHTY" :AJ$="ENGR ":AS$="*** ":AC$="***":RETURN +;*** REM DEBUG, Uncomment and Jump here to skip loading +;1700 REM TEXT:HOME +;1720 REM AN$="ZURGTROYD":SS=3 +;1750 REM EN(1)=1:ST(1)=1:FT(1)=1 +;1751 REM EN(2)=2:ST(2)=2:FT(2)=1 +;1752 REM EN(3)=3:ST(3)=3:FT(3)=1 +;************************ +;* Rocket Summary *** +;************************ +;*** REM Load Rocket Shape Table +;1776 POKE 232,0:POKE 233,16 +;1783 PRINT D$"BLOAD ROCKET.SHAPE,A$1000" +;1800 HOME:PRINT "ROCKET SUMMARY:":PRINT +;1802 G=-9.8:S=SS:DT=1 +;1805 FOR I=1 TO S +;*** REM EmptyMass=Engines*1.5T+(Stacks*FuelTanks)*0.5T +;1810 EM(I)=EN(I)*1.5+ST(I)*FT(I)*0.5 +;*** REM First stage also has a 1T capsule +;1812 IF I=1 THEN EM(I)=EM(I)+1.0 +;*** REM FuelMass=(Stacks*FuelTanks)*4T +;1814 FM(I)=ST(I)*FT(I)*4.0 +;*** REM StageFuel=FuelMass (one gets decremented as we use it up) +;1815 SF(I)=FM(I) +;*** REM StageMass=EmptyMass+FuelMass +;1816 SM(I)=EM(I)+FM(I) +;*** REM Total mass of stage includes all higher stages +;1820 TM(I)=0 +;1822 FOR J=1 TO I +;1825 TM(I)=TM(I)+SM(J) +;1830 NEXT J +;*** Thrust=NumberOfEngines*168kN +;1835 TH(I)=EN(I)*168 +;*** DeltaV=ISP*gravity*ln(total_mass/empty_mass) +;1840 DV(I)=270*-G*LOG(TM(I)/(TM(I)-FM(I))) +;*** Thrust/Weight Ratio +;1850 TW(I)=TH(I)/(TM(I)*-G) +;*** Fuel Flow +;1855 FF(I)=TH(I)/(270*-G) +;1990 PRINT "STAGE: ";4-I +;1991 PRINT " TANKS=";ST(I)*FT(I);" ENGINES=";EN(I) +;1992 PRINT " STAGE MASS=";SM(I);" TOTAL MASS=";TM(I) +;1993 PRINT " DELTAV=";DV(I) +;1995 PRINT " TWR=";TW(I) +;2000 NEXT I +;2998 GET A$ +;2999 HOME +;****************************** +;*** Main Loop **** +;****************************** +; +;****************************** +;*** Initialize Variables *** +;****************************** +;3000 AN=0:GX=0:GY=-9.8:GA=0:V=0:VX=0:VY=0:AX=0:AY=0:KR=600000 +;3016 RX=0:RY=KR+10:RA=KR+10:TR=0:T=0:BF=0:MX=0:PD=0:LN=0:CQ=0:OM=0 +;3020 HGR:ROT=0:SCALE=2:H=0 +;**** REM ** LAUNCHPAD ** +;3035 PRINT:PRINT D$"BLOAD LAUNCHPAD.HGR,A$2000" +;**** REM DRAW HORIZON (GREEN) +;3038 HCOLOR=1:HPLOT 1,80 TO 132,80: HPLOT 148,80 TO 247,80 +;**** REM DRAW GANTRY (WHITE) +;3039 HCOLOR=3:HPLOT 110,110 TO 110,60:HPLOT TO 130,60: HPLOT 110,70 TO 130,70 +;**** DRAW SHIP +;3040 XDRAW 1+((S-1)*2)+TR AT 140,80 +;4000 REM ** MAIN LOOP ** +;**** REM ** if not launched yet then skip physics +;4002 IF LN=0 GOTO 5032 +;**** Calculate altitude and set maximum if we are at new record +;4003 RR=RA-KR:IF RR>MX THEN MX=RR +;**** If orbit mode then skip drawing horizon, etc +;4004 IF OM=1 GOTO 4018 +;**** If above 1.8km don't draw horizon +;**** FIXME: do we need to check OM again? +;**** FIXME: we draw the horizon one pixel too far to right +;4005 IF RR>1800 OR OM=1 THEN GOTO 4012 +;**** Erase old horizon +;4007 HCOLOR=0:HPLOT 1,80+H TO 132,80+H:HPLOT 148,80+H TO 247,80+H +;**** Calculate and draw new horizon +;4010 H=RR/20:HCOLOR=1:HPLOT 1,80+H TO 132,80+H:HPLOT 148,80+H TO 247,80+H +;**** REM *** Check if need to change to surface mode +;4012 IF RR<40000 AND CQ<>0 THEN GOSUB 7600 +;**** REM *** If in surface mode, skip ahead +;4014 IF RR<40000 GOTO 4018 +;**** REM *** See if need to change to high-altitude mode +;4016 IF RR>40000 AND CQ<>1 THEN GOSUB 7700 +;**** REM *** Calculate Fuel Left +;4018 FL=FM(S)*100/SF(S) +;**** REM *** If not thrusting then skip ahead +;4020 IF TR<>1 THEN GOTO 4050 +;**** REM *** If out of fuel then shut down engines +;4025 IF FM(S)<0.1 THEN FM(S)=0:BF=1:AX=0:AY=0:GOTO 4050 +;**** REM *** Calculate acceleration vectors based on thrust and mass +;4030 AX=(TH(S)/TM(S))*SIN(AN):AY=(TH(S)/TM(S))*COS(AN) +;**** REM *** Update masses now that fuel was used +;4040 FM(S)=FM(S)-FF(S):TM(S)=TM(S)-FF(S) +;4047 GOTO 4060 +;**** REM ELSE NOT THRUSTING +;4050 AX=0:AY=0 +;**** REM ENDIF +;**** REM *** Calculate angle to center of planet +;4060 GA=ATN(RX/RY) +;**** REM *** Wrap since ATN can only return -PI/2 to PI/2 +;4065 IF RY<0 THEN GA=GA+3.14 +;**** REM *** Calculate gravity vectors +;4070 GY=COS(GA)*G:GX=SIN(GA)*G:AY=AY+GY:AX=AX+GX +;**** REM *** v=v0+at +;4090 ZX=VX:ZY=VY:VY=ZY+AY*DT:VX=ZX+AX*DT:V=SQR(VX*VX+VY*VY) +;**** REM *** deltaX=0.5(V0+V)t +;5012 RY=RY+0.5*(ZY+VY)*DT:RX=RX+0.5*(ZX+VX)*DT:RA=SQR(RX*RX+RY*RY) +;**** REM *** If new position below surface then crash +;5020 IF RA1 THEN XDRAW 1+((S-1)*2)+TR AT 140,80 +;******************************** +;*** Handle keypresses +;******************************** +;6060 IF A$="Q" THEN GOTO 9000 +;**** A/D rotate ship +;6061 IF A$="A" THEN R=R-8:AN=AN-0.7853 +;6062 IF A$="D" THEN R=R+8:AN=AN+0.7853 +;**** C (undocumented) forces crash +;6063 IF A$="C" THEN GOTO 8000 +;**** Z/X enable/disable engines +;6064 IF A$="Z" THEN TR=1 +;6065 IF A$="X" THEN TR=0 +;**** >/< speed/slow time +;6066 IF A$=">" THEN DT=DT+1 +;6067 IF A$="<" THEN DT=DT-1:IF DT<1 THEN DT=1 +;**** M switched to/from orbit mode +;6068 IF A$="M" AND OM=1 THEN OM=0:CQ=-1:GOTO 4000 +;6069 IF A$="M" AND OM=0 THEN OM=1:HOME:PRINT:PRINT D$"BLOAD GLOBE.HGR,A$2000":GOTO 6095 +;**** space launches ship or stages/parachutes +;**** we make a click noise on the speaker if we stage +;6070 IF A$=" " AND LN=1 THEN S=S-1:XX=PEEK(-16336):IF S<1 AND P>0 AND PD=0 THEN PD=1:GOSUB 7800 +;6072 IF S<1 THEN S=1 +;6074 IF A$=" " AND LN=0 THEN GOSUB 7500 +;************************************** +;*** Adjust values after keypresses *** +;************************************** +;**** Adjust rotation +;6075 IF R=64 THEN R=0:AN=0 +;6076 IF R=-8 THEN R=56 +;**** REM Adjust astronaut face: FIXME better cues +;**** REM always start neutral +;6077 IF OM<>1 THEN GOSUB 8200 +;**** REM If flying upside down then frown +;6078 IF OM<>1 AND R>20 AND R<48 THEN GOSUB 8210:GOTO 6080 +;**** REM If going up then smile +;6079 IF OM<>1 AND VY>100 THEN GOSUB 8220 +;**** Adjust rotation +;6080 ROT=R +;**** Re-draw ship +;6090 IF OM<>1 THEN XDRAW 1+((S-1)*2)+TR AT 140,80 +;**** In orbit mode, plot orbit +;6095 IF OM=1 THEN HX=INT(RX/25000)+140:HY=INT(-RY/25000)+85:HCOLOR=3:HPLOT HX,HY +;**** Adjust Time plus astronaut eye count +;6118 T=T+DT:EC=EC+DT +;**** If enough time has passed update eyes +;6150 IF OM<>1 AND EC>30 THEN EC=0:GOSUB 8100 +;**** REM Loop forever +;6200 GOTO 4000 +;*************** +;*** LAUNCH **** +;*************** +;**** REM Erase gantry +;7500 HCOLOR=0:HPLOT 110,110 TO 110,60:HPLOT TO 130,60: HPLOT 110,70 TO 130,70 +;**** REM click the speaker +;7520 XX=PEEK(-16336) +;7530 TR=1:LN=1 +;**** Make astronaut smile +;7535 GOSUB 8220 +;7540 RETURN +;******************** +;**** Ground Mode *** +;******************** +;7600 HOME:PRINT:PRINT D$"BLOAD LAUNCHPAD.HGR,A$2000" +;7615 XDRAW 1+((S-1)*2)+TR AT 140,80 +;7620 CQ=0 +;7650 RETURN +;******************** +;*** Space Mode ***** +;******************** +;*** Up mode, sort of intend to have up/down/left/right images +;*** but only up implemented right now +;7700 HOME:PRINT:PRINT D$"BLOAD ORBIT_TOP.HGR,A$2000" +;7710 XDRAW 1+((S-1)*2)+TR AT 140,80 +;7720 CQ=1 +;7750 RETURN +;************************* +;*** Deploy Parachutes *** +;************************* +;7800 HX=0:HY=0 +;7805 IF PD=1 THEN HX=5:HY=3 +;7810 HCOLOR=HX:HPLOT 120,20 TO 160,20 TO 180,40 TO 100,40 TO 120,20 +;7820 HCOLOR=HY:HPLOT 100,40 TO 140,80 TO 180,40 +;7830 RETURN +;*************** +;**** CRASH **** +;*************** +;**** Make ship bigger +;8000 SCALE=3 +;**** Make astronaut frown +;8015 GOSUB 8200 +;**** Spin ship around while clicking +;8020 FOR I=0 TO 64 STEP 8: ROT=I:XDRAW 1+((S-1)*2)+TR AT 140,80: XX=PEEK(-16336):NEXT I +;**** Draw explosion +;8030 FOR I=1 TO 50 +;8040 X=INT(RND(1)*80)+1:Y=INT(RND(1)*80)+1 +;8050 C=INT(RND(1)*7)+1:HCOLOR=C +;8060 HPLOT 140,80 TO 100+X,40+Y +;8070 XX=PEEK(-16336) +;8080 NEXT I +;**** Kill off the astronaut +;8085 AD(W)=1 +;8090 GOTO 9000 +;************************** +;*** Astronaut Eyes *** +;************************** +;**** Erase old ones +;8100 HCOLOR=3:HPLOT 258,150 TO 263,150:HPLOT 265,150 TO 270,150 +;*** Randomly pick new ones +;8110 KE=INT(RND(1)*3) +;**** Draw new ones +;8120 HCOLOR=0:HPLOT 258+(2*KE),150 TO 259+(2*KE),150 +;8125 HPLOT 265+(2*KE),150 TO 266+(2*KE),150 +;8130 RETURN +;************************** +;*** Astronaut Frown *** +;************************** +;**** Erase old mouth +;8200 HCOLOR=1:HPLOT 259,155 TO 271,155:HPLOT 259,156 TO 271,156 +;**** Draw frown +;8205 HCOLOR=0:HPLOT 261,155 TO 269,155:HPLOT 259,156 TO 271,156 +;8207 RETURN +;************************** +;*** Astronaut Neutral *** +;************************** +;**** Erase old mouth +;8210 HCOLOR=1:HPLOT 259,155 TO 271,155:HPLOT 259,156 TO 271,156 +;**** Draw new mouth +;8215 HCOLOR=0:HPLOT 259,155 TO 271,155 +;8217 RETURN +;************************** +;*** Astronaut Smile *** +;************************** +;**** Erase old mouth +;8220 HCOLOR=1:HPLOT 259,155 TO 271,155:HPLOT 259,156 TO 271,156 +;**** Draw new mouth +;8225 HCOLOR=0:HPLOT 259,155 TO 271,155:HPLOT 261,156 TO 269,156 +;8227 RETURN +;***************************** +;*** CONTRACT COMPLETE *** +;***************************** +;9000 IF MX<40000 THEN C$="CRASH SHIP":F$="0.30":E$="-1":GOTO 9010 +;9007 C$="REACH SPACE":F$="200":E$="20" +;9010 TEXT:HOME +;9020 HTAB 10:VTAB 9 +;9021 FOR I=1 TO 20: PRINT "*";: NEXT I: PRINT "*" +;9023 HTAB 10: PRINT "* ";:INVERSE: PRINT "CONTRACT COMPLETE";:NORMAL: PRINT " *" +;9024 HTAB 10: PRINT "* "; +;9026 L=10-(LEN(C$))/2 +;9027 HTAB 10+L:PRINT C$;:HTAB 30: PRINT "*" +;9030 HTAB 10:PRINT "* FUNDS ";F$;:HTAB 30: PRINT "*" +;9030 HTAB 10:PRINT "* EXPERIENCE ";E$;:HTAB 30: PRINT "*" +;9040 HTAB 10 +;9042 FOR I=1 TO 20: PRINT "*";: NEXT I:PRINT "*" +;9100 VTAB 16 +;9110 PRINT "NOW WHAT?" +;9120 PRINT " 1. RETURN TO THE VAB" +;9130 PRINT " 2. RETURN TO ASTRO COMPLEX" +;9140 PRINT " 3. RETURN TO LAUNCH" +;9145 PRINT " 4. HELP" +;9150 PRINT " 5. QUIT GAME" +;9160 PRINT "---> "; +;9170 GET A$ +;9171 IF A$="1" GOTO 1000 +;9172 IF A$="2" GOTO 1500 +;9173 IF A$="3" GOTO 1776 +;9174 IF A$="4" OR A$="H" GOTO 9200 +;9175 IF A$="5" OR A$="Q" THEN TEXT:HOME:END +;9176 GOTO 9160 +;******************* +;*** HELP SCREEN *** +;******************* +;9200 HOME:PRINT "KSP-APPLE-II BY VINCE WEAVER" +;9230 PRINT " APPLE II FOREVER" +;9240 PRINT " A,D - STEER SHIP LEFT/RIGHT" +;9250 PRINT " Z - START ENGINES" +;9260 PRINT " X - CUT ENGINES" +;9270 PRINT " SPACE - LAUNCH,STAGE" +;9275 PRINT " M - SWITCH TO ORBITAL VIEW" +;9277 PRINT " <,> - FAST FORWARD" +;9280 PRINT " ESC - QUIT" +;9300 GET A$ +;9320 GOTO 9010 + +BLOAD: + jsr find_free_dos_buffer + rts + + ; See Beneath Apple DOS +find_free_dos_buffer: + lda $3D2 ; dos load point + sta $1 + ldy #0 + sty $0 +gbuf0: + lda ($0),Y + pha + iny + lda ($0),Y + sta $1 + pla + sta $0 + bne gbuf ; got one + lda $1 + beq nbuf ; no buffers +gbuf: + ldy #0 ; get filename + lda ($0),Y + beq gotbuf ; it's free + ldy #36 ; it's not free + bne gbuf0 ; get next buffer +gotbuf: + clc ; indicate got buffer + rts +nbuf: + sec ; indicate not free + rts + + + diff --git a/ksp/asm/ksp_1.3.7.dsk b/ksp/asm/ksp_1.3.7.dsk new file mode 100644 index 0000000000000000000000000000000000000000..3ec00e667b90deb6f33d6c2834120d0333869f14 GIT binary patch literal 143360 zcmeD^3t&@4wv%sfl77K-hXy5vrw)f7R zIdjgLGv}O{Idhxv8isaB+=>N+C(ws|y^zs~(%^JWnjRK-kU`O&17tLfb^5`o?1y z2q>){dh9&0ZP@&==*)Qne#r;VlMkOKM|=-uKN2WPCW#OUc+rtkLM-IRAo8~D&4dH( zu-*LJM#_2ErGI0a^XBI~#F;jiTX5zDmjgkKeq4j?fQ#I*jXYJaUs-RzW>=v*zO(&0 z_qX|C8$WI(U9F8@wARQY>@lZK9s9g>{TCSHv46C>KeP}_Nz~RX zP$pWGc^2mZ7eu4oxJoYAPPbY>;eGiosz-Ky&91SfW6=Tpw+TIe^2FrYFY3_~?vwTAHgq7Zpbi~4B0p=%dtm5> zrQ$YQd)tO~^$I6CP(8$Pq3%!Z1J}3fDo@#kx=M22-WvBg$8mD+UI&dYPPjZ_pX?Uw zLkFf^c%E)c+rMpS9bj1BUgJL9Fyz!U#1u9y6|<%L(DR+{Q!E_${9ec3{isgk+y%G* zb!cu$)Kx+gplz|E`pHMs-$TPuf(wA5GYr6cXuta!w&CC1QXe+Y@A546AJz`( zbPGQn;`y4bKkoMU>VcYoEqn}9s~*ZcsH%rB_tYVq(vfy(jr?Cb+^sCw-`!3Awp$Y| z4-BhT9bGE)R6yGy&ZWZYp?ROEJlV|=B^S;t71oMwKYwhg@bHjYe#4Ni$Y$P-Jo3!G zeX;vVw7+3!BKg(6eFJg+(;@Dc;Fbso(gZ5eFuHA3`?g^g+HS9pJ>vfH({XP8r{h5t z-5v{1txO>Y4IF^eqVyq(Byaw)$DjOj-BV9*+x~2$vuWq@RP={my%T{oDH={QbjEKK<8cr%r$V#hEYv{q=v&e)H}BeE0niKc2tP(qcc+^3vhJ zwdF8vU(>=|54W_?HEX=rj+W*c#Cu{BU$9vy65F4t-?FtKg4p4pB~n>rRP(Or7UVN$J@XN1sb{*;e+JJ$B+^@fp^wx1Q`CY}}l++WV0e@2^^xqB5+*iUv=mXf@_hO8uHh!l)@Fq!0`9em1ODd7>x#c2w{ zt`&d0u0wpSWtCk*B}!AI*ESa+@_7_b*e%lbKS}RD5?f4^OG)waRe4@FF@y0CA7Bqb zzH|V7!Diva1(HO3@!~Cvg1HQF}@Vwi$+_lEzp&U#Z*J9p zc%a12Uw=+)7p^}iwDWf9XnV}-I#2&~I>=V)HtK+gooHK+`F4K;{;iT`$ufnyN?qlK zb0SJ0j-QirUt-Hw)VS z*ghvmNw{V92r$kX_jgU_M0VjW9Xb64r8{=(czKjPu7GpawAZd)zf=Tm$l`sqDaV$Il_yH(HD-L6MK{}g`E?^^fO8CUA%8M(cOJ037Rd4I}K)8+DZ);_wKM&_TNYVHfSv z?bx^X;NcAS0%-H(huhY(s|oD`3C*^G}N#in|8azL{7n!mQ_E-T`BQeU+QPRZC7j(ENMoO7omg z3mOW#l!${e{`D29N^w!3`On1c&^vwn6(DuUgwBYL3mb z;0h6ttQ`PcuyC@5jIJ0rQ@9=%p3bvu&Dgi&p!x&H1wj9Df&55Av0K`p1;U@atbJLF zbu~D3UuwZB%(=Q9eqkYiPUwqann$)e2cO@D5AlDu}y{tbU_ zaY*#lEuq&%|9?uIyt=N5BI=2dEaUX0trq8r&F%p!_ zXF2xaX7?HA`OQ$D_nF*we)F*to1s2U(1id7*+l@;#q$We`0#kaE`&$B&=Ctao&*+q zG)jV%=l(tV?{_+X-0W#M_QPhk;Mk9wE#MA~oBxvz9`MhrpK5z*3H>l_q0#2&U8kOk zeOmGK@Tbe4wmiM)=}8T7TOZrv-umU%Tk03pFRuTr{`!W)4KWSxH`LcZUcah-K|@yk zn0jS>M!lhaSwmfeddu&&*tV>w|6%J7TW7zEPKC z7Uea^IiI85*h7h=a*;z%?rumV$nqT^&l$AMNGs>r%4xM={*1c$zpInV`?1aM^){~` z*!D18w}d_-|JJ#SwoQQ8f28%UR%c9IV|1Ox`6AtTh_>j< zcbqzrXk$X-|UA`8#@}vQjP34}pzP-PRO`Wup?aBOupo za|oa}70{ZH9`M{k%;>sy|lpNDW;BQ2%dV(WBm@;Z#d!q%_9iQa$mlGu?DEU5EH5A=hPd zFVP=;8g47=5!C9pKF!>_Y@P_r*1n|2 zsqR|m`Kn$BDBS;mu`$w~RJgU$FjV^Yw>l9Y14$h=8{z|j>9m7#iyd+|-$7=~pgl3T zOLE@5G1PgZ90tj#`=fet4eZsO7uQI&Y=jk33NdK%3^$ z4aJ-0(E5{honsY?sWQzP1)MFW-Jf|jldGQ5-~Tj7n{0Xptc-3;0wo?)r?Y?p!pMP= zi5Vqqv|xFD2h#c$CTRP$oA$e~VDRi;tp(W=U0Xe4l=@@OK;A9hR@?xyW!`7a>f|nI z^FZ?aGqa0f(>`0f1G4bDZgz2X@e{MP)!N#>Bx6$(b%`E%8}|`qM6X z^GEeU06*gXP6Q3~!up0{{iEmM^2hVe88q(24BC>um^KK=&ZixVCN8EyRdE@}zXf`( zgGsg$e2V_9?G6!1*Fz-4j-J>^SsW3d*94U4Pt`jj-QPHgI$N8|DXFtTI79+NL3ZLQ za!WnAew+Jy{hiM_kpB17U$h`<6Sg)Vhb?RIG@QdCHf0n$Q|_# zYsQN%ShEWB?rjV>xqK^Dz%-s)yx}f-{oOPaG~Gov-c9T8+)CcO1+07iT{QT0583dx zT%dn#n}ZKj@)~x2GIvKq^Cy)+siAV~TtE*o9$caSR0#G1#U=v0TGd>s?_jsTs z=0yoi?Ai*fCeEHqKQX)V@Z#o0)y>uO9@zQ7?c3&Vtt5eWVBAs%JTY*<))y9^qhmrXy|aV#v>ayE?o2UHu#Hkh7zi+*>i^kOsziW7C8z4<=BYy={A~7*tX} zvH`RN51-g`4NNU}&~)7kRtS} zgPD2quxIpqVgYC0JO?Hg7?^;*fSTa)Ne(fd)W9fXz!V&UqcDvfbBKVmt`oKVG%L(c zFd2CyN5FYWR>2esbF>bRM)bCOPI{uYWuN%K6H%FHX?RclKb5d8_@N%pG%ZiVVgp;A z!2Jw6_C6JT$z^f6=xU8~4_!@JNb$3^*FprfO9X>H<2n69&%svr6wHBOx6*BQI&_j% zFwer2aI#YVg$2gYcF^Ulq;2gk=RB-|PKeTh#ztU`ZJ=yrbc4obpe^=+`f z*az*RHaQ?*JH-7B1m@P4)9a1cC4!@VXuJOI?bxLZ1aAU+8>+gvK~t@De{LVRi+XPf z?fz$t{2TDx7ALA};?=pO_S9XJM?%-^q8`vxQ|kcTF3JL{4No*kc!QIDy#3VUTCSTo>={A zWwpNgh^1llQ9+$2&Ni8D$g`PgC%>*b&nc*@9^EkNs0de>=!RTd1??2pRp&ZIb=9LR zC6h|t(wAvEDm0T18_maxbefW5#ag}AbXZ?j^s0Fhz82}rDh?a9nhxz$?MqXPC8ooM zvWgN@N!hV7gZ7xlV9-wLFlr}hCLS)*m^AvbS0n{{3Cxm=nyS)}6h&4l)nTI0a?}8Nt{w_pC*z}r7 zwHqOe9TZWu#tX9Df+ITU=rUp2(uIi4!%GI&4VLuU|^` zSp7}6Em*qt3Hter#}V@U*#Ad?;6GBOO^VQ1gk(HM9AXd!lOj>);n!aKi~Y)yU@ah_ z&>^?`wZm`z<>j|dwm#qT{2tU^)spzq|BRV@!T zKHB&|<3o)&-`3dGxWDmb$e%zSK5PJH(l{JI&TDc$@9K(bmcfSN2(4@DqIDMitu3VT zS-rJ|eE(UP4F2hAdcoy{!yC~F1nX+sN!NzYTx8d-+8G-*x4@*-CUG=vZYgb!f-Ox~ zyIY{2*`mL@1t1)AJdxo(2XhXbjQo$w+3vEPb2$&Wq>$(h-?|*Jw(nqS z9k`Pmxs!Zpw}YQ?+~r9ozlFw$WNdTZv3FgtW`57*JmUiXonN}3E5IR^i1JzIH!k%s z5Jz>P^95IR5pYWm*v;0$sSJdFuqZzTQGS9&Ik!cBUkh$>j;%ZcmH&pyub`4dE#!_y zye0v}kaz8ZM;%$e%Z@5H7U~~sB%f<;mhCFkkvHukAK6uD(J#bs&X-)|UmLw`Fz~KI zc!t*cBhdP}W@zi6qK><4$6e4+|Hv-KD%(>n%%blp+yUSi#0jhNr&?Iav#8kKVUk~- z`Pk+D=FBH9eSfDP9#&=dwcw`AsMLMB2co<$?>X?wp7n3Ip!bR7jGfIY7(;vH`pqr7 z3e_^$Qg`ku+)+tB=xp5F(%I?$m-9_m<6ACx&TD=hLLopfkNjY_1J#3zgayTS7OZc0 z!0N52y{v6#3!Le}lH&ob^PAS{VzLmI!!I7K=9^(cWccz_s7vj3=$o8x zr=NfpOgHTjQfV{9X}{aI9b<9WamBy(R2PF1!4y^4#FU&odD1=*`UaIJVNSy6)w^rA zH$MejI&4sStggjPkdZ$+5`Zy_o$o+8*Z^&9sg3)ett~LEX(525t-KxS^y8ZY3)tP~E%kX| zMbEdKbbnVLd1AdM-Y(c@Z>jsb1#@_!*!_9E&V7>n$L4ypuI~9g07Yt>9kGp`mYNzk z%d{QXv%YOlCmbQdGInZnW80n@waESX6P{1W7hB2FR_Itg@`&sCZhpP6?G@1HwocGz zOZsuwBA$i(cqcS7HaiZ2ZGa|OoX1^iD4yUgw)%>@T=)#~2tJN%V#e1(V5^$26Ldk@ zENOb()%b=>@7f80;X)5VW0im>>~w@4J`R-bw(~a@>T19zzzxhFoPb^A{5uwp^Fz2+ z(v>?Lz@&q>;Z4_i&>v$nM5YUE@4FHg{MBXqy9-d-K5#Ago6Gj03#1E-^Yq5%##dd= z*Ies8_*Ay(ZCB$vuw>!^7JlPPG?X@W&~V1v^qtF&0GI&DDVvGLww9&?EpBPkfjw^E z4Meu#@s{;Zz+eDTK&@?Vdc36(p83$md6>pMf0+gXmJQ5VEgbhkOimodNX&OG>-^Sb z`>fS@&V`SfKXTdr-Rk_O%l0)sUq0CiAtDGA!LcvsH7vY9`%kwv^DNG@t@em6(nHvV zU2+fKPCNloTj$5FqbFRj1p35v^dBzI9PnQ_`+=)=02D&y`>xtJT=Jo-R?e3E-Bl|F z!>oM=mPa4EzIfjyy*+XV3=AB$#{`C8Tsn{tNWWeF$H^^n!tJ!$4;ND9@7U+}v{eVEV*a zSk+>n$MyHNfWCT?k9l0`>k{jQW504i(4f|H<_u=`OPA9F+JStubqHf)1bC%+iL~5T9}Cz9%YCabw)DaUOyKhWaO*2+*S(F8w=1~w zub|DZs)=kfEUbBAw1kFkJ&qnjkNUcIY0+4CyjUOfZ};CM@S6mFlfZ8h_)P-8N#HjL z{3e0lB=DOAdLaQNPp3ojOE0#2f$EAtsJ+xvBA$qs#7pC4@saUS@zL=y2`GV=z)uh)2oppJ;)I9< zB0-V>r#=6Li9DC|U&!@;JIl3$&8mKV*omK&K7G7*KYiH$-$?%^fxeW$&uV|Y=vZIV z?*)s$f&3Uj`wl^0>b1 z{cn_o@J2x&s-Ikm_vlPxTpfOxPssQ}X}MiO0kE z_u&ALJe8bB^_~7h{GSl^9eHFy@V^LsnUsA?zAwA}Gt=&i@c-p^38sIFy8LEWt3_fm zyvztZ^i?9#Qepi;^%Z$U8slSQ3*~)AAIX!2aV336{?|*{Fj(~8&^eKW*Ovw;9}*9{ z&#R*Ul*;V?@rmB#FEI!9xFm)P>2s83RRVX=tYK3D7mUqw=m(BbL(xY-Kfp~8B2zG5 zE5g#ZhTz{%i`xgkOgI$HDxZ9Uh~o!k5Z)`K&&A=F3Wt;_ARkU?h-`TJ1>z9kP$UwF zgd&khEQ$~jB8f;Ul8GWkQKD#3j1UQVLcUNS6beN`u`ohN2qi+PP$rBNMhT;Z@E*Q^ zC*TMvH2(jSr9bKXTauj29j{-wgA`sR$@^{%s*FwLT@~+hg>qA-B=Z$l*!HS4D~XdN zqrQy5NeI+icW_lY{2P)W2~cr-VIO)uk{2iKL-L4-1?x{HgGBO6J{b7YG+|$QARfH^ z*mv$1L>;F|`6UJZ8?9go$ay5$hw(28P9KOq3;-w#b*jD$!O3-o;PLpSpGs4}{r05? zRtgP$N&c6X_y09|N_hFb5C4snxKZQOD^gniyl)BgXgMiAv;euBrqCn*lv zcuxM(Sxg_&J3U_Dj7OM`)C>>q1Ju>GIHMIr64TMRaY{fB2P zR82Sg3%0%x{>P`IK3tcy{{qIpu>A?4{|p{6A(n`HD_$Sv|MI(tKbVlB2QMT8ygKj0VP@%7A z0@F&6jgL8HOdLV z*AdLigtRntns^MYnSjm_c2vZ&SAi}NG+I-F#F9P08@f*NLV#+SL4g#KP9LER$s0cM zVbG=KJj*>^0Sb^F3Q$lLEAXWf1G>;<>XpA86qOX#gjI3T}>yz3wT zvoF(|`M&_^lNb-w!~go$FYKJpdVAkW3zr3)QrP()dqA#Nyz=?qw*n16|M%n{!~pzq z>0jRb>!0bkePyMAublZW_{k@Jd^ZK3%!Qx-LhL_6&i}|Sfgt)pz2q{`+xfpNg#7${ z<<|M7!l7~%&i{JOe=z^EQ{xrR|2|1^_`H}!Rde9jY&Y{e)b06Ee*>>o_;l1)?v<49 z5$>@5=4wC;cRkLPG20|){jI`foYQZvPO|g^_Q*D8v_Dw?{q}dachP}wzo7kJ#Qu7Y zf3W{y`*aci6UqX*`=5)@@45eky|dre{8r2vfq?xn{?8}$pgYtA@x>8)w`>Ue=g<#~ zZGfi$eXQw0WCIU|-r9c%`6E9qZXf&-2%_Iz_x&7P`TGZ8{}=sv)KA0Dr@sVee5IU1 z6NhI`ahNR4L>jEtgTZ`2L;_NX{Xcg`z$m?v;$Y|6d$;iqA^&c@f4$ptp#NU0=wn6YahT}d+8@90$`PXp@<;)lWb~i29`IAd_QTbkkp2g;R(T2fEY6>5|G^{4 zeF{j^&ppTf{8q$~KtPv%e)|v53P>PO_M824bksk5K1ultz#=&^;}nO<`qm%a?4R`t zq3pjKp1!t!uLtCC)ouO3vHnZN-&pJBS_H@5S^Ezm+pzYp=a9Y}`)4V!qutH_aQ%$0 z%b4Gwat_&U*-Om-KJOIL{;~b3d^CgZz;7?_gc|K?4PTnzAj&e{a@Vv{MLP$ z_79%n%I)7fes~lE_8*WypsYI;U-#kOYx@te{tVFP%GNJ|Ao@K=&&xz_?Y}4eaQ2Vw z51+|B>hC72=iD7JuKKy`|2U2HHN^ZMG}6GpFFpVJ<>AXP65w(ba{uu&+CP>6m%e}f z&sco$C9DSddc)oYi0a4g%;#12)ER_oI#lK})*x%fn6K=OxHYH-t>MzI#Sh}Wi6hKa z*8MLZ2*tByRg!hCHG

El|HQ`Wz%7vnL~ixNG+TS=QD-Hc^1UGZ=Qq!aZav3R?A% zJz%zm>YpF#m3|w$Ne5T0hQIb2Moy61QfsyLoY^rPWqsIEu#_`S46U`e%9q;d4^Q!) zJ==Wz)H`%t<15F``YPbQ;bBw@ee}`s)wDC2Y=#RayR<;OB1|t{K?N2+eYp=q;BJTQ zVUT$JRkdQ=%P^^gs7pf@C|HSw}+qZQ*=*xpG*dfpA)RSzffP!_4S^8C|aY7bs zgB;xy)*zB?=D%*8Rlv*`aE(AqyJ0zr?QgB!5A4lgi`?TcgneGWZtZ+^RS4{#>l;X4 zjqgs(&RL(!SlbGS%XRsH-?fxKPd!ggZKjKd=84s$#(b9ShImXp8sbxeY`#t zeaoU*!S+vH4#8m9OW419PIvyi&G)i$i^MDVCG{T%NrOW{fbIGs>Ex{a?xy449slk< zItjfi2%br{>3P9xBk%@ZT>5}lnlq+~YvUYZmZO3B-@+*mWZO@D*pzgd*ZjeTw~Nj` zdz@?k)cuF->{=rL4mrH)LFhmJnNf_Emd&zqcP|V8bFsXJ#-MEPbI%!K5p4TUao^8j zR;%oK0ea3PwYN3*Mr~Ap{j+dX5)#8~5hlGBCi0N#R&6qtD+;M{ew>g`~MRI?z?pRf+t^bZ|+1i z5fgzTcoF;vL4+_u6d{g?h#(>)5z+`*L}Wx%M07-q7>RjezE~g@ibZ0vSSF4XM~S1w zF(M?o(th`bwVw}$`Ty5&`+whL{HUKkUJWuo{u0RG*bno=DeU!o3b;*s=<~l`zkdjO zukQ3i?!Ud;;GQGZ?Y!@j=YQS(oL2&z{zLq45ogzZiT4lvksiNngGvI?RyHOTc=l0b z%0uq|VO{1=q2E6cVBb@NYS=ktHG>jgVfBM3&9Jkocj|xWVdYTY2>bv1?*4~qeMJ|J z?KAD?z??US!h0;UVtlCm|0)gc*oI(Y!r;fN_+$^l<=?Jm66sp_GDwLMBW(13r}wxDOfr)=Nb&Qz#t?Pk@$`a#{G*hdS+6CnToJEVk8&-(6c zqqXep&JSNWOC1-y&0WXTiZ|l*hQG&L8rfo2YY>VYWL*{$x)+u|Sgf5 zL1Qcw?EhEH5{SnvrDl0|5_Uar^_+tC5G|l+5l>~l%Ny6BB47p5ecu+kS;$hK6oV@_ zgUr{=!cmUka`tIVxym|knQ#38WtLD-mt9uV?j7qrYw-GG-jAx4jm!Mn!$CJ@oT~gx zu>FVBEl!iLSvNR_ijh4CHPR%;CzI18e8x{n>!UL2urmc=~?XNPr^e z==%vE{^yNkB(AoUEsK0Br0YYGkEqPB|7LuiS`6`r;9Z-a(j_w>-}V5IcOHfU3;cDU zj+%a#EAXp0~aVz-T2gut)`8Pid_0QKh)cwVfX@?jwlU}C2YFc|==)TWc0q4HHbrRz- zx_KXDp=Z(7Mr#q+|M{~x3c&Fe_J_p?=7fN~aOuAk;LB1_6-rA0+F}dXKeurp|L&82 zKL+;SQg`~DQ*(ptzuvcZ4|qC%v&28bDHr=xU|AFq*8VL=1E&=J#+*#e+C2zn{cMEi zfA9l|chB|49X?uXxqDeb2h9NvWMTd@OFNEuWxnEy=YOBh2PEtrQ;-`%^&O3m{5v?x z=4GMahhcMnziiu|0v!FcTszkb0ji_VfCpmsRf^lXTREmgidE+CgU+>nYW#n-Uz=(X zg(F*uXz?)f@|pFohn)Wtt;@dWp8ti`e$47sNJr-cBf(2gh!Lz=PwI zK~>Cy{r;Y1fs#ESmw;L^{ zn-2%sf8tu0kwR04*;(wTQU!b5&?8_+A?&~1-w?dmTlDv3u$a3$2`;k=z^eV2{8EQK zRJTOURj>8MpJV2%;GsEi2G{$?G98o{h~t70y4vKFd~7b)|`;29YOmImUM);4ABaz{{d{^l8`e#z3612XHS679|1ij5L80NZ$V$3e*2y zAiP`LyL!uM&WJIs&fTyzr^hH9XA5sqK@Z4hfMBZDyg545{# zIg1aI?^Lso?4R|#Vdc(n$&3#032Q!>|17~8jrAO6yzcft$U7T?RfN-OcINi$p4BIj z?ss(+(C{VDm+lEy!8>=|?0?av=6|2g`7p!1J7(WAv#x=90b;b)SIpcg&?M})@fi?| zA;@77><+Cw;2EC^arZ1i?EoEb1&>OCyFZ1K6!tB69VDm<2N8t27Y_lyQvmkoPhs>Q z`oh#;2~oW4MDP4Rs~3dAfUvV39#`nmQtK=)2Vv*~5@xh~5tplB|L~3i`wju)Q@tm6 z;pvCz#}yY_d@UIXzys(GoFn>5@tvB>KK0xUaiOj(FO8B$OJgKR!jteN0*O!}l87Y{ z5<()8NF_2!q$ElbEr}rz!6W#D0KWP|M2Lw9f*>S>l#mfW2TNDhk;`dyC7=In#{_&k z;??*eu?F`4^JeaUy*ZS&SRx^c6ugcja4Sw)b#ZTtj@E>V0JcMf)Qd!j&q=dZa8L%a z7BmMXa(5{tg@miQ`(M;JYyaCjj~_b@?*X1gZwH_MxgQj)S#9@4sRC$m&L;(g#=vO| zcMTW>7xexi$yBv-0XpIRqdIv1=*REgDLQ*P=>5Z^tVP1QfZKr0tAFrG6<*A!f*nIB z=`&|Eu(R*k+*<-8_=Yb!+8yX&Z$v6oYjvW^jAs;_7Dd2m`JAx*?~bB|5r2n@L-6a@yY8a{XGtzg)A_~!Mw1-isvYpOOlu!frTv# zKmRfO0@NivKVC`uQvt+?e0sq4n4Lr58Z`god6iv*hhKki@nQnL*`Mn6N+jCESe#SbalOMSx-gZ`S)Es0h3-!>a?3 zJ+lrOgJ%-V30{B93WpP#z$y9)3>QeDZ3?XbOn3*tjI5vXPtJHH!1=t6aGnt$nP?Jd z*wslZm~r%WJc&y3u7SezA80b;>7#8o4>5x$`3VWH8oi0#g;d2@fSd62eb9Yzhjn2mhY;Q&6c|&+!d9(-I4LIuNjA{dYGq}0744tZA!b$Y z-Fss;!r4Cy2LJ({ep-&Pe;83V!ML)SF#QKwz(MG7yfQul=Lg;#6JrXifmcT4YPEuy zhlv2;(Ebc@Y}(=f07!yIwdGz41|crNU_ zI4O(-;Ixhbx|;USN}CxyyiQ?LIQviZ)-xP)2LFn)E0SO~^LrI$q%esv{l8)|;T!tj zAM)D2CB{+~eg+DU=a;Cdg3mIZYn_W{c^otGomjA>vDJh9U*!BRyk&DOFuZ2_wF8gP z+#Vgqs{`0`bX)&3>uy{ce*KTp1*LG>$J#%D;uE{>^zr-;l3~vO0_UIX*&|CobpN4O z%$X{egE01Qff*9>2Iqg_rPQ6TOFXl>54>~fhtvNRIKB!}W_G~vh5?+$gHDV|4BfL! zP-d!e?^!sk10W|hg&P4MmtN`r^z*+JNx(adna>A!Irs(b-zO#JBm(A3_^-ckF%2K+ zRlAF(N_nw7soYRd0pDr}$)Fl2!FTz*n@WYr39%?Kq1Y5z8kfb?#v_8vG%vK?n<~UW zBp*o)@JYfwUTnpcmq^jL-k`b#Zz&KObu)9r|41k=hpdH<7=kI@f3Tqxc^H6#vErd( zzIGVHBrYNqkTp!7jPsY3n3wUi@CrM$QX&%RN(7L2@T_!#wCGp_n4m_PF^aE1vGMR!QzDzr3vOGQ-q{Kj8YM) zO@a4J)2w`?Q*y6nf%s|7ZoEW;JWyYs_Veg-fH}qGf++Lbissb6slf$d-l_r!-Ex0j9 zBgd~vla*HMOmkMwWMot&m{kj|O~$Ah5kP}(NnRRO%H1G?A1UL!stGFobUr^F6o5%o zDh!Erav?&g3Cz&kynJA}(ptz2zcAi-tvp_(iX-J@TB;OO@n(?Ga@DY93;9GWg)aHM zY~8;$POVBy7zzJupJL%>v0o~ij^JSx1I<>BVT3$nK?)*;R52O)Snp{7RzN^C8|*%#bXXcSz4kpw4mm5DGLhsEW99;YbGlcyJ$DPvYuY6+>Lphrrp z_1;`_`e?Jx1TR_V3^NC}4t^rBBfXMTI&VS$9Hh<>RwC~JQz{aXCNoS5WFdpJ$~w$k zS~X=jMjvk=&9}s9h}7TD6Y}Q8f!Y{LRkIalRROSvp)b|x?mY61*O;|Np4%G3P?xGX{eD_gu`JAx~JGc#HkW%xO z4@}&Z)P%4s&r4dp>Dv?U1vfk49KLvLs=ij&kgYd<7VuANf!MjlF+yXemSY*X9 zRoKmSJO2xY#hAFs7Xk3Ev$>VNyf^;OzBLXzR_`v5t;RbylnB?L^FK7`(&vBp^Io_q zEDx|*@x%4lp;9>J*yH^p=3LDi{|h65ZqzXaUx&Nj3y{D9)ey7lxkHDZFTMx|RW~m$NXS?@$W&??nHE=q7llEI z9T}#GB47agqKk0Fz-e*AYu5q$m@>sp9PhlT;>bO5`-=L8(wqK;*y#xsjDDh=fAYa-@Rb1RwZ> zUxR|-HxLkD(OmM1Tfv_&1rt_+!lM!jp>qBr9L%tYNa)&Bf=40*i|_byA9nz&(n*UI z8pyDTDpsI)({#%BeA#!B9Xzs77hkTMGaLyKpB&03hNUS+ru2htiHeL*;Lz)VKVAyE zl*>;_U3!jrj*4-s$RtYDECf|dA9N!R<&$!xE0o?oS(R$FGW*`k$A0M+X{Ho&Zuw+Z zu<;eB;zl$NH%4Fe?!PJtmIOr?Q`V4zDprLDA@ zuO(-c@*(Wv1)UCNw&Y&3F3!N>ywRGJYML?rTFMBnUp`^+^wM-`Tw1BFu(TBOIi>$F z>rB|US+#NnD#x+ti>2-cN|sMnnF%sMS{bKCJnTHu5|V)d6?h|()v-GYhNPNR_a@-} zlc;hsf2Dce!kO2S3>oU$gb5~7JlOx0rXdNj3Z9N{S!mWW{Us_Bm^(?_E}LZq+Zt*% zDAVG-VR$|w4Im&$pmIVy|4Wm#ip!ww^Rfu#V*4l4(vyTdxd=`6E+^%PU_$AncV8vt z7bA)U3sEpjBnuB*lw7Jx7Kum^MgWP4p^?7x1GcOeSHOgXfP%ztVJdlYrBWN8g8d2) z@en0ZBV&p}RSb0u%OdbR-bBV3*i_tm!;6Ut4Z1nlg=`R3kGa8pK!Zt9c;QVQYyKQdca6qrr7 z^oQtQyt$P9npda_B+gV@Y>FcT6}``q=IK>t6*W=|b1mU*2A;pTYD5Bj=dGR@`H3q> z7!@~YWS9Uk&oo1opfRaZ(iF~ee9Ee2HQcNi#=sF3V-Ac#;C%pl{c<>RBNa(0eRjyM7 z7FtRZ9y!xBxcYJu2pg9D@P`G9QIH8n0?tBp;0(|rz7WnPQc74mPlhfQ`*C|eYtTO* zNwv^EjnQL2j4uPYDPO+Z9oBM~1&}bCAl9YOmZqCAFI2KzS*|KH%}dXL9Tp*!YM_t| zIetL9)Q7^0sdqOynL2OW9l1joxyEbnvfigvC0GY6;-dkv1S%x7%Wr_sHnooMV&jG& zdq?0BP*LV+tt#cV_+;Q7PQaGjT~Lu?9((gB37k5CU?Bc)z1NsAa2WF$`w;(UgvE$} z$pv9I__r}Z#g~3CFTZct&D4AqkM!F=tmJeiIEF!TNeV_#uyTadJYB#n5acTD{8B}N zq$EnK;+yrrXQj$CZ{|YNaBvvHc#RS?`LYsaQcdHh8A_#w!IklNB&abNcrk}hy9_L* zMN_2ju;n>ydAZ`*k!Y6m-NDa} z&dgP##Zu4U-K0vTB6V850cX&1>34%4M^8zGDf<-@DhwGKgF&y&C@CQer;(FOCKYMP zDO$~Btx;_yp(T8?QiK$3On##yBV_}I&qlb=Yrzp^38HK^L6-5k><>nG#X@$&` z@`5G>Js_)0d3LlqQ+=sH`eo{)!v;Hl8Tx%er3R(JTPwRseVL}1WWQ?JU@RMN)J!Bx zCc$Xx#v8LpjZv#XWkd{oc{Qjj400J+STa7HX;d<4JRWsT%1HP=X9cebMutG^3dbplA87 zy2SE5{0m()QlW|HPP7?yqQ9l2q^GCn z3=M#A5%fgDq6q^NjLZkx9XJ%yUch!o4o!kmbeKqc5YVsf!IFmHAQ_H+lM#%0K|uiw zKCC%1n8AlJPstELXm3=(nDk%0bwpnxWbtbodZs^-BM>QwBqJg%&Nl?rJUjeH>n^10 z+=Z%nmDR{CY~Xn!?NHzqMv0=t zQ4vu@lq5-aGhi-ykR1QS2FG!o1itt4Ubios3@p5!#-s? z{1>>1((xgH3VV|<+cZW-#mqHuG3PHB3a?$McxoK+$BCQ(erVV*cp;^fz~s>aYZ<@% zh7l96pb1niB~ z|4^=jKgiCU7$2`lmBI!Tn1horxCu$vxf@`Mgjr2ZVN`&^PnS$`ioxTBOP0q;=B1dF zX31YQj&*=1Vwy8Ap~Lri8&$hKgLV71|hfFUvtq6p)wltMZWH# z;#*cGfG!n`;3K7+k_rn;O`y)pt#CZ63XU(57e(9aN}W-<R%j zl?&nXFGvuF@b2f zLBs+Q3J>H(5?A{%nC_OFW~gF~X1+3(WSbeThn}e5L=qH&8PuwRex|sp<)zm`iBevu zq;v|6G)~AzCMy3(X1!>Z0C&3=N7*$3|<8@QrZz_#bU(L#a9Z*_l=16tEZW2#XG3p^8Itb#qeVU zF~S&8j5sDDhKP~GNMmF$)%~i|%~B~unDmp}YIF^3gp0}{Gmx0tf6J)RSve?+nBRY2 zR(4i;*2tWE$YiHytI;Ilp8l)#ZVYfJFLP8*{vQhS_vzCM^VjInt;Ev)8}pw~=Woi& z*SXdCMh)OwN8H!nyY($(_StMC#h@u34%_Q=O$tPjVC(E8R`h=;Gymbt^gQ*UOdy)4 zhKG@P_%UnbD7c~biIx2y%7)TRbvpbV!uMQ&0&q5i3r6AA_=Y|sto==xjS6=bLXuVe zAIon;OgPvlP*GQ`SJB^yZWag>W9nX$Z=VYU?Q1lR{4fUNmFDsooA2U$I zveT(UcS`=yU*|SzUd>YH`*^=ZlRrvqnBeP~&}sG2qVm`OqV8xOl?$r>lw?Do2D6ff z_DcT5a_0xm1mIBs+%9>jKaL?ClRVO&iQkngI#!`iB#(yb1*UD1`9KXt16BV`xFL$blkZjjb-VXz3meIUE^DYjS(ANik$ zu{TMd0SUNsM*`z&)F!RRPhENNl#`2&NVoKNR=lnT3TpJabVvUujOd?Ix_^CEX8wMK zQFEi>2BQXjA$9f#agJ1@ucf>DuR^gha=`t$>7YUom`NX*1(#8y@MC5+1Zr|*$ph}s z%)#}bm-w1FIz2lV|Bf8V{-UWe#en;BveUi4Bhzzyzq#4z@H-Oxoow)c`$s~X-1OWm zTn4|{fM^u{#ra(Hlq_Yy{eU(U2^KXvBuixp`S1fF7T3rejCy1)`b0Jadc%;&%o>$G z3Mge^e&CAf0pp_)5jhkn1yRQ}9KvW=q>^EV(@kIZpr4pLniQD^%y2ki^BjKAoslZ0 z*I~Mhd;Lh{FdrcfeTGr5gi&i`I$!}pp(M=m^0&wgA1@sG0cnFM(D}&W1MUwc5C1@* zq9+ezyln4$`Mzk&z#tFuO7y&e*em5@7lU4pUO2EhFDpxp z-icm3a2NVKy4g!|yb-T97?Rh->>t>RiAWW5aA1g;B0HvIATvLXj`;{E7-HfFv7KTL z2xgkuvyFRW1`P_L!JG%oG?f{GCc6zWg9nA6@pz1K5YWg(bur@x?Lxa^s3ev~kx^5j zV>+=nrZj0&HhM9pED1Uc9`c(QQ_|`ZxB5`-$XD|6pD4-ii8sji=C3J1eEAIACi75^ z8s4I)Ou|dJzbP}*j^yDLTs~gD1s>68`CUmxzM@eW;GrU9kgrIB=^0O=hrm&HPE8-F z?wp2Z$sb4x8mCHmZ4ywtL;hsaDpVui>g~`3t+5bJNwm|n6->8w$sI{}YR}5aOV7-K z86Pwf?og1M!xoGJ4-M?TC~r!dp!IQ+orX@z_a-gxCl;`S!ah& zauxaG;5nOAG?o4%;@}J70l(e*0v(Vp&B8;U|pTEB-<%aynvRSSW zPcqJrojIl*hqs-;*ElXzS`d_WszGZk(c&{`#SL06T&Bc;v7rePW0=lYNY)Ro&&)-) zNgf-#Uooj{3OPlmF%>A#8i^eWNHTLcY1Ep`#!2|Z5cbgIWKE$0ZIjSUZ5FpyQ(-ce zc?V)D^jflqfyw5=u#>3*y(QVlRE`|Z9I-3VDai{=LC$azA2^faH51{)`kbT_N;5Jt z#zNO1Z1=`synpzwNz_lV%ab2|W<#q3eXWJ49rGGtpy+4Goh&;2j(FFD?Us#}ClVv+ z53C>F&%EAPd+W4pc%%1cP4EdJ)H77lANID_ynMe$j_e4%gxvphAN=4?s5a893iFwh zSCgj;=ut;)&FZDpgKKxxezf}JOB)_|p%y;X;ulHl_?>If!|(+p^{Pt5o_WwnSJoOImto0RZ!QQ8R{jD8rR{h-ehiTP# z_W$@i0_j(SF19~Zji~RL?=`Bub!NfOPX9ys8-H}8&1*Kpdkv5hi8Y%Le_aRt_@MA# zsfPitTC!gl_s)g~cBA_rNnBfx){*E@^cEua{oxnzJP1+Se>}CixfZR4;P`4(Jtqr! z?4%I9U=4VJU%>ZM&#YauvBtgg3DAPW@J*T%L?{AXhnhWN)U2NNj3sbxbk*eTLnI!< z`@{WeA$XWZ>}A%1{;g%^JHloVaNk`nkw?m-0RrArX#$ zZ_Ixv8_9_X^f=0fD0tBReZ0P`P#d&&r-;2W4Mfa`kAicJ5@MgMXd>*`%ZdFmtveh2 zj(A?CEpcZ-{P}j`fJ_T@!*h;k(LF?)Olxvy=H|ge74d@1;hIbmYwxQU%b z6H$resB9t}6i(~{HJu?jCM%xo)|MO@f8>3oY2vFBO=)P68id$=X6-thDjZcHU z(A%9_)>dF@0c@R!Q zAmJSl;Xt7UOKSihXnU_gt5qA7`l@#R|4y71t9PcY<8WcNc3RUCfZJ|)A@Ty z4H{c5_}8h`xosi|CK%z!!$&(-#YgcmHCD0I7ysHP1fmjia7O6Eqh#;1_S$Q$z4qGA zv(DM#k7b*ukKb3H=YYqHuzMtzd@9>KZqh#Gqj?T!YtStGZDXVlAxrX^3}D$H^7KhL zwMVjxCg-4$l4=>WA3yLb7C2ktlx+n=06$SOV=R_%?DWUr+2|xJ>m)Q+;*tS}aiE;3 z=ns;;vRjl_Dyf$NOYo3>Thai8CQq3TYeHOPurFkh9Kd39Hrs8IzssO~AH$DXr_Rnn zO_Hy=SwD#%b39oDtczwttY|hmEjcFJJasla7lBMq7P$%@%^QN+C8uQ2SA3QIWKmA- zlPEmmtPJ{(Bb~Q#5nf!vqS>w|XQT9pHq5+emg~t`=;4SfvS(*8GiSk*kq+6jvzeK* z(dY;&7J8RwXS;ygl!%qF(BC{e%T+WBJs+_;b|&*h_RLweGiSMG&aRya;{Gw>%~&w8 zsk2?UqsxYD7;238Q!H5D)LETSK%bR^Dk9d!f(3p7MXiOTsk3Wwf&UiqZY+Li_S94d z>?q*9(2S8w(4mNmSYLOzCp#M+!aX%Lr?xZ9K|JY(*skhAJfr{mj3%*zeD_JENo!Jqdja01Uj|0Q(*&djlD zAI?ljm^64=MlNfvKG--l0JAXipQQ)8g#&NnnMISIgxxq?kAvVzP)nDjm%9;I23U-u$tW(e-Jc+gmcc~iMyM|6 zkA8$?9zqXvzW3sX^(ypsVs~)Q)dAui2mFp8f7~hEh8e<1<2L-C9^ht=o}XU%LX{}` zXKn(~_i!B&O7}m6^k`Tf{+zF9c4O-2tAXe~*^Kz%>NonHZ-xGF%Z??3H(Y<#SM<;E zrH_Cbk7j+=0{}m>Xmr=6PcmQFP+z^r*|eq6WoMl9Z5MoyTf+C$+Z{(7&b{?pcG(+y zKuMACn_SMl&K{F7z5pc)h5PNhf^h*9K8hlQdm5SB$ae$qtc`E4-phCn2IIu7BBQ&W zya)tBkG;9B+Qrx%TU@&vx|wyx(ouYbu)blJyXi=Sd$+5p2c&eADD6aPs%LsYpy_lZ z3g_?LyZ1Ko-2fqy@%S|!mPb!o223fEMe?ib>zW$u)lEHXAPhzEeboi3>=^~L7#-=? zlSC?PayNOLJxYy*ONU3Md|Y!uWCD~hL`1Tc+mrq<4NN6j#ERvv+Z}{bI7*J>`|2VH z1}#KkeBo|S{jNKSD<}Aj>rkV+x-keD82h5xug_y0#K`zAr^i$86SIe3KD;H!Z*O-b8PwzieotKi)>yIS(9O>8x|C#29cxudH#< z|F3c-q<&h-Db8m8;We$8uozKHcnlFEj_F4$>|?!17lxTzX=IHzT({;Mu5Cl6YppJu zoVk3EoONwwv2Eouww2RtE2rDY(@|Erp~L!&;Rg9P%TPcLxAvhpf!c*7*M>KRc6ujM<#Im>0kSw%^Q;jHD{d}KIR zb=Gj+%FDdq6vwVSSaBUo$3S*OZ0WSOkcntk$;QZjKq+C)zL z9*m^oQq?umdmS)pnKp9Obq#C2V6TMFu2#u3SX!{=>l*m^&U(_|1;F{u|L>~1kO>D_ zyy~km_Zep3=G3e1<=zOZ5|BP%p;kBG!Yv?dwq5ng+((&M(A;_J5*B7X4#^PJcus%Q z)=uv~`R&Ei=f9!1Zu#q$t?=_9U48x^-qYt!o}jl@R(^u&zd1=)ZK>S4*98q8Pu$?A z8h&Z!+w;dyUc7kz+Yf1Ub{E}X-;3;C@41t-+l@K~{6hIy-eU#B-+OGx@E0HOd}j+U zSgCXk81M^6_@1;B>0`1X$`>WJ?|7Qz!rXV$2K=HR??sQW=)=fNeu{ibBq=Xiv$k|d z$`FrSF3o&-#JLSAL_tDa*^FEbdU($M-?q5+5KZDn`NOl@_Ms)w4T{L@l(@*;loap8 zpMGYefZMb6Bhkj<$zzl zT^aN62etAe3CV5GwjCN(Fkt5DUsUpubYP?F!x4#d^Dn>j;<+a@|3Q2tshA(fQx-&g zm6j)K{2TgcO47_tW2b(ZJ$2k-V%nDvAnS}xLlx;U^Gt(W8C&Nqcm&lHZ~cR5;)1;P zr!Qt7PV7h|_`?L5CrAH4N0%6BOk^yI<;C)21+l`|uvk%Scq|bsj+Mkl#7bi$W20ha zaq!XSIDVWUP8b&!_fyz9l(s0W4;pf;0}a_U`qYI?*)CflbJ^NqI06G8IU|W2)(#D) z4jNv)q1L+Ju*bUB;ISSs?6nSnj%cyr3i*Y?8g9sfaWE4)n5)(s06L${roIKycaun& z0@DF%KnfYM052WzhWhX%kQLv4-JPwfE8Aq8&6)zq5*B6+Gh8FDOQG9>9v!+QHxGhW zBi(!m_D4cTCs6+((Jh4Fu$25fQoT+}>Ti&fle&vomHmzju|)*RzhML*&~*?!irktVEhO*dtr`v4@0 zeRKyxw7QEfeE&+t@%vXQPT#+R4=Hwi|4J43{VP?F?_a6>-@n?}$1}g%*u`{h1>BbO zlLh$gh@9)UsdtmCF<>#cMPsYc_^jr2a^p2CBA;)!WNw7XYpyklOln`BX_Y~6D$|nb z&SDtc&VdZuUu3c7j0u$Z2&6&uWS80b*<$l$yBNsGvXlYqOhAQs2JS>~BX9=fGN+Q; z6LaOZPF6lLeqzAcPe#&7W~Yw~w)qu4G9Y6&nxEUN-DunVXzHipK$4Tz7Q+b$k6T*} zEqLDaPD`fC_BhiHeMT#3PXt{Zh3@fdXwIh%XGojEYB!vPsqpszXg3@)d|^0jIA}Q3 z*+y}XX);`av~!lP4gVnHlGttsnk}?uXt}=SvJadk(YOx}hsl{dayPUvT3)R=_y^xVv`EU=^#Y=pkFlKNU3Wmd! zdp@85aY_Q1aQT40ZJCcbV=5wG8V*eNMB^k8BLhK>y7_XxmCt6u;<_+VK!zknF+U8$ ztpW)fu&KbpSI;2mm{_ydRn-EEq@(T3Ws4U`Ux-myzAd?A_;#Z6vNGKHom`+!kFlb{ zla~ya)Ix|k+my0XZA>m``jVAzXj4A}IWCs887@wo=#Ejwd1K~n9FGO5Iczzb^SR+H zaDhePkg5~jCtOu04Cf60uzWkw@C{!0o+pPT86U+^xaAwpTY!e)oMJu?8U&=otseq} zPCx~FVbXtrG%G;7^+P~2`XM$Ev)OVK=OZ8=5QJ=eU$%!~y#5ASFkZBfH9v>wlsPR**z?O{3+2cXG`EkR9CV$FoGBfmjaY@Vt= zhHgSIyO=k=3o>t0>rsOF8xXQId4B^cYBrOd1hG_26DQ_K1LVSnhe<&Yt|$T8Altsn^8SG%y*^D5ann z+6u)GjfpI6xg>HEAgw1iEVIQD_5(a}#u}y(3SVfAG zqpVR?Mq!OfaRN4^2+)fFW@5PB;R|jjyz^WxMb(M<9i|g^Hn=fl-Ao4d*HLU$6brOg$G}i2AqF^th36c*0DfP5?uvM_sl`PW~ zZ0MQzCrdw+HLX*u6|5hsezg!yxOXnM^DZ1L`)N zfbId*hC{jOggPR@Co(3iupBKpW;iMr1J|R#H#fnZt|YJsFik%Stt<<)?we6Iu_eJ{ zE*{uM8?Gp<{E|~JO)bWY2}`STM%5L(o=9abp2}fyU^W3Vu)qhI?-bT0CE12-Hiha= zkuu*|g_)-qB6o((DpXe_0+SH+Hd)tb;G6hj-e0oA1fCU4PHMNDan>F5 zhRLH~EzoW`?W{j2$IAlCX+yo`46I~u2H&~`&ztdhRp-kNQy;rwkHG_L8xcTbpy}gD z_i9`kGrT!srJ*$J|K%I4UzuM(*JJOp4YXJV`J+J`a@81LU z#%qNt<<%ZVa=w{=RG{R;w$nq2e)e{jJ0!e3}D7& zIpP)MDs39;QqV^&)2{KWAL|@!adF-i5XctJw5eMYtxKZ)ceKQePP8h+tVh(}C0a?q zakUD{|-9=&75tdfB zL>_jE?bLCFzF@erc04HH3{0&~LkDn9F>j-Wh13D0-Vd>y!&`eWGs5M%u9#nmtL_}! zi=F3KSagyP_K!|HKRm||hanqdXe{TP-zbI7^Gb>39}p8c&&&CR8d!Htx8*(!l_NBq z!qJ(w+-Wvgi)pNUg}-gU3X_I9hL(}7{NB1m!8QU^l4HneJt{OF*DURT8Bj$>Epu6e zTMOgYrAnYW^@$38DhaL5`hgbQa_!1 zl*fo+uDCRFQbQt-ka%!0mPo1;!pf1J0C)?1W{;y;!pS=}AuY_+w zrL5}ME+$NYwce>kOaRzDq#rUK7CQ5=0c-+fB}1Ibu4S&O^9Go*aqN4Tji{vquxMeY zveXxnHH|K})8lB|fuE_~el=FtH#l!ebGf^r+bSy|QuZ`0*c+TQJg9OsS2wxq>)^H@G<8i`1DP{--Zva%5ip>E}+nfzs>YN}?qN}Ni z+40dw2M!$A(hdKJW%LoK2P@^Hrd?GZfxb3v+C=XKmDqPX>6!+R&uMRHa?t<=(%>qw zyTRVn?6G4FHqs#fhqzoD_B&~Zv$3h6{*cpw_=(`V0z~TU)y{G#<*w!?`heZtR8G^4 z&br3>hDKH&4p1)C1n3-e3SXhbE&+S-ZIiuWx3j5n3ovW|9~e+i1IvYW)Yoljq9KiD z>~06$T-W6G&~}dpIAR5NOMv2-#w|3Ktbt|#eRs3F&S|F^_iozV2xKsq8UXpKUI1m%Wp>#f_ifM~#jZgP5@U?x73pzU>-e`7s1mL@2(Fkx4-XAkY% zyw?sE1toMrCDOZ`&N|w85FidDN`wcUjH`ZEJuX=s>-z!-xZWUO%iRFA3AOC6N`5>D zatJK44p#=`_BnHa6*wW<*aS>{0^!V#hI+SS3q1Jlwkh}s$F4(2%nvjx_!#3Jpt;Lk zhpoMF2jYvG85)drgL?yRb35q0U~#zen(1Z+@xvYU2kO}Ly^tQ5iW3l@aMppDAsMj) z>ed7G*+^G6H#7j0u4mY0#+Uetih1nW&`F|^hQ`j&YzpE>c$_tW4+yngOgb@e3gSx} z8L*{YP$NDW8(sDFO^t{jwZXLk$)a}94tFEtu^$4p<2J{aIUB24di!vpcF?$40=j$y z1L*P{U_Q-_&<6R@8yW!+y#tiHdpC3h&`&hifdR*Cs0Mh<4jOED7lwl~lLJDiH{6P` zv309?3*yCNsG|Y825dSY9X!Q`)?f#-PVku&C>bgcqe0MVs4TK`zuSWZiP)YRpao%T zfCuH!4FDcXtlmTW9;~1IYOSK zOoA{6he)14Cdd=y55m8s&VM;_NW%XBCC86|k#KH5QYQtB)`bG(yONciF|w0M&)mIU zc*{ANPDaY)1!-PYJOV&*G97PAL#TL=HrF!m@& z!tvy+?*JT6CJ#QG=$i5y%1`T}AT2KzB;Ad?dt@ z~p-15?FbHq{edtjP z&l;392-v}4N}yIWC=GNCwTBRB7eO#M8jZrc*|k1-Su|1-Af2Y01%lh)zyJp!Req zdU|p^#Gz6XQwOFdf-Qh44nROE76K&Ce-O!I$aoOuwqG(M0gWC8ILU)iT<(J?CS@3k zNytrrpA^UiP_!dnJ{anJkTITwnnuZ95{l{j0jTX+G;!#&LnmVS?_Yr$U^X>xY7PYS zalEg-zY(lh#s|RCgC*XF-`BuTTm!~_E?=K~|K<*5?C<{P4x-&py03wIt^wn#ix-FA zb1uOd+;9KEb#p)Ez6S2K2Kwszm%+->7vH}O#v8-?==+y<65)Q@eGT-R2Ksyc+wbFl zziIwH;~%UB;-&GC@lo-z1eCx_;3o(Ygb85@qJ;1SB0-!WNr*_0CPXGgCCCy{A}^7j zC`c40h9!y;!xM=_aiS!#>qYt>Yyo=`49-7P^Lk3S9j2v~wEEAt!*7MykXz&F#k&z} zTW+P$^Sz_YMwxc>oOTm*m$8NY;_Xeq;5W(@p9D_~NYN_nwElwtK#-_XVXEl*sz4B& zKyZ1Bx-{@UXq=Xcc9(^IN!KWUC*Yy3X-t3~;;=tUkyXsQU+P$x9%)1lk;>bcvxWZ@Fgij1y(ToB8QI@8?H zh>p{taRMZIL4@qo=eKmmChHukh9;@z*q;29 z^hjIIaL8j^;ZSjz|Nq5Lm}BVRxLRCIduT3Yvr&5U$GsSVOmjoq6fTM#)fAc5g|<{J zrEhU?EIURsDLAfIDXGrQVf?piJR3t>X@Gz&YdMYo4y4sMILz#;=>m>5>XQNXE9P?P zuh!}uih@<4OZI@dH?uEz7$a&-;xcCOE0j7rhq<-d$`4R3hp4EUt`UXCBVeAehC@vi zaKH)VX4E;TH5_V8tFu#wIP|RUK;j(Y9;SS^wAYOjrG~+$kg}Ws8!7uBt>_Mw4z%N@{I| zr~5W&j8sU?Mh-iLRlVAM!Kc${&0O|tl^P@UPD@bnx)MC=Lyr+%$Ph76>vivNX#Yl` zRK%sG4)xZvrbRE}vaVkW?aI!fpWxD$2bN#Wp-;v5CQ9(W`gmZ@p5sR~#+DO3C-n$* zf68g~2dB816l=cek;KhFkyNpgLw)))Ev?|TS|K(1mJ{3kxq^ot)iGDEEYR$sf>Y~G z@o4mvhr{~Y*80xs?p&c`)f$I_%Zyoy>_sLH?QdzXp1#1oc3BOl{t~Qzj^oqN6ms4l9#xUO$)^_&@w$Wcl$3!ga;Smgv$))jIu-zo546F}9EV&zR4&MQ>A###nBH zG5*bs@LnW6N&`JuU+~|!jDAz6m0zIj$cFeTvIs_c9n<<2g<6e$^ZwnseLL+uEhTM* zuh*0b8A^hdx zA7H4=9a;eYk(-z#EQRPW|NkLFa((}mfHOpi&JmM^r9+114jt0@zYDWqST6e?NySrq zC~OXv@KBZ@5P)1LR$MGBRiX^>Yrkl?&$@prPVQ;oE4m zc$@J5j)YS)NB(IzDiMDo+yTckU7vO35pzorr!Z zX%}vu4#&)5pgV5}D2s*vx8w?j=d*BEH~clp4WVu#dR@{XoXxPfIi4+lA-1VTZpEZn|+nXtFJL>#!@N9jQW z`ZH~>Y0)Jf(p-9Nlz*S6FXkU0%d1zLc@H8b#ndWkRp|p}q(cq-E;)B)+p_qh0~KgFGV9SA1ZAfU6}vSD zbcaQ~-683s*oz4BhK+746>QhiZ93B`Tk56C1*O{8fNbCJ2S)$1{rVYWf|hz$CoLUQ-h6fO&INuQa4DUJ3sNwg zSJRL}zvv=bMjhLZR`HP@dP1~AdgZ`XJR;uft3%fWeqgxG>2a^WeoD9!As3oc_4=hR zQ29On0K+0wNkV&HhNKErxfW@$1T^rM^HmT-h^Kdt=drP$=TG0Pzp-vL)%4*mO*3a< z6v9{Ew7)B#{H?9hSh|+Bmm78Pak-6J+MpW06YQYRzJH_La^Ul2G(rpluY`^8k;m;a zPQK=>mj20~1+Qo9&@NZKuPRlsJ5PdgV<}17H@3Ch?G9-#1kyCWjvvC=&Zx?a^qX{< zh(MaL1|(f~P_7i(sE%Hcx(ieVVHK3Wi~={NLA}#6)LhmM(jtY@T zyQxg1->zJ*2OZe|_0QV^%G_Ogv>p1H<$81y?G`OFzbUt)!*jJ%qufs0UR&HXBMZR) zmq(9LderQD5)TqqsqAwQkJyStgi0HZxa{KHwM4e+Ox zuX(T|LN5p-?x_Tr?Z5U?{WEpedgSy<=mEQ~zWV-6>zK0#L{()rjY+dsA>DL%@sZL| zScty({*7iaPgSl;TejUs)s%YWh(@p@%p7MvKm0~tegCEdy=660+C{1|82?+et<|fR zerDA4(eB@JzKh-WGaFmsfN$NKhy=y!Y4jftTHAWF2LZWye=YdKcRK$h6VLeUVVK4_ zq~xJl{Po_?I&OJGus8lfp{4QG87Z_~%>xN^c-#@dY(oH^BP%KN0s;DeH3{w9a3(aJ zp9Y5X%mH58;@yi!ZGX>SpuU>_Qr;cccj7g_0c_E>+JID7Rb?Q=y&M1iC4}&Zyy0~Q zy{mf{u`_N3p?e4MmpeASor)&|eQ?no;|{D^x)qhasnElLRU~=~H6h~DWnhW-{!(qY zenwjfb6+96xrPjL^Wn?rq!4;R3VH%XAMh`Sw{Ib$3yw;t|_@0E#f6~lV2E%ag%4*Ux+98(-X<;Xa7CZQx!J}!IW5>vwWa`AdNvc9|4gXIQT|=SrtIzwO5WLg=C?*9Hmm;gn*@bV$MaAHA?-&aZLG z)4!kp+^>HJ*1~3eQ8EJ%a9tG7dF8oz7-7uIFU^0BO?+K4vomqpg847KgcEBf;kH@%GgByno+5ov_J)8BFWgz4a~7hnwq5laPckG#baSgf1u z;OU5EfC|Nf=t=e+d%+}|(!!=t}> zzVOkP7rrof!NQkcSUBfJtei*Zz4GF3(Ef-OJ#q6!tP+5a=J4T4`|uIUk;`Uc56zj_ zLsKDLD=5tyUXVMa5WG6UvlCn+^Oc3UL*aK=ZeDIdZvGHu?g;dl)GR2?SLU;c`QTTX zH+%^8$jluM_z;X3hJGpC0KC=tW5+zH9x`U^lj{7@j}!$)$2@_SNk0^@%`gAUDndO(HPoRjD(0&g{tApgFr_$j={+<7iCe*FHs)PfVFSmh|@}P{Tjq z-o1CCB}XO82J|k=j~@G7egeUSca9H5GbWE2&yG zh(ZE9oUamdVIx)`eu0?A6reQmJObQ>^KzJik>KhJVg5*PsKxi_G4Xtymfx8MA)AKp z(KF)z#AyYcX%Mn$_#XXI{A*$=jDqvU3y8{maD@f$=id{b6=kCTBmQG2#30rK&QuuH z-w>}NKu^PzXoGky;j4`&rWV0eWBi0-wnDau|3a*tiv9+z5gUmPv`YtnN``qTi$l)95z)~4)5(5QKrvsEBka!}hzI_p{n!11 z-eX`sb^q!&4aj*Ui5;B#=~5vC?E7y5l0AAnEPng10m#P}_mk#3*-p%a?zcaC;A~-W zf3oji?e{>^})$?oAT?*#K2f z_vh-P{}lfN;Vgu)w;#<#(Nf*Mi>wdd3Gcx(Ae&dcAPw&6k zSHG6~hrv7!>c1Z=faDF5^Hlw3|Jl6p1iVtwZa3pJ0Ls@PCq?+8tA|gh>NFzg-AsqJPq8$10ds_Jq<1p*@%m$ zL6kVZlU)y<1`mseLt+q5gYn|Wp+G@A4NAmC!E>$_j|-afHctb8)%@^7nEt9%{U@d( z9X7xEZ~F@oIax6O?mq>PQ{$qeNB83sIC;7-2DTvXU;kdNO#Pt|{{eKHn5LH6hV2WLh7=n&&zF4OndK+(YPfy6-ZK*_*} zfzpAI1EU7YQc)@|m7gj|6{d!zic-T_M_;s zZqw>N<^OXVwfg{W8tAL{4}(c_Px)_Z=Jqd`aQET&HSiPHz&&k$9CX*;{5gntALYIV zezF?q@AlW<{C~0)d%s{m3Jvt#_dk19M}N1!KKuS>&&9tFy|00O)qt^Ix%bicf9_Dm z{_cP7Alm(;`x?0C8tAj{e+DT@pM3u-2yYC&-~R8Qocl>Xc@6Z{_dkOvvM;{>8H_iE z8>KS_^~qQG?j*$hwEG(9Ck^!X_}A~_e?RH{KHDF#2GYXQh%|AUBrPIMniiQBl_mrC z79Pnb1*DJ+BSmC5NswYvLPn5MGLnoUW$7rLm(EWYqzlu-(tn)e3HU##Ir>m)X(g?O zGo3qlceVuQ>rXk}+pjBAcEtsM<~xM?79(Zi zP=5A=%RA7yHHm9mb(9;;4i06L>g;8vUbKIQHMC7(nfV&MLOthJ>2JT+o23;W_kzEv z!h1WB9v}`>wtCIn(6ZW*ThW`(cR9)(9C}swhQ3g*t6mYB|5~bMduXhH0=9TKok>O_ z6QwQ-eQvI4Jy(nJ$)Fc`6rrgiR70K6s85G(+pFhp3n*OZs8(cj?F)^DP?=F@nj0F? zaXK_kAcg}S({Ql>C9*3DIJAEUhraA4{-uF;!Q(cScAWcM@N|EQQK4Ub(SO4sG|km= zz(UBRQ|i|22wne5+PJlb6Gb1A(PiL28kda^rC>{YAAB%Cu(V@zDH@A~*ebXtXYjF=c<}b=}+{;z4$eV^Qe- zN3V0Zxr}FiR*o{$Xa4vdLyfV*2&Yo)1O&SX(=u_97td3QG_nPJ!P4nG^Y@H^&~FyZ>7$tFzyUZQq8eF`6=mZ`XJ>hPKiG0bAB`8vh+gt8s9c*;msA9Bb4k1MFAK<=MeXBZL1=if{Xp>DXEBKi(;iSa^0^nBeRl2|L@T_-sfUZ ze$^<=+}5im%2?*$z#qNuNb1e{zlLYJ>X+qCAxSA)lpJ(bCE_xgbaPTtYb!k6w?Sj1 zLTWa0*eR^))$R*Eolk4#vR|vz7^!z!f{NFb;8`DfjOap!h>2RSdxt~&HwvX9E;V(i zx2G$%=tW%C^-G~$**WwRT>A3B@~b)YsTkix3Eo#956szf{HVs*a-!#?9-;0}Ij#QS z6g!h*%{M)gxEUytDpqo+Pk*MR72H-Uq(sxd}sO zSL`dj3DV<@z-;6+Q|sOC2b7-&{ThdMttzrp7ll2Fb`y}>Y`QxO_x(y!C71QLy5R0E!~9!MnOZ_i*{%N*l}awX8f0*+ z*K-(uO}wh*-PA+JM5W~%W)<+gRgs-qb2@a-W^{9_PrqbF%1CjWFIH1V4*idsgN%OO zIFzndQi9Y#NYC-rs9aaY0guZXA&`TOs$Rk6xtgBRS2#FWYUmYOAouQgI*~3;m!wCe zOVcCMqtay=D1(>5&k$q?Gr}@N8Q~d3hB!l#5s@Lyh|Gw}kjaspC+Eura-lp-E|T|l z*3-?nKV$d5|8O_j=elBKXeC63{SA@$l2af3&39#5Dylm7xUgk z)ksgnuHkAeV6jj5r+dtlJG;7QBt=m@F z6oxXr?$Tn8&%1iVt|#0ri$6M0ftDk)9<4!8cG^&}TXR5nSk&7ULQlj)!I(E}bYrPt zyOu5o&o$L-CDNuKGl`@cfBp&%}@y_pd?)A?RgSEe)WbP_q(Xx$h*fUp!duW@^w91xxsd7Q7_BEi@ zH~fLo|7^d0#+aa`-qlG<$CNi;UA%LFUk6-@q~U@T4CmD}q|h(Ah?Y^uwxd;iq=%jm z?T}tMa21b;_xkG4HGv-lZgYCv>#v^@u0+U%=2X3Y=?heTk6%DugepmB@5_)>p(@uR zEtY@={&KzwVhHi{?(sY}_VfJdoB1c!t)`kj+@)#eEQ~_<>YMg=<&(d)RT@jz()Mzr zjzRp5TH2r*zZ2}B&%Xbl-E!dbWi&zzf~RsD8xYzqIkE zyYdp08%s&rzOk+4Zg&WJA&{o|b-W2}JEJNy(r?mbA_8f~8jy6|LAg?BqdIy)>Ml?f zgjG=fE>c3D2bWI8gHQ#lKe+#+3Tf6N!6w9EC+99W|2VST17LZ~7mE&b%#e*J+naSL-(# zscIdpLWP&YxjgF((BNH1+mOR-M5|YsC`6Hnh$G-l2ekaKPK$c8JARk!KWozImm?jt zxE9!Z;hli>A41=X7L@So3=1CEPWZ-wyCfbeo3v#ca;!t(Q$=bJWrS6L32D(TIIN_w z2+@Lsh3_xoEq)^um7i3)Xv~~|^7PsFAFgeOb(d;D>3(FVfj@mAjg{iwwSNsupZ)P( z>DaLi#(kq1!I%qO-X`S^{bz5rZln9E{i{AdvhJu5iL{%_MEdQ@^?DliqkJ0Z7W1Ev zX?i5F9r~H&dUO))7A-TsDYv7;bG1~X+)mqGTii7x>oMoQ2zZRrqh{ZeD3Gv9WuJq1 y#8xCCRN8RFWf$+R<*;pstl%lD*Vr%(*zd53Q03!jK{P^N^I%7WUJypG68wMP;(UGp literal 0 HcmV?d00001