QBasic and QB64 Discussion Board

[QB Forum Archives (1999-2009)/ ] [QB FAQ] [QB Links and Downloads] [Subforums and Chat Room] [Search]

QB64.Net Homepage   QB/QB64 Keywords   QB Graphics Forum   Homework Policy



If else

by (Login portaljon)

I've tried Search without success and this question has been a minor irritant for years.

When cases come up like

IF a or b THEN do nothing ELSE do something

the THEN is unnecessary but QB requires a THEN so my workaround has been

THEN goto next numbered line ELSE

Somebody here may have a more elegant solution. I've seen ELSEIF commands in other compilers but not in QB.

Posted on Jan 10, 2013, 1:57 PM

Respond to this message   

Return to Index


*IF NOT (a OR b) THEN do something

by (Login qb432l)
R

*

Posted on Jan 10, 2013, 4:26 PM

Respond to this message   

Return to Index


encapsulate...

by portaljon (no login)


A pair of brackets works wonders.

Thanks

Posted on Jan 12, 2013, 9:48 AM

Respond to this message   

Return to Index


*QBASIC has ELSEIF

by (Login MCalkins)
Moderator

Posted on Jan 10, 2013, 5:27 PM

Respond to this message   

Return to Index


Not always

by portaljon (no login)

> QBASIC has ELSEIF

Must be version dependent, mine gives an error message

"ELSE without IF"

Thanks

Posted on Jan 12, 2013, 9:49 AM

Respond to this message   

Return to Index


Re: Not always

by (Login MCalkins)
Moderator

IF condition THEN
dosomething
ELSEIF condition1 THEN
dosomething1
ELSE
dosomething2
END IF

Regards,
Michael

Posted on Jan 12, 2013, 1:44 PM

Respond to this message   

Return to Index


ELSE without IF...

by (Login qb432l)
R

Did you try to use ELSEIF, but not in an IF block? That would account for the ELSE without IF. It must be used as shown in Michael's example.

-Bob

Posted on Jan 12, 2013, 3:22 PM

Respond to this message   

Return to Index


strange

by AlGoreIthm (no login)


It appears that the basis of your problem is that IF - THEN should conclude to ... nothing ...

This could be why you have been struggling with the notion: if 'nothing' is the conclusion, why would you even want to test for it in the first place?

Perhaps you should post a practical example of what you are referring to -

The typical understanding of these problems is that 'something' should have priority, and that 'nothing' should be secondary. But maybe you have something new to offer ...

Posted on Jan 12, 2013, 7:30 PM

Respond to this message   

Return to Index


Re: If else

by Pete (Login The-Universe)
Admin

IF x = 1 OR x = 2 THEN
REM Nothing
ELSE
CALL something
END IF

Posted on Jan 12, 2013, 11:00 PM

Respond to this message   

Return to Index


IF THEN blocks

by Solitaire (Login Solitaire1)
S

IF NOT(a OR b) THEN
'do something
'no ELSE is needed to do nothing
END IF


When using a block structure with IF, each line starting with IF or ELSEIF requires a condition ending with THEN on the same line. Nothing else must appear after the THEN keyword on that line:

IF condition THEN
'instruction here
ELSEIF condition THEN
'instruction here
END IF

If all conditions are false, will do nothing. Otherwise, will execute the first true condition and skip to the end of the block.


If you include ELSE, it must be the last keyword before END IF and nothing else must be on that line:

IF condition THEN
'instruction here
ELSEIF condition THEN
'instruction here
ELSE
'instruction must be executed if all conditions above are false
END IF


An unstructured single-line IF-THEN statement does NOT include END IF. Examples:

IF condition THEN instruction

IF condition THEN instruction ELSE instruction

Posted on Jan 13, 2013, 9:41 AM

Respond to this message   

Return to Index


Thanks Everyone: I'm taking a brief hiatus

by (Login Clueless_in_Seattle)

I'm grateful to all of you who have been so helpful to me over the last few weeks as I've tried to get my old MS-DOS system up and running again.

To those of you who have posted messages for me that I haven't replied to, please don't think I'm ignoring you. It's just that I've been sidetracked by a task that's taking up all my time.

I ran into a problem with some of my old software, and that problem is going to require me to back-up my entire hard disk to floppies, reformat the HD, repartition it into smaller partition sizes, and then copy back all my software and data onto the HD.

A couple of my essential programs aren't able to handle HD partitions larger than 1 GB. And I cluelessly formatted the HD on this hand-me-down laptop into 2GB partitions when I started using it.

I've begun backing up the HD to floppies, and boy! what a can of worms this task is turning out to be. So I'm going to be busy comparing all my HD directories with what's on floppies and vice versa, and labeling floppies for a few days to come.

Due to my health limitations I'm only able to work on this project for between 45 minutes and an hour each day. So this may take me a while. And is it ever tedious! Argh!

I'll be checking back in again once I get this housekeeping done, and I'll then try to pick up the message threads where we left off

Thanks again to all of you, see you soon,

Posted on Jan 9, 2013, 7:39 AM

Respond to this message   

Return to Index


*good luck!

by mn64 (no login)

Posted on Jan 9, 2013, 12:07 PM

Respond to this message   

Return to Index


Yes, good luck...

by (Login qb432l)
R

You reminded me of the floppy days, and the endless boxes. Today, the memory card in my little Sony Cybershot, the size of a postage stamp, holds 8GB, the equivalent of over 5000 3-1/2" floppys. We've come a long way (well, memory-wise, anyway -- those days were more fun of course).

-Bob

Posted on Jan 10, 2013, 2:55 AM

Respond to this message   

Return to Index


Memory sticks

by David (no login)

You can get USB memory sticks to work with DOS if you can find a USB card that is compatible with your old computer.
I have been forced to do this as newer computers do not have floppy drives.
It certainly helps with large data transfers, but it is a pain if you only want to transfer a few kbytes.
It is some years ago since I set it up. The info on the net is confusing and misleading, but if you want to know how to do it properly I will check how I did it.

Posted on Jan 10, 2013, 4:26 AM

Respond to this message   

Return to Index


RPL

by (no login)

http://www.hpmuseum.org/cgi-sys/cgiwrap/hpmuseum/archv017.cgi?read=112519

For you were made from the stack, and to the stack you will return ! that's the life oh variables, hence this is RPL :-)

L

Posted on Jan 5, 2013, 2:24 AM

Respond to this message   

Return to Index


* happy new year ! (i forgot and, don't abuse QB64)

by (no login)

*

Posted on Jan 5, 2013, 5:54 AM

Respond to this message   

Return to Index


*wth are you talking about?

by mn64 (no login)

Posted on Jan 6, 2013, 6:54 AM

Respond to this message   

Return to Index


*my hardware doesn't like qb64 so much ! screen 2, 8b cpu, 32 Mhz

by (no login)

*

Posted on Jan 7, 2013, 1:22 AM

Respond to this message   

Return to Index


The last comment made me laugh:

by Solitaire (Login Solitaire1)
S

"Get a half-life"

Posted on Jan 5, 2013, 9:04 AM

Respond to this message   

Return to Index


Any way to speed up this code?

by (no login)

I've been working on a pong program and right now i'm working on improving the visuals. The problem is, when I try to add a background, the game runs too slow. I'm using _PUTIMAGE to add the background (all of this is under the "multiplayer" label; haven't had time to work on single player yet). I know that it's running slowly because I'm PUTing the background every iteration of the loop but I don't know how I can add a background otherwise.



_TITLE "Better Pong V.0.97B"
SCREEN _NEWIMAGE(1280, 720, 32)
_FONT _LOADFONT("C:\Windows\fonts\lucon.ttf", 18)
'Pong

COLOR , _RGBA(0, 0, 0, 0) 'makes the background transparent so you dont have _clearcolor everything
DIM menu AS _INTEGER64
menu = _NEWIMAGE(140, 144, 32)
bckgrnd = _NEWIMAGE(1281, 721, 32)
CALL gradscr(0, 0, 640, 720, 0, 0, 0, 127, 127, 127)
CALL gradscr(640, 0, 1280, 720, 127, 127, 127, 0, 0, 0)
_PUTIMAGE (0, 0)-(1280, 720), , bckgrnd, (0, 0)-(1280, 720)
CLS
CALL gradtext("Single Player", 0, 0, 255, 0, 255, 255)
PRINT
PRINT " ";
CALL gradtext("Multiplayer", 0, 255, 0, 255, 255, 0)
PRINT
PRINT " ";
CALL gradtext("Options", 255, 0, 0, 255, 0, 255)
PRINT
PRINT " ";
CALL gradtext("Exit", 0, 255, 0, 0, 255, 255)

_PUTIMAGE (0, 0)-(140, 144), , menu, (0, 0)-(140, 144)

clicked = 1
DO
IF clicked = 1 THEN
COLOR _RGB(255, 255, 255)
CLS
_PUTIMAGE (0, 0), bckgrnd
LOCATE 8, 570
PRINT "Better Pong"
_PUTIMAGE (575, 300), menu
clicked = 0
END IF
DO WHILE _MOUSEINPUT
mx = _MOUSEX
my = _MOUSEY
click = _MOUSEBUTTON(1)
LOOP
IF mx >= 575 - 5 AND mx <= 575 + 140 + 5 AND my >= 300 - 5 AND my <= 5 + 300 + 18 * 1 AND click THEN GOSUB singleplayer
IF click AND mx >= 575 + 10.77 - 5 AND mx <= 5 + 575 + 10.77 + LEN("Multiplayer") * 10.77 AND my >= 300 + 18 * 2 - 5 AND my <= 5 + 300 + 18 * 3 THEN GOSUB multiplayer
IF click AND mx >= 575 + 10.77 * 3 - 5 AND mx <= 5 + 575 + 10.77 * 3 + LEN("Options") * 10.77 AND my >= 300 + 18 * 4 - 5 AND my <= 5 + 300 + 18 * 5 THEN GOSUB options
IF _KEYDOWN(27) OR (click AND mx >= 575 + 10.77 * 4 - 5 AND mx <= 5 + 575 + 10.77 * 4 + LEN("Options") * 10.77 AND my >= 300 + 18 * 6 - 5 AND my <= 5 + 300 + 18 * 7) THEN GOSUB leaveconfirm
LOOP


multiplayer:
clicked = 1
CLS
COLOR _RGB(255, 255, 255)
plen = 80
LOCATE 18, 500
PRINT "Loading. Please Wait."
DIM temp AS _INTEGER64
temp = _NEWIMAGE(1280 * 2, 720 * 2, 32)
temp2 = _NEWIMAGE(1280 * 2, 720 * 2, 32)
_DEST temp
CIRCLE (12 * 2, 12 * 2), 10 * 2, _RGB(255, 0, 0)
PAINT (10 * 2, 10 * 2), _RGB(255, 0, 0), _RGB(255, 0, 0)
LINE (49 * 2, 10 * 2)-(51 * 2, (plen + 10) * 2), _RGB(237, 158, 41), BF
LINE (99 * 2, 10 * 2)-(101 * 2, (plen + 10) * 2), _RGB(255, 255, 255), BF
'CALL blaa(temp, temp, 0, 0, 50, 50, 1, 0)
CALL blaa(temp, temp, 40 * 2, 0, 60 * 2, (plen + 14) * 2, 4, 1)
CALL blaa(temp, temp, 90 * 2, 0, 110 * 2, (plen + 14) * 2, 4, 1)

CALL supersample(1280, 720, temp, temp2, 2)

_SOURCE temp2
ball = _NEWIMAGE(23, 23, 32)
_PUTIMAGE (1, 1)-(23, 23), , ball, (1, 1)-(23, 23)
_CLEARCOLOR _RGB(0, 0, 0), ball
paddle1 = _NEWIMAGE(8, 152, 32)
_PUTIMAGE (0, 2)-(4, plen), , paddle1, (48, 10)-(52, (plen + 11))
paddle2 = _NEWIMAGE(8, 152, 32)
_PUTIMAGE (0, 2)-(4, plen), , paddle2, (98, 10)-(102, (plen + 11))

_DEST 0
_SOURCE 0

RANDOMIZE TIMER
dx = 1
dy = 1
bx = 15
by = 15
bsize = 23
p1y = 10
p2y = 10
CONST p1x = 10
CONST p2x = 1267
p2point = 0
p1point = 0
serve = 1
DO
CLS
_PUTIMAGE (0, 0), bckgrnd
LOCATE 1, 600
PRINT p1point; "-"; p2point
IF by + bsize >= 720 THEN dy = -dy
IF by <= 1 THEN dy = -dy
IF bx + bsize >= 1267 AND by + bsize >= p2y AND by <= p2y + plen AND serve = 0 THEN
dx = -dx
ELSE IF bx + bsize >= 1267 THEN
serve = 1
p1point = p1point + 1
bx = 15
by = 15
END IF
END IF
IF bx <= 13 AND by + bsize >= p1y AND by <= p1y + plen AND serve = 0 THEN
dx = -dx
ELSE IF bx <= 13 THEN
serve = 2
p2point = p2point + 1
bx = 1267 - bsize
by = 15
END IF
END IF
IF serve = 0 THEN
_PUTIMAGE (0, 0), bckgrnd
_PUTIMAGE (p1x, p1y), paddle1
_PUTIMAGE (p2x, p2y), paddle2
_PUTIMAGE (bx, by), ball
END IF

IF serve = 1 THEN
dx = 1
dy = 1
DO UNTIL LCASE$(INKEY$) = " "
angle = ABS(ATN(dy / dx)) * (180 / 3.14159265)
CLS
_PUTIMAGE (0, 0), bckgrnd
LOCATE 40, 500
PRINT "Press 'Spacebar' to serve"
_PUTIMAGE (p1x, p1y), paddle1
_PUTIMAGE (p2x, p2y), paddle2
_PUTIMAGE (bx, by), ball
LOCATE 26, 1
PRINT "Press A to increase angle and D to decrease it"
IF _KEYDOWN(27) THEN
IF qr = 1 THEN
_AUTODISPLAY
RETURN
END IF
END IF
IF _KEYDOWN(97) AND angle > 10 THEN
dx = dx + (SQR(2) - dx) / 100
dy = SQR(2 - (dx ^ 2))
END IF
IF _KEYDOWN(100) AND angle < 75 THEN
dy = dy + (SQR(2) - dy) / 100
dx = SQR(2 - (dy ^ 2))
END IF
LOCATE 25, 1
PRINT "Angle : ";
PRINT USING "###.##"; angle;
PRINT " degrees"
LINE (bx + 12, by + 12)-(100 * dx + bx + 12, 100 * dy + by + 12)
_DISPLAY
LOOP
END IF


IF serve = 2 THEN
dx = -1
dy = 1
DO UNTIL INKEY$ = "0"
angle = ABS(ATN(dy / dx)) * (180 / 3.14159265)
CLS
_PUTIMAGE (0, 0), bckgrnd
LOCATE 26, 650
PRINT "Press Num-4 to increase angle and Num-6 to decrease it"
LOCATE 40, 500
PRINT "Press 'Num-0' to serve"
_PUTIMAGE (p1x, p1y), paddle1
_PUTIMAGE (p2x, p2y), paddle2
_PUTIMAGE (bx, by), ball
IF _KEYDOWN(27) THEN
IF qr = 1 THEN
_AUTODISPLAY
RETURN
END IF
END IF

IF _KEYDOWN(52) AND angle > 10 THEN
dx = dx - (SQR(2) + dx) / 100
dy = SQR(2 - (dx ^ 2))
END IF
IF _KEYDOWN(54) AND angle < 75 THEN
dy = dy + (SQR(2) - dy) / 100
dx = -SQR(2 - (dy ^ 2))
END IF
LOCATE 24, 1000
PRINT "Angle : ";
PRINT USING "###.##"; angle;
PRINT " degrees"
LINE (bx + 12, by + 12)-(100 * dx + bx + 12, 100 * dy + by + 12)
_DISPLAY
LOOP
END IF

bx = bx + dx * 1.5
by = by + dy * 1.5
IF _KEYDOWN(119) AND p1y >= 1 THEN p1y = p1y - 1.5
IF _KEYDOWN(115) AND p1y + plen <= 719 THEN p1y = p1y + 1.5
IF _KEYDOWN(56) AND p2y >= 1 THEN p2y = p2y - 1.5
IF _KEYDOWN(53) AND p2y + plen <= 719 THEN p2y = p2y + 1.5
_DISPLAY
serve = 0
IF _KEYDOWN(27) THEN
IF qr = 1 THEN
_AUTODISPLAY
RETURN
END IF
END IF
LOOP

options:
clicked = 1
CLS
_PUTIMAGE (0, 0), bckgrnd
PRINT "This is not available right now. Sorry."
_DELAY 2
RETURN

leaveconfirm:
clicked = 1
CLS
_PUTIMAGE (0, 0), bckgrnd
COLOR _RGB(255, 255, 255)
DO: LOOP UNTIL INKEY$ = ""
LOCATE 5, 550
PRINT "Game Paused"
PRINT
PRINT
LOCATE 12, 380
PRINT "Press 'y' to confirm or 'n' to resume game"
LOCATE 10, 450
INPUT "Are you sure you want to quit"; yn$
IF LCASE$(LEFT$(yn$, 1)) = "y" THEN SYSTEM
RETURN



singleplayer:
clicked = 1
CLS
_PUTIMAGE (0, 0), bckgrnd
PRINT "This is not available right now. Sorry."
_DELAY 2
RETURN




SUB blaa (sorce AS _INTEGER64, destin AS _INTEGER64, minx, miny, screenx, screeny, quality1, quality2)
$CHECKING:OFF
DIM ws AS LONG, op AS _INTEGER64, cp AS _INTEGER64
IF quality1 > 16 THEN quality1 = 16
IF quality2 > 16 THEN quality2 = 16
FOR main = 1 TO quality1 + quality2
_SOURCE sorce
_DEST destin
IF _DEST = _SOURCE THEN ws = _NEWIMAGE(screenx + 1, screeny + 1, 32)
_PUTIMAGE (0, 0)-(screenx, screeny), , ws, (0, 0)-(screenx, screeny)
_SOURCE ws
FOR dx = minx TO screenx - 1 'goes through each pixel for the entire area of the screen
FOR dy = miny TO screeny - 1
ra = 0
ga = 0
ba = 0 'reset color and other values
difpix = 0
weightednum = 0
op = POINT(dx, dy) ' get the color of the main pixel
FOR cx = -1 TO 1 'gets the 8 pixels around (dx,dy)
FOR cy = -1 TO 1
cp = POINT(dx + cx, dy + cy) 'get the color of each of the 8 pixels
value = 45
IF ABS(_RED32(op) - _RED32(cp)) > value OR ABS(_BLUE32(op) - _BLUE32(cp)) > value OR ABS(_GREEN32(cp) - _GREEN32(op)) > value OR ABS(_RED32(cp) - _RED32(op)) + ABS(_GREEN32(cp) - _GREEN32(op)) + ABS(_BLUE32(cp) - _BLUE32(op)) > value THEN
difpix = difpix + 1
END IF
weightednum = weightednum + 1
ra = ra + (_RED32(cp))
ga = ga + (_GREEN32(cp))
ba = ba + (_BLUE32(cp))

'check if the colors of the pixels are different enough to antialias them
'find the average color of (dx,dy) and the 8 pixels surrounding it regardless of whether the pixel needs antialiasing
NEXT cy
NEXT cx
IF main > quality1 THEN
IF difpix > 0 AND difpix < 6 THEN PSET (dx, dy), _RGB((ra / weightednum), (ga / weightednum), (ba / weightednum))
ELSE
IF difpix = 4 THEN PSET (dx, dy), _RGB((ra / weightednum), (ga / weightednum), (ba / weightednum))
END IF
NEXT dy
NEXT dx
_FREEIMAGE ws
NEXT main
END SUB

SUB supersample (destscreenx, destscreeny, temp, des, factorscreen)
DIM curpix AS _INTEGER64
meanquotient = factorscreen ^ 2
_SOURCE temp
_DEST des
r = 0
g = 0
b = 0
destscreenx = factorscreen * destscreenx
destscreeny = factorscreen * destscreeny
FOR x = 0 TO destscreenx STEP factorscreen
FOR y = 0 TO destscreeny STEP factorscreen
FOR cx = 0 TO factorscreen - 1
FOR cy = 0 TO factorscreen - 1
curpix = POINT(x + cx, y + cy)
r = r + _RED32(curpix)
g = g + _GREEN32(curpix)
b = b + _BLUE32(curpix)
NEXT cy
NEXT cx

PSET (x / factorscreen, y / factorscreen), _RGB(r / meanquotient, g / meanquotient, b / meanquotient)
r = 0: g = 0: b = 0
NEXT y
NEXT x
END SUB

SUB gradtext (text$, fr, fg, fb, tr, tg, tb)
div = LEN(text$)
FOR x = 0 TO div
r = fr + (tr - fr) / div * x
g = fg + (tg - fg) / div * x
b = fb + (tb - fb) / div * x
COLOR _RGB(r, g, b)
PRINT MID$(text$, x, 1);
NEXT x
PRINT
END SUB

FUNCTION qr
CLS
DO: LOOP UNTIL INKEY$ = ""
LOCATE 5, 550
PRINT "Game Paused"
PRINT
PRINT
LOCATE 12, 390
PRINT "Press 'y' to confirm or 'n' to resume game"
LOCATE 10, 372
INPUT "Are you sure you want to quit to the main menu"; yn$
IF LCASE$(LEFT$(yn$, 1)) = "y" THEN qr = 1 ELSE qr = 0
END FUNCTION

SUB gradscr (fx, fy, lx, ly, fr, fg, fb, tr, tg, tb)
FOR x = fx TO lx
r = fr + ((tr - fr) / (lx - fx)) * (x - fx)
g = fg + ((tg - fg) / (lx - fx)) * (x - fx)
b = fb + ((tb - fb) / (lx - fx)) * (x - fx)
FOR y = fy TO ly
PSET (x, y), _RGB(r, g, b)
NEXT y
NEXT x
END SUB

Posted on Jan 3, 2013, 11:40 AM

Respond to this message   

Return to Index


you could try using PCOPY... or...

by mn64 (no login)

'draw background here
PCOPY 0, 1 'make a copy (do this only once)

'now everytime that you want to PUT the background:
PCOPY 1, 0

this may or may not be faster. 1280 by 720 is a lot of stuff to draw, if you're using sprites for example, GET the place on the screen you're going to draw over and PUT that section back when you're done.

then there are tricks like PUTTING with xor, but you probably won't need that if you try the GET section, draw on section, PUT on section to clean up trick.

Posted on Jan 3, 2013, 12:15 PM

Respond to this message   

Return to Index


Re: you could try using PCOPY... or...

by (no login)

There was an extra putimage statement in the first line - I removed that and now it's running significantly faster. I'll implement the GET-PUT method you're talking about later, but for now I think PUTIMAGE should be fine.

Posted on Jan 3, 2013, 12:44 PM

Respond to this message   

Return to Index


Happy New Year

by (Login GarryRicketson)
R

I had forgotten all about this piece of code,
Actually I did not write it, DSman, and Galleon had helped me with it,
It creates a "splash image", uses qb64,
------------ code -----------

'************************
'* SPLASH SCREEN VIEWER *
'************************

DIM happypng$
DIM byte~%%
DIM count&
DIM splash&
DIM happypng_bin$

happypng$ = "89504E470D0A1A0A0000000D4948445200000280000001E0080600000035D1DCE40000000473424954080808087C0864880000001A7A545874536F6674776172650000789C732C2AC9CFCFCBAC00000E610355A9B029260000200049444154789CECBD7F8C24D97D1FF6EDAEB9D93D27F6090E79A2B6EFE6867B92EE6419C2E5F6382B72409E1D4487FCB1149D5D5E030112C0808198420C6C1B93950829F2CC2470C0F030F00471442A8001030962A0A95D88E6FDB5FA4747A18FDAD5DD82909278CFF26E9A836B87591289CE72B43B735D5DF9A3DFB7FA5BDFFA7E5FBDAAAEEAAEEA7E1FA0D0D555AF5EBD7AF5EABDCFFBFE7AAD288AC0C3C3C3C3C3C3C3C3637DD05E76013C3C3C3C3C3C3C3C3C160B4F003D3C3C3C3C3C3C3CD60C9E007A78787878787878AC193C01F4F0F0F0F0F0F0F058337802E8E1E1E1E1E1E1E1B166F004D0C3C3C3C3C3C3C363CDE009A087878787878787C79AC113400F0F0F0F0F0F0F8F358327801E1E1E1E1E1E1E1E6B064F003D3C3C3C3C3C3C3CD60C9E007A78787878787878AC193C01F4F0F0F0F0F0F0F058337802E8E1E1E1E1E1E1E1B166F004D0C3C3C3C3C3C3C363CDE009A087878787878787C79AC113400F0F0F0F0F0F0F8F358327801E1E1E1E1E1E1E1E6B064F003D3C3C3C3C3C3C3CD60C9E007A78787878787878AC193C01F4F0F0F0F0F0F068380EC7CB2E41D3D08AA268D965F0F0F0F0F0F0F0F0F05820BC04D0C3C3C3C3C3C3C363CDE009A08787874701DCDB01AF72F2F0A8050EBD2AB3003C01846447EE3B750F0F0F17BC7A1736965D06771CDE5F76093C3CCAC56134237EFBAD6AEFB39AF0368000706F07A257EF42850DC8C3C3C3A3AE388CAA1D403D3C3CEA082F0104004FFE3C3C3C8AE0DE0EACC00CDA933F8FA662D1D239DBFD9A2729F40490E0DE0E445287BE1A9D7C5538FCE1B24BE0E1B12CBC7A175ACDEC1F9A37587978A4B128D5AFA46AA62AE8AACB520DBC0A3803D8B97B29A18787878787471DB00CB305BC67B3491F85970032F0D9BC277E1E1E1E1E1E1E750297C4D1DF7971785B389641FACA2EC362E0258004DC1984FEF792400DDE80DC0371781F60FFE56597629168AE0399FF6E3D3CF2C1E671DCCCEFC94B000938F9A3BF14CDB4F92913AB2302F7401C7EC5319D254C9244FEA4D974B341BFFF2CF257DFBE62CDBEDB56ABA6EFC1A3BEA0367E8711007C31AD024648C7EB2F0D5C7B02C8891E97F4D15FBA5FDF8EBD6A48339DFA37748F2CEC7FD37E3E9EFD6EA48F278CA51941DC7F63FEB23517CD940EAE1090F845917F0F1E39919A247D473EAE4906EB3FC9F22A6098A971E82F9E9354C0CD55FB1405277D3671773345E11E79A0BDE3C308009E00C0F9E97FB58D8CD344D2637958E16FB6D58A1646FE16792F8F0540F3FC951C4144214858F77E6E6D258012C993A47D5CD25794FCDDDB8177E62BF132810D9CBBC5F36398D6A354B45A57967773FE9EA50E30D1519E9FFEDAA4C4FB1BBAD4B8CE2B56AC9AA49B0F70CD78BE5CDA974512324FFE5610F4DBA01325FAAB8E81C1428A3807BC0490419302728790F5920072D08163114BF17888408943E99207E9FD52F0F72E4988797A7AAEA96D255FD97D3F510D72F7C555AB81E9F7E7A5802B085BF897F858080041BA3FAC777FE70920439627B0EFD01179D4C2CBC43C9EA987CF00EC7F546E794AC042EC9AB23A311BE95BC589415DDBB787154D27644D2F7FA558E637C9496156FF584F7802E8E1089BBA4892023511873F04D8FFD4B24BA1820F06950C0E872380FD8ED91766BE089BEA23AB734CDDB3666DA76EE55904D6E099CBFE5E3C395B331C8E2121E503488E7DCD33875A4B02786F07BEF2EA5DC8F07A5C6770A919970601E8A4AF6903C9E118000600FBAF2FBB244EA0D2BF4A54BF360F37A91D68D0A48759EDC7C323897B3B307EF52E88C6F4F9B43225B7374F006B8045F42159F7D026C8F5C75A3A81B890BF7B3B60897766BD6E0518B544FEA82380EAF504CB6FF887F72D0E06D287BA31257F79AE592078FCB2286AC5E48F9E2F1CE7CC66D7A2113E3C2E397BF0BC8B2C9D543767849AB68D354139E40FA0F4BEA96AF2E763173A6011E34D6202FB1559D2274D9C693F5A4FAC25017481D6E9385CD708E65F1C92248837F02A1A7C569E71395ED23B054D7A659BE1B9A82FE744AB759FFD97271FAD56146F480429192C04E9F9F83B963CDEF87BE769119C04BA90C1541E852663E5A168DBA8211A4E2AEEED4054CDAA4CF9BFE3D598EC2F02878F2BC8734975BFFFCDA440840B46E274CA7EBDE009600958ED8E405309D2461F13AB77E46B165D0E7A5CCBCB26E5B2CDDC4AB2F368B5669D6214BD4C8E471045E9C90755FD22E9E3C7785A27B8106B0AAD9E797D7252CDF779E769ABEB65C7D25AC404A720F212BA86AB2C6988AEF921F501FC1CA875FCEA1F55589592BD6F63B1FF7405792EB91D3783E065612D6D00AB84A49668B6F7B0A4F65D7483D7D494925DA2ED3F1E631D7EAB7503A283AF1773E12FD1068576F2D4C64F52034BD78A833B0FBA6C7B3E2940B3ED9D4B7969F63059EFD096B7871334EFF09ADAAADDDB811BAFDE85B7C8FFDC92BD66F7AD1ECD049FE426FABC7F0D0017F28D21CB8327800B42F33AAA2C1BBFBC4429F7FD85F02DDA4CDDC531C196A628F1A3F9960C97193F8F3D9618E8B356DBC820C5701841EB40209BA94EEFC96C86AFD52DBFA76B3DD7BBF3F4981F36078FC27022BC35695BADD66388A2A7CDBE5CEE9A12F82916251410FAA785DCD70689087241494DDA99024F002B42F3081F85F4B1691240EA1ABF88B24865D2244F1C2E1F2B4F2B5D87C7E6842D90B3768C2273B0C892B001C852535525F62B806B068BF7D1DA4D5EE8D735FBBBF2E0E052BFB414F030BAB7B39F587F7D3D97E36C0AEA40CCAAC2E12380FD67D93165FC40D4BB1EBC0D6045588DCEC966EF169FAB90FCF17BD27BDBECFDB89D9A964EFB60AD2408DC09A780A9EDDED4E943B2F1A14E1EF43F4F9FCE534863B16BCA4DD4F65B31F983C3C789F2A90E20B6FB4BFFE931FA3B4BF7EADD437B313D66A013869ADA90719BBEB48DDFBE786E91FDAB68E35DD3FA8C41FB8485A2DE84A7380E6FCFC81FED9B34CD923606D50B5E02E891019BA44DB3EDAABA1CD2BD34B2EAA2CA96CE69F72B30C3E5E44CFB4FC125833CFE1FBD1ECFAB6A224DBD7D1801C01701E03B8BB7F1943A4F4DEA6C2F4FE9D2A0566B0451D4292D3F8F146CF67E7C394E2A0D04D8178E2F1F65B6C17B3BF0F8D5BB5081E3C4AA60996A555B1F596F75AF88288AFC56E2F6FE67A268D965986F3B70283F4DC3D31FDC5F4CB9F0FF4194DC177E01A264BAACE791F2918E676C00723A80283E47F76DE76CE90AD563AA3E1F59EAF1B1F3B34DD38F731E8FA22882F73F13DD97EA19BFA9E96FB2DCCDFFDE2ADA0AB58D6A37FAAED8FE981EE75B9EF75C757BB0E5EFDBE2BA6D0791BC9F3AF7D879CC58F0B6F402F8AD4EDB4164275ACB2E9F4BB913FBD381859228FA1C296228ED4B75C2EBA6E0063076247F690296BB7EF2BCE7ACE7AEE6DDBDFF99E8312F2F923E4E06CC3667BDE47E5F8BBDDF1A6E9C4425FF1F44D22460D95B2D889F6DB2191DDCA8EEDECB7E17C2E4B4DAFB457A7F8AC7A53A59763DC99B57017B08C852A7D645CC6D754E215EACB87FC0AED754BC2EAAC839C4FD36670E493D5CA907A0F47CB667CDF22ECE735F00C9314756A72D48BD526B8FCB6682AA74A51059009072F2A0E766C7EAA7625B86338A7780B1611163D4610471F4039BE360FDE19D400AE3F0C6B24B502DB8613F76BEFBAD290928E804512A68190507043A9047512B996EBF357360C8B2F5B391C29CB019664BB67D92334869E0CF419F873A5FD06737E4AF50590E6F937C5A729D2609C094044C3D41B9313E5D15221768106E0E4FFE4A870B59A1EF314DFCF0F87EF985CB09DEDE1641C472DD937F970B770459F6B8B008E2B5DF0280F3D9F6804907B65A62D92248BFD5693B8892BFD2717EAEA99BF6AC523AAD3E940D40B1758BCF47A90D8F4B69E77F568B9A843F1FDF5FDEFBE636639A0D59291B57C567A5F19BF4BEAE98DF4CB59CC51E30E2E9D2EFFA20E77BA8CA2E7929759CF3D92387769BB73E57652BF2DCFC1AFC7F1015B6155FE2E655C04E4848834A5281AD0296AD92718D4148245DB12A58B8460DB752E273BAC4FCB3A529D543D516EA06E1E6893B2F24A90F5775D9D48529E451E5726F6B2D36634D514930E50AA07BF726CF2FA774F54631CFE765F7CF8B86B4780040768CD35CF750FA4CAECD40489AA2FABC134F0033B14E1F914BE36E18F8F26A78CC3AC897F4CCADD66D88A237ACE591CAC7D3CECA3D5B35602EB8103F8045BEF7E9E07F083CCC471669288C566B0CD29ACBC934CA84C0230B59E49DBE5384642758C7902F8B40654B8AE69B18E9DF8834694A60198212C98ED9D697CF6BD72D9902D9CC89E8B17AC0DB005A91AF4114B247AA156883C5ADA0ADDBB2D16A8DE37DCD8E4EED084BFA48A3E80DD1E183DF573A261D2F85FC01B83F9FF4DECB6C0BB3BC6880672E0194247F785ECC36CBEE692A454DDA3262DB70596DC523857B3BF048389690EA4AA42F0BE9C0D071DEBA1DE70A407AE65248709EF6EC42FED43C97A2257B42EECFC62D6E8F278DED999A2462FBCE499D44F63811D4A4844BC4B275D0F5DC0E2CBA7BE95CFA5875A101AA74E9CF530F0DD85CE2F065A55DE90DE3F2F1F77C102DFBDDCFF5FD64BD4B80FB897690A79DF84D7A57A2CDAB12BAC729C65F2D42ABF8ADA4ED60C1EFF220721BC3793ADB750723B77CB2F25B745DD8372F011461538FC54CFFFEEC5C7AE690D356C371367B3806D87FCB3DDF79913923AAB727B436DBD5A4708BF0985BBA971EC5FE863C4BCE9AD1963B7B95BC7BF197EEDBAE49204BCA11452F27D2D9D654AEA104B06E9A06CDFE50B3E5A4CBB9092ADF47348D847B3BF095B2CABEBE70FC86A5FE49EDB3789E79FA89B2FA142D1FAED50248472290A249C4E788DDB5D427D27D1E41811E97FAD5E5C113402788BAFC97755BAADC03E579C772D4CCD07B4646EFEDC033CB2C891512E95A96BA4F229E4B85D40902E8F1116D6DFA70346F69901058547FC56DC2E87BE7EBE46A6DA1866BBEE679F64592451792EEB096EF27EFEDC0583987797CB37021D716AE8E0887D97D626ED31949F5C97FE7518FD27E479BBCA6AE89B2CF6B90ECFC5C50F4BAEAE009600A3CC61D4AE7A60320C625A30D78D6D1D908A1343B726D0C451B6A9174EE20D299F1AB77E123B33F32BFB76DD72E04B635736B2ADD592E6C1DA78B07DD7EA677F2BD1DB8CFEDF8249B3F1EE34F0B249C00B5E793607BEF1AE15B741B2940386D246F91CE135A00679BED1F3F67D2D76CA2BB0A70251C799D20CC16B75B4DFA45F3D79C26F07A51FBF0D8447D90CADC49A6E75A0C7A2F5712E6E22467834D9A5834CF0AB06C1D7433B68328FD9BDC66362B525A7E8D8B2D415659F8BEEB33CC570FDE3647AC9705DA6556FA1C91DE6E1369C6C9FFF9EFC5EDC0E83129CDDC36815AAC45CD0E7091B67F39EE655F2AAD5E5B9DCBE637DC0E8ABD23FB5AE0513AEF83481F03B532E4291BC67AA4F7D6B60822755DF2BCF5C69FD1F60C05EBBAC26DE905A8FF7610490D96AE519A1D00F2404893BACF237B198A94D3251F5AE6AC3CA6E7163508BDFF99E87629797943FE821B6F1BF438DD68DA5CEF37C25F5B1B9ABB7D01DC4F1140801B89FF523B5956BB2978DF3A102E5BDF209C1BDB1C41FC56F32DD54E0FA2E4FE81E53C4D43D3F27D5B7E111047B60C42A75D5FE6A695DB5607CBDD965E80E66CF4E5BABC60291D3DC6F75DD2F0F4DA7DA5E3B67D9E3E7D4F6990D6A4375903FBDC129D79B7D20776AD2E9BBCE1BBE71B6F23529B2976CF2CCF50F60EDD1781A7E48F13BED96699802D786BD88445FBDEB3DEA5277D0DDD12EDF3209AFE3F88E2FFF12FDDA46307C97CC4EB23484BF7B4ED601CA5563DB295A7CC4DCB933F57BD366F03E804CD7328D3268AD91B24D326D7B6D4ECAEB8813E35C6D70C6A258F27BC5EBB17BF27BBB63D61EB72EAF65892C71FC0E12363D7F5D81CFB2ECD4B2F4F055E7FA5DB75D530BED3DC90DA0D84C9FF922D4FFA1C8F11C76D00A9BD9F93AD1F40BE9888D4DB977A7B537BC0287A36714DD5CE1FB6FC1B669B4A1D3B6C711B3D5604099BEA03B2CE3A854B240D3C2ED9C727C6D897E5EBF8FEFE06C0FED3695B40CD369FE7C391A72FCFB219AC87D30787278056489E90B6B45283D33E8CFD160D7ECBCFA5C95C963BB966F42A91425E66EDB966C75FFDC376CAC01BFFCB03F66144CF03EC3F6B0688A701005EBD0BAFC779938142F11C5C82D71F86F989FF3B7606599EB255433394764D6B33DA462FF454072D187227F63F89FB920308F7F8959C090A813B8550E2A7790323AA0E0B54632FE322E0241E8FD377CBBFF1755BDD6325114516A70E711209D982093E764AE396ADFFB139ACD9CA614B9B17DAF85F2FF8A5E072419AC564357ECDAB49BA46CAC3764F49EAA24B629279F0B26948DF9FCDF01F830963A32DDDA52D0325FDE29DB4E3D500D7908C7FCD324687EF00ECBF4ED24975FD1500F846F6BB772ECB6300780A5C42FEB45A37208AD271215BADFB1045264C11FC0AC07E06813E7C3C9D39A78E2BED90436BEBFB89F797B5B287B63C98BDEC16F025FFE82F47C3A46E754216A1F36BFCD60145FA22054ECBC9592792168246AF95D265113E170F5F7E0F9AEF7AC14B007301A56C9A54CFD658A5D98D5D459C4C8FF95150098E34404B332D49F4AD490593924C25CE572286E18CB41DC6CB7B4904408B07C607936A060E2EF98A550C489A02736287A593DE8F21575857DAAC37BE77C68C6BFFE914F96BB5EE2B89BF2EBE4F0C743CBDFF37E4FB2666D5E78563581EADFE9FA467E8B4ADEFB7A6EAFE691BA0D21F2DC61F405A9DA8DCDB0D3CD0335FFF590A09B32212B94582BF2B6D8DDFC597CC638612C98D13F9D3FA4189ACE135F45752A9720D9826F890345F74DF4510B31EF004B03464D93C707290247EE958821A194C34D2209D46BB3F3DA64976F46BB8A466FA7B1877FEAFDE3D64B65DFBA9FC3555AF4D0A54CDC091255D8B49EFD37A47A2117B894C4B79E74074F0422AEF562B82E820233FE97DD2FF929A429AA98B6D52085E9EECF8A7EAFEC4FF843A50921C952A2DA22A5E29D8331EE376811EB9C06D742B5BC7D6A3E6D0841C784E237F0984F2B8A48DAF9AF025AB9FE544D1E59AD5832780854025489C0824A566782E2B58F4CC1E308BACE555D96A124697FC92D74CCB78389E49F2F68964671F66E96684901ECF92FED034342F9B7D60B990EA4392D86A2A089A9E5F5FB43C0033F52CC92B3A2069B499B434E19024C0FCBFA6D2CD73CDEC9C46EAB4C0C13C5D2E703B3EAEF2E58BD8DB96836B08962D5D431BDD6597C363D9B0A974A5F1461CEB02597822DD47EB93344921EF0F33C9E8CAC3475C2F042E41CA1EE467039BD418F97FED838127B3B489C179AC0FC02E84C4F6514E8FBD7A170000A27B3BFB01407A0587E9331E02C03E9E8B21A5E5FB3C1DFD5FBE3A98131BAD137025DF12A9E28491DFB74879B5776A104B05B5679248A0D61E25B87496E9BA92D4FCDC14A034F2C0D5BCFC185FE37705247F7591AED5A51C1ECB8646F4F24AEB78DFC98FABE324C87D66A2EF7A02092D4646DFBAAA58761C9AD5DB0E22B7209818078B1EC7FD745A3D1F976B5CF291F24BE69D15A72DB91ACA2C7FFE9CB6788152FEE5C60B93EA5B7A7F2ED7D077ADE565BB4F561BCABA96DFF7208A122B5B1CCC7ED5324BF7CA4A136FF785746240562986642501C5D3019F23759B9E9F734500BFF96D5DB7832B735E1FB91F3F88B2372D1F9E86A63D88A2E8E087ECBA77965FB78BD9BC0AB874A0E4275BF23653FB4AB613B6FCA5FF5C15CD6193DCE07536D1FB6184367F5ABE333BC0D9AC8DAA8867EB28BB1B8ADB8E652D1A2F3F27FDA57596A5DE94EA2F6B166B7B9F2EAA7761669B0869C2A4C6AD83A96A383A48C7EAC2346AD934D5B124998E8FBD942C2F40523A4EDB06971697E0E4D16A7D3E758C4BF2E8FABF92BA378ABC16C4C3A310F6DF2E7EEDE13B721F68D392F0B155EAC36C6320CD87A6DBFFD4EC7A0048447E586DF830300B86660F95DFF83D4B259925CACE12796BAACBE9BE16DE236DCB980A1BA3123F492D385F2818CD460D00A6418D03D94ECE05AACA0143C808F59B47052CA93FC87F247B1CA9E3FB3355677C5C504DC7D7EDB7A0D51A278951963A25A98EB9B7B31FBE7A37695E627B97A53B7E48767F3C06608355BE1E8B47A737391D1DB7CF2DBB1CAB0F49BD0BA0F4D3A136E1B4F7EB52FFB59EF004706E1C5E996F269499BF917239C4852BE77E79480A929D31B020C13332B89F92FC189200F85F8A098877A8280C8CD4E83F8084448BA695EC4D34FB942C7BC179CACCEE87923D247618953F41F6283819B43D177F86945DA1B1A1D1A5A3BC0D54066EDF271D07906D013D4A47A737B90900303A6E5F5B7659CA0225809DDE241A1DB71BD3763ABDC91800C26612D8ACBE54981CA7FE6B7D14054EDE31B2467CBD890DBBA258B60EDA6F75D8B216D276CE274AFF1E44DC36D06E3F58FAB339E63B2D5BF61AB7C967D3ED4A8A94C1A5FCFCFE11A4EDFC48BAF89C506E7A2E611327E405F04EB6FD8D547FB3DFD2D780E66BE64A367E5A3AED9CDFACDB85EBE14DF3FBC0FC9E5EB81E8E2F5C0FC7F8DFFC8ECD76CAAF6DE276E17A18E1469FB38E1BAD6753E635B0733D88ECE7F03CEEF38DA74B5CEFBEEE78C3362F01AC099A162DDFACEFFAFD57EFC21BC933C91998E6D9FBC76FFC7FD12FDCFE775A49896195CFAFA9BC1333C45F0580AF27D3493348290FE9F89C68B5EE4374F0924D15AFCF6CF7654960BC76272977429248A47FADD618A28340BF3FB9570E9577252A5FBA2FA97F25C9A04761A05409003647C7ED164AC53ABDC9291E33E92200002A316B9A3A159F891E6B820490D67DD3A496C591E81789998F8B798FA8F9A858C3B75C7802E851310EA37FF977FF36FCEC6FFF53F35F22138B29876C17E26A88ACA9444B2B1F51A38BE7953219246CFFF639217A0C51F4F44C157A904C83A0C490DA048A9D2A854D75AC632E2288CF243D43964AD8A3300CF10B20DD0E847631231FB84FF2B9D914153196DF200480A0EE648ABCA718752FF3FCA04B5A725B6F00D33F7D0560FF9BBA7D789EF169D16358F9F05EC04B44B303A71E5EC9381F7B59FDEC6FBFD0BAF78BBF09B2A468F621565B1FFC43A5DE64B4BC581EDA41481F7AD91FBE44FE14295BAB15C5240D0092BF241D12424AFE30AF04693A608BBAEFA3C76C2818635BCAA9FDCE509A7D2792BFE97ED2CB17202D0DD4C85FAB95D3937C3DD1E94D4E0D11425241C9C5D9E8B8BD313A6EB728C96092A7D0E48364B029E46FCC8853000067CB2A8F0B880D66E25D2CAF448B02277FFB2D4838FA1D4600F08DCCC9F4EC5A01ABE53CE225801E25435399BA78772DB27C5279B3A47E99796748F10AE2C96F4EE0FC7FC3266B28A5A3EADC7D41FA459E415AE7F6FEDF0378E97F20E4F2607A3CB1CC9CA6FA0560EFF4F300F0DD6A25A5065CF58B90499E97041644A737B9343A6EBFCFA460CE8402D5BD4D5247767A934B00F05B305B0B1C09DF669DCB4D412580A89A6F92DABD7CD0F1C63636F13489BEEC36C03E33796A363C01F4A80012D9933E3480E5CEA2F2A885A5F4CB0691026A7670FCB89626919E92C903723FAA5A168E6399AA7EC759DEBEF81CDA710F2720F933FB7746C7EDCBF3903742221F8E8EDB2F1AE95A6DE33072D28BA83B09F4E48FE33002356A81362ED1F32EF9D7695C708757017B940C4D5DCA3FBA3A7C3079CB55873253ECA7559FB3303061EA384FF3CEDF86C4B178193998FEC6D730E95F14A5D5E7ADD68D54D912BF2502CB4F891D5DE24D227DBC9E3C9CD0E94DEE1827889D7925774445FC1C532767A21B6E2D5452619E39341B2D7BADD5BF0671B9CD3B3BD7E94D1E2CB94C4B028E47FB4FCB244F237F9AC64342DDC605777802E851322435AAA442D4EDC4168B067DBCADD663A7E35382B641CE47A9DF286AC1EBFF1400E0F766C70F665B7CED01A4D5C8D45612C010D1B766FF2B56EF4B71FDDCD5C1DEE62F1F3E01006F03942AF9DA4442D5E94D224DD246D10F4E16FE9D1AE964C88ED55A9266A47F9B302BF71900C0E8B8FDE2D20AB55448DA09AD5F928E37687C28004F003D4A8626512B2A5E5F3CEEED0059C2AE468E3AD4F1C1E5F8EC7C0B7EE27C5A6D3AC52FC5C7A3A805CF9C33C4EA00A652C0034848F312FF01EC9D6605E49E133E7E0EC1A580B3E3B55539D609A8FE35C4E14B65E5DB0DB7DE61C4CF49A2D60DB7229402F2DF8AF0A129DF26404CAC5032584BB0B2A17475534A8B58B4647539383413646ED38C9B66079E777C5AB630233F3C01F42819F4237321839AEDC572905CB1A4AA954896803F7B92B4FFE3EBE2A264EF233A8670E711621B189F3F1C9973E364475A915D8C4462511DAC9DF3C80DB4FD337056D566A11F9CBC6EF26FED1E6D031082D5E94DEE603A89E4F583935637DC8A501A88BF941C9601A3364D48CC88ADE28765DDA72C74C3AD31402C9DE45EDA0F6DD72E43B2BA78ECB309B23446E5D14869692A9CF856044F003D4A0655FFF15955D687B37CBC7A175A2B43FA34C892B1D6CCAB987586B16DA0799F09E9DB7EC7FC6E24EDFE4A7CA71A89D342BF789402E30D1B432259F348E3067BC390D8D67D1B002E69923E89A860DAB2480C79DE331EBE065117552A923E00807E70B20100A0D8F95DB4E411D7EF7A480229B8141061EBB75C4D5BEA339E65C113408F9221357E4E0AB5F31E9563E624F18C780E0E1F9138803095F81D904492AAA462D8D4BD94F4713B40EFF83117A8147074DC6E0DF68689F3DD706B3C0FF91A1DB737BAE116AA82AF0240D00F4E5A54C2C7A57C2805E4C48F97A320A1F975F38B52C94B18DFD0C54E719140D287E8F4260F08390DD15ED3C56E13EB79FD482080AE8D72355992D235673CF304D0A302D08F888BDBB50FAB391FCD4A208A3E4A49CFA6C4E993F17E22C48C9DF051BB49ED7CE1B272552F050FF64C8F7BCC05A3968DCCFEE9EED136275601802EA1E3E8865B637A3DB92E262CFC3CFEE72445227C59124307C4C1ED8D7AFA3D5727954543206BCFA19D2200FCC094390405521DAD0F09E4367F7CBCCA33B96DB6E38827801E1540237436517B733E9A95424A5A46A47FB1EA570B913003579D97EA3C2385B0E165F7A8044492740E2049BCB84D9E0D86580492D46EF7683BE8865BD1EED136702923BB3EF19F1FE3E571556D621A1A2EA51F9CB4889D620800AF014CC3E264E5B708D07A3475473D7F9F33BF81465ED7C3F64F033555C15FDB7874B8B291033C015C3354E7D58ACE0012A83D20FE4FC5635AFA47562B8FDF452111D0991E47A99F40CC1D1C2B38197CF52EB472D5AFA4A2E6E5E3C48FAB82A7F92CBD5D35189771A7D39B9C52F5ABA492B5912D4ECA785A8DF8A1E44F228E542AC809113DCF8F4BF7400FDAD171FB45AA3635D707CC2966E1C822B2A69C9B0031598FA5AADC9693E6C9DF45D9C490DA25D6C783FA500EA7954C4355C30E910370FC6A96264CAFD1140000200049444154CBAF04B2A2E0DEACCB85F851FC2AC0FE5BC2F185004949D6B1B546CAA9A2F85277A5D4ADB672C98A397F74C3AD114CA5659F5AC6FDC9F26F0FC03811705B324D15CBD350E297A5621CEC0D51F51A43BA86923E29BF3C92498421279B0053F5EF606F7806B3102A67CB8EFF672369BC9E791AE93DF0B4653AD348A8EFAA2FF3DA33BB5CBF609BE91CF004D0A34270AF29C9F6A29E1FC65A23B59E703E68930F733C7CF52ECC3F10AC3001A4308E160B1F3829214250122811090008B1AC36F297B58F445023265A6898A2922CBC6EB03784D1713B714FBAFA890BE9AD024A5D8EC1A8D44D9D85A3E3F646A737B909005735E70F8D305755765C96AEEECBE7AD2BBC0A78C5B1F880C69203083F4E7F3D6A87842AD5ED3D71271054F9D2E3C64E70A3705B949677D3CE370C5A88952591BF9B60E2DD7DEEAD388A48C8D5858293C60627493C6E1F276A7CDFA8826FD17352B8129B2D2227A64ADD6260E74B0033E923E683AA4B2A91E42AE54541B96760CA7973B037BC0B337BBFAB00F23AC6D2BB90D294E908825ED465E5E7512EBC04D06301902481F8DF4B015701DCCECFB63FF7CD24E95F83A5803629571EC956196ABC4E6F726A9C21C660BC7CA904CCA66AB4959BA6A5123B495549247267BB47DB9B1A5191F2B4D5034B731F005E1AEC0D6F81214D04B746C7ED6B5C1A69CBBB0A74C3ADC7FDE0E469E9BE521D1A4FED4DF23FE2525B9ABFF61C653D236D43084F06EB054F005704F5B3693B7C0760FF75FB22DB5C42581511F42AE7458112419B2388942601EEE12BD9FF211A4AFC38BAE1D6ED7E70F206F99F69CFC5CF97011242840EDE0F47C7ED1725752E2F9B8DBCDA1C31CCBD2F01C07B458882460AA5E3000083BD61FC4CD4FE905F834BD6D5C10E90D7E1606F1893552C2B7A533BA8EC6354E4FC21DA8FAE1E78B8B3E68C319E007A940C4DF5CB3D7FB957B0C72A80AB81F9F1D226240D96F849D0A48059C6FBD27F25FFAFF483936FBA94052547548DA891097A8CFE2765BBDD0F4EDE90A498D23123350A25B2952575A479710999AD8EA47AC66797C8D432E052E7E8494D2596B6F408ADBEE62185DC8674D9F5E721C313408F05212B00F42248A0279C55834AF5B8AD1F3D9E2901A4D0C8DE8A914084A6F2CDF2782D517547EF13024020A9416D44D446CAA47BF2731AF9B4C145F2289142EAFC41F3E35241973254095BFD1A3BC01D5B7933EAE731009C2FA9FD9CC2547A1C400D24A71E3ABC138847059016D946F0F5174B5E37D68A45DECB433249286496A091BC06913F637386FBE89C30E20E0E79A45C36F5AB765D1648ACB687867805007036D81B86ACEC2967104DB2E7422A18F9CB1D2F4E23971AF9A369E80A2783BDE15D2C330F4953A673840BD05185B70BA51C3B0053D28A9240DEB66C2A609893FCA1330DDA90C2CC7C6053BFCA63D9F012408F8AC097D991F63D195B55689EBE5CF257AF7895D5C3E6AC200DF29A13882D6D96CA330B5CFAC663B865492279F95CEA82DCFB0E00BC62FE067963C765D9186AE76D52C03AA92F3547199AC656661767997940026A9FA3C7BC14B09EF012408F8A40499EB4049C642758357CE8992A21A97CE9C6D32011B492BF06AEE4615B2E8C131149EA6793D6D0B436E95616E1B1819207E35410AFF9CB9F83960BCB20DDD3263164F7BE6CC8C2A6896B17D1D524847C3F4FFF538923FDA5F7C4E326D87388D23E81FC9D2D9BFC69B6951C28F5EB07D325EC3ABDC9299520F25FFEBEF8FB295A5E7C77E6BD8DC9318F1AC213408F0AD7B7D4C2BE205055BC481530BFB7475960442E0448C6A1E464909F17338DA21AAE1E9050793D30BF6322FDB84CD376A72B7BE07E2689D2EEA9490BE9B59C50E691F0603F8012C09DC357E3FBBA385568C44FBAC6562E23318A1D3146C7ED172DC5BEAD9DE0C487D7D5EED1F6E6606F1808C42F0400A09235131B71E1D0EA098F73E95FA73789BAE156343A6E9FEB931892BCEE35C9B2ED9E3660DB27EFAC55CF953F3C28BC0A788DD1E94D6E8E8EDBD7CACFF9F03EC0FECBC271412DCCCF79341D363B3F291CCC624B572EE88047BC671F8C8EDB2FE2926ADD702B1AEC0DEFEE1E6DEF64A97C3934D52A9EA3696DE7723C4F22769BB4049C50DE2F02C077B2F276755499D783B41B6EDDE807276F91FFA9BA45D5E9606F18EE1E6D6350E53BBB47DB3B248D75459245C0D88EBEC4DFFF606FF810009E03804DC9F183AB5D5D25894540D4F69BCB96987AE4839700AE37AEA0A8DEFC46F32DD87D7863FA2B91BF380D510BF3B030000087571CEEE3672D3586E605BC4A6B2DF3EF04D55D86105E34BFEF75C3ADB151255E96ECE328B9D0549759D2B379A47EEC1952522E9428E17F5E46B3FF36BFAF560E97B28D8EDBE7E6211294FC69F7FED467FFE70D73AF0D3C8E925BF27F2EA95819E807272F038824F63923FD0B01A664D5F4DF7700926AD7EE743941F5598AA87C99D307AAEDC515483CEA0B4F00D71B38CB4677FDD67CF61AFB62C79B94F849F680893CDE76B8CF4A9088758224F9A3CBC52DBB7CAEC081CFAC96419D2550DD1552E230D81B0600B0D90DB722639755C8F68A92409BB38596273BF658BA87D1065C26FF634FD84E6F7249CAD7666BC889AD2B28B94627943CD7F3F2B0323E010078F1CBBFD9C663FC5D1889AD6A8B4955FA8B805487B8E2074A2FF13DED1E6DEF08242CC07CF080647B9A07A3E3F6FB667793A97D7DDFDC207815F01A8375140F8DDAEA0EB7612A073C5A3A802772AB0D4EFA10F55AB1A618F8325BC2F9314CBD5813AB33D0C0C2DCAE8E5E6F730C31FFE3B86DDA402E5CE3A27ECD5401E3BD34B5A2E6989207743592A2A422EBF9B354F07C19B865C246B8D10104212DFF26390C49FB59E540B306762C0E1CEE0960B3E08D343D00606A685DBEBB3E257D5992BF45C3DB1C560D247512B96B92D40F61B39915264EA1F1623D4D923E4849F12492C707635722A7A997B14C0E8F192F0137952A9DC464532A970D3682EB88203B890E5EAF94EC4C3E3E07EDA766E514AF3B5A6CDC3F57D07A35E605E7506A89EFCCA41B03A4D5F612E1737D3F48FE303410257D9EFC350F5E05BCA6E06A15F32197ECAE9F97601D8AAAA96AE0C9DF222179FBDA08621D313A6E5F2336562D6A33CBA5E6BB47DB9BE88D89E971904670D5A3EB206CF3E0A4E7B90A937A8572747A934B3C1A00DA950DF6864F69F7E1F68A65384B903A8D558A9DDEE401AADFF3422A5BFBA9D3C4799ABE0C679A32D00DB7AEF0F2E07EA737391DEC0D43638A703AF978DA7533696020A97DE97B13A4A263CD4400EF8B79CFFD801E4B8727806B0412B22202F3012F77F6965A25E4697B5AEFFCD1146449F86840E88649032FA1C314403AC699F1DA549D20768FB681AE3061B3A163F9269CA334D247FFE751EF19C9CE274018D8D1CE8CDBCB71BB397E9DCD83598321A19F03805BD4396D74DC7E91AB1E8BC010A7C431A95CE6FD7E30EFFDE6413F38795B7AA7E6EF26C667DC3DDADEFCDE573F0062AF194FEE6D76A39827FBBFD10F4EC47E984F10BCCAB7F9F004708DC0E2698500716771660BB65A1DF248E1FC326E4D0297EA496BFF364D02681002C413A6332E4947AF4D84195C433A000FF68621EE1B091BC034940ABD26817E7092708EEA865BB731AD2445D49C326C0F66FA87900DEA67AC1C09A99F4644350F66DBFD4D192E8F8EDBEF3355FB6B59D7D9C0A45C71D8148CF74731D81BDE2241952DD10C1603AC634AC0E9796E36B07BB44D1D92E23434ADCDBC2003AFD0098F277FCD8727806B06E2F81190DFB73382AD2E19DABAC21E4D80F1F41D358CE82540A41F343EDD39205EB3148CF42456D2181DB737C8C07D363A6EB7067BC3EF98FB9C4A037237DC7A86FEEF07276F90FCF1984A1272A866373B49EFE673829AF7317D1E5A0E49BA54C40B986A2900E0BD3CD7730CF686B7BAE156144D5AB1330E7AD0D274E6D855BE06F0B241DFDF606F1852E794C1DEF00C9D8CA4102C5AFB7091C60A509D833C9A09EF05BC66903A09FF317B7864C3D83F7D1F0076B2BE19178F534A9ACAF23815ECFED4E5E2D8B35D02803B403C970120110899A6D73C67799ABCE547671A73FFB3B2EC92934E12B3F26984B5040796D28165A5CF114D5A51AB1DB5A4F57F6DB68C8E1EE19700E0D7511A4BBC7D4FC1077D5E097802B826E0D1F511FE23F658249A18F205A0D8EA142E6A5980581519C0CC73785C64192D4EF8381C06FC541F81CF69237B9A538A0BF194CA803116CBEC9BDEFC783BFAD653C338248F56560A5C2DA44E0430EBFDA2C9415F58068EA6CB7BEFBADBFB75D9EA2F1E6EF02AE03500DAF7A1571DDDEA1DB95D52F936570DBCACF544EB046D959006E043DCC94BFE2472446DBB08D943C7AC22E4EF8A9437BDAF4DFD47025CA7ECFF1C1C544A9392D100DB65F54D9DDE64DC6A4FA01B6E455CCA6A538722F9B379C52E0244F21792B2FE8A5101A7D271F2C7ED36B3EE4757F940479C3A933F007DF5170F3BBC047085418376D2609D344DDD3FEC554351E98EC7F26088FB2B60D65E0590BF9BEE74C9AD0DB32FAA8011542AC6246F73AB3D358F5C976B51F50A6C8D594D354A254E9A848AD7838324325E59C2A5CC0ECF340680C0D1B62F8E835817C91F42AA5FFADF8485D9D0D2D2F4824AF83E777AE1EB5CE37E354FE7B10C7809E06AE3B7E80C8E44D70730C6E7F3ADFDEB510001407A2D598FFA6274DCBE669CA444F28712222441EC5C22F69A2495C3B56F4DBE9B45255FD2604F559CB6B02D9DDEE4C1CEEF7E230200F8DC5B1737D1598297955ECB254E12B91048881A8CDAC4FA1B93FF734B27A8CA179D3FA474C4433BC07AABCB378A9238CD7E14D3ED1E6D0716696DEC792ED50192BF4E6F72537AEE452FF3D665618FBA26A835F9EF255725C013C01586B4A4DBE8B8BD41D7FC2D3FF8B30705AA7D493C338CBBE8EBBD99083931E90B71D32819B2496D2868BE66D0770ACDA4855991BC7F99472F1D54BBA3DFFFBB0000F0EE8D877148119A3F5E2791594CC7D5D0441275C51CB749BF7F8CFD133DC8E3CFB9809298C1DE30C0758DB5FA304E2221A631CFFCB9BCF7AD10715F8EF53AD81B9E490979D81773580CDCCCD5DB66B273AEC8FACB65A2CFC21E49932B8FF9E109E08AC3A8041E52E99F21234BFDC0D7057CE9B07ADB5C7A38401B4853923FFACB257116C7081CD4375D43335954951FE03D391135C7360062B2F45BBCFC546246CB6C937272492321846F4B03385BDDE3129D2891C95291B5C913D25A8D2453D0B0308600CF157EA62CEC1E6D6F02C07B5C0AB67BB4BD496216D2E7FA227FDF16C9A7167C3F5E286099634537DC1A995F91B87BCC076F03B80620A4E30C925E7EA58559F0906106D7C06CBEBE1B0823817AC5F5DDD9D4749C50B1FB243C605D8CEFA9DD21CD57724261B678F7FBC1C9CB9DDEE401124D3A39A1F67FB667D2A49992DD9F66FF57665811F3AE7668FDB97A632366EB362F3F048CF2EE3243F2D8DA990D682FB94C5BBFAC32BB90790F377809E00A03EDFF00E299706256ECC948F530758C92854D80F43ACC1ECB0397AA28780566EF2ED2A4B85CF2C5EDFF300D9E17B2080C216B1967A1CC018E3A9DF07CB93A9696136DBE46C7ED17D9339DE17D077BC3B0D39B9C5272213DA35636AE82A6656092BF801C9FCBEECEAC24925AE94252C3F332E1CA2094342E1B4C721CB755BA9A8CCDE9C695F402CC960825EB2F2FAC0EBA66094500D99481EE379BF8D52B8A8527802B06662F831D6B683A5674FCB8E3BDB9AA07277AA4CEE75ED3D4A31C64D8A4014072A2E4620C2F910BCD1E90E13255FB961536C8368062BF0044F58CCBD3ED1E6D07599344C9B185DED33258F7CDFDE98A1F8526A5C679E40EC90F7FE3B0295C0A2939C3A00A18F35826D1B8FA6F7FFE314EE0FFF037FE181D583600A6F10941B045054887FBC922EBB48D11E277BAE8D02F7DE2812C994F082605AA44B4DEA8D772A69E00AE1E5EB1CCA2378D9AA9884D8D470E10D56FBC6E2C9EF3F55F4F48F66D9DDEE41291CA45F86D75C3AD47F43A9E8FEDBF3618D3904D50C05B9C979FED8FF1DEF4D98C07F239984A386FA1EA970EFE9AED9566E7E8881FE30E89495A48323E3A6EBF88AB87D06807BB47DB419EF20EF68667C6A64E74AE5824EEFC577FF29459D7B7153EF92B0FA943CEEED1F6E6E8B87D8E87B591C891696B9FE7C749DCC778950F120268A92A60C95C40FA66EAAD0AAE97A44F83B7015C41D099A124CEF7D2BFC5A1094154D7015D16E78C0E305CD220D8E68DC1C487D362386A767E348DCD0E8EDC2BF78A23BC1C2EAA41723F3E00DC0280AB440DFA0500F8AE6453C6EA6D4C3D35B9B4AD1F9CB48CB4E9B9577FED6F7EE63B3FF54EDBDCFB21B541CCF3BCD47E915F2FD53397FE11840010686AE245427AFFD496D145A59BD7FE0F6D4F4B287E26BAE1D6E7FBC1C91F38A453A59BDABECBF7553D0EA3BA49F96CF00169570468A80ED3B54A01203578DC0587354C3DCA01CEA6A95AC5DB5C2E0F7D16E4969DCBFA26427C7726AEDC07FDE0E465895064D95FB90C4EF37CA3B681919605CB210487A7E40FC0903F8D7010A9931AA6833CF395693DBE439F15C95F11B3941F9B671A0FF6860110C99D56661B29D7DE5337DCBADD0F4EDEC859B65CE8F426378D342E0000F8F77FED3F80B77FEAF75BDD70EBC6EE1100C089D304823DC713CBFD5043111AC7A35300789B472D281B2EE44FB8C63A515B36694FA239E40FC0AB80570266267C19A633C71D73F8CC9C3B351DFC8E76BDC7FCE8CC964FBA490654741CB8E9C95F7DA01103C92E0C60B63C5937DC8A46C7ED169249AE726306FB111F982415B304160FD02916202DB72625921C52880D580853B529868039D3244992A38B94462B078F890990DF2CC21096573ABD49144DDAA8B24CAC63ACA94435B5703F38690DF686E1606F98780755933F832B00B36500DFFEA9DF6F195BCCAF4B92CCB33FFF04000044933696311597B12F847821ED691392218D82AAC91F07A9FB47A8A696DA12423345909EBD9EA89F5AD8AB805708CCE3971EAF6481750F3778E9DFF240A537DAC062930A757A939BBB47DB57077BC3BBD4CE8CE7A749916CAA485BB98B7EAB9AB303C5606FF81A00BC8B6BDD723530BDAFA45A73512D539228E54FECF5727F1BD4C60FE3E069EF04CB906587C9DE79DC8F76C3ADC712912A031DB2542779AEC4F348E0EFD645754D9E2D5631BB861A2A1B59DFA1D66EF933575FD23280A4AF9E92414F0057045AEC30DEA910558347C92046ECC1B23A578F6CD86C87B40186BE4B8DB414B1F963F7B809534990BADE70D673D9549AD273F3D87FC6FB170000067BC3BBBB47DB3BDAB3D848A6B9FE0C831513823636F7F8F7FAC1C94719CFF3A81F9C3C8BF71AEC0DCF70220B6CBD622C23A6E5C7E8711B2134A160502D5AD9BADD4663D0E73118B3881FEED35885F419685A5BBB73B95F15C863DB279DC33C9A4300EB0D4F001B0EB4E5A01D152579385B86257B76AD0B5C3BD645D81579CCD0159C14CC7155726208C1C3CFBDF5E94FBF7BE3FFA4EA4A550248F3CC3B48F1EFB6E8F7AA49EDE8608A04C21091F770C24203406BCF91F5DC983FE2B35F7B09BEF7D50F9CC9469705B7E6E54792FAF15F3CF3F8A9BFF4D1D35A3D67492D35E92C2F3F4CFBCF1F8C1C57669907C476F81C96477B060B9E28EADFC458B1AC09AAD67EF03F4D9B45FA3C199C0FDE06B0E1C040C334FE1597F055358BF598C2D859DEC40ED53180AF277F0B447F1643ED3580E9779245FECCB1E7BEF5D40FE27E520B8F82D7503BBB1C0336E67DAD4382B79B723A8546D1A426F43827379DDE24FACCFECE1F69818FF1F93A2418B4A67EA465A6123F0080EF7DF50300B30CA50B28F9437B414AD88CA432E4E48FDA58D27252922011627A1D0084FDE024FE86778FB6BF0B53D2542AF933EFF926F91F4F1C997439A4EF465BFF1761DA9EA6B2DE04257E60D5E0ED5192F8D163FC1BD2489E277FF3C113C0150033A6C64E3B361EF7AAC8CA1100C09700E65FC9C0A35A68EBBB4A84C9A4DFA4C49E12328940525221E5E78010A6A158F0BB2D3479A386F17C6025C9CEFEE8F02E3A1B9C19627586AA61240AA8C6EDF426E3C1DE30CE8F92681E93AE1B6E4518C7CEFC6E74C94A16DD70EB362F33C9F714EB10AF0798124B420203BC86933C1BC9A0F5A3A8163790D08E8EDBADC1DEF00B9083BCBAC0F41121005C35FF23723C817E70B2C1C8EFA69026456E2DB78F57B4A96A4CD0DABE54DF9CB0DBAEF3281F9E00361446E2C4977A8B31324B3C91F4FE23AA16F1726FB423EF865BCF98DF9424C66371A083CF606F18D2EF05256212A13376673121A2848C0F64AE52BFAE7DF9B900661EA1CE03B4268DE4E90449D36B866421B1D844F226950DED044D9D85643F065523777A93312128B4EE6209B8215C0FCCD27363249CD41B9796C955C54ECFBBA8FC293EF7D6A769DD055A3A17E0649C90EA4D601ECBF83EBAE1D68DACFCB0BE6DEA6D7A6F120982DEAB34F2C7FA36FABE13932197F2F2FFAB23E1AB9F07308027808DC5E8B87D8DDA72F0F3C6501D3FF4332F01AC061DB6E20757E1A0A1FB6A766ACD011B7CBE8DB6645C5D6993A27009A005BFA7D996997BA8523DF34DA7A43CAED0549E9C9C767A93E8977FF4D9BF00982EC946885CAC6264640F2584F1BD3EFBB59782DDA36DA0C74D7A0C41350680CB86E05D325B22AC0D5183BE303A6E6F10827D8679DBC0259DAEA49013649A4F3F3869B5DA117ACC167294E8CC96A63BE5937104E6CBDADF5B348D24C5E444989F67780EEF51F5184025A8DD70EB31973CB3F2FD881F17EC01DFC1EBAB2CF762504F2F604F001B08EC98E86C5E1898E8BA968507140F1964200BB073FDF2939FE1AA8BFBE6B796B3BF750351A35D05980EA418F70E20AD16FCF2E94F4F88D72900CCEC69250241AE7D038F712296059CB8E57D2E5A0E7A8CFE224943D5ECFBFF7010EC1E6D5F64EAC084B4CB1C0F31640C5E0F00F0BDAF7E10D27B120FE24D932E0080F7CCF1F7601A7AE622D69DE9C7BE64CA1550499591028659F526493AF9648B4BA0B82A5C53398E48F06F575B4CE3540300F0A1A9D7739DA4D4B595878CF167E1D2569E863CC3983CC3269160574644585B3F2F958B1CFBA464F347CA1FF58393D7AB2AABC714DE0BB88130B3E6AB00722C27F4265C96ABFFBAC00C0A74BD5F152ED2098F72D125DEA474B0A1DEAE34EC074F0790EDD5AD394548CE06345F0DB44DD9EE6B2B8B54361ADEC53CF7DDD171FBB285C48ACB6B99F35F0480EF4865C0FBD0FB91328460D4C8525D691EB0D22F5E4FCA84F93D06433EA46FCEF67CD2B98E1243D5164E4B33B79987D863B908414E1CA7F545AE1F9B3ADF0452AF65C010CCC464412A87D6865CD5C11E15238A22BF3564BB703D3C35BF11FD15D2DDBC703D1C5FB81E4624EDA565977F9536FE2EDE1C3FFFCEB2CBE4377D7B73FC3CBEA7E8C2F5F0F4CDF1F3113D467F8BE6CB8FD37BE4DDE8B73BEF335FB81EC66521FDC11D521F1169CF5837F769D94DBA9B6F8E9F7FC4D2F13A1CD37BF1FBD27AC167A4C76CEF84D7A7ADEE2D75F2487A37DAFD485FFA80D611794F637A8CBFB7A2EFF0CDF1F337787D656D55B5A322ED4EAA5B7ECEE51B99E71BF25BF6E655C00D001AF20AEA2871B684F68134702D00BCBBA0E2AE3CD0EE8F4A05B2D4159213C8B255C3687F45D4562B0B2A59407526F568E5E8F426775025C9BD34D13689498E9E705B26AED6CA0B23DDCFE555CE55A2A8BAC4B2903EE343F4EA3540E70F54F5BE44F334E5B9D6378199D16984DB760DF6863F00E3354BBE8D1657B51B0961EC8C43C39B747A933B92EA5C92F8D132647D4FE6BD3C2BE50524DC0AB5A31C1DB7AF1955F64553B6088C4AD53CE3063F469F038A7B107F9DAB480152F109C540D7B84FFBA7799D0079DE74E3C7D9758FA43C68F96DDFC8BCDF90871D9E003600260655221C45CE2C36CB14FF7B000059ED831E943A3989F02D5A252C913C63261082991C18CFF29BA98B1B06A306C4FD8811947840A66A34AE061C1DB72FE33743CC2CCE0124C93E217BA9D86BD4103E0FD8242FD7774BD4A937077BC387BB47DB01922F5A96DDA3ED9F9742CC48CE048A7D56C2BE11AFDB3DDABE0816AF59664718A7A3E14D70F51169D2642B23F92B922EED194C5E8144360100067BC35BC0482D80BAA671DC3F9B3654388C0F7D167C5EC929469A6CA0A77B11BB3F4ADACCFF31AF1B7A3FDAB6843EED9398869FF3C46EF9F001826B0E338BDC29782D7692D6E0A11EEEA09258EC5C3B64C92869464E072C4E3416515E00F810005EE8F42600B35561F0DB6FC36CE9B16B2831324E2EDD1159ABB429A0648CDB1DE1FAB11D988C0186097B333E487566ABE880493306812868EF991E23E548AD724141257EDC26CE065E76747441509B3C62DF163B364C8341438A5409CF1602C0137E6F735CAC03ADAD6B844B237E349DCDC1C056BF349D8B5D269938E1F270F13BE954B8541C291B06303F1362007E51488FEF35E8F4260F244FE32CA09494FCDFD0EC31355B4BE978D67F8FC5C34B006B0E338B4C7C2436B59020C529D5F877DD211984F341809209CD687D811D1FAAAF4200F8364CC91EF51007DC37FF7155998B00F01E397733AF3AB20EA0D2892E7186306ABD4DAE2215B28857D9E99BA0BC98174DC4DF339790996B4659E404C8928D3CA490F27C6317E9CAE8B8ADAAD2768FB6A97A5B226BBF4AF2DD0080F37C420382D4CF46F0F82448228B5CC2A8A5A3E8865BA3AE3DCEA248F6E93DE9BD46C7EDF78D494D2C0D26EF249E1C941D664590AEBD2D24FB0EAFAFFFE84FAF8518247B34E7EA25D2BBB0A521654D4D10BC04B09EF05EC035878BCD5FC6756155B3D475839951BFE82299E133657E7C210586443BB80B5349720800DF36D23EF4260F4157DB45A3E37662A268F380AC13C860741ECC33522F5580EC6F8A927D26C9132522523A807C6160CCEEA6CBF7CEA5929DDEE414EDF89854281A9125DFA8A488641793079767E2C89AECD848B39457D6B39709498A4BFF2FB23C9C206BF537D81BDE4575394C837287B44F9A27EC8BF4CC5984D0A6D5F064AF9EF012C01A81DA6975D8DAB2793F642245F0E4AF24D0197516F9D3FE57DD117666AB0E7029080E1401005CFD5B7FF62A5D333A008068F768FB47A6DDA0C9C01900249605AB33BA647931C1362FA06A501E0390BF3342C462F30949A2C54920BD3F9ECF49FE3E2C6AF787B66C26AF04A1E14E189DE98A1B5CDAB8C1259759044D9ADCE075361B3E7ACCA58E6C6A615774896DA896B7544649AD5D1528F192EA923A818C8EDB97C9A5C1E7DEFAF4535F7EF2337409BF8424AE6879A467D6EA834BBF0DBE3B6F393CAA819700D60C5AC478B43D73B8FE148CF4C0C7012C0724AEE21888F3872D369C745C9A519745083BBDC9256AAF47EC1323989298C0782CA20D63667B6279440040CB3A191DB7E75A22AB0A18356BC7EC5B25129A7D99256F7E76A99E000020004944415451B267930CBA961BA5CB66DFF9BBA56D13A57748746DE5404921FE374BDEC5EDC155DAA3D9EE49D76549C535C957D9B0BD47A9FCCB9200D2FDAC3E05CD1B0080C6610C1D4C0EACF7CF2A57D1BC3CEA014F006B0462741E8BF239D1C8FAA05C498A473ED07AB5A5CB529555A952EACC96A553CB69068AD7B87387397E0BA5822CECD02D2081C7CB2EF72220A8CF629284E7E93BA1244C52F977C3ADFBFDE0E4659E7751228813379892759CC0C5A450B9260EF8CEBD43354245CB4AA5499430F267A1702107F418CF270FC95B1479904896D62E94E78CDB421965A1FF35F237D81BC6EA7AF33F11787BDE3268F7B5B5274FF49A074F006B026EEBA74968B48ED6A875E20181C47FAACC536D5D406DDEB2A433AE9D661544909136601307D1FBD4A50CC634E13D7AACAE44B04B56289006316A03C86DE2CCB51FF78393A789E454B4C513DEF34FF483938F5C0843165C276E48F8291140E0F3F4672BA13C03007F46D350D2C009850B9175B513CB92F015912C558545921B2AADA6F797EA4AF1024EA048196DF59DF52EAA96D47A540F4F00970C2E5972502DFE1E00FC12FFE8D07E10253B66007B38AF2798476C5777517B47D2A051A5A44F28DF1D98867AB90A53678F57768FB6277D21361D8536F00AD2B03398AA80E301A8CE12E62C292C213E4FB43A6212C0847A3D4B2D87A88AF899328C0D89DDE093475A465E5E5E2F4884A9F308BF5EB8B755FD5B94502C127C4224117780ECEF789E67EA865B8FFA26E40AAF3FFACE067BC35BBB47DB57998AF7160FF5E35A0EE9D9791E369573DE4981478DB1ECA548D675C3A5DAC8FFE8C2F5F0A696DE65391CB22C51647E4FF394C96F99F5ABD66B9E258EAA58DA88BE7B69E9275E36ED9C92F71DD35E27B41EEAB4BD397EFEB1F6AC7CA3E5CF58426BACDD437BE745DE2F7EF7B665BBF0DE17AE870F68FE742935AD1C967AB8292DDBA5B5DFACFC72BEAFA5B7A137C7CF8F8563A9B691B154D98D12CAA1BDF354BB9596CC2BD2F65CD269F7AACBFBF3DBFC9BF7025E1E62750BF1DAFA124FD40D9371CCB4CC8C9A7203BD17E9CA051EE541ABD77EA0074515DEDF8F4A2CCF4D12F835E5C9AAB51F7ADC419AF521005C06E3114CF2AF8DFA002579DD70EB7196D4465A4D0161A4A90090F6A027F710A55D45A4BEC6CEEF5A565DE2BD47C7ED17317F2E31ECF426A736091EFEEF07D3A5D8C0D875627A7E8DED7ADCE87FCC87E669799EA54B89249308549D73292FFDA5DF0E4C976C7BC4F3316945AF639626751FED5DF076CBEB374FDB93EEC9F7A5F7BF48CD8647F5F0047001A0838AF98F213AE2701B26506B2AA0B0EB3DCC2072FADA3FD8D9C4FC9A18B8B74E6001B5AD767F9A1A981E23FF9F95F22952BE115BF7999689AAF428B8AA4BB2C9A2E9CD3D124E2375227F0CE771274B75279D1F1DB72FD349147D4E7A8D346016C48FCD7D5BD4C4404B6CCA74CAE3FA014C975393066F4AD0067BC35B5279B5C1DD90A11B5259B208485348027F0E8118A6C298B0EF3CFE9E29E9CB32C1E0F9E07FA95C54658FAA60DABFF06BF3423311A06D472AA347B3E10960C53024E215B31FAFB6604EE3125CB92475C22C14309FF7FEEBBB00D3150E1ECC5DF835074A66F204E39606450027295B11BC8264003D41778FB66174DC6E0DF686EA3DB5813ACBA81B2510A40EC21A12C10F341B403A704A035B37DCFA2140E27BBC45DFB7ABA382EB7B364E3B97691B4322D80DB722B4EBEDA457E9D8A4D220FE2CF8DEA57E62F768FB2A95260DF686E1606F988A754808C1463F38792BEB592A68DB0B833649EA9AB8927DB2F63339A7D90CC692687A0D7F0F7CE2257DABFC9D9EFDF927E2F89598C7606FE86C93AA6902B47352B93D560BDE09A402106F5CF4CA8C9D08689C3E7A4DD78412E08397D631481F25C6F2AAAB717ED340576500169E87427B3F55CE94A9C7374022F61700C48BC16F644917B28CBAC9FD6878210C590250A3A506BBE1D6957E70F2B6D94789C9C3DDA3ED8B3CAD8DCCD99C2A6C925E520E17CFEA381E2364ACFA61EA1E971DDBA4E16BE8B3D2726924851363297C88747D16095805A9904D12AEF5B9AEDF7A913AA56591CA48A5C02E93132D9D85CC7A078F15879700960454F39AB02BD70066EBC6C28CFC45308BF195500BF7491C29698646C1678EFDA94DCF194C257F1190352A3D8AC110AC7330233A818DE870C9091EAF62F6FC1FFF9B5F189B3252F2171A3382563F386921F993ECB334A9A4D4B91B49D44D5433D3365CF673CD0B247F66BF050020913F80997DA465404B49FF24D24CEB364BDADB21EB7493B6B44955B9DD702B7AF3E3172644B28B619C3EDC3DDADE44E9AE2441E2CF2ED40F4A161F00CC3C803542E22295D288A8F99F6903572768EA4EFEBEB5EF84FE4AD054ACD2BDA57782123FDCC7D55D6CE4AF6B5917394B2229D58F9706AE163C012C094695330680F771602601645B264D8BEC5FE679689D82F631E27EA737B94963445167108F62202B7F88B0A94CAA9E25DFFD07DF0F778FB6AFEE1E6DC3E7DEBA880339C67B5397E0E2D0480C1F0C768FB6AF92BA788D868031931CB59E16893CC4DB416A79951F90547539D4BD77606A0A72C5FC8FB00E3BBDC978B0373C4372D86A47ADCFFE773FFB1400C0EED17660EE71D1DC6F2CD97BD27D87325D347943A73749A59708852639A2E768DD9874993670758626E595BE715E4F14527BD126655219E879AEFAC7735ABFD39FC5818C25905AF95DFA2D2F015C2D7815700198CE1CE3EE21D94235218DCDF510005E008715240064D1BB8BDA01E394650529F6C8071EA311615399CCA326722C531C209CAE00A1A927256449FE6C8311DE93AAA0E67DA6B2A0A9B5A5B4ECFD8931E134159B707DA66AED8D7FF19F84B77FEE9F0528C5C17C71F515724F24D3010088EA6BFE1C9A5A5153E151C9B19656BA8EEE6BF5BB6A04C1A60EC5E3AEDF9AD486B4362BD5B791FE85606CC8B5F797F73B90DA8CF6DC1EAB052F01CC0943F676C07C881816841AC6635A13843974701C1803A46774DA47CB3B08C143D34BFF4A80E45D0BA07792DD70EB3EFECF9218148151FB6C52E91100A4BC027939A5733C5F1749167D5EEA295BE459AA0097D0499249AA4233DB3B7DE6F539D81BD275904F6DF56893069209DAF8F6CFFDB3A0D39B5C228197A3C1DEF021923FBCDEACC6814E6217A57B73CD00270B9CDCD232757A933BE84840DB8DADCFB169206859B804905FD344700939FE6ADF934B5B31C743FABEA4FA928E69ABBEF0FC6D420497BEC95522E8D16C7809A0057405009406995321AADCF800388F44A41B6EDDE807276F65759EDA6C11ED85EA269969225CA4A97C766D93C2CC430289C3076D83A9F55B35E981545EAD2CD26061A40F671856A6AEED4BFA6EA89303852601ECB0E5F470D5054AD424E0CA0CF47D0CF68638198CFB8DDDA3ED802E47479C7680DC0F005407941F01C0275DA549B46E067BC3BBBB47DB3B529DB8B64DA9AD4B52A4B2263D7581A32439D369845FE370DFAF00C037C8BACD67401C81B2EA5DFBE6B5BE4BB8FF4ABDC7F9711801ECAF4C7DACBD0410432DB0630FCC60FB9E91B6DC0132F0B2E597CED0B62FC7324EF7D9FFB1F910BFAECDC06D1F211A75F365A13C8A81D6A14D9A6A7B2736695C5EA053114CD77D4DD8926A5284AE1086820F00BCAD499D3DA661EB909EA11492D8BBA6BEA3AAC1BF232E1903D0833EB3E70FBAE1D6B8330DCA7CCE48E2E23C778FB6AF92B4B1849F0CCA80CB72617D189215AFD36BA46EC11FFEC61FC7D770092E5DA3180DFCB10CE4DD7C923E1F7FF736C9541EF2D70DB7AED0BAC25FAEA5A06593A492AB022EE9D4A46CD22490E7C3A5A49AD4D4D4EB37516268DACB87BB47DBA1A6BA65F93F061274DE55D2CFCB9B27FD6AE290D4D9EA903F002F018C41A46734C40500CCD63D85E9EC2B00479B3E0946E5F43AF94F176CB7DA6ED8A449DEFE6F7EA0A4CDEC3B49B924090CFD5F46074ADAE4C3DDA3ED8B38884B644D6B332EE0037C567A242BEE4F521DA4679780924C00B96EE877A44DC6F20CA294DCE17F4AC0B43035FC9EB86F7B472CDD0FFBC1C9A7E879E36472954B1F5D25C7667FDC0F4E36B4345944B4C970A97B17ED8D964EFA9E498C468C192BDA9AF2BC5DCAA969923CD6072B2701ECB0D51B2CE9D086E914833363880B30B32DE6B5DBA2E78A96AF1F9CBCDE0DB71E77C3AD5137DC1AC154FAF048FA68B94D4746E77A261CF3C8011AF8D925E0B36DD004701F141CB009300D696224394E1769EA2997F412A8C48BEE2F13DD59B05E277B47982E6B67257294FC49522D297FA93E08C9BA6BFEDFE5EDCAD80927CACDEF49253792F44FD210F483934F75C3AD09FE3752CDAB00F09A39748BDA434AF5C7273726DD4697913D3EE1A89448B45A4B935848932B1BD192DE952D6F7E0C437BED1E6DC781BF695B28E39BCE9BCE63B5B0521240A3C27991D8F16000D500A57BE4780026882D866F81A973473CCB5A84AD53776AA41DAB979581E9099825AE14A905E671570A2FE3E10616ECD88904E2BE2631B11D73284F6C8F466C7EE2F692258D52547B098F57099254934BB2F05CDDA480B6F316C9E9B81F9C6CF0FA46E491FA0912BE549DE1BE54664D1AA34DFE6CED4A92EEE03B0348BF4BD6861FF7591897ACBE6A1D4944D6245093B475C3AD47FDE0E4599B048E98A2C49EBF36C9B45436E9BC97F679201A2301ECF4267778F064763E02808BE8958B523D98065ADD108EDFA5FF47C7EDCBDC8E6F4E878E2B0E69223E182B1FE7792A05A41FB69178863025B39EFCCD098DFC99C1CF497523A168874BC99F3994F002D4240DDAFDB2C81F2D2B6F8B188418D552482496E975DE0DB76E778D0D2D3E375DDA0C00524E15E63A3A38A6EA4491AAA9F675F82B48F8C47B6A523DF66CB1676E5E69AE416CAFD8614B434A7680AC4CA9187EFDE9B2706AB064C732AD14F8B76723F4F43DF6CDFAC19A5419BFFBDDA36DE8FCCD6FB6709FB673A93C59AA694FFE3C286A2F0134A4EF1328D903628347ED75C86CE92E98302DE8A96BF24979EB92500FF8FB80AA64AA80362BE7E96C5207940419A9C54D9806974DD88878B8834A8669106D8760C100E0269D2928014CD875767A93536ABF66B3C32ADAC94BD23F04CD1B07284DAAB668E07780F5436DFD1034FE1E40F27D49DF914B5DF072A0373049932935D306ED324124B977778FB677E83BB4DDCFA59FD2D2978A562B82286A5CDFE622A1A5C7DEFCF88509C03418B8691B8FC1687FB26093C87AE2372F56CBFB17512B09A064BF67247348FEBE0FA633A5521A4AEE8C142CA41EB1C6B85FB59B23767E95903FDB8C5D3BC73ED8904B76FA535B9C31003C07E0895F5174C8127E908CEB98207F5D164F8D4B7078E75BC6A0CEA547DC79814A6DF80C3F879428F14CD23EDE0FBF275316AB4DDCA2313A6E5FA3848F1041B4BF8B252800E9C192785A27C0BF413CCEA439F17749C99FF9DD60F9A4F2A6DFB6A6FA2DF23E29067BC3D0484277303F6257665DB28DB7735E4E4D52592A1A48FE00F2397D00007CEBA91FB401A6EDD5A8EB63F2C7E37D4AEF413AA6DDCB230F24F27738D7375907D44E0248A5307410562478E24A0D2CBF38969FF97FEA2AD9290A571B30DB60AD4976A4F38B905CAE03D82A1B629DDA6CB8E83B2A2A8933E154DE357F3701208EBF679308E7B98706AD3DE695A62D1A7948AF2691454FEBCF7EED25F8DE573F10EDF68A406B275219F8B3CC5BA7283DE2CF40A5B62EF7B1A9A0BD94291BDDF44A33AA1D2E6AB9768FB60332F17AC03DC5B3A4D2FE3D78B8A0361240E38D7B4A2477F18A0728ED23367A28B9C305EA551BA4D17489B43BE47FE9E48FDBFB69B33E9B8448C83335ABE6BFC62E720C003F36FF1FE0F1B91F6A4DD049AE68B169EA33531A6C538FDA06D66EB8F54C46917E0B00DE0613EC95923F49E226491EE7951609D8E407701DD9C1DED02AE558045C880C5F014448FB360084DFFBEA07719EBC9ECD6E0816B84A6034D5AA265515FA92440C4405E7E9BDD036520A22CCF6AF7009B746FAF0DAA590BF257A04E701277B1AF94320F9EBF4266323A9BDC8ED5A5D840CB6F1C7A3289A2FF5A3A89D0410405C5EEAAC6AA9DD3CE82663F93D03007F06903600C6F459523F2E05B048FEC63FFF9FFFA7C1FFFE3FFD2F00104B456F6AEA2C0F19796328DAA4399601FF7E3F3879D9A12CA70010133F6AEAA075FA78BFBC83302D935171072E122F2C179392393D5FD9E8865BE3C978B3FDBD5FFB97B9C3E30852C0443BE0248D7F93B65F52BECC555716419C8C3A31B50289D09E54E9944DE224E5553A1A6A07E8021A7F96ACB57D134D0A1074451EA97DF27CBD54B60C50FBBFD5B205AC8D0410C1ECF950EA5767F2F718A6B1FC70469E227FC235AA7D18B5F9C91A8C47C7ED8DDB7FED7FC56BEF9A639EFC390263409A01FF969446B38FA2921E4D3AC7D25BC911BE67A36A8D3B781AFF4B93DA14EDE06999E8A04F9FCD488EC4EB895D599C979106B948A7E646A73779D00F4E36DA1B67A71A793FFDE859F57A33C8DE0100F85BFFEF6B13EC6FBAE15684D2748960DB481E7F1736F2C7A585E6786AFDE2A2C0B2777A939BC639050092CBCDD1FEC65C16F0E3922682EF574632A8942F8A5AF1FF8648FF5C3122EBC9635D52F287CB0A72530C2EF1E7EF53197F16F27DAE0E28E15B1DF207504302683E8244B0651EC2A04EE807274F9B0E900EA6EA406D512D3DE179F38F58FA980961DE29E379D605B8EC97D98F00E0AA94AE1F9C3CAD493E34D5ABEB60D80DB7DEE17962478F4480BE7B7E3F4B5B2A044A68E94022C5C433CB95A90BD32F08CF01000CF686E7CD3BFC3D5E9673CF3C4A958D3EDBE8B87DB9D39B9CFED1E1DDD8D1A51F9CB4B809804DD2254DD4BAE1D6E7A56BB53CC8F1CC303DAE4029927190A16422963271422BFD6A2A5F813C960F2EF1C3FF2B2609C47EFCB35FFFE99489413F3889BF35F62E9EF0638E12FC854BEA3DEA895AAA809B089B4A08C06ED3E3AA76E3D71BBB908086BBF1C807D780CFFC5D4AEF5523095D21A8AE761F69AD560965122D4DD589F7E16D73B037FC70F768FB395A8E45A99ABAE1D6E7FBC1C91F98FDC700709E3B35F06B5CD6BFEDF4266333C8866054E1E61EA9EFD455DDDE0DB7AEF48393B70B3E6A6940F5A2D4AE5CD586596D7F615831353053FD8683BD61403DEC5DC8357927219F407815F0BC381C03EC933AF52AE0B585A60E04D02535F45C9624C0A646A262FB4E6F72079709A2E16E3CF2812E07A8A591545F7C30945464340F17F20710DBF7E0353CEC4F22044799D217493286E7709FA9817F0A7768DDB1EB4A5365B2B2FE01DE77B0373C6FA475A2E30D51A5A912AD4E6F7213BF1FF38C1866EA2697DCB37264BE8365933F6A56807524A9F35D4C5234496015E54E80AB7A39F95B2D5570404D3E00A66B45A3A3150F0343F7CDFBA19EC6DE1BB814EC33E1CAEA903F80864800BBE1D6A81F9C74965D0E00D57B2F9E794936432C6D9CDE9656933250278FBCCE0B1E4964D55F37DC7AA73F5DBB39D199DAEC338B74B89C64F1E59E5C254EF342925EE3440320619C8EA19AE812750B9334D0703D923D9E74CD606F98080C4FAFA3EDC026C16FA234C58415BA0346B229A9ED01E2E7BBD10F4EDEE2E734E95F77BA96F985CAEB6485A47EDD70EB2BFDE0E49BF89F2F66A02DF5C6A18D19D5957C1D801EBEFBAD5593F469688404308BFC95256DE8865B8F32CEA73E38F35FEC54311D404ABA17687665342DBD9EE0BFEDF426A75F7EF233F567EE0D054A5BFBC1C9EBE657B48DC37336E96FC67D1EE37586A024080985568632A530CA7304B80C15DE73F7683B40DB40492A51253ABDC91D5CC21155E63BBFFB8D28AB2E38F119EC0D5F93D249525C4DB2DB049818A8214C55C00195000A12E5AF73E9AF85FC4560C85F55D2DE5504923F5267E1EED176E84AFE067BC3875A1B5D884476A5B1DF5A07D247D10809A02BAA9E0549365E362227A5B5952F6B4687C758C0E24C1B368F345CA4A736C99FCD16CAF69E51AAA8DD03CBC61D2FB2F22D0A57091A9603A58264A58D852E056796C3FB0F077BC3EF0224D7B4B549656D2AB1373FDE8EBEF5D4500CBB24E5D32469A0595DE915134B2E25E5C4745A1BEE865B3F04809FA4E99AF2EC75072E640090963E8391D80EF686219DBCE4E96B3CB270F81860DF98E7AC87C48FA3961240DE016BB3527EAE0A1B15970145FB003592D8358BD7D3735CAAA3E419024C4306747A93B1277FC56008B42A6D43D8ECBEA4638E76375F90EED10DB7A24E6F726A9B6408EDFBF33007A476E6324141F2F7F8D1A797317BDCA4E4CF95BC4A78F3E3172657FEAFBF11BD7BE321004C6D30A5F7CBA4648D1A748DB9481700D4D54D783B6344E427791F27A52FBDE0AB65DB2762F7683B5EC54A781F01A601480732C731A429EDB0A6206B2C6BE46FB5023FA7104551ADB737C7CF477CFFCDF1F38FDF1C3F1FD173DA35B663D279E97EB86F4B83E7B3EE632B0BBF8794E79BE3E7A36B8F7F3AF31E7E93B70BD7C33B17AE87CEF527D5BFEB7B7679FFDAFBBE703D1CBBB69B32369EB7509E5439793DBE397EFE31D94F957FCEF7764AEF77E17A28968996EDC2F5F08ED93F95F2FCF2D9D604F3315B229DF4EEABAAFF2AB70BD7C307587EF2AC63AD3FD3DAF7BCED3EF706D0C8FA767C27A717AE87EA9882ED96B667292D7B3F3796FD5C8BDF0EEE97904734DD96FD2C8BDF6AA702D666359A7A14C5E5FDB453C57D0078493296C53459F7E7B332CD1E86A70580277D123F8E4B29D8FF384488763F7E1F132BCEBA06B2870C1A760120FFEA1F92C4495011DFEE07276FB8E429BD67E97F1533FD2CF5AF313748D82665A948CB2E230555DBA3DA562AB70DE45D8DFAC14907F3E42B6350355C960AB9AE30EADF2FC1D4CE6C93AF0062EB17F33CAF9744B9C3D8B05E46FB55FCB6A2492BFAD6533F68D37AFFF2E94F4FDA1B67A97AF56AF84501D5C22BAC1E5E36038D225DFA2649DDB266A8B6FF2E69B57B669529EBBE59523F4DFA47D35109C585EBE1388F24CB6FD359B7F94D49AF6C6DC426952D221191AEA512192ED95A44DDBC397E7E9C258146A9641EA9C41CEFEA26D98F6CEF4C2A33960D7F2549DE85EB612C4DC7B65185C47799DB973F7EFE09AF0741726BAD57AD3DF8ADD886DFBA569F59FD8DAFFFAAB783B5A9DF5AD9006AB675DA0C5FB205D43CD7781A9A96DBBED8249036FB179B9484495A6E735B46DB7DC9F56F03C49290C0840E5063D879A4403D41CFF8C9EE741DE7146CEF33CF2CBC3B0D9B91CA83489BD0CB168C14B1BA25B692E58AC048BA34099F2957C27B9D0716366D5A8D959907A3E3F6B54E6F12513B572EAD95BE5D9E0F977875A76BDDC6F9FDCEF93F6D99749B988EA4AD977AA400DEFD2F871BD4F39707C5E65240529FEF48767F7CDF231FF05B0348DB976AB6ED7CD9BEF5A97F17FBBBC3DB05F2255EEB780FE95E2B6EFF07357102B1A87653E7E97FFAE1F0C1920F0E92BA8DE74FA11938D332F20FD8B593EC07276F90F3F11270FC598401F90A8B1B157B037BE4C6263FD00F4E3E62FF131DB3D4C6F2DCB01F9C746CAA9B7E9008D4FB4BB6BCBA6419B932A07D6383BD21985880A99037786DA7371993E34E41AF6DC0490D257C749F3F3BEF3FA480DA26E907C6546484E412379BEA739E775E035C064890F578A2C1FB3856575F90FAC086D7C55281EB4E2324C18354A774D9BE559A9C6463BF05707865BA7F18C9846CFF8DD979E77C3766D7A06A97AB78579FFC01D48000F201168F4BB65092F48D0FCA9C3CD9EECDCFF38144BA5E2399F498C333DF26657D9A12C80CA96782B478F2971B71BC2DE205ACAE33CD0746490A588004B6A4C177F7687B13A57F982E239FD7F3DC574216D931E50200D8E493AD6EB815FDC93FEE433F386995B514A1B1590348B6F394A4B66F82734BDF8AA9C34DFA9F5CF7B2B1BD8AC39A98767046D2586DE08ABCF365C1048D7F1FFF9BC9C5652D7D37DC7ACCFB5CE9FF522551ADD6FDEC44F541D7C4FB3375F6218FC3C8DBB156A7445B85B16A536BC7AF26F6CD6A3A48D00E2380C3FBB3FD385D465B3C2493461EF0994A019114F29880AB49086BE70402207F085A870F201BC5DA3A692DBD22094C3869489D22BFA7ED23767D2E4D2A8986C3DAB379D8810430EF1AC0F4BD4BED671E60BE543DC757AE5804F2105CAE4A2C522728C146C71C7C2F789E90F4B1541779CA8BE5FAF2E94F4F7EE7DCBF6A9B7CD5954C8CAAB8F16B6C9BB8899BD86F48312679BB96F69751F6A683B6297C0F78CEA675E2E3C1D99F7F027EF727EE658E55AB0D8DECCDEBA0C1891D259A2BEAF841B07409A00449D227A5D124865C8DAADD43533333C9DE79E97A7A8D56260A36134C490FB3A40A9DDE04BD7FADB1EB3C64747A935357F2C7245D54BDA9AE87DACD584546489F686738401B952B20E1A952DAD4252B38F04165B037E47648A1F9BD6582D302802C3D7429B3217D6893B909443ACBD3B225DC12DF114C3DEE53F7A52B94D06FFD77CEFDAB36AA7D4DBAB34E6F722A90C780BE23E999BA25D93B56854E6FF26074DC3E87759197FC4992EF3C7DD6BA83B5CB4DDA8FF07AA4FF3BBDC998FEDFFCCB3FB68E85AB0BAEF6A5E48C1F73CAEF9DE4F5541288BF346F6D7F75507B09A04DF247E1A29AC94A23497BF0789E3267A47BDC372162343241EF8B6103CC80750B00AE7A09603E747A934BA80A3376383B2ED23FDCD7A480F394491A7817BDAA8656265396332AB10090CBCA438B48F9B2FA47A95FBC0A82C1191829A04B39856FF90990C99A542EA3EE7F8EDE874A665C24884D01E93712CF87FFA5B6ACD42BD0341EEEE8865BE3C1DEF007BB47DB17F1984DDB63343CAFED1E6DBF4755C574951092F71A49013951A3C7385CC3B61CBE03B0FF7A32D40BCF07EFC3F757473A587B0920973098FF4FE87FC9868EE683FB343FFE8BF7A3BFF43AD7327374D39E9F4FD38E56239AB8FFB9B73EFD197328044FFE0A81908F6874DC566DA038B804C4366BB7C126ED359D7E6C8346F7AB044A2CF9B3F583D88922260DF41781D24A257E1EB0B4EF136FF580A974CF4C9B76227F782FE13E09493DF75036C7BE09247EA6690FE7A4EF8EFF3649F2D20DB76E63AC3930F69484507C68D25855BDBC2F6DD2F32F1B5D13E561B037FCC1E8B8FD22806C47CCDB563F3869615F85EB6F4BED985EBB7A3814D695D6ECF1245B3D3C6EBD4704F18A4C94FC65114CCD61A4C158761C1A697389DF97271652569C3E8708EBF179161B2B7714722DE621DD67F1E16ED208FECB7E374DDD2E5C0F1FB095241ED8DE8FF6DE5DDBDD9B66250C5B0C4921CEDED2DFAF4B8C4B1E574E8BB3C7EAFF1457A0E02B7AE428DB482BB314035029476AD50F5BFFD0C4986B17AE87974CD91FD33A97E24BDADAA48F3937D73B88E3586A7161A50D57FF30798C6D79ACDF7610CD62F4D15FBED1F4AEF9F2F43CAF3CF93567ABA50A9823877A55740491665AE4FF937E094167811C0000200049444154A12BF2C045558DFB34D48B5FFBB73888042A25699254EF544AAB3938E46D978A8AFF124AC8A8B17EC1C72C04A2D6BD353A6E5F33D28BF83C0BC1926ABB83BDE16BD4DB1420F640BD368FAAD7A5CC9A1D1B07AA3F81A97F47C7ED73CCDE33B6BDD4DE7BDDD10DB7EEF78393970192F6C2744517844D2AA5B5F726D6C922D0658E43BC5E3BBDC918D7F6A5C7A5714B5AB5855E53E573D41FDC8B974BF13415ADED3A3C0E0070F81860FFE9E475653A9ED4078D20802ED03A25C9B079591F93462AB2C8868FFD571E685D6A69341B28CD3655B87E0C001FF705EF714DAD660688CCB2550D57551F3E0FB1053C43DB3254F192DF529FCBA64693CA486C005527201B496F2AE1A1CB1E4AAAC4ACBAABB8782B876EB8F54C3F38F90889A0E4656E332FB2F50D786C7DEC002592A59136C97E2F3E16CEE2FE611E348D46E4AAF23AAE176A6903D825DE89AEB07D0892FD1FB7715914247B325A4EFABFD39B3CA08315DA2C2DA6A4AB0529BC880D596D24A3BD6DF485B5A06947CE1D2EF0FF32A47FBC2D52E91F827F3B3458B321819B00B3556ADEFC783B82A9BD5F04333BBF52A0D925D2F3D2B744CA77A6113DDB7DBA35F7FAA5E0E44FAA13FAEE359B3F9A268FDDEB9AE28700D3EF1F4027DD12A1C3F6D7E94DC63CCA8364A329FD5F2D48248BDAE0E166257F00007FD31244BA0570A8446FD0EEB13AE40FA0A604B06FA2F5E7B9A61B6EFD3023C90724EDD23A319BC1393D6E82E23E47A47E2DAFFE2D06242B461D690577D0B111F62CD07C681E8243C539BA30BC09597353CAB36CD001A9D39B5CEA07272D128B50F51045E7896E380D5E4D48630800F0ADA786717B2D6BD2D20DB7EE6359F05722259DDE243E8EE547637C5E768DD4704268F25AA8A9C83C30751E3B1465B55FA11E422F19CC073AE9236615782E556F9CFCF5A74E201B9C380A6DB13113916A40C3B870C78C5468973F10C2C77C30F5023E8C00F69F4DE7C9377EDFD5412D092000403F38E9E44CFF29E5387E642FF36300D593419EBF66AFC4D38D8EDBD770E0F452BFF94006C34023D136DB31FAEB0A8DECD9A42E57FFFCAF9FA1346D74DCBE96E77EF300CBB37BB4FD1E926424825A1B9588130E6034A073C9EB55FF651C2815E9EC4F486BDD02A463E06179693A4D3AC3D3360146E2B9090021C696D4DA1D1E63BF1B244D48CF7902924637DC1A639BA1123CA92D92FF54FAF484BF1F2E8927E71B3311A90692D7AFA49A9548E17E0B60FF6588BD80B5F02F7CDFB6667073B13236804D826697487FA90A0760B976614D0671B2C80C02CDA55C9A5DA646EE785EF43F231B8FC1842DE1792ED209A44B56B9E16500D09D3F2475291EAFB2BC525924F0F766EC1327D2B3F2EBF01C6F07653F439530E4EF223DA6ADDAA2B5D3BCEDDD638A2CD302694208248625AF73291FFF1E3878AC3E84B6BEAF6DB50F1B21F471003D0A82AA06F8472ED982A04D95277EC5816BA152D5AFAD3EE9C0280D9254AD98D509739B39F6AE9FA6D7777A93F1606F78668EDD9AF3B19DC125095826240B5C454A9F9B4BC7AA1E9450C2C28F4BF7EDF42694FCDD322AF6F3923A5F2BBB24112CF7892AC573E6F76C74DC6E516F52DB7BA26A716EBEE0911F46EAFA8E76BE3B5B65288E61D9E94D1E68ED7311DF59F3A0913F7A3E2B68344D43E30A4A3686787C45B0EC3834EBB4D96200F263758809B72A1BD6258DAB657B47B6186839E2008AF1F1F8F517AE879768FCBA45D78D2D065C56ACBC65C62663E57CA094FF128DA349EA5C8CAFA6BCEFCC3653C7CDC4FE3B9562584A6DDC16D3B148ECD555DF780C581367F454AA435A97DA7BE0FF3196A594CE1CA36DF89965D7C772B68328F9AB9DE76971D3F291CED9F26EEEE655C015C3CCE63E0080975C5467466A1182B157235E94DE0EB0205CD6FEB5497A34B5B02D1F7A0CA6365441563EC476E821755AA8125CAD24A97A2555A04DC5BD88F24AE518EC0DC3D1717B83AAD5CCBAC581F45E5CD4FD4D033579F8ECD75E82EF7D75EAFB469718B449F5B254961E337459DC3FBAEC9E84AC3EA3D39B5CC265E06CF6AA1E7990E9250C49B5AE14F30FD3AC1E3C015C006C0443207F67E06DFF4A4591388A79084E37DC7AA71F9CBC4EAFD5ECC93888AA12B08C2ECF5405B01C58068D0C2EDB468EDF970FBCBC6CF8FECDA01AF6A751069642601701160226B146B2CDFE8F9E2787BE0800DFD19C633C66E071FFF07856DDF1B47CD2EFEBDC0587E359BC3F89CCD9D4C0D67C57CEEE8FC2DB00568C2CE912B7B1A2E4847A537ACC8533E20022923FC9DEC9B5D3A5E48FE5277A4BA22D8F644FB70CD067D7D61ED5ECE7C0ACCB4DF27944FE5FA9A8C8897211F2F7055AC6C1DEF035733E26B55462C3F3A9BAAC8B00F1FE050080C1DE3041FE705F7B5E6EEFD90F4EDEA6E797DD56EB866EB8F598F71D79DB527FEAF1FB1ABD76F7687B93E6BB2AEDB31A1C46C960CF54CA678B0198450E579BFC0178025839B831B5CD78BED39BDCC17D12436D251BDEA2601C4036B91AB8CB828D4B8323570FB24E3E456E046789F32E240FE33C167DC6798013141A72A21B6E85C2B388E8B3D54EFAC1C9B3E4DCDBDA7545CB2A959D1CFA2EB9770BD5692855C95281367D9035B123BBF4187500A1C735671EFCF56A60679C1FEC0DEFBAD4912DCDEED1F67B64DFEAFCD1F4765A3E8AA86CB9E3872D5F29FFD580570157048B3D1800C836605C05ECC95F7190B568E3F55FB342C0E0BEAB7D9F06499228D9DAF1FC16B9D673A737798076869AEA4A82D6A6174912A85D253F37D81B3E1C1DB75FD46C2DA56F0ED349E7CDB184AD579D41D5BF6405A14BA3E3F6FB36FB4976FC513F387976592AFEA681489CE360EE45EA0C4D1970C2229177AF0E96703802D8277183B9E4CE16DA65BDE1258025824B95CCB144A8179BEA6FB037BC0564B17A8FE230E40FDFC719DAD5486969A7CAA54428E9CB3303CFEAA005E78FD345ABFA47C7ED1771C50CB39CDB431715F822D5525DB61A50D7AC04621000513F23768FB62F9A89D4438029B945E926B57DC3CD36B8A20ABF29E4CFE0FB0049F31189FCF17D493A9A25FD5D67F06F001D37B87D65D637C2CC2F36F118598DE796F6EEBAE1D633E53E5553C1C95F7CBC95DEF7E48FC213C01241070A4D9DC20750BA8FAB3F2C5212B4E208614AA8CF99A5F412F67F5CC221BD2B54632A46DD949024C007569B53082D57A737894A5C3923059E375921E2A2949E0C38213D6EAE79C2D2948A3E5B0DA81F9CBCCC06D4D8BE8D2E5B07302582E61780AC642149FCF0971FEB3768C5854E6F72D34C7876B8EDB024C96304E5FFA6E7518DEF558D69E0249FB625EAB54B575C31F840AA47722C140401F4EF73A0A01F9C7C54E011561C2EB67D59E7D6079E009608490208900C06ACD9E218D52F55DBF8063A075CBC7D25DB3E7A2EEB1E8690DC96CE49D2262D5F246584F46F527BD079806B0A1B8210AB0769FBFA3FFEC93F498409A14488D44D42DD6ADAF4D3B63AAC0A92048B2F5B47B17BB4FD31403AB8B326896FB0D42B14C8DF33BCBE847AFA497ADE5C67F55E5F57D0493E3A6E00C019B62BC17EEFE50C1BDA0D80D8FCE72140D26E7374DCBEECEDFF6C3814FB5F799D606D99B7F5852780154252037089031D608DF407D536BE81CE870FA924D52655E324C6621B251D7F835EC36DCFE8F53C3FDC4709A579F70FB1FCA6DC375D1F5883910C7DC910E210EB05B7BFF677FE4EA2BCDA44C5668C5E2569B2D9CE52290C1E3BFDB34FFDF9606F7836D81B864854E9B58B52612F12B87678A737893A7FE3B701207626484889B4671648FC773D099481F5313A6EBF6F62B67E3FAB5DB91CDB3DDABEA87D5FDE1E53C3FE1B0087EF08C799ED5FEC152CA45D5F78279012A10DFE12248960A737198F8EDB1B7CDFC31D2410EE18007E80B66E59EBFFD2FFF4BCCD89A02BACA56B33AECF28F7290EE000C9090079A63BA3E3F665DBB303C01D48AA6B130E30F497DE87A8749F02C1B9428226D52E1B161BA8940A4E289FB8EE3257072F8ACC5609AE3590DABC6B1BF5844346467F110EF686DF46531EDB75FC9CB1FFBE8A4E24786E51DFD8EAA278081774242CBB4475829700968F9FC01DAE6EE252148C530630EDBC3FFBB59702DCF7E4AF1846C7EDF7CDEF0600BC600E3FA4EB01537075A7A416B4EC27C81FCF9777DA9AAAD478E49E33E56E09F11FDF35E72E9B386FFC7A7422790FA6E4EDFB3055F5AAAB12E07D84E70A00E057B5EB68DA45498634DBB53FFC8D3F3E0348C62E6413AAE8E37FFB57CFB310372AF993DE5903113B3A71422849A9F9F915AB8BD2C0EBACD39B5CEAF426A7D8B6CC6FC009830B9136AADE6B26FD08CD81E8F9D21E64ED505CD5BBEAE40FC013C0B211A2CA459B65D363BB47DBEFF58393582AF3BDAF7EB0D49870AB02247BA3E3F686A9DB176D849A10BF900F921A69EB865B8FD0E6539210724269234B7CD9374A56CD20BE49CD03E8393C6FF269C134E8F5651A4712D5DF262D77E61891723F6DCAFB7569D0E1447891039344027FF11FFEC2A676CEE0ECA97FF7FF8909A26692C1AF6FB0CAF38C4E24E80949C2E9A57CD9E82A8E5EBB47DBEF8D8EDBE7B06DF13686B0D52DB70F36B880DEC05EFD5E35BC3AD8AB80E74437DCBAD2279EA2D247CB8F19713F8C8EDBD78CF81F076AAFF62D098644058A1A2C15D7CD3618BAAA60E8FB970659E97CD6331012DBCAFA4FAE9BDB8BDC46182816451EB206C2BF787411FED2B30F13C750359CF52EF018A6691A213276A2AFA0B9031E47F2CF97C903703275489837AC23BA261EA2D97FDC0F4E9E7631F3C9D37E4CFFFF1A06828E266D78F7C6C35400EF26B6CB2603C70F80D5B6C7F712C039D117C28430FC887EBC46BCFF25142F13F21799C13C21FDA16141F09C51F9DD31FB37E9AFC74CD24555A9C63E0E815EA163AEF2A2B3F22CC36E099234900FAE393AF28049FD024AEE90FC91E73E352AE29067E45A76FA4B8FD7DD46EEED9FFAFDB84CA896A3C1AD6D92192D4D93C0C91F004037DCFA3C98418CBF3349FD8BBF280DAEB8C8B5473FB9AA4DEC480430ABAF8F1EECA89346C77BB490FC0DF686D06A4F522B811814FAA63D8A6174DCDEE06632AB082F012C117490C79516A8A13A1AF8A26482C57B429C196780C40A1630B3ED89D57D66B07FC1FCDF208E042B6FBC2AC190E24B308BFFD7B2858391D47F5912DC2CF293D5F1E7254F925498780BBF5085C4D865F05224492197AC96551E4DB2CACB6493F26969F833350DA61FB808D33681BF2F8C8EDB1BBCEEB4BA80E9327A5FC0E30B7E845AC326D1A7E9F23A6CB0F162BC7BB41D64690A24ED8587475178096049C08F95C46F7B8ED9FBC5AB1258661521123820F1DA4810E358956348C04598CEF051521418E299207F92E3C02AC278C87E1B483DD962014A52111BF971B1E7C17454DA37A7BDDCFBFC80690F56BBC6A228486031DCCA420626DB20DB0FA6EB1A73692695C4E27F7ABCA9A4C77888BF08D3092206F3BEC855885CE209907AD75F90F26FB254B42CF076933521B449932502DE0DB7A2DDA3ED84E73DEDB3D935957C6365C51DF568163C012C019DDEE4017ECCBB47DB3B661DC7CD68D24E7510A3E376EBCB4F7E26FA937FDC8FFF93731BE61709DC1910AF3E6AD8CFC4D321B9FE22AA827EEEBFFFC3C87424CF1135F2295125AFDC478F759757742FA93939919354A3343D4D2791942224C316F6A56C64492F34A947D5C48F4B69E92FC04CE5DBE94D4EC9F11F4912764EF65640F58B138478D2F3D7FF8B37A3C1DE30D4DAAB8DBCCC2B15FDE57F34B991277D13207D17A71FC5DAE1549BB24D28A4B64C817D378D09B888C989893050D90A441EF58427800581366586F45D7CF3E3ED68B03784C1DE30C4D977AB3D497CE4A802FE9DF37FDAFA17D77F9187FB48D878A0D48F4BB038B131FF0300B8CBCA37FED9FFECEFA187E926C96713A6C180C79C5C1872486DE51A076E07E502CDE1C1663786FF2D2AB544DE4D201954EDA4493634DBB132D1252BEA64BD03809907E6EED176DBD854C1606FF8491A1E86E62311FD32CBBF6860E400EC1BFEB7FFF15B2D00D8E46D398BDCD3FDA2EFF59FFFFDF65B45AE6B0ABAE156D4E94D6E9E7BE651FC1F603A9936FBA9F5A9F9F5B8CF279966C2122F5B58C90310605F6FECCCC7366D89C76AC213404708C4E8D73BBDC929AA9CDEBDF1F02EC04C8A47562110A5403410EFEED17658449D4706CA3300D8C1FC90147EFBAFBE9708FC4BEE790ED8CA2326DD391244B9912822F9A31D7191812F4B6262931CD60DDC21824B2104229592349580581D46CA739F0C9477F1BBA318EC0D4FE80400E3A949F65BEC196AFD4E1C90F896012094026303B8077B6E3A292E13BC2E768FB6AF024CA3391087A31D93EE7C2A0305F89D3153A1C066E75A32FAB8431DCA9A2E04F0708727808E20AA16E8F426A79FFDDA4B57810C54BB47DB3BE65C144D5AD1EED176609B796307DDE94DA27E70B2217DEC598313AADE0C714B4906513240EC085B207893F1B021D819509500EF14EAA63E46D5B64B0894EE747508FA3FB2BD2B9B9A9012479BD450B2C1AA1B8AB6C17924464A9E52FDBC44CAF10923794F24181DB75FA4C730FC89EDB916A966AB0A7CF2F8B9B72E0679DAB1261D2D03BFFC8FF24BE4EB0AAC1B12A8F92AAE412D99804879507227104B6BC8A52A60247F7CEC48D91D7BAC263C01CC80145EE5B35F7B69F37B5FFD003EF7D6C5C0D8FBC531C746C7ED56AB1DA5EC8CF8878D86EAA816963E7C9741C9D6518C8EDBE7BAE1D663ECA48C773092CD8746FAF8844A08511D60B2D8245285F74C7D20297C85FD5F2A8C543326B71952CCF32EF53CD81B22416FF1E8FC1C1291A024A3EEB666D8062547160A6900CB522F96512EDC0798DA47012406E214A4490027AA757F2779119CFF37303A6EB7BEF5D45095F269EFC9260D9C07FFFCEF373F8C069788A3AA9412360E5B3DD24995F49D153163B9B70357F25E63CC8378A8298F3582278002486CBDD3D171FB1A25470000BF73FE4F5BA3E376EBDD1B0F63C2615B6D00C1254FD45B11210D52745F1BB02CB3F8582581AA0BD389BD6854D84F63F9697C39A55E2220A410D5C65857D2358B02277C2E2A754A2E067BC38783BDE15937DC425B4ED83DDAFE80E4778E5C7783E6417F115C3288C78A3EDF02F0AF7147934268DE8F45A516DD70EB1917A9A346D66980E3C1DEF0A1CDCE8FDF83DB5F3519F8ED854FFE0A8D157AC9D5FBDFD4C17757A12EAA006D273891C673D244338BFC716921C0FFCFDEDBC64876A5E7614FDD6AF670645B64B412B598DA6DB6868EC944F9D8D4903566B7493A829701E269AD3C143B40A028C9BF5D2200DB9950DEFC9122FF8829D11DB51383BB0E90D80882C06A6B26BB6AC23F8689007231454D895312027F0C21CFA4B7C162B85C6BCD9504CF4CB3EA567ED4796FBFF5D6FB9E7B6ED5ADAA5BD5F7010A753FCE3D5FF7DC73DEF37E9E6C6638673BCBFBA8B7F056685A428D459D62AA4285D8D097980D4A3F800CE4BBCF7DD444DC715F7C439C05C1E14982CED3354AA371854877843880BC1E3E057CF92FEB21CB49AB4F282EFCE6FFD6FFF8BD5F48CEB9681918DAB51EBBFB335528AE8DE1B95D72E8008CF866E47E187D6DB2DE4FC8BB9D07B67B6B8FEC578F7EA871F27CE2AB50A2D053EEEDFDEAD153C63DF55BB1C63B902C9C7F402A18EC5A95360159B9EA8B08E60B907097FB214DC3B2F64B1E48FBA60929845F323F515AED5B62F3E8D39DBDE8D6B4B8EB4E8527D11B0F519D29B17C2839800C8E254EDC236E394BC61A0006C486B2203D2C172F3E61481DB3CDDD751EC43EB11CF3E99349C8854D3EA7ED3479DDB47CF835BE1BBCF59FFC62C5F5C1077CC220BD3BF6E8AAF3659870097D6DC803C4E9F04D60C47D955C25D937CFBEFE64C20D25D139F3C3A8E53B122D44EBCFA2719BF6876356BFC68ECD8825D6B8CAD2368BF893B0CA920BE2E6EEFA2A117FECDB5AE57ED57CE2F9658024FEC84F244FE3793F3D8BA8D936E2E08662D1F5FFE43C99757324EEAFC8EF441E933A919BC79A328D0FED06B2F6F58FF39392F83B9D28094087DA4E7C958B7A3777D7EFD30749041FA5EDEC45438AEF69223383E5CFD39D955C184B87504E1A6962327E8FD7372D9FFDEA518529D17331C78FB93EA0DD6AC275A39F24FAA64D043A9D30D265B9A6A5D9AF1E9DD5F43999C8F778BF7A54891E7AC09F09D2FDD3C489FC7DA52D0EF3C67EF5E80DB16151C55A3E4E611EED93E3D6FA06E89DC974DAF7E8DBF82C11CECB0B5A5B0D51F88A3687B87B41C4BA068DF85B3482907FD782EB3C92868ED3F2E47DCDF3A4B989D482B87A83F63D4AD45B182A3B8D20741B8432BCDC29C7A9170193D8D71DF7311061AE6EEEAEBFBD5F3D7A51A6D7C4528EBBF42206E1945245657C02D144C01AACC9455BF4D20852597F2D4F9FC8B8A6849AE322586A17BBD7C720CAC9B4BCD83FC0E09D6DDDB872782077B3CED26D850807C3DAAEC7EB0F64138B65DD0C1415966A8125E6CD22FED5CA91C4A4250296D738E8797AB7DA3345EFF749C03880436A0ACAFBEB71822FEDBD2E739FA561DB855CB324057CACD1FD94FCCCB9D6E547F34FAFC342F859F9B51BE873A24F9EB3EBF7EA2D24719D1DA1F9A50E8B1D5D72FF4E2F4E2D01581B8450BA45C4031CE1078C7E10A16C7FED5CCB432E54BE0959E3B64862422BD39AB8AC3A5A69E4221DBA28D44EE21253FFE63ED16CF7D6EEED3B23164700F430F081B64AC7103A9CFFC1DFF819FCFEAFFD4E427807BEB377F7AB472FA4D4458D2BEC4B53341863E60338172C1CA10456483F589C2ADF7B2191190095E8E3E97C9CB07109D822C02DE65F011BE7DBBDB58FF7AB479FB7DA2ED003901A7F761C10B76FD1AD80B58D0A396C263503DF6679CCBC470879CAD722F408C4F9F3A521947A7F254E2D014848331EF01160D6394716F19FC5114923E6B4E7B4BC797B78FBB4FCE43D994F081811C8C5E7D350682622330989C7B882601336E0DEF58D2B8777C99D08C1D7B66D23083B2742D93593ABC5EF676EE81421DEFBBDFDEAD159AB1DBECD02CF2B8DCB67719A2D82ADB6135FD8DC5D7F5F19E743DCDB90CD934CBBC87084E06560D43549DA7C426958763D6D9C9718DDC423C530CCCA43E1261ED3A6953B82CE02220CE5BF969638C6A5F14789534B00127162DDCFCAA508E19AB11D5E4208F976DE2144A68F98CB9A97757F1202A6B613DFA43893440CE639E1D476E2076EF21CB9C7C4EB1FDCB872F853948E384637AE1C669EC02DA471CC005B57AD28F08DDF342E1F1D5B9B88908D0C1DFBEAC7446500702C5CC1240B29F37739522F8B985F3438C2EF12581C608BB3ADC1230D20F1E7A5FDEA5166F7228B0EB9A993FD78E3CA213A7B51E5E5CFD6FB95280630BEBA486D27BE49464C37AE1CB600341422BEB35F3DAA0140BB81D7EA2DBCE18E87EAA511801A21C8094077EE5D0B4B2C2F4EA511081FF02284920A6D2295D7F8391D6B13B17423A34D1CDBBDB5EB964851FEF8731631C89FB5DA23F39079C936B9E3E7AC7C587B29DE70E27094AC8B5DF48E205F651C2F7FF678EC9EBF09E00F88A823C2CEF5718BDAB15F3D7A6A73773D76045FD23E1E2982B791AE85D6C7A5A5D07F4FF1BEE6FF1A9193A59CBCC1DFA9BCAE1110721CC83E4B7BD61AB3923074BF7BB27EEE9D713DCD559E57672F3A4369ACF2DC758D93FB554F571512520F9720FB549B2F94F1C83D11ACB8FF5347FC01038331C0DEA891770072B81D32AF8AFC93FC687E747358C3485F63A7BF4E07F5162A9A1EA0240CE9BCB613DF7173E679774E3A8025F157308C61D53D164E2D0710D0773EBE5D6FA87855126FEEA3FBF1CDDDF5F33EE5618BE8B344655AFD42448F1677535BB843B83F5976BFDC7DCCB846214CF729E104C11103521F2C84C39A267ACC0A0F61AF118073E346F9384516278FEEF1E7B5FCB4FEE7F95A75329E4B8C17F8F3E4EF4F10855E3DD790EF68D12036B0C72E0250507F1396A52FF28635574A494E963CE475C7D90ECA8B73F4342E1FD70194DC3FE6B4BA8793CDD3356B235162B6D00C7B80D17799A6079A05A7920024BDBF8098B15E0281902686650627B4E30A52B656269F11D184106D0DE96E696D486B634AF9B92DA0E358A091F5317F7FDC10401207DACE362B813B2EAC72D871174E013FCF7253EAF4DC7EF5E83BEEF863003F29D3F8EA631184DA731A0192C6F9D4D28A323F01F013FB03D159BF936241EF236E65DE8B0839AF00A3734BC89C55428732BFFA2CD62D1DE121C7E7727DF06D9078FE1E2BDF243F8B40A073B6F92EF5FE1604598C7AC6C1A9140113E72944FC0B0C8BBED2D230514B2252E1C1B5B908923FABFD2BC4D790B181224E4B25FED21644519EBA806AF742C51FC030C7C2714743F115F23D48FDC8397E3CDFCDDDF5D5504E13FD6769830F52FC26AFB9FF9973FD18F1D7DFAF1E7D9ED565484C1D321EAD63D987726193FDAC8CE1A4BF5CBA0F581E8FDDB87278CCFC730EE5A3D5495EB3EABDA0D897A1C87C049F31E77C92D7B85F3658DF0771FF68FCB9FEAB1A793CC5D2A863507E23320D304CDCD1BF4614CAFB8CF8A3108125F15750D0FBE2E7C0E8BBCF13A78A03E83E826F03B8DCD98B2A7FED87FF7EFCD09FFD57FFDFFEB08E0580C1CE0D4C993F6D47ADA56113C63500973777D7EFDFB872F830309935EC249C0B1F572FB4AC10EE8E96676D27BE00609FFBA042061104E71A1211008CFAE42258E2485F5B0C91E63BFB8A1B98EDDEDAF57DC557A4F2BCD95F92BB10D20F79200FB1605ADD2D312C9DFB0841AB3C1295697DFBF267EBFD7FF4D061AA7B9F6583B5A8A78D3B9E7699FB671258E35513018BB9E6ABFBD5A36F2AD7CDFCA4F1878634C30F7E6D6B233E06B07AD08C401C4059E712C5828FA807F2E7049E3602B0CFC4862322429FD8CE074B5CB55F3D7ACC959B846AA280DB7928DE5A628780E75245BBDAE29E95806269D4F8AF69EF83A763A77765982BABDE542F595759DF903664C1B610EF16510C19D21721CF6B6DF48D9149EA4C16DFC4EDA505936F06ACF6E4517ED1E08CA9AA60DC27AD1F7C792C5B9FE409DF068EA0CC91DE39599B6B42C6A8A5EF1762F99BA7CE5889E962E6EFAEDFEF9F8ADFB9577B0FCEBDDAEB9F7BB5D7D7EEBFDCFD629FFEE9989FCBEBD6B39EF2FBBEF2953C6F8FDBD697BB5FFCF8E5EE175F0B48773DA42FD2FA6646EF2FE93B5EEEB9577BDD73AFF61EC87AB9FF4E96772DEFBBE34F32F67D571B0B5A99B3EA3B5F5DE47BCE5A275FFAB4B68E53D6B9577B7D595FBAAE953D8FFE9EC5EFDCABBD0B6EECD3BCD27DB9FBC57B56DF1BBFEEBCDB51B45FCA1C7E93FADC9DF7439EB3D2A48DE17EBF8F5BCFF4FBB79EE9DFE3E7EC7A5F9ED3F1B9577B5D59C7F257EC1FBD3FF93EB5F79B5799A78E0308A8913EAE03F8B24F97C9421A27C7F2D5355603A684504EE238E2CA947EE196BC327C1CE76E245CBFEDDE5AF7C695C3EF3A3132F7A135125DC5E244110CCE4F5A60080000200049444154ED5445B2BEFCB77B6BAFED578FDEC8BB4C5F1DE85A9A1A405A9AB4B2C6ABE970F95407A68795F801F4BDCB49CA2E3A6A3B71FF47CFDFFCEC8FEF5E7C481347FA74024F43FF6445C85C90854B1E226920A3366EC8C6F3F6598072AEDFD6467CF7A0199DDFDA887BCE197E9FC4BF3976518929C172E303D8063E9362E98D40C8E79C86EDDEDA6D47FCBCA82D88FC23B48EB77B27C61F463197B868B368C41F306C9020170C6A1F5DE7FFDA3D7EEEF256DBDBD98B5E22631CE690F4A6FB7FD0D98BCE74F6A295675F7F1200CEB3C973A5B3173DB1DD5BEB4BE26FBF7A5471FA96BCFE9FF0BA507D32EA025E0FE94709D92F5AFEE2DED4883FF95EA82EFC5FBE639E2E0BA1308E6E9FEF3ECFA3B61353DF25AE7F280FADBFB5762F0B4885E28FEF5E7C68E38D9FCA6CBC536214EEFBBC272EF78093B1C49DCEFBC697369718F30E45271A4923177CCD4D08006C6DC4C707CD88221B550180E9FE996B6089624013DF733F8F52BF33AF724F0D07500B47B63D1CF0FB3E808701BFDE18CF3364074D1FDFA23ADBB476BF80DF90C1E2C019DC40D537A0546ECFCA954D6B8B763D6FAE481AD771DA5C181FB7CFF72EF328D32A4349AFEA8872D476E23BDC8FA6D3FDBB43E1FCB4368AEFDB5B874503972C70D71E96BE9AF67DA20CFB9660BBB7F61A80D7E0DC0CF938A8A477EA4E559D64A38C118EA01557D882E52B6E6B231E0A87F8AD6605CFB42A4B31D64F2B7C9CC0BCB0F404208FF50B0C117F49781DEB23973BE8142E91B9704AE293C2A3E5D2C019C1D73EABFF429F97FDF3E23FFB4FFBD7FFEDFFC314B98809F42E585823EB192B9FB47AE7813411D2AC4471163128C67562BC3446FEA9AA04E3B6959E93BE347DCF847E9F8B082BCEB6AF4F7C44F2B4EBBB48485B0F00A01F47A84471A6F942E67BE3CAE15DE6114135826B37701DC0CF40B899E19CA0AD8DF8E98366F43E5D77CF95861F0B0ACD01F4D4FC01CE5BF171DA3F9FF107195A58860E3E63880CE5E7A6B059949FD63F63F4CB4D769C28B3FFD58F5E18329639F76AEF81562E3F9686012C7D97A7CFC3E861923EF319D4CCEA9D59F5C9FAFE6650DFDBEC587D6F5C797EDEFD3B8F9F36AF790C3E927EB1DEBFBB9E6A3C36EDDFD6FF30BF39D39ACBC6312A92DF9676CEAFFFD62BEF24F7A5A2BF34F6A07991DE7F9E8601E56FB6BF5BCFF455634CFEBEC5B56E5EEF7CE97500B55D95139F60BF7AF49425AE72F74D6E89A52FC5CAB8C962DE06399C2E1AB8FE9CA5DF27B94A56BFC873E28092636700BD677FED2FF47FFFD77E67A80EA4E4AF8139C16D39FDBF636347DEE3F5903A39BC6E5A3BF384A503A89537691D64BEDAFB2BAA7E181709F377C4F5AFE09CAD4B1F9069FDB63D70D3B3B010CED37BC2213100FD5D6ADFA64C374D3DD450FCF65F1FE6E6FFEC6FCC6EEED4748415CEDD716D27EEDFB872781CF28DD2F72EC6F15D96E43E00FCE6FFF80BC9054DCCCB458207CD68955FCF5B37AC44FEA8EDC40F343AA0DEC2902F59ED3D0AC7DE2B797178979A0064FA77431DD5D98B5E920BA326B2D4264AFA90F9B93109BC02C7B6EFEC4595221A7FA461BF7AF4182D96B2DD1C5C8468F50B9DFFFC833F1F6FF7D6BA4414D7FEF2DF038016806AF7DE8F523FF5587FBD2D45A6540EE9CD6CEEAE379C0ED41951E60AFF176D1B1127A7B5731C581B08D95F3CED766FAD2B88C4CC048B46E82AE57889F4A263DF8E8C9344E131C4790B2FF2648AFD5500773991A18D673AA6E7F31CE3D3862408A705FAEEE4DAA024A54DE96A5A1F5A7971BDC1FF7AE3BB0FBBC39E8CE4018C8AFDB636626C6DC4004E0C3DB474250A87552061080D19E6B41BE86AD15D7C06217960697500296EAC3B4EF486F8BD34C5780DA193666D27BEC3F43BAE01B88C0161B3308BCFB6110183DD37DD2488DDEE350097C8892F90BC9363A6C7F43480F70198911E2C0577BA26CB1775BD07E0614BC15BD3F31CA3CBCC7EB2EAEAA9AFECD34BFBD5A3B7D2CAF1E9AECA3A58EFAF48E075BF71E5F098C690681329C027865CC078465B8B02B780AC02A3D128007DB331F34A66C4CFFE46DC9F15B19706C9A5E7FDC71D92A7E5D36EA0FBFA7B6BD5FDEA51A5F597EEF7FFF63B7F0137AE1C5EDBDC5DBF0C00FFCD0B7F8895E38190CA8AF5CB17FEAD8D1807CD13BE4D49F42D0E4223B158915D342EAFE6F83B13E62DFF9EE68F9C04873A80A6FF34FD99C0B22F50D9EEFC41E8B38BF2B3FA863B99757DC0FB614817865DF73A2EF5E93159E9D2DEB12FCD34FA4A2B2B4D674BEB53259FEB229DFA4EACFA2875BD67DD9BF78FEBFBF163EB5D6A3AA1CBF03BF76AAFFFD37FEFBAFA0E2D5DD9A2EA7BCEF3F772F78BCF69FDF772F78B9F587AA434F6E49C2EF556AD6F9EE9F1D171322ECFBDDABB10E210985F3BF76AEFEABCFBB1FCF97F59D67FCBC977E9083A238405B01AFACD23C24DE0E34419E55E00D084B2435F3684724C295CD78D2B873D00E09C508D43C639B89C7B47E96F5C39EC6DEEAE575D7ED5903EB6EA3A0B6B5136D63EDEAF1E7D3ECD5A533C93EAA646A6D5FE65198BC0010486DE5BCFBDF721BD50E3FB7C1BC2B9FB3CF0CAA3E8BFF969BE5C1ACEFD0386AD7F35AEA77C7EDE7D12827971037DDF8D9B97BA6EDE0190E89F7EB05F3D7AAADDC0BD7A0B67DB0DF4FF68ED0E3E77F4440F40F5F5F7D63E02708EF2204E1E0F0B2A393BCEAFDF2AFF078BEB0BD896BE548FE9F4508971E138803D0C2481A96EE1346E9FEFFA38581871E498F82E13C39AC604805797CFAB4FA5A1B317DD02704653F85C3668A2113ABF71E510DBBBD4A787004608BFE700BC4BF924FDB5076CEEAE5FDEEE81F49ACE72BDB5FDEA51057B406DE7B0BFB9BB5EF5BD0FFEEE2CE25DA699AC477484105C9621087F26A4AD72F1F2B5B9C87A7F4A3F55E10C7AB4F609CC9DF80BC12B8FE29D373F85A966110A6D8360A9042C02E644FC5DA2638DF87BFBE7EFF43BBFF544A5B673D83F684678FDBD357CFDD923D45B786ABBB7766FBF35D0497DFDBD357A8C980FE788F0436B706173771DEDC6511F1B27E553040FB7C0AF3A3DBFD57A0B950EA2216310D209D388C092F82B34AA18186E752D75309FF36FED7C1211F0527300015DEE2E2749C04F00B2FBA48CEF253A5CB949DA65E400BABEA83AC2ED0137C010FA7F80D37D4CD1ABE962E010758450974413119A7C17AE703E46FC9BC9FA69C4D2B416494D4F92D7456BA74C27F3F11DCBF22DDDC045200A3270E87BFBCEF17311DAF5CAA383053B4F0EA0164211C3A11267EEEC7C1C1449DF8FA3DD409F117044E00DAD0D5F7FF608C0C01883FCBA1E34A306118412949FF6AD537A5AC06B3B71F7A01955E91A710B8113830F2B1C5CBE3D51222FD476E20B9DBDE896A5B7ABC167E82139C02501684058CA55E1C4C0726797451C97A16C6EF1B5B41F2713C77E0EC0A72E52C32FDDB872F8EBD2316D9A01067012FDC312658A72E9D434AED108BCB43ACC03A1223CABDE6904A04CBF08B0DA44DC621EFB793E359C3D9C0B9886B89C3AFED3AE9D264811A9DB50FEEED79F3D7AFEF5F7D6B8DACA838366B40A0C71F5000C36B6DC1803385998E5F777E3CA21BEFDBB7D44719587665BA5E739A1D7D98BBCEE5C4A426F31E1181CDF0670D9470FB41BE8D65B03C9AC46E0E5ED107AA9DDC06040F4AD02A86EBC310893C8456972129462DE3C3843CB48FC918F4322729D3B964F81A4BDBFAEB55B4C8CCFCBEB4EBF06E4638B3F4BEF8271168F5D19D7C0FCFCC9F2B868D7A7EB374B51689A2E22136D5E4F1BA7322F492865515D281A787FF018CFDBBD35D2271D4A4FE3A32862ED571E459F7EFCDA84D95E0086E7158DF8E37DA06D2226ACC34243127F0056BFFEECD1F3C4696B37D077636C756B234E88BFAF3F7B84AF3F7B64127FB59DB8DF6EA04FE90807CD08BF7EE3A792BC0F9AD1AA7C9EA02DF024EE9D861B9012B381FB462F6310C3DC8446FCC1AD6FFCBD733741938C87A5E6004ABCFCD9E371F3B5FFF7B3102EE0A49364A8C9F7A28238753FFFE089DE7B7FE30FA3ACA1B938420D16E8982B626731FEB0C4FEF3128D595CCE1071B14416CEE6A270805C3BBE06E01B403AB79ED2B0676742EC6431F498C428C471FF2E60B0B1BD86146E0230D0B3DDAF1E7D679CF29615B4B83A63BDF789EB46A2DEAF3F7B0472B742841DD7F90300E98E85E0B9DE23D12E37E878FDBDB52135196E14329350602566867168829071404422118F59B0B404A0F40368898B7C44074FA33DAB94790140932C7C968D08D4E28F4204434FD33F93E772C17622E4A167E9BEA233988B7EA54F076FD6B0FAC58245302EBAD88F743843376A457A8744E4BDF228BA6F7E8A15CEF59B541FD08A6D6E61DE7D5174301DBBE38366B44ADC3E3E0F11D147E2E1108E8BA50F48F7888BE816F52E8FEE90A7956789E2407EBB30E23F03A3F180E958BB37C9F8585A02504388EE94C565089D44B3287A2E02C8A1B53B4E06B0537EEE07887A4DEE14C78D2B872D003F0EE03CE59F52AF20E2DA479016815820F8F4DD2CE38D34A38E908DCB766FEDDEBE88A8314FF0FAA4713E2D6EDFB66200342D109127AE110138620432A95B1836BF5C037029C49DC422E0677F23EEFEF65F9FAD937CBE89D4165C3AE7C61AC03071E70BC12609462DEDD6469C10013E5D2FAE1B566271918529A419FBF0FB7958032FBB0E6082AFFCE0E9914595E95AA97A439AFE950FCE42EF4376BE0CD4F517B8318DD03DA205F71EEFCB34430660B46F3777D71B00BEE08E93E72C82312B71CD7501E99F1352F3D61BD3F4FC649DE598E5E943C4E7DBBDB54794720B43FC01C3F549D361F488BAABB3789FAF3C8A8EE3F0752DDD3E22F672B408A6CDE54B8E1BFF20ED0182F6FE8B8259137F4E172F99CF48FF8FF0FA7B6B78FDBD35904E1F07F9320586E778AEAB47C41F1F87B59DF8A65CA03901EF5BBC4BE26FF1E1361CC7EE38687E922101AD18D1E372024F0507B0B6135F75A1777A37AE1C5665F078C2A41C211291BA63953BB628E0A1ECB476FCFC833F1FFFD6997F11016116A89ABE9DBCCF432CF9FA2FCB2ECAE2FAFAEA366FF80C544274FC161DAE7D1FEC578F9EF27101E7A5BB694172FE08748DFF8F933FE3C09BA2A31261503871437175793AE2F8D13FE9F00148F4FA00E0F5F7D63EF8FAB3474F02C3E23A290E66C466EFA01955B532791E2596073C04AA2F9DC5FDD342C4D1F138F5597A0290883FB76BFBEEE6EEFAF910FDAA49161446DD177AA2E67A92FC1A069CB8068979F97DC6F5A3EB49FCD53451AF4F2F8D8E659403081F82A122769F4145D1083E09D6776FEF578F5E4C13F5F26BCB461C0618C0BCBD5F3D7A91D26AA2F15942E3044AA270420290E21E2FA57FD159438A7BF93917E1725F7E96288E44C552444CF7686C926F415E07AE0B38CDF696982FB2BA87B3C6671EFA7FC0921380DBBDB5CE7EF5A896A6486EDDCBBA80702389224DCEE488D2B8C7B9965D67899670D8B4B6F814EED3886ACDE255A6732E6056A58367479C5E76A741BEFF34BD398B009CA5EED8A40825768A4CE85A48D317E5B871E5F05A672F7A699E449F059F2EE038B0364793E4799A418BA9C6914BD3EB034E1CD23FF8E16378FF6FB6EE6EEEAE9F978EA339B1474E9E39B7B174E27CFAC0D7598D4E901B019F7E2ADD57FC057E526FE1B1B4BA2CB50EE07EF5A846C737AE1C3ECD1715CBCF9C964F067DA2D522EAFD392FE477E8DC115284D5DA4EDC7796D2BFC39FB30628E966497D345AB835DD2D8D4894C4F68D2B872D4AD7D98B2A8CE347ED78891D9B0B9F2C2BE4FDB9BACF6D31B5F4B3B4BEE2449DA6A7BAE85C40A9FBC8AFCB6B839081B6CFBB69E39547D1B5EE71824F130D4F8056672FAA94C4DF78903A5307CD0807CD489D53B85E1FE7E6B971B60A00671EF90407CDE83C71FDDA0DDCE3CFD371672F5AD9DA88B1F1C6F984482C89BFD307CE64D1A071812581A7F9841404612AF1072C390148D8AF1E553A7BD1ADEDDE5A3FFEEC0C2D2CABFCFE766FAD7FE3CAE1D374CE8D0342B811825019225CC68173B67CC1B8A75E57D275FF9DFFF97AD771F99ED8EEAD7DEC6E5D160390E2ABBE48173A7B5145EA4A86105394463352905C1AB9A077F6A28BD46F449472113ADDE34429276C2534230AFE5F24EC578F7E685C5789A194BC4ED5A222FA48750A3E2D9005B074F84C90BA7F9310819DBDE88C23FC2E4E52E7D30AA950CF174F6904A23C7B89D27FFDD923EC578F2ADC4D0C197E385171A212030CE69BDA4EFC60BBB7D63F6846F79BAFDD45BB8185E3CC97C807E34808A5D3673E96659A2C9B8AA5270069B1FF6B7FF2EFFEEBFDEA51E5BDAF7F30E41790637377FD7DFE5CDC5D4D3E521E89808388312254E8C54ADDBFDA4E7CC147B81157CE397B05802F39CE5D97A52102E81623944608208AD2F1CC7FF774F55FFDB3BF5225B1F48D2B873F49D136A84CCE49701355DF45E378A04D509230E6FD65B5CD8221B6FB90F7A520A4B90F25B8344FC86B5639BC0D1A77C9A57D27BC05F3C169593834DD47659CF504077A6E5C3122F02C222F0F22B0C4F89056945B1BF131E702F2C595D25254907A0B6F49EE0B45A2216B619A577819344F1E34A3EA8D2B87D8DA881FDEDC5D2F0D3C4E299CF87744B79EA3DDC0C7FC5C72A1E5D8F17105D3B0D40420E7DE3DF4233F3C0B0C5C8C48DD32B9A8386209D1CA71F2A2A4B104C39BB59DF8AA23D4AEF117CB88390078539441041C117897DCFF9784AE4F95B86160E25AE69099BB692125D3D5CE5E54F9D6A36DCE11B9E6DAB1426D27F1D9766FADDFD98B2A145ECDED6EB9AE914AE059569969E9B8A85849FE383F61FA89573188A588DA4EDCF57D40299CBEB7ADE75C1B5EF0DD2F317D4842CFA7B3AB117CF3E2F0725D3FCD129844C2C22FE03D94982968A1D40CF41C27EF3E9D93F147BB81FE77FEA3EF0F8D491EF1E3F5F7D6405C3E4D6AF4FA7B6B55381720EE9EA93A50627911A2B6516FE1F36961DE6468404D141C82A53502D9EEAD5D07F065FAD8F84291B6403842E80C71C368A7B7B9BB8EE33FF95CFF5B8FFE7EC41D24136A3B710C009DBD2872C79F3102E60E9893636203F37F7E8FF2248E22BBD673D7575EFE6CBDDF7CED2ED8F52A7F86DAFAD99FFE185ABFD2BE2BEBAB19C738BDBBAB5CB15EE02332ACD18C66D244E621AE3B5C5B7BACAD67C4BDA1BED1E033FAD0384B007A8B6200B2CC701CD8E701DB28CB67F15C44A397499D3F97C81F34C75124102B362F37E8D0BC09B0FC86A24D599BE32C2EAC4A2C2F881E081D079A93706034245C56C3A2A52400B78D680274AE11025A3A1E0EC8114643C487C685EAEC45957FEBEFFC6EFF9FBFFA17930FDEE74E85D2B843E2D605858BA14987D78D62F2F2F8924AFF8C58906A849C75EE83B5487BFAFFFE3E73FE4BDC4FEDC3A8894824561DACBA178D3028A163BBB7760FC2B5103FB6883D97EEFB00FE791138B992F02B09C1624173E7A22DA2DAA682CF3137AE1CDE753AD6E69C79E3CAE1F1E6EEFA6A68FCF212CB0DCDD386CF5B07304A0496A1E002A11021C90223AE8F102DF4A2881024A2502C3CF76E5C394CF263045FC29553EE8D7002E95A68BB98DB19FABF93361159C4AFB6BBB58838AD6F7D7D69D5C1D3AEBE20906F02B840C46C9A12ADAFAC45B7905D6658DC3B6DF3E1C694B9D12B1A4E1BF157C4F6B61BE80248DCBC6C6DC4770F9AD179C901948B2CCF43632010B479AEB6135F20DDF292F82BC191D52720818F63766D2C4270A97500017D51D917E1AFB8CE91F2811F732EA013091FF30FBD1F470F33E38F44BFC3112CD79CA14585117AC73C3DFD87123584CE5E74C6E9EF91D1C413544FA963A7193DF0092B4DEF8A1B7FF0B49A95AAECCB506E22774FE3F4FCC8E8E522805E1622398D90282AA1709AC1C7181014552621FE349D52A706323748E7CFA749DFAF68C41F3070AFC117498DF803740B4B77BD6B6D886F5C394C16743E1689A3E3243214062CC88B4389E5C5B85E42DCB8ACD2B17469648D5D0B4BCB01B4766A6962242D1FFE2C39FFE47E04297C99AF0EDCE1B2AF9E6922545927ED9EA6FBA6F4C1C7007E526B73880E9F5696D56759B9330A07F00E802F382E679771026F5A2E317C752BC5C2C5C5B6D3D74D5339C8CA559E378AC8113BCDA045F2EF3F1EE3BFFC6E34E416C6E2AC58A26026293A86535F91733F9C637BD22F9F51334B2C002CDA8043D3016463F603002321084338824B4B00120C7DB72E80AA4F1C9A26DAE4CF69CFDEB872D8DADC5D6F6879C87A595C329FF85242E49DE8CA59795ABA79241EF711A23E515D48DFC8FA72701D4085100CF29FE413CDF8EA5FA2384821007B9C482CDF6571B048842E71610E9A51E2F14089A830B4905A73283106E8DCAD014F93F8B71F4768BE76B71401970090708113B773E3848593D734A411814B2702D6C4B98A8868C49F5C1A4781F2D588C31B570E47CAEAEC4517B978944F1ADB27CAEA5E0E9914B96A622E83E0F2BAC6B0B862EE59AF4E959800EFC9B4DBBDB57B22BF116EA46FC12667B7C2FFE11DEE20DA7A56F6892C5F13571709BEA812A711DA7B72D7AA8B44FC9DA6F7BA287E0E6B3BF15547F8ADCA7B163750038D3F9202917A9013F93681C1FA5089FC8EA64B9C3E70D5B0D0672CEEB4FBEFF174226D47CB6FE9388092D343D77DE2402B0F0E41687DFFC695C31F03506556B8091BD7A5B90FC749B3B86DBEFAF3F4FC19AB7DB2AE3ED1B295B72FAD4FB49C2606B6EA68DDABB198BF8A1B9C6B1E9F8C430821628B001FD76491382A9320645CCBFBC4CDD7363C254A58700620AD8366944868D25C6C848024149AF8174C3C9C4B234A2C3CB8D5AF5BDF5ABE283F3CBE2FB70296E9B258072F050770BBB7F689FB1FE1304962867308C12866717DC8904259947E627377BD4A3E02B77B2786182CDDC32CBD2942161CCBDB927326EBEE232243C4B2B23D96D856A695DC33EBDFC7ADB4EAA8E0321D3827DB0F98B1CC10F1B7DD5BEBB0E3A177AC715ED308D359823B0EE6E71CA784F8BB677C6709AC715F127F25B2C22D8C1FF26B96FE9FF66F81D4568821400EFB1D97E70C661CA6B0C4FC601811C96BEFB3200FF0117F00C0893FE59E1A25240D4B4100EE578F1E73FF2A41240942767D45A4FD1E4F2F89453ABE71E5B0E7FE13F7309CE89079689C3B7ECEEAF7649AF83A4D97CD221C659D00BCABF54DDAB10F4639DE3CB685477C661DD57313E74B2CEAC9880878BF7A54936D979CC8907ACC03A781B80BC1BEB0CA77D782F55F4B141F45130BF38DE4D6469C704D781838F94CDAE2EADC70519A5516729316F872B3B2206837309107013956640CDF9B17FB13E904F88C96B2E4B314042087E0027DACDDF72C264356B18288E31F6F15C0909368FAD7F4040DEEE3507D0C8270A4CEDA7D8DE0D2EA45C496CBE30559067F661C5822604D1CCF8E872645660D95E86932A2EF58EA076A6DE065589B806C2D9B2D8AB6584E13DBBDB5EB7213E0AE7BC7B2C62DDCEEADDD9E6E6D4F709ADED1389031918BB8D9A9B750D9DA185D87F9229A65419591961C27B01C270B887A0B2F86A64DE3F6F14D05E9EA5DBC5989A40EA0B5AE79EA58E184E038EA0B4B470012DC82F1939668D77A4E72CDE4758763E02418B8A60FE7A9D39078595ED7F2F38953A5B8D327BAF589CB2CE2CD876D6704C29FF189DFD3F4BB80610E203F771FC9AA3B56DBA1716E45791F85B46BD690A2609F4878D9B05F3D7A91C6A5E476A7A934D039CBEBA959D4192826415324F0D8C745052DB807CD2828E66A168CEBDCBF44F1C0082C95404B1B1F9248ABB7B042C7ED06FACC2F6415482704A5EE1FD7F9F37103DB0DC50F69BFDF5FAADFCBDD2FF65FEE7EB1AF9DF3EBC6B35FCD5286CC8F5FD7CA4DAB07BFEF7EDD90B658F5D0F2B6CACCABDF7DF50D2DEBDCABBD3EFDE89CDD7B105A0F5F994AFF3C97473F64FD7DED917EFF6B8FF4CD7EF1DD5BD69FF6FD64F98ECBDF7C7F8B32666F3D33A8E7AD67FAFD73AFF6FA744ED7E4B995CFCBDD2FDE56AE5DA7633E7F95BF62FC6E3DD3BF27DF2B1F0FBEF7AEA5B3EED138B2F23CF76AEFAABC7EEED5DECDC036F4651DB46BBEDF527100A5D8D5B2F6F470E8BEE9CB9BE900AAF7427410352310A51E233A8AFC9E66EC20D36862575F599342722A438D54389CC3E7045CDCCB76D35E879916C7948BDA1987F51E7BEE3B21EDCC1392F3C7AF118ACE459914524DC3E2BC6BE3CAE2D697982F1661CC12C784E6958366A4725678DA7603968AC19F9317F6AB478908B1E400160FF516CEBAFF0ABB66EA7D0A0E5E85EEF1681CFC9AC8E6FB5ADEED06FA5217D549BC1A326D1AA43EA0AC9785A57403E313C75AC61369F9D131C573ACEDC47D2526F088A833A41C2DAD56C73CF4F4A685947EBF2F15FD7DEF8079D5AF02F8769ADB976D111356AB4711FB4C42BA7C39452E60865CB9F854297C1B8C79E3B4BCAF4587CF850690DDFD4B89C5831659636B23BE06E04B9DBDE8093936DCBD2F1C34A30617B9B28DC4D5CE5EF49235B6A4D18674D3A2B884E969AA4E46FE3D122B5B69AD31BD1404A045E4D1314F939500E4203F4FEE05DD954ABF0AF131147144D6D567E9A8DD4BD3892A0AB1E3EBEBB43AD2E0C780F83B46800F2D8DE8B3887FEDB9F15B3A198860E09CC0D34E44581CBF71DED52B8FE2AB00F0E6A7F826BBD67DF3D3E1C95221BC6F0378F234BF8765875C487DC7F3AC6789FCD16EE01E710035A2CC59730F1181EE7AF7A0198D049130406B980A467C7601541D8179092C0A96CB4365805804A6A103789FDA2BB154046000D7E0AB00BE3126F1F780DC9130AB9DABA14E89795D8B4688E481ED94F073A10438579C76E2DF6F77F6A297882BC845C09C7314B209581448EBC9D348146AE3258FEF4413BBD3F5903E3E8DEF220DAF3C8AAF7222DB29B537311C65A3303170DB0D74B736E26F13C786DFB3E2AD8A85F57A162BD112C583C649DBDA8871D08C927F0E5217E8EC452AE79859931F1F34A355854BF7118073324FAD4EC010B369244E302760F9B35ADE690EA197420750EABC79AC66BF392EF107A02A4DFAC721FEB4EB8B46A070B036552D0BCE10EB4E20E9E76B744E2C704BFF6F5FF871E4F96B7D5D645D31EE36832C28A555F06981B464A76B32CDA4E5E4E1A6E434586AA781137F0040A22C11E66A24E4DA3CE0A229AC70E24FBA8291DC3FB98096C4DFE283387AFC1A117DF44FE3626B2346BB813E598BF3F1C0C78E7B6E95D28BF26A54AEE56C5C21FEBADAA649722F65BBAC7B1A968203C861897EE5B5AC445769D2AF438AA07DA257451C9CE8EEB9F06F97C0160AEE4A81CEB3D44BAB4389121AB270F6B8E87E1EC4B9FB56BE5274C7C28B1006ADB613F769C14FD3D32AB1D8107A76AA38776B2306E7F2F173D2F53B684697657A40E7C2D576E2072EE67470B8416EA0C4A48D49DD793A99874F0791A5B95D6FE12960C13980D2B293AE6B0407270042FCD10594FD093B3E35C1DEB34023C2DD3939A44ED8D814F1833BC7643E0183893F6EE5CBDEF9F7266E0F3FEDFE0000200049444154CC1450728F4EB0AD38719E96952FF5BBECFFD0F75100CEECE50521FE08ABEE5AB7B613DF9C53951238DF6B379D1566854702E11C1AB9B05A7EE04A2C060E9AD1FB64197BD08CAAF47E39174FAE339C1874CF5D064EC686141573B8CDC5EAD6467C4CCF5B56E6FC7F6B237E5AD81B40127F0E4968418BE0D3FC5812F1072C090730ABA1C138E096399A5CBEC409C6E5BE39967CCFE95ADE01F0389C5EA18F00F4E9802EAA45F0AC208D225E7914F700FCC99B9F0EE24ECE12DBBDB54BFBD5A3B732A40FE6E45B16D68B6680E3BE91D46F629EE0FAD22810F7AFDDC06BF516DE70C7B7EB2D3C25DDC0B0B425F76F09C139BE802D32951C60CDA2561B239C43C8740A8F3917D0677DDE6EA0BFB5115F737AEF77009C0FFD767C62DFA5B302B616FD348383492C8051A0C9AC68D0AC912532108252D7D26BFDCBCE55A39092E03BBDD0FC2A6A9C3E1E7DA5A8AE7838F10700DF6A56F04CAB5288BA0140BB8147EA2DFC1018FD861D463C27CC13693A548668ADABB9DC28B118B044FE4474F99ED5A26FD0314F77F07C3FFEB35DE03F6C5622ED796BA3A1B88619A2391C71F91C801F702E9ECC2BCD829D1B912CB408D8323890D7B467B2801B2194C49F8E34B72BDAFDEDDE5A878E4964E4FAFA1A02C0094E9777553304E2E516D910649690B15A97551CAD852493D78828F41186F3446D277E40866870612801F47E6EA37FCCC248CD1DF5167E58DB896F3287EE4FC3D5D7A9753C511011F05769B14C8B054CE74CA456127F0B84DA4E7CA7B6133F7062FF3E80BBC028878F8C82A498D6D2D7E3EA0272BCD4EE572A7FBA3258CBA478978EE9E7E30802785AD01C5FA8B7F01827FEACFAFA8C41B805F1C212804450709D2F7E5FEA058E0B1E9DA2B613F78D9DEDA905D7D3F2F93534DCF3D4D8E987AC6F2F63B070F4B210DC92E85374014B6EA0838C37AC113ACB4214722E9EB4FC951C41490C16A10F9CBA4995C7C376E76700CC9DA0024E169ACE5E7411C0E307CD88F496862426EEFE5C516FE19B5B1B718B2C3B0180EB69697A5325160FCE70E209006F9138F6A0199DD7D2A689FCDB0D5C0774CB704EC4B51BB8546FA1B2F5EE80FB4716C19645794AB9375D3BF8B785DA4E7C87F451E558E5E7216A0C0B2D02D6C4BF5A1AE5D9C4FAD407F26725FDFF95384116FD3B1FF145FA0E74CEAC9FFAC8203AB244FE79FA925B7448A24F23908C7B234E9417019ABE9F767F3EB5B341967FDC2A1018D5572B0A38F721548D63DEE0569A80AEFB45D7E755C712E383AB4D58D6DEA1798544D660E5723D58D2054CD6312B0F430C3CE4545A5A1DF33AF938965A7B17960004B2855E1BD3F50B59B2AD622096BC541A7F0CC322C4B3185CD476E29B9DBDE8A2307BCFE476C7320492752A89C05182082886A8731AF011B7324DD10841A710DE3B684655723741EE2B4874C917835912297231D4882682ABEB31800F8BA003483A50C209F035EEDEA37403B35C608454AFB3179D91C4934C1FF2DED3C6875CC342DCB668F9498B60789CAA6BDFA5AF3D0B2302E66E222CF19EF24C1E8600AB4E7FE52514C4996951E0E3C2A639F2E56062A163C93990CE3A43EA94E678FA34137FC0B0C5AB3478E0E98A20FE9C143ECE1F4FE3BB3F2F6C6DC42D72F772D08CF82236E47E621E848A4620913E1273A07BECEEB70E9AD1AA0BAFF5D559D65303E940B9BABD0D0C74C0B8984E12B4A18E754B140BC4C471DF4BC245D338BCFC1792B7958EE9E5F6C8797408C751D5271CE8CC5E13FE706564907EBB81AEB619D3B8801C85E7006EF7D63ED9AF1E3DC6CE55AE9F45EC4DCAED2945BFA3D856621C2B693211DFE43456720081301730548E668D5C72FDFC6E504288A46544D1387E129C0368A5610BD93BF5165E985DED744B59E0C4AFDA4133C23F588BBB57BF80952289AD85AB8D4444C75194BA96981CC27ABEC77D006A9CC03CB8BFCE59FB97009CE7A267992E549CEC0E57017B3D4C735BA3A1F00420C1E7EB4F8BFE31E9622F3B1D28AE1ECBBC61187804BF0B2E0296F742FADC220235FF7FA1FA9FCB8A3442709E752B91289B3FB7B511FF6347A08CE8A801278B9A46583945F4607F8A19EB37446872E7B500DE0470A1B317AD8C2B569B15288E3B712CA91F2D571F743E9FDA9698048C00BC060007CDE8B24528B9F7DDABB7B0322E11D86E0C7CA902F809BA96A65BEA8C3AAA5A792E245C121695C4C179D0230B43007268FA65298BFEF5FDEA51E6F88D4227AD74FE2CA010E59FEC578F1E0B21FAE43BE104B7F0802E0D7B5EDBAF1EBDA1D5858E354EE069E7FE01BAEE1B5D97BA72D6B559D7FD34C3123B926359CB77D9B47DD5B51BE8D45D6C53AB9E8E0B38A457C795E08B0047FC254E7AA5C35E4A43E94B0270B161116072FCE6F59E69F3C6893F194A2EB4BC10E68846B02E0D079060391C9EC6A23F6E1CDA6587C7BA7A6C8B5BCB6A3074A7936684324B227051AC65D308C0F9D66E3A5894B6A5E99C49AED53C89139F3F33AA27A128441489D701DC02D070569ABDA287D82B313E682DB1B8BCD3B2FCB6B8E159BE5BCE054C2B2B4BBD17C60804182630F882AE71FE28FD38E5B898950907AA24FE8661117FFCDFC2766FED35EB9EECE749893FAD3EB37004BD08C41F30EA10F934E8012E4ADB3465746B622F025115B2F07C56290EB7A1DE42C5E956368840E50B6C69F8B194E8712325CB9089DF9B640CF0E77999E3D69D0C2235C3C876039F8C937FE10940EED0D9B2EAF459A166298BAC77F844503A7ED69146F0591C374D7CEBC4EB43BEC358189C5484447DB1C64E9E28BAD56C9A95EFA21047CB0E5A3868A2D7A25548A38559122B32F280E5FE8508BEAD8D18F5162A176F9E84C66A37F04EBB017333380B6C6DC477A53535FD8A405497C807E43419CC1F2077D02CAD66B5E38CE5809E0786B9E0969B963438F5B35BEE7884C1506FD9B1DB7D652C84083844EC9BC5EF9C0F6ED2ED39278EA5DE9F071AD795102A7A7544F74D9C28E95EE20E34B3FA01CC6B1C9428314F081F75434E6C653CD3F9D47098F8ABEDC477AC280B546778FC97CD1272F1251F8B3E3F6DF3AA6B897CC08D7EF8F5105F7959A18D2F0C688A15ED7E8EE526317E43515802505A6B5A8E7DF9394F3B66CCDF3B2E5E651727A1974A28D0F42DC7F5BB280D40DCB554F1AFC709F53D000FCB7A4C4B0F7051F4CA4A141FCE82F061B980488E1F611A0B49603DFB00EEC37D676975E3D7A65DB7349022BE4F3FB188F52E910F981878C4C5521EEF598E1D1A679691D13CC7566145C09AAB0E19EBD58AFC90C3225F9522C91227707DDDD37431F93F4B0B47948DC085BB3A8381BB9D168BB77CCD287B44FF41EA824221FEB4F3BC50127F25F2805B0CCECA05218DDB37AB05C4B9A849CAA4BAD65BA8502C5D917E48DFAA284454672F7AC9AA2F1701F35FA90FB8F820958A7A0B437AFDD6D8CCF2CEDB0DDC96C6259427899CC92298E73DEF6FA2B004208725022648C27082A21EA783D201F400DBBDB547C439895857F835E99751D1DB3CAB116F2E603C897A3F64B72E69F5E1E52A751D510F9885D147091B522F66D1D06EE091F454F980131A7C812022CAB720CD6221A9B7F0A2AB47F24E8960726E6992B4CE2F6052B7A211509DBDE88C8FAB1A72ADC4E2A1B613F7D998ADFA3871966EAB867A0B4F71DD41F7DCEDAD8DF82EA91890DE21A529C2375158113030EAEFCFF0F137159DAF9200B491C67DCD2A6A658E3A131DA1349D2156E607009EE4E56B750AADCBA4386DE260CDE71CD371B94E44C32240FAB79B43F95C37E86B00BE11F0D87DAEF7D36EE076BD85A7A6564986B4C58CA29870BDC5221052BE280DD2A8A508F52D911F2C972F128AE366AF6F4D7E5F338CB2D438E63DBE0A4D00127CFA66792DEE4E0FADEA7EA5DF3F054E8CDBDAAF1EBDE0CEBDBEF7D8734104218583A3F39010709A11CABC0D404E1B1128312D25E765865C60D2B803F5162AFFE67F15F7FFF0EFCE7E9EB25C675820CE6011E654B950F37B6CCC3E0FE0DD72DC2E17C81084FB039416B9964B9890FCB5FCB636E2E3CE5E74C63727B659F4919C9B9C8A851001FBDCBEE40167895A75563ABD224C5445C3766FADBB5F3D3ABB5F3D7A61BBB7768F883ACDD50A895E43DE13F95C741F65B085609A9571963AE48D6525FEA4DB0EEEE78AFD77C775A35034B41BF8EAACCAD288125FDFD576E2FE6FB69240F3EFD0756744326DBCEDCA0AF693E674AAE7AE0E506F61A5B6135FA8EDC45D2E5E078616FCEFF0F312CB01165A3171EF26BF373EA6F39ABFF81CA9E994BA6B2BED063E9EB4ACAC283401C817716B31CF6381273D343728CCC0EBA7152EC45BB23B7184E010E1E7F3D798C291EB01C9029188DD438870C3CF6096B27341D1FDFFE5857A0B6F88F321456A37C10D1132C267DC5C0900593E57FAE7D7E8B8DEC2378D7CA6F2BE25F12C3912FC1E13A7DEC780634569A61EE79AC4FAAC6E3D494C711C340784EADFFE7F2A417E3D6780370F9A51951BF96D6DC477E9D85AA84B2C3E88C920ADBF43375E59C1E37803AAA3E94FDCF56EBD85CFE7556E280A4D001287495BD4F3E40A3A7F7F2BC009213249BD970DFBD5A3212793DC09B4E8F78FC625BC6A3BF11DF7DF77FF41C4822FF2C7AC44C159387ECB402CFAF466E8BE9C443971384B9073778711970FF4ABEDC45D5EEFDA4E7CC771A71FD476E207D242741A75E5C433F5716D27EE4BC28AAEB934A61B96698111F7C421AD3AA5FAA174D2D2F6C93FAD4C9D380DC14133FAF780E14D26F76158AA2F2C37B636E2DED6468C1EFA2386578C301B9B93AE8D19177610540EA5AB3B07CEF3981B8102128092DBA72DEE9CD394C7224F8E8739178AF9A63BF5D8EEADBDC38E47E2FCB2E373EE3CE8E3A9EDC437DD8EEC1A0616D8C78C03B852DB896F06D44D25468A6AFDBB88E26122A2E89B90849E47976A886B35CBBA123A7BD12D22E0B636E26BA46E40449623F012CE3FDD3F6846E70F9A51D5598BAE6AE2A02C22D02CE084E941331A8A22000CB817F38CAFCBDEE93779D99250E5DC0F8B3B380F1097D411ADF7B5305D25E1B77CA8EDC417DA0DDCFE66BB1275F6A24A1595A1394DBCF3646315FA8D6B2E5E88D83C6846558A8853A4B15538025073E922F5BCACE813E3801600C9F92B82C7FAA2808C3EDCB1F4B9A7895B1F0E793F9DBDE8A23BBC8CC102BCEA825E57C4FD11582A01B314FD9E22ECD776E2077FF39F5656E50D450770E68437895100E0A019DD74D7AE0303828E5C941C34A3CB9C7022DF5CFC9ABCCF38D22316AF39EA0869B13D53894B5A5066D9E7DA7BDEDA88AF01A3E1E9248AB4F0313C4CF34D29EE5D6E74F6A25B5B1BF13FDD7AB712392E7A8FD679A90E328925387F56866D2B1A63A91004E0766FED92FB1F21F82C65FF1C9DFC7E08E0386BE8B1D3084B1753E3D686BE0F8A038C13E39B21DD9C344C6B6350E2049DBDE889CE5E74E6977FBA8FDF6BF4D5891218B5829B55FDEA2D3CF67EA34F2CA6AABBF622D72925E24472A28888E2F7F933FC58D315CC43AFD112FF900855E39EF16BE21D4CC508840C80A48EA2E3A25DE6F5E2A25FD9BFED066E4FA37E5950DB89AF6AC61FFC7C9E1B9A1253C5971893C15C6BC6E5EEF371B3B511F788E023373007CD68755A92837150483730969F3F43EC3811980FBA92F8CB08CB254F16B72F1473192E0C5C9AFF454D042DEFA55D9B1596C51D0CC56B3E6846FFAD3404D1ACE8F8FD591282B59DB82B433BC9BA4825ECAD8DF82EE97F6D6DC4773B7BD113749D8E651EBE3AB4C788C7C99EE575EBC0A954D0E2C1EA9CC4AE9D1757CD11BE55DEA75A6835AA6F117C00921A0011AC567DE75DCF12D383B3025E0586FD54FAF49AB38E09C11D1F0AFF5634DDD24270008174EE91343C30D274B296ABB068E7EEAAA088905CBE348E6C1A9C33565AAC57DD3512B705B1C9AD31A1592487EA25E6896520FE8081E8A4B317ADFCE0A1FEAFFDF6F37D933B624D94D3DEED928E5F672F5AB1AC66797A7ECE95FFE9D871ACCE5BC62CDA0E9E4DECA45F9679BC89B2CE7D56E9273A7FBC0CE2464AB715B3822B6F84D076F5FC80A7E3DC4032F49A17DC7BBD4C16BF9C289DB5AE6A89F9A0B3179DD9DA888F1D07B80AE8F313B7021F774CB8F1B6EAB3909F057CF3432108408DA093C4853BFFC067F8B15F3DCAECC55F729C2441586200CE75DBEEADDD064639B59C104B13C576F6A297005CE44AFB4CF7CFD4BF0CD1F1D3C688165BBA4436FCE7CFF4FFCFAFD5FBAA48D2D2999905F1E7267538A38E3EBB976CE6F864EEB1E6EDC97B6EA302605824ABB98E10E799C79B24AC1FEA5754A24486869B657F53797C81241D4087274572D21BDD3A68468FCF53F445042927FAE5FD59D7691111629C5744D476E29B345F0038A60D80B641543678993774FC7B662A24F75DFEAFA53C9E1B8C4DF96DA020042027182CBF7F8EB0984A88A3D2ED4B3A845EE653BED8CB19C4AE4313897B0F778DB42AC72F441FB1C4E47084D0650089F8D14A3B63317095C28C39AFFB0971C23982523FD110FB90FE20F7B777D9EDE0EF6A3EC4F24296FEE4FA8A9AE561EE950B80552EABEB41BD859579D50FD039C1F3D25B5D4430C94C83DC23B9EB573D8F15066454C8830EF00D9FCFBB417D38DCE2759E6FBB812E970C503E1407D81D27F9B83443AA347922442A5077E122E74E006EF7D6BAC028C78FFFFB1C408FBBD02FCAA02D0234F1EA984E9F252E92136E00C7EE779E3837526CEBF3032951442B60E9A264C1F0056E2D295D1AF87468E8384F0E0B71FB1CC7FE2E30E01C4B057E39196A9C3B56C7FB5A5DDD0E9EF404D5FB6DE6C4791CF07A08D72A43BEF4B83F31C755E8F276CD8A8B25CAF982A6B6C1DAD19362EC79818BE42C31BE3C2E31A4AF4DFDB2EACEBB00FE7B96AEB0DCC17603AFF158F37203A5BD7FED9BAE8BF8E6B4B19173A1732535A46B9AF746C35A53645DACF13C770290479870E7AAF850128393B8FBA8EDC4779C0812C080A3E10C100A3B78E7094D1CCFAF496EAD8F7027B805A349E79DBDE88CFB55480C2FC5B69223CCCE7B742DA4EC79C1F9A4EB2F2AC7D919260018B58AD5E0D3BD1BA3EC11AE228574EAEC454FF0343EA56E6D774FCFB85D7E4FA62511A78FC8B52C793DEDB92DCE87161CD657AB5CE44E462E8C001F2A77565C2CDE8707CDA821231E6C6DC42D76BFAAF9DA9B07C8B50F718C015D6D61DEF54C43BB81476655968BA12BD572AEB1000AEF13479071D96EF2E7B57CDB0D5C62C7B398132F31B5909E56EEA4EFDDD2259DD6F8273FA7804EB4A671B7E76E05BCDD5BBBB75F3D3A6B117DD3B4E2E4AE5F986E40090F2CD16B9677E41C405F14FE177B96FE6528615744AE1F812C9DF93569C969881E0AD32637797E1BC0656E956AA5CFDBEACD9AAC2DBD434D3C1A78DC05F073F516DE12FA80891186D5F6ACED749CC3240248168E69BD35886042968C59CA1D076D67E1AC71541D31B5EA138FCF632CB71BB85E6FE145FE7EC5BC7FB3B3175D2C45C17E30C269C8F847899C75CCD27D1703C9C1194744BE841468FDCFBF9149C1E7618A4F2D3D074C3A0E68AC710B6081EFD75D04903CA079CEB0E6369966EE042030CAD593D7B4FB9380BB1DC923BF6587E67E272742B08FC14EAC4AFF21EFC47207648CA3CE38C64179C359407E016E91E4FEE638DCC7DAAB0F82831762316A37709B74464276EADA049AA52DED8163E73FC7890DA9AF255D78F0B26579E310D61641608993277D4F59893F0EA39E9D7A0B531DF7B25F9577D2ABB7B0221CECCF6D3CFB38B845F9D642902741140A46385D83D30506F03480F7793A4E10D2F14133EA6D6DC4DF26F73B21DF1E808FEA2DD4A6F15E380798540278D9D65CD14E71F124E71C40773594573BB47190B62995FD395702508A0D2D9F7FD300E33E754BCBDF6CD0DE5BD677C6FD2F12ACC5C1122F871281F38613875CC040172AD911A6114A45E24A38A2EBE98366F43EF743A7A5F571E6C66987B69B25910A77E5614CDA99FA5023E8D20807792D63F3D4F24330EF310104732987E204938FC519D4AD4B1B29672074467B5F45FACE7C0825FCB4F64CD236E9A715189DAB43D45A1CD135E47B4FFE03B319D73E55107E7FD27C69DCF16F20AFF6B51BB8546FE12DA2655C996F03F872681973D301DCEEADDDE6FA643E27CF9655F038E5D60601DE79DCDF92F8F380E200A74501013245FFB8D3D98B56C424D2B3D25B51610C4BF15CE243E7898366F45B3FD2450F4E9F8B7E847603B735B1A5D427A13433D297A1BA758041B82F174A6948FF4F9B68DA8D11438C4FACB429652765384222313490F170A9BF34B1AF5636EFC3F670348F9EA2BF73CC7C8781F21365DE97F96685B6E850B9CA75EDF94B2317E784AD8DF8693AEEEC45156DDC4F1B9C5822E24F1B07D6775614B0B11CBC56C9B64E427430C3892E9FB3B99B2576FD1A9DF3EF93C60080AAD3C3EC523D43EB38E97BE17E284917D457A69CC7D2F2D708EF8366B4EAC4CCD8DA887B7C8CB5278CDA536FE12DE0A4EF5DDE5FE675E76DE0F5A4FF428880019DE8CB12F1210BCAB06FD9A1897A358E6DC8BBE1BA64748DBF0BB739782A4DCC5CB4C81F3E908EA9145F86EA92CD9B33485C14083D2F6D07CFC1EA9C889103CB53B91D964858949527E7311145A5899DC7856853120144C211554D8B8B3CEBF120EBE04B6FA93C4C136DA15FA971AE8BCCF1B3401B21AEB3EEDA741FC0C33CED24ED23BD3D29C277E7D7B84EDF9597E27FF90FBF8847394385F4EBF877A3CD7DF21B9EF6786622E0A13129C6F07D000F8FB36995EDE1BAC3849C45C123A2670DDAFC383702D0D2FBB394FDF35CD44B02301B7C84585682CB8943BF846145DC3E8063CB0847D33BD4C6C92C5407B2A2DDC06B5B1BF1DF0250152E01DE05F0BC8F70E2222C7EDDE53B37CB456D42D330AE38C54750CA0584D28B73D3B0220BE8591E3E8AC35AB8C6294B96993691B3BA5D386846EFCF9A9071DC8B87816171BCAC9F14850183F1F3ED66A5FF74AB32350994C5ED93E9E6F50D858274870F9AD12A89CED3C489724C5AE932D623488F53FBF688F806B2F9D0F46D82B3C2F5E31F905F4FEBFB1A57242DFB9CD4656459D31A5FDA26584B27E7E4B98980B9E8975FD3C48C7981C4BFECBC18ECCF824323A8A4F36EFEEF03B909A0498411E3A9C49FBCEE0EEF73B16F91883F00A8B7F086DB15B79CFECB56BD85CAD646FCBC919E87201A71F161B1F367A537438B0F5F0464D99388D2E46449796D6DC44FB3636C6DC449D40E4A3B8EA8CC0747605D758BAF59572E4214A2E520110F17D58470D3E89B6937D09F07F1E7F03070E28E4713C78BFEA1708F773A7B51E52B1BFDA9C9822DE26F6B233EE663AAE8C41F0090AEA4DBF89C777DDA0292F1795313F7292A0A99BFC7DA4E7C87B9AD223FADDE759336AC4CCCF81C8D11DF9C21F250EB3B01F177C1F5E357882347FD22C783540908ED3B96EE5EBD854A672FBAA5E547794D2ACE26B487D557BC22F542710039E4223FAE61810F8C9DDD45A0B5698951841A646CF7D6BAD2C72347C88E328B5A40D121274DE94A44DB2986884566490012272C8448E11853FC7A1D4E99997191864478BE7C2D11F218F5E84BE26F5265EE76031FD75BF8BC2C47131D4947B2520C2F390DB3DA088C4B54B0BE7C1A834840B7007C18E222641C686E3E80F1393DB304AD595CFD80FA4F7E07727E48239E42C78AF0D41024B1A1FCB5BAF13459B882397030BB7052189E9FAF9EE37E535A7BFFE8A13E3EF7592557AEAC2B6B4865C43716DC711740E2366AA61C408A21EB8E13AE912FF287E61A661C48E28F2BB096D0C1B9B13CFC9ABCAFB9EAB1883F6E84E32E1D6B5104282F6E7C92C6752CA2F36720997C8E354E8976CCCF35628F63460B7EF2ADF0080A56D97267CDF2097A3F2E9D6AC9163A79E6C50574AE229273F9FEC6D9C913F167BD73096EE97CD08C56F92276D08C12371CB324FE1C3778C8C1AFE6EC56E3A6B86FFF7D0CE6E28B79137FF45EB80E1AD54F1AF2B0FF0FF2ACC3385038C697686EA431C0A3F1F0843E82D6220843C6AE2BAFCA2536CE597F90CF5C8B23454EB835E26F8A4EC37B9A419556CE049B3B9560FCDC672797DCFDFB32CD9865D5344EA5E7DD2616D8ED06FA3325002996AFE54BCE720BC3AF4D5A8792F3170E295AB5C4ACC22AF75E0A21F65D6058F4AB4D26A19145ACC83145000BD353A5369238240BD20885692FFCF5616B4A2F41EABB97564F37295D97D769E1E6717EADB243C5AE19F00754368F1EE123CC53FA25B1D44DE306708E0F4F63702FF26EB717567DA95E1E0E610B18550161FF0FACCDB9155182DDBF4304932BBFCAEBC5CB95C47B3D8381D2B4501FF53137346F28751E698B2440E438F589083964542CC502F841BB81E76873A8111E56D96E0E1C3126A3638BC81D176E4C543B7BD18A9C7B65BFF2FF2CE5537A3937C958C0AC5CD39F6028D298035A3AB9219BBB08D858BC1396734EE2DF3B001EC709F7AF8CFA91024BCCEAF3D598C102B887814E500F830820439EE2A5F858730A4E28BA2898FB3BA4B16778870790BE330F11EF4C135C1C65D5691C71937BBE07B6430554E7C26A19D38056078FD8FE7EE8A4EE88B587EACCC047E495CC7F5C14CCB1B511F73A7BD10A17CB4FD6DAEC0859207DEA0BC0683426307F738C48A438B4433E5B695EA77EE04626404240DFEDEC454F5884F6ACC4E659C1DFABF0F306E0644C5ADF9E24C2356221ADDD9AB1A415754223F8B5BAB16FCA8A92A1629C7764A97DA5F5CD04DCBF77EA2DBCC0CA4FC4CED3284F6B8BBCEF5B2F66CE01E4E08BBAC659CAD99F1B27FEFA25F1970E9FE185E4DE86385FA6DDBB9BC057D93100607377FD3996BC4AE5F922C21439EE2F438F4F3C07CD6822E5774DBC43D7F3DA31FBCA2548B183B6C0A42D345CB4ECF25B710BDE0526F21C120969A2E569A0B6133F107538DEDA88135F959CA071BFE01D7DBD85B3C45595BB73E25CF1BEA505846212BB3A55DB0D0CCD65D37CFF327FB711A0B05F563B86C642C07B4B08029AAB1D11B2EAFEAB74CD9D9FE7C41FA99790AA85E3349DB7C6611188BFF6C007E888227F672F3A43EA16526F8D38D29A3A86E466599C39A52F5EE3E7C258F20E5DE3CEA0E5E685F7A7F27D0C6D9C38F1A71958C96B63CE6F5F72EB4E95D7DBE2BC4F3A1EEA2DBC40F574EF8DE276F7B48D9EC6311CA34CD38B844680B37172BB101C40C076FF9263E8B7244F37102E74F6A25B79E4BDAC488BD2C2EFF167AC77C6DCBF90427655EEF4653E92E0B3DCC014950BC876A08908228DB395156962C43CA171FF781DAC1D7F48BD4227C1592ED8A1EE6E80FCEA658D0FEA4BCE39118B5712A6AA3D8550616D160798131BC7953E56FB959131E05B987CE5B0B99A389C09671818151D0318318EA0BA695CA63C17FCBCC0EBE108964B10F385041F0FD2C9B5F61EACB1A2A17612B948ED73E2467AB8E143F51475BA5D6FE12939278610422CAFCCE3DB6D0CEEB36F24972829EEF9211FA7941F71B42D4E6D9EE3CF374ECB6B2AAA0000200049444154789DE4FD591B815C17E77D7EAC2DF89394C774B0009C0CE492F84B87C581D5DE490807D0297B9F715CBF2A60BB13D0883F5E96762DA0493345BB817B8CF85B3D684655ABBD9CB324E1E378F1DDF62C883FB7730730BC43F789187CF5D244575A5BA87F3C9CC4E7DA0DBC93B54D3E380302AFF3D6BC3892DAE44D910394EB894B1AD17F67D9716EC45FBB0132DC4B1C0CFFE3E7FA0F80C11858ED0F9A5E0B8CEC10C0C9B9EB7E1C556778C0B982D7E8DAD6467CFCD287E8D273943FD79FD338D44581200E2E61303F56D3B8EEFFE44707B77D62C076039F28EFE16178E05C750D594E7363145E678DD32421E681275D1967787D4389BF50D458D40FC6F91B22FE346EA9FC8594A5117F74AEE9C5A6715FB342E6ADCD49D63B9A090770BBB7766FBF7A74D62DD4EFEE578F5E70D7530B9F94BB533B09625D1A806484429077009C9BC4158B2482E89D6CF7D65E03F0EBBC3C5E07797D51E0FC9E3DF1BB17FBFD979EED67D27B01C277D679D5D70271263A4A3C55AD3E16F741C24A9FE6EC76DAB0B87F797390B445DE4750F3EBDC2DCEACFA288D23C58FB38C8394325FABB7F0863B7EA4DEC20F81C1B775D08CCE5399BE7A6A04E0BCB97F1AE7CB708D729F735F059758BD47B0DA9DD60734FEAFBE57C17FF64CBFF79BAD8135B5C6FDE365C97CB573C6ED1C71D1E3938C64E100F275FF47BAC01FFEDDD1B5DFEA8FBCBE27399785F47B5E65CA6B569933E10012F1E7B84A2F4867CF3C26B0D40304268BFB0BA65752221B78FFBB77708E73E7A48B98098BFB5B168197360EB67B6B8574E9E344C04FB41BE8AFF62B4833FED0AE4B8E8AB6B3CBAFC676D907CDE8B28B6BA9127F72372D9FD7F2943B57ED399A40ADFCF2466D27BE6371B1F82216CAB9F0419B98F9E2CEAF716E0B5D978601D3026FAB35FE4867526B8BE4B2642D9F117FF788F803808366745E238ED388A05970CC4320B9365CA752E06147F4546A3BF11D7265E2888A2151AEC575B5CAD40AAB9D849AABACF62BF8C3BF1BAD6C6DC4F856B3E21D03D63BD0BE2100386846FF222436B492FF885F47597FC761EC75F6A2CABF5E39B9EE1BCBBE3664456D27BE19A3DF97F9A5951998F705EB9E1CEB69E37D2604A0F3FFF77D859BF391BB3F4210D2757E3E0612114AC9FD1B0FD20D8CA5971742ACF389452967C517F583972F55077C0EA7E785DA2082C47F4C6DD6FC4F718849E03E90CED518475C91058A28F658DB9D1B65DFD7DA2B27F33442AADD00D7117DB43D707C3A3550E405772C237B24045B5EE25F992F5D932E60643A3200A03A701729798C857603895116D58B8C5024715A6FA162718639A408336B9D24B1A3D459DD2CF1EFA308849F1C53ED06FAB59DF8A6F4F1281E237DBC2700E0772FF61307E5DC68CADA5465441503FFAC495E9DBDA8F2731B27596944B6B601F0F577BD85A7F85A90C6FD0BE1CE71F7356464487E7F3B7BD119C995D6CA7075BF37C958E9EC451729DA8D66059C4688B2F65C604638DDDA4E7C53AAB0F9B8F2696D98950878A810CB85088047017C9AA7F14749F88561BBB7F6DC7EF5E83BEE3821F22C830C97EE93FDEAD16359CA513848894779C7C9AB5A8625396C08668AF640FFE631E9C6C38584F3EE6281A109FC0338DD192B5D2E1536D06E0C625BD2C4A3B925F1D58B4F72F2583EE3F4DEAA5C64328B45BBDD40D7BD977FB9B5119F0386276E595FAD6EA175D59E936934D733BCDFB81B90ACE5678155572BFE2FA5F3BDE33CEB9856A636EEC4F397EA2DBC95577DD260717D1DF7AFCA2C47A17D03F4EE2D572C69632B6DBC90AB1DE67AA6EBDE75325F49B5034BEC18B2E1F511A9F27D868E1B3230813062B1BE578B5B99F57B6A0BE39A9A883EC2CBB0CAF4B487A4473DEE3D43A98397CB28EFCD4A043C22DE05546ED1A7793BF6654AC3253C20E2CF1D8FBC2B498439C22C13F1070C73FFA447F9FDEAD18A8FD8935CC8821A7F7418EBFDB17663D48D4308F1E7F2A28F76C8496D9EDCA7803A749DB8E97D12A11886111F28D7A80D6F8B3C4716A5AD8DF86960B06BCFC33A3A2BB636E2EF3A0E414D236A2C311ACF23F47DB0854D555D20F11E718DB5499DEAF87B8DFED4C5E392CBEC08E5A1FAFA16694B04384EBDD3081ABAA6BD1B83189D19F147F530EAB2CAA39648E29E3F9F56467BD4BDD2D07CD16EE09E452828C445E24059FBEEB50D5D16C2298DD326C755DA7861BE24579EF9C1F07AA3E5618D99713653691C6A6B8362B589B94E4BD6481FF1C7CBD0AE6BF766C601F47091EEED578FCE8A74DE38B221288D3F2687C1A505909D0B277631800B2CBEB9BBBEAAB979E1E52C9AF367E0C491AB764F7000BDDC3D0D93709FC681C57DCA58BF4B00BE5577CADB6DA1C84DAE990487E978964E8EFF972FF7FBBFFCD37DEEF622D569F7A465BAF6F60054659C5F8D03E244850D111FB8C7DD694C5A270DDC99BEC59DB5B87D923BA5FD03F8406E742487C643C4795D6C58DCB12220EDDB92F5E68EE5E1A42721EF41CB4B03775DC29F0186B992B2AC344EABD2EE2E9B0B2C2264C8317C48BE9AF36A397E2C0E595EF3A936BE35C7DDCA3760CE29D2617A96507CBE764C6DABBDDD5BFBD8FD8F107F428FEB6185300CE290A420C9A3E4008E076904A239600EE1C2D5440827F771AE6EEEAEAF6220F657D5043442AFC8A1DF80A1C9CCE7E8F4BBECF849206CE726B9079C2B33CD854D2C50D7B2127F0EDF02F019AB7395F204808366F43E5F081CC76166C45F6D274E88BFDA4E4C8E5C937728DF412847C242BB812E7B772B5B1BF1359AD4AD78A5AE4E0DCE21740B4B123584E54F6324B3CE645B77A9F307603AD53ECEA8841C13DA39DC7710C845FA208D08D1AECF9BF893F592DFB1F3E967724B39BED1AE006E8E917382C5EDD1C6AA72AD0AE098C616BFFF8D7665887BCD362F99C5B49CF8AB0F24009A2BAC2A80EF857C6335114290AFF916B7D237762720FEBADA78E3EE60E43DDF3B23705F8C590259A4B5636A04E07EF5E8F3EE7F48842715FAF9759E6E92B2990E008092033809341DBCACBA789DBDE825E7033019C40070E3CA21F6AB473FACEDC43743FC0E7202B4A844A0E3D2DCE1FEF224C1A4B9AEB026393651F5B4343E11421E90132580CBB2FCD03AD5071130CCC5985F93C4EEB4E0168EFE41334AC49AB4530FE1088CB35010012C08964BDCD79A45086D6DC42DD627495C627A4F82BBD0ADB750CB5ABF3A0B67D56EA04F0ECD3B7BD119C99DD2B894F21DCB77686D607C9C2CD1CF4F6AC49D7C7EDE049F84AC2B1D33B1EFAA8FA3E6B8E42B9DBDA8F2B3EF56384750FDE642DA6FA459957356BD85CA17EE57B8252D8DDFEAB8FDDC66A26ACD1D8CC34FB2F4721C259B1BE66396548BCC79491B677C2C4E32E7D4857B1A1FC7D14734734B5FF70D8E7036F3C05C42C1718ED294C27A25A25FB200CA21CF53074B74EF13D95AE08E3999436EFABFA8B996A1F416277092B64D0BEEA37EFC8F1E1A54DFC72D0B996818C76945BBAE4C66F7C6AEBCA7FC7603FDCF2AFD11E30F6DE1A77391CF8ABC27275CCBC54C8ECD19026D145D9B9205482ED07970FC3834E2D65980AEB28DC331170FD1F141336AF067E482C0D27F22C74C28F818AAB750E9EC452F515D79583EB939B0385C92EB22C789BB3E326E7DC4A0EF7D58DC14CB7D869450E409DE2ED7CE8460A36B32DC217F5E9CEFBBFA728260E41DFBFAC4F73DB51B788EF4FD480543CB736B23BE16B2390A00050418EA7F4D0CAED5833637B59DF82A6DE4DCF9C898E4F5B438A61A81EED2649E53E558A77F72F5B3B511B7585923F449672FBAE5DAF44046B9C913532500D3167322048561C1D8DC1DED03778E780BE726645120F5007D04A105679AFF383BEF0338E6EF5FB10C37A363141D9DBD68E5BF78A69FEAFA8520FD7F59BB53375974E8BA4CEBCE8363D28682CABA78B332325F682295006E2617FD5C23F1CFB48D3FC462DC7522DEEAD6C6A8CF3DED58CB671208CEDE90AA00B9AC10F597DC40E20E74690CB1052DB38116ABD759E0C427226DA0A5435B6B13C217546D2C58DC61BAE75BB4358E232F57BCBB2ECF8BBBCF9821532089BA411C33DEC62C8B3B7751F40F7EAF32F28C248C35029CA717FDFC49BD85EFB41B49083D8A3A734C5C4A4798AD1E34A3CB5A7EE3A2B317BDC4DFA34F0796D5B7CB9F27B168672FAA1C34A3475D9A8E24C0083E0EA0BC9F654E6D3BF749327FE65287D45A1A4042B35459BAABEEFA90CE3C939EE5BA5999692C6046D8F5A4DFB73C383ACC0288CBCB0BC9292A228441CE27007E424BE78BCDEB03DF9975F6A221639F10772F458EFBCBF17F6FF6FBBFF8CC893141E844692D98BEB4D31673B507FA60CF87D4859F7BF21B1153596D9E46DB28328BB836C2D9B4446A5A9FB7035D89580BB2D3AB4C44EBD6C2A71140567DF31C1F940F730DE215DB6A842B6F87964EE669B52BAD7DBEFA90F23CB5C38A4A346DB0FEECE22426FA90C1916C97F3FF76D11DABEB1AE718F37C7CE3A03DEABA64C4088447C5916351FE8FDB1F741C626026AF3162E918C3EBFFD5CE5EF492555FCA4F5CFBA83E86DA4408ACE8421C64D045E9699C5A56E19362662260C1055C71FFB936882B47CE83F8FBD54AE5ABB32C2F6F706B6C18C41FDDCFAAB349EF6373771D9BBBEBF4DC4A6D27BEE03300599450707C12FB373EABE0A019818C09E487DB79B8AF72EF4208A169137CAE1E495CD77A0B2F58BB68965E25FE2C8E832F8DBBF7FD9C0897210388F71BFDF8A0199D770E55935DBF9B90BF46E56B8BA8C58172F7835C89F07C1807F41842AF52A657DAA52EB6D2D828A40FDB2C0E29E32E7788F3C7893FD24DB4C6A3EB93FB5A5D2567CADA34F03162D55F1B3F69F972E2CF9D0FE951BA6B53E70A52DD5C7D56A84F39C7576B3723FE1E380390647EE1F912D2DE3DEBE7B3FC1A5743E0E9482C6C71CA26FD5EE9798D38F2CD170E44380FA94410F127EBE9DB6C10F197177793D7FBA019C1C5AE56D338FF8E2B343F01387663636A2EBFA64E00FAF4C7F256E4171FB01556676AF8957EFF9BB32E731AD07433F971A8E89740CAEDB59DB8BF5F3DAADCB872784CEF7E7377FD7D9F7FC89C7543A706B6D0242C7A69F945A8DD4F14B8471672ED5C8AC4B4FF69C02A5BD6D59AA07D6DF311307526BE9CA47DF5131DA10700F074AB1291C35D25F937787969136E5E9C359E1FB55F6BB34C5BDB89AFCA3A70E315ABDFDA0D7CC2CFEB2ECC9A3BAED576E23BD46F5C315FCB5B1B0F21E2326D5C71C2D222C059F95D7E5DBE33464C5EA73C38F1C7708D1DF7908FF78911F0FEA23A93C187F876BA69E3AAB3179DF95ABD9F10B059376569D7481D83DFE73ADB79117C124ED74D5DB3354E386F1F11563E868F3666B5CD09DD9B06C14563D5D26F241C34A3AA6BD319D2059ED63C3F5511B05BB44D3F6796886FBBB7F6DA7EF5E80DED190DE4438CFB482A45BFE34313B58EEB8B8FD8F042ECD2C3C0A3F919CB4D90150DA488903B4A5AC8FFE1CD4AFBCFF42AF5903C7C1C2687C42716DD9F05379023844399226E0A8A56C0F31CA79DEE1DDCEDB838CC7CC72DC5585A7900DEAD3B4BD869F6B3B3164F2CC27DA2520FF7918FB91E9C48919713D20659B61457691CBAB4BCDBC2D75B283753232C2711353A1DE42F41708868638029F98B35C48E89CF479FC8D7429A7F5B6D6C04BCFB211506ED7B94BA8A93BC8F7603D7EB2DBCE82B8FC39A336833B0B511578943A9F9FFB3F234EA96FBF7CEF3243F9E565A6A83FBA6AF1D34A3CBE3F67308A6CA01749CA4A7E858FE5B6E45F6AB476F6CF7D682FD5731E5DE84F82B7DFF8D07A98BC739B53CA24B2847CE117F773677D751DB89FB4E045CDDDC5DAF4AE31F7A266FB740D342DB1903484E845344C69FE955EA1A174CE384699C3691B62AEF8967EEB573B6000EDD755A1C2B591FD696C4A58D336068710E18CBE35296498F738648CF4F7232B86F33F92E189E9F26679570D08CCE73AE9F8F30F57171981B912A1477416EAC486B54E2880CBD232EF293CE80B32E421AF147F9C83A4A0E8DE406A671A37DE8EC451789D8E2CF3995A1A9050B3038E055C7651B72301EDA9E8366F457E43321CFA610436F511A9E6E6B233EE6841F976848CE6548DD59792FF2738DF3C7AF69ED745CF0EED6463CC4A5E6F5E16348FB8EAC7CB3B425043C4FF2E3099C187EF17EE66A16527F51D63B0FE446006EF7D69E63C76605B545DF88F610A4884996BF5CE7AF08C61FBF5AA9987DE0BB376F68A1D7E8D811835D992E00E76F5C390490F8FEABC0236E29BAB8975067968B00B0B511DFE5E79A28AEDD40BFB6133FF8FD47FA9069B532B4C55C1EBB09E22C80563E2D1BCD9F5BD8874EA8F516CEB699188EDD4BBCFB3B7147438A46DCF399C2746D6DC43D6EB1EAEADDE78B17D7C191448D46184E6341900BAD56BE326E8616594E9471628D14C825B15417A259D6BEB374CEDBCDAD92E50294C6B1F3419613CA3DD6CA0D45DB5983D2BB773A565DC74DBB3B4E9E0165F23ED9E2638D447CBE6FC8C20F1EEABF038C8638F311CE328D555FB709BBCBBD17701735BC3C7E5C1FD3DD109048EF461C1B1B1178EE535D81611738622E5C119B1CAF87826971F82564D9342F91DEA5DC90D23BE1EF2E6F4EE0CCAC801DE130B4E8E7C9D91122C61629CD1609BF5AA9F47FA5DF2F24370BD043BF4D6A89EBFCFF9D0780CDDD75DCB87298188100A322DFA28B7B25B828028CB0C99287F68C9CD435D10E3B1EB2E4CB1B8E4B94B8B3F085ABF24D50CA0EDE0C3BA5E5D10EB0B6B52CED2C4E924CC3EB392DE28FDA2E1739ED3D5BCFCB6B744C22245FFEBEB125C37DB59D18B72D42F759F5C8C8B1D57C583EAC114459DF857C8EF57BB2D1709C38B2C2CD8D69D06EE076BD85A7B46FA2DD180EF736CE18E375B5DAC9EA92C9525A8E0BDE4779131F541E8540A46B569C697E8DC6B73517F173ABDDD6B559C0F71DFADE8D52FFDB751142310B66A10338A2C89FA77E17273008F3E6FE2D2A34572CC03091E6F1E9D805F03D8B734B0BF3E6EEBA69D8B148849F044D64B4E886101C04171BF87B00CEC967296FF94C1AB134615B68D137CBDDDA88EF1E34A3F3C624D60BE50AF005518B356A81DCB9487F596E3178BEEE7C9AF17A53793E422F8490CD0B698B77DA73F4AC1C67B4A0FAE2A1F263A98FE642929DD19ED5CE43EA1B42CC5AED0A29C397B7D23FD730B0BCEE1D34A3AA1B775B5B1BF1DF912E82C628F7B97A0BDFD1EAA3A5CFF2EEAFFFA5FE1FFFF871E547B636E28420E37968E56425A66B3B71F7EA7B95EA5FBC59192296A73CDF24BA91FC7A0871678D4DEB197E3DCF36E405DF3B9D469D6741007E6FBF7AF479DF629F35B49884E534B1C4F8B0C2F4C96BBE77B6DD5B7BEEC695C3FF0B27EFE6DAE6EEFA65FE5C9AFF3F71FF36E99416093479BFDFE8C7112AB98CBDB41DE1AC089434025623567D1C40DFAE378DFB058CBAF3E0E0C4237108D208F18CF57FADCEAC66B34272DAA8CEB22E741C920F7F96FBE9935C26A39F55CBD7B48D474053A99E0977228433A5B57392319E36B618419818A58D5B962877C8F8454B9365DC49908B100CE6D59E0CA316FA2D79EADFD7882F7E7F9C7C7D65490EA3D16FF7A1482214AE7561387DB20E80DD97691BD66960EA462060B1FC34FF6E32245C16B810305D38279069A6E0F384A6F757245DC0EDDEDA3D2D728B660042F7D2DED97EF5E83B3C063080CB4C0770680C5804A528AF70C41FC7573606E27DCBCF1387A657433FE06457CC27063E19A44C9413A1CDF4CDD2267B1FC721A01C5A8047F2E1E7ED61FDB7AA26AE932E7788F81345FE92AC6396FE9B84F8034E74442D67B7F47EE99D5B7DC0C70A1F07E47B929527EB9F706FDDFD1E4BAB86FDD2CA0A05174DC96743F29A74E1B3BE917663A01B4A512E9C2ED96A1EDF527BA08E3112B691FEE99DD07B1AB74CC6B1EDF17E9284E538DFA3CB7FA4FEFC3C0FA284ACB03937538E7BEA2F173AED21DE2E22FAA4D4407E3FBEB96596D0FACD37AF8AEFBF2FFE6FE751A7A97100AD38B22162E12CE0AE5F30200273D9C59D46585CDA00F1AF29C6AFEDC45DE7DC3259B4B508228BE6FA454308C70C182CB69A92B3C6A909E55CE509ADDC3CEAA13DBFB511E35BCD0AAAEE710FE76FE859B7407DAFDEC2E7DDFDEE4133AACA7ED388004FDF068BAEB38213BBD265C5B89C209EAF6BCB7300DEDDDA885B9DBDE8A2EC6FA66B75DCD98BCEF03A69516BB47A148193E2431AD7D2F71EA651175E368D515EAF71B86994AFDC08F9A403A1E564E4F67F529F20E42070B23EA4CD35DA9C697DDBDAB549BEB169206DAD18F7FD65C5CC7400A710F6ED2A06BE9DCE93D233117F3C044C915104A390EDDEDA57F7AB47DF64E7A6B8975F0BCC3B79D744A8B32820431B0059DEA2107F72B71A12524C4B6F115C699CBE29138223865B3EA4D5A5CD94FCD3C41D14FAAAB6133FF8DF5B95D55F680C924B4B7F29EA9579F27C27118B4D0AEEFF4BBED3AC8480B558CA36FBC6571AE6BD4066455B51860FD888014C0C3E0D42B03D70BCFD13806A709384FD1A235FAF989FD28C23FE65F523223961ACE44988D09A203978B28FF8C64ECB479B778A2A06D69046741BCF909EF63B75E7B3741CE446009295AFCF8880A7CF6B8127CE409145BFF326F24210E87AE597B238E8A67C356EEFBCFCFCBDF228FA6F7E9ADF2450DB89AF92B3CE9FFBC5B8FFCBB7275F70E54E3E74326B0B4BCD496171EC68C2B6265441B80E397DE5696801F4EDFEB918D3117C43B17C2571A7115763363F579042BD4FB17D9C85DBF70E284FE708F902E73EF1455DE324F1FA2C1A7C9C6A3A97EF611262CC570FB6A1B9C0FCD58E707DA98E2179CA6B1AF1340EE1477D4496BFDC054CDA379F05FC1BB6362FBEE7D336509A146592FACE03B3DAAC4E850398464CE44DFC118A4A041619CEE1F64F8211EFEE7A5F726EE95E8AE147E2328471FFAE6EEEAE5F0E31FC5804EE9F264ED076A0E3E66FE53D2EC7282BB44953732BE2AB7B5AFE74AC714D69D179E607C02FDF1EE50E58FDAC11CDBE3E4CAB675EE09BD434F15C5EC49F4FEC4965F1B44513914D02EB7BC922721BB3DCD7EA2DBCE17BC714DD41133D67D9C0596DD3DE21BBAFE62FEBCBD755B7E94AD42BB4F4A16011BB12432ECB1D4E9A842064BCFA36D045046BF347F5166AD6779C675BF274047D4923FC34A381491DFDBA1D2D3677D7873E2272525C221CFBD5A3DA7EF5684523BA34A310EDBEC8EFACFB4F884612C75BE343890232B5F7F8CAA3838F88FE43D11EE85701D0958CFFC98F0EE273F200ED00BE67E5976628E2C4A5E624566FE5A388AD414E3AAE3D1F02C00F57EC6E1B87EB29170022523A7B51E5F77EECA49FDACEA1B46C33F5032FDB27F29D66BF69A0458E3CFC53FDF83FAF5F16C8366A1B049E96C772A53994F7CB2475290A9C2838781C92E3E349366C84BAC74888FAF4A0195D064E3603620C7889BF76037D7A6FE4AC598E7596E7962CDBCA9F9EAFEDC477DA8D13C7E26CCC56B736E2966F7C8580714093E82B647CA48DE39073ADFD5AFBE4B576CE5193F2007B4F892B3539A7E55DE64C74002504A7E9DE7EF5E8EC766FADBB5F3D0ADAFDD476E2079BBBEBAB2EBAC431068E2A879EDDEEADBDB35F3D1A5B367E5AA18969C731D8B162FCD27D831B787DBF7A34222ECC8A571E45E7CD4FA1FA232411F024A26021DA191149D2F1B813651AA6BD40A7714B645D0C318ED771B0C651B40C23B87EAF555F5E97A2ECFAB95B96D06726AD7368BB43387F45E8C37120DBC4EF59A2E09C38801FD79D51525A5D48FF90AF5B22ED2500FF6B5D185968DC5CDEAE49B974BEF98B8C8BB2E649707AFB97E15CD870DD7D8BBB15F23D2BE376AA8EF1F386364666F5DDE5EA0646731FC2F001301A03D8117F7D8DF8B308C8CDDD75EEF3EF8CA6BB51127F9341126EE38866E57850C2CA49227162E20F002CE2CFDDABF07F203B3790C4294EFFEF3CEDBA7D3BD5B40F3A94BB372DA252AB8B55072D76A7C2711B7185C1FB883BCC266E06711C6A3BF1035E768865BF5C24E649B838F75437E99C87D602746E5B1E9CC92C8B7E08E76F11893F82F63DD2757ECEF5DC26FDAE38F127CB57F23E269D4C6DD1AFB7F09646FCC971122049F0B649720E39279E139BC020A6B26C171FE716C8DD0B9CF36D0CFBEC3D030C8B792DAE9735BF2AE37661883F092ECD98F63C0FE44C00F2859D5F730BFF939685A76624C261F9A5DBDC5D4F233A4B8C892CE27A99C6E7DBB188A1DFC6E104D65B58F9ED66E5AF1231C445912CD90774A07DCCE4874DDBE16A225F2B9F49D16EE011EB1E5B10129F71BE1066CA24DD698BE0ECE2BE26AACCE4CAC9B748CC095F00D000860D2CA4A81AC897CBC6C648B7DDC0ED592D2245824624F9085B6765AAA6CB03FCDBE6C41500B25CEFA695AB113A5A8C5E592E2BBF93563F562F421223996228B71BE86F6DC4D7C406F0C7F9432C16B7F4DD79878E29CF34622F6D43E2EBB7B6889D5D6468EDC863431882DC45C024D275C7666831965EF5FF661106B59DB8BBB9BB3EE29A62DE44C4A2C3E7B2C788099CBC679E8716E185A0E4B11006202452B0C4399372E5DCF3435126A41876D622821431F0477061EB0859454F96AECEAC45207983A2127DAB59C133AD8AFACE34A277E615C5E28A784390A6C6506F81E2C6AB2A4479D581CA72C4931AB523E4793A4FDBEC8CF33E99CBA52EF583AC3BA5257F7C8A753EAF4BE26F122242972FE6B235A7BAE3A178E498A2CFCE7943AACFB86B13B97BB130352BE02C8480F69C453CDEB87298F86DE271654BE4031FC72F8B8FBE595982CF121A01F8470FF5F1B9CF2AD8DA889F3E6846EF5BCF2A22526F782A2BFDAC176CC61DB80BE0BCCF6FA1278F2187B16241195A14B310BA2E4D0F40B528840C5F08655F599B87995772C961F5B584E6E72EEF7A00A3EF980C83F2DA34E5514F2288A50EAEA573C808C06B00BE8201114D3ABB7D6094300C25FCB4BAC9775A7E37F920771D402DBC9795CE4AC3394F8A38B1BAB9BB0E7228AC891F4B517076086EDCA3168126AD74B5FEA77456F8B84524FE007D27FEB9CF064D5188BF8FF889A5BFD2435FD5C3D2D2CF5AD4C9CB3C6846E7E5A2C5EBECAB8FD465AA0FF4FE8EDD22A23A9A0E1181B8342B45590CE462C745BE52AF679A22FD1203F8361192A01122CBDCEBC17F008E7D226A4D7CA9113D9C0B67E83B06B549EAF46A1C6AE9AA89C2AE3A0F0F5549DC69E7CE0844D651FD1E7CEA0B45F9DE9701B91080DBBDB577E8387471E706012E8F117123271688B0D8DC5DC78D2B877016C0DED8B125C2A0705B3FA57B1AC1B65F3D5AD1C4B7EEDAFD10BDCC4525D2B51D299F8899EE8D698842D8DA88931068A44CCD2744AEC763111079238DB05326E55FB2D2A694F121D78DCB9A471150DB892FB8FF07FCBAE654D912E72D5A9B170569DF89206856A72102F66C62560541289F1BA98B228A1D8A7F6DE891A5B6C971FDCE68B189E55CE0366E237DAA70F68E5DDE5D22145DBA91E85C2EAFFBB25C09234900002000494441549D59F4FD4A8C8F3C2381687A62234E8481513D33ED9E4C47F959E59784DFF8487B073C9D2F849BCC2FED9D1455E72F14962E97B1A027AA0B0ADEADB7F08226FED50884694C866DE7C2A2DDC0A57A0B6FF17B3C8C192F5F9BA8DB812E187CFA3E56DE4504E9FC01C33A4E96E80A2817B36940882CEFC3E98B2984D3DD8366745E46B800D2DD0D65AD0F952FAF71D733BE32353D609E07611C3736DC1933E5F1F71F8FF13FFD233DB6B0D61657FFA1082759A0493524C77CD1E68345436E22601F0160709182C2C385180848D73293B6E5B4417B4F3E3D4DFE9CF5CE3442315417B448901C1C3A764ADD667A055560E04B8B2EB809AD0760939D8F94E51317E50957D65B520CA3F9FE12754C9CAAFA883F9F58C73D3BA2FF93B50DB3867343C5B91C23EFC76A775A7F940807E722C3C59BD6364F44FC39EE1971AA48672D2FE2AF2BB97FBC1E5CCFCE57A6ACBF50C948C4B0E3107F1858E626BA7AF5162AD76AE8C9BA7AB88B34DEC722FE781EFC5C129D25A68BA9F801D4DCC1A44581B0FCCD497F7124FA25DCB872784DE699679B4E0B24112DDF9DE5D0597BD657C6746A9F3FDACE7582269E249728522F868BF5E89A9CE43827CDA55F0150B5C4BB16772CCFB63AF4DC2FD5E044E14806F9DD923A715B1BF1882B0B4D045E3490B89E22BF843C23C7911C2BE582970F348EAB047DB707CD6895A7ADEDC40F343DB5ACB044AF9A0E9FB609B0D406281A07E3588E35662CDFB93C2EB72581F08DD37603B7B3D4836F1CAD32F8B79225EF1261C8DD0F2060BBF7A09FCF0084A797C4E08D2B873DD201246CEEAE5F36F258183F40F3C2766FED9EE59E4783E60AC6FDF725E790FA5FDB0C4C135AA8B7AC8E9E81131D3E4354D9E37EF1E89ED4D393CF4B6C6DC4BD7603FD18FD8418B026DC697301EB2DD468E1220E865C0C345D477E5F1EFBD06EC00C91A61C7F3276C372466D27BEEA5C663C90DC3EA9C7C9A1E953F1FBE502971D9CE0D088063A5708AF63B7F93826913DE3688DE8A94D58C791314DFFE4CBEFD387067A58B59DF866EB62BFCB370B227D636B230617DBA681F454D9799F6F5C2CCBDCB4B668A8B7F054685E2EFD592D4FDFB7506E94F245DE1CC0EB802E02E4FF92EBC7EFB3BC469EDBDC5DAF3AE2AF27CB50884F191AAE70B1FFE68DFDEAD1D9503D3DADAFF745DC5FF18E87FA7F56DC3F19E96392906F80ED070BCCF58846F8D17579CC45C0E4FEE4E9562502FCDCAF7188AC0950D5CAE00B8EA6A7E3D093CF85C2E5F3B672FD3125F9BCF015F7BF2ADD6690A8DC22EEB485AD5CD0C6072738441FDFE7E9F818756E8756DD58AE1E34A3DC45C0A28EE6BB0706DFD4CFDCA844CE354CA371B3A272E1B8E8D772C564A009E8864A4E57358971AE11CDBE8D0B9FF3DA633A5E961B4D3EA7941BA5E9636202505800BF28EE8D70862CA2CF721722090737E156B77B6BFDDA4EFCE0C695C3967C4EE6EDAE2F6C789859C0C709F4B9EBD1B8BD32DD3C45BF93107F043E4951140C1EE3D59A840DA2ED43B61899CF68E2645E9FC95AE4876FD2E59C4FADFD96F84BE6C723A888505C5F2E9AC8C785767B000CC4649AE88D6F027CE3C2B74928311918C164CEF5B4E97271A757683C3BAED8C4E2DFB4BA71708E3F117534B65838C49EE4C0A76D109D28BBEB5CDB9023E6C4B08B73FDEA2D7C87D787FEDB2C7A886F8CB267C6B2A26E0F8CC6D479CE7D4B9FC8F695C80F131380FB9E98BB9A418114076B84834C7FE3CAE1B5FDEA51E5C695C3639E6673777D7573773DD1A9D2CA2E118EACC45B51FA3854C49B4514AC4C383D12F1F138997287CF2733EDDA4133BA4C040E39A1BDD5E8DFE7E97C22E0694E84ED4108B121FD34591F2D9241A8D236278E5C34811E5FFC789E9C8862BFB988823B7BD14BC41DE25C3FE9EE45BE7BA9F3C8F32CEA82D66EE0FABCEB302E7C6A12B2BF99EAC177E91C8358B5B94253E1E0E7823B090CD44B00E72A666B23E6F18213230DD259E4F9325F86AB9DBD6885F4FCDC987D29250A87D479AEC939C7D20F9C642C73625D532BA9B7F098452096981C53890422E1B3E0D58C3EF839592CD1CEDBE900B600343677D77B52D458623284E8EA31A27D28EC1FBF6FE9814EA7D6D3079BE4121713802A86791BC097AD7C787AC7854835F2D016B3694C886DE6C225CBA42E27EED0BA5144042D3F9ECF3C38824ED7EF25769EE84C49D7175A5D7DE2B4A22E66B2CD8B06F91E7C69653AFA16A75927794DD691D7C1117F004E7405E95B61114CD4681B8E10A48DDAD300DE0770ECDCBE24E1DEACBA5AF503D20DC4AC36FB10FAAE4AE48F5C750009A40B48C8C24552D27E8881C97A17001980343A7B51A524FEA607DF3B6396D9672DCEAD26D29F5E6DA70FB60B7D58EAFE89742FAA1938086E5A305120098A69709038F11722F6C97A4FC1318982A58359DEC669B5D707C731E96A0AF39DBDE816E77C689C10CEB5D088C1A2A0CD0C2988F82B2A773214D606CAD25F9B26775D2BD352EB10C4DF31B97AE1E9344295BB2172A8B2EBB7003C4D1C6C8DF8D3BE339F0A0A7FC627ADF0C12AC7A77EB2E8E3B288980A012875014320C28BDD2382AFB3173D417A7FEE5C0EF61239411AD3F8FC2E521A794D71E1B350C6379A32339FACB8F8974F7859B9552C14DAC8C44B697C0BD3B43880ECD8EB06666B233E1EB70ED41EAE749F660D2C1682DC2DFC49C78F74A79C956FB258CA39C75A1C438889222D64756748E10B8556A4FAFA60A95E6863997F7B64292B2DFBF30417E16A756E37F089549100A05AFCBAEFAFD7D9FBFFDB3B9B5047B22CBF1F855EBFCC5A75625CE5A255F4227351B56C226B94331ABA6B350586140D55D060F0C2CB9E5C69D3B33098A1308CA17BA355BA37DE190C8D33F1A00243F5C254356826559D412FBCC806676237AD76B96A3C64AF32DFF353C80BDDA3777474CE8D90149242D2FF070F49F1756FC48B88FBBFE7E3DEA4F1657BD985A7DBC8D8587D9EA5DDB35A97B1CC87F3B82A784EBFE1E3CAF3CEDAF46D796DAC7702A88EAD08C07590D6BC5F347FF706BB7C39EE0AA26FBB88A177AE9C8CDFC2797DADF1010F30F9A6C92F2E2BBE855D2F448B2F45D9932D23024526E2526F98B7297AE9551D1397AA611962E7C10DD49AE5CCAF9B1C8B2D1D2D2684788D0B11FD8F75CB66F4F018743D30EED320FC9AAD15C759F3E237F5FA3A59015BBDFC39D12CB6B3D5CBCD218CEA545F8D120F4B4938D67722A27FF7DF1BF3FF871048DE4C3D9590C6E7AD7E336CB3600D53EDDE6FC590351322A23F1935A4D05BE9FF94CD66FFD102AC30A18DEBA6D72BE17D96C61343DE34EEAF09896948B52BBACEF7E1A1B29318C04D112FE209CD5ED04B331380ED52767AB77DB3E9B02F4CA6A634E397D084A6D4A4C6922BA64CFC11AF97313AD6344EEBC6DE5481283B3675DD429DF8FB2A65C8ED5BBDFC2224852C583AACE37BD780E3F2641C9B8CD513535F2DC5407170BC127C93A2F961ADBAD44DE095415A998AE239EB7A7E96654A0B08A2F930304DA285E7F13911DDE6E7B9CA29E1BCBAC6D607ABE43CEC40BB68ABBCFE96FB371672A1D779EF80B296C258877755AF0A589DDA0BC04DE61A047182B5EF2C7C8F26EA10AD27FE7E34F9EEFD5F347FF769F196F5C06A3488AEC7FF1301D893C13069CA9794DC3EF6120DAEA666103BBF25A277BD97DD2E5F7ED96C00E8B3320D01B36ADDB2363D4B9D01632DF7372FF7AE4F18BAE36F88E817E37E7287051E278F5139ABCE25CD3227E773F986639B42C013A58768A9F03A239EEBBDC0AAB31782C5BE59245C38E9C8FA5FA94EC06585D3C28DD330A8BC58F635058B5F0C4BC46E7A6F591D5BEFBA452CF0D1FA8965F379C5AD67C62AA7C8D208AAA5F60210EC0E6BBAB7A2399B0F3DBB9788286BD38FD311FD3C7C37AD1E2159E15C066A13AD9FA02033F8C4319FA5237ACFB2606CF345284559AC4108F55E10BE5594278F4D41187B8D8A38C6B4DBC9DF0F56BFE744F40E4F6E2F049C9B1D6958FC881CAB5FA8C76B76915BE23426522D115017D8FA55261BBB8E38C263AD6C601689BB08372AF3CEE876F2CB713FB9619D4F0542D0B4DAF177AF3CEF3E8F590563CF8C2EAFA84C502DB5890104BBE54793EFFE442FB306DEE6E572FD2AD3C71D022CFEC2F7851711BF8CFE76D8F8965EC6BFF5BED6CB4A2E4B47B33100A50009C779371381D3F225E97D56018B4E7D2EBACE44B358B1301DD58575ACB2E5E972D259BCD39927B0F9336BCFC63F235A0A6E3F97569CAC4DF3FB5B64EF9ED1CCDA7719CEE50FBC3EFCCDC59FBECEA91A5CD8BB07E4B512BF6B29FE34FA7FAE1BEA2AEFB9AA28AA33AFE379A7E5F6723F39C5DA36C9DA74D5EAE557D620F0BA4E2CFEF4FA75C590F7FFB396EB659660D4028DFFE46F79EF38CFC92FADF5107FBB0102F044F945F3773FF3D6C9C1BA3DABE0AEEAB92BB2363DD32F2BD97824D4E0819B97B2058BAC0DFAA529C51367BF8A6DE62E4BFD6295C7AAFAA5288FCBE7EF899C713F696C9204E2A1CBD419D7DC88B32B3E24895D0D86C96DDE87B359D311FDCC1931A0C9EEBD7444ADC77FD730C58DFE9F79165FFDFFB11ABA3A33EE277788ECF322B22D9C75C413313289909F35AB3325EF934D3A3725688EFBC959D13CBE9EDB37766F656DFA492666F050EB4CAB9BBC06FADD622DD3F5B03E8B5CCA6AFD5FC8F5459D29502D108060096FFC3E4BF8FD68F2DDBDCCCE5035E988DEF35E76DC3804CBDD1FC6FDE42CF6522EEA51EB8407EBC5B70FABCB2A2FDBAA5ECCDAE2C9DF83C89E589612B6A03AC343FD2F22BAF4046C880F7CC2CBEF3D99CDC36C8978AFB194EBAD4EC3A1345A5918F6472733C9CF6D7538AAA084F57D3218266DA2EB7000793FC9FFA91C06A7CA041031BCD045AB975F70A746DFD7DA622671EEBBA5E1B5D211FDACC8DAECFD1F2D2BAA578F98C8D3DBC9E35BFB1BD6727E0EBF3AA48ED4A1821840E072CC163F0FEBA5A346E4BF64EB57AC475DC41FCFA6F4EDABEBCBEA1D6B570DAF2E2B761EDBAE13D74507E4C72CACEB5C2B2D722CF7A1D7D8591611AB1E75B69C656DBADFEDE48F88E85CC75D12F97160FB240BF1BAF2BA160912225A98498368F95C5ABDFC392711D1CC4AB734E3CB2A84D8CA7F180C93FFDCEDE43F25A285D93BC236D31086F01DAE933887A519878ACACC44924E44C4FD9888FE7DD1FDEB590C8DE315C6016A8AFE5775B8CF4E0508400014C12AD5EC76F2171402E4636E5EAFA1B44443E8FD4F789C4B6B9807EBD8A26E5B6B8CC54B7F9E2C21EBC48DE80E04E03CAB9368669DF132AEB5E82ABA3E9ED08D89DF32C2FE10DCA416DA1A2563300FE19C628235A7E934A1EB71F23C714FB4304C105B8A373EE720262744744ED753B14DB5102D125D5E9D8BC8DAF47D22FAC23A96C673393BC7353B4ADE39C9639679FEC0EE80000420107B1113F996A255D1A28A45E0BE5E8CABF6E2C3F25724A6C5ABBA1ED63A2EDB5AE6FDEFBC46C83ABFA2B263DB1C2A3C6C4E19F1B1BF5A16E3FDDF65A7459CDB844407236CF78216C7025C6B5EE4562FBF78F4778DF33F7DD268C80E9EEE3CC53A7D4CCC926C09F42271E8756C56B55CC7CAF49E95D87BE5103A1AC70A62000108E81796157F5664A193CBF4A73E463AA2C660984CF877D68E275F6C8B32C287AF859805E58DAA5FD89608D5E72FAF95B52C6611CC0AA690B3FE0FF258B1EB94B5E9ABD5CF78FFFCF3AF16E2E0A4FB5136EE3FD8F53D5984F5ACE8F562CC4E9DD0B030D44FB7938F4232CCFB9C58B4AAF8133184E71FFFD9AC4A9C74C2D3B6C9BA857A2C5827ADFB4CDE8365ACD07ABF5899FA592ABAA656399698E33FEB5995CFA775CE75B8B74E89DA0DEA09C02EC8C420A562D9C2CBC74BD2885909E5712C6142743DDE1DF5684A1D3267BF887D5676118C3AEB7AF06FAEA376596FA32EBA81D1CBCA5829AD7DF4B55CF53CBCED0FD572D1EAE58FE86DFA9FFFF5EDFC1D127180BC5E898F5AE17516D211355ABDFCF96098DCE67B95076E1F3BF68E713FB9C7B3D16897B0B57D4822FA9E58D4944308C979ADC3F1CF5ABDFCC978749D4C66092DEF9D12B36CAFEB32F6D695159B7A7B6B5DD97796ACEFA13E4B870A2C80E024D1E24FD3EDE49797B311423C21F75A1C6B49A4782F56A2D9587A44743918260B22536F1F3B7E9588BABDF65CC144D7C3B2743BF9446C17B5AA6D52275D0F591F656598C87AF27E59C8948C09696DA9B02C7E5E035BC65A5257B2367D36EE271F8FFBC99DC130391FF79306FF7F75832CAF719DB0EED120DCEE84EF0B224CEFA744DA8D201E799939CC514816B917D69F0791D80C96C3F94C2361C8A24BDE8FB391CBDC63BCDCBB4FF53508DB4C62A2CED8BE309CC23A7F4DACACB248E177A8CFD3A10201084E16AF01EF76F2D160989C9F4F97DF8162FB9BA221B922A25B65DC64FCA21BF7931BC29DBAF492978D6F4C0CAD4BD6A6CFF953BCC46F7A8D8CCCA2FC4F4F1A5F8AF3D98A17A18CDB55D6415E2BB1EF1BD6BE5663AAAD7BFA7FE17D1EAAC5221DD187E23B4F93F60D2F33DC814DB9FD0EAB5A48AB97DF153F7FD3EAE5D374341B2AC81217D6FFB8D5CB9F84EF8F894866EADE0D9F176148171E7372A266F279218F1D86259A67AF7BF71377A0641D2DF769CC5A1DF63953BF4D2BBABEF7F533B3AA05506359C72D712BCB8FED0FB60B0420385974E3C0BFB9B74E440B033F3BAEBFDF8697EFFFF52C809E98E306CA1A78D6725186633CABE8F4DF0D9F3FE0F222DB7E212D1BFFE2DE34DD754FBD4C795EE3A87F5B0D9E67EDB31AE363439CD79BD6F874FC59378B27FF7FC6FDE429D76B304CDACE2C3B4BFBCA4F22FA7D38D6C7BC6FB0F63D15CF27CF177D41C1EA276699B963650E5BA28BEB24859B27DA3C0AAC814B9D5BCF52A73B31DBF036C48E05C1B75F20000110E897661870F84CAFE3DF6998468D8485446F6B890AB1EE277A9C3B631BB9FF7C1AB50D79193E5F5B2B551D7EC0EEC1D0C8FD7ED72FEE9865417E6A572F6F5F644189091BBE16C7DA580557254F8F27978F62F76E1DB0844E10B197FA5ED0225FEE3BEE271F676D9AAAE9E07E133ED9DDCBE77E1EAED3256F6F75123C0166B9582DE1E57552F476FA7AF07ADDB1B1EA73EC9D1B1007C3C080ADF3E0167DFEF0257DE0AC9B3E7C598F46C51310DE77FEADF7E7EFFAF8DEBA589956CFBDAA46D8AB47ACBE751000FA1A58D77DD57359A5B13E6658D07889497BAB182DFE8FBA9DFC3111FD30C4D312D1E2FFBCDBC91F0F86C9477AB9C36B22BA198E799F16E3FF26DC0194317E5C1FEBDA58BFCBD4A38C05DB3A57FDDBEB04EDFBFF07EA072C8060EB48F1F7E0D6E20B8DC5DF835B34D5EB7605F78EBB9DFC452CE646BE58BDDEB57631EA638806CAAC872E472ED7C7DA9498A5519F17D7977FB77AF9A3F0DB9C7B749B14B994A435C572C159E71DDB765BE75127840BD55CB7EFEBD0EAE5CFB90E2124E323525305CA29FE781817FD1C3AE77193DDBF6AF98444F28B3508BA165A459634EBFED4F5B4B62FDA362614C3F6DD2CC41BC2DA07180840B053B4E063D1F7F025353C4BE0835BCBF35E6E8A7E6187C40F0EF06657D2C4729D948C2972CB24BA9E168A97C72C0831CB41D6A6FBA54E388EE90696B030E03A8B06363AF7E83689B97535F2FFA3AF59090BD149D0EAE517E9E83A798288A8DBC95FA87BB38AFBCD451E3F6BD3153F7FE37E724788D466C8A05FC8D41DF7937B9640F32CC4725BCEE2A560FD0B491C67FCDBB3EA31B1E7BF4834EA75B1655EC7D22B5F9CFFA7698837DCB79807F5010210EC04CFF2A7D75B56C0872FED6CCE0D5918D662304CDA3C6C43B7935F8646679E59C72FEC584F7F9517AB9E94DEFAB484A72148A3C3D9C410C7BA19B18E2C605988F6C52A9610B95E5E33CFD25B653D0F816001BBA1EF6FD929D2D76E1B743BF9FF269A59F3D2119D753BF965B793CF5DD321296B617E6EAEBF3C17F9BD486C85736FC8240E1684BCACE89E28135AC0BFBDE73D52CE4276B65CE13DB7969511000D6200059F341AD3BF9E1A637F808D79708B9E3D7C394B6090717F3A0670D7318132668803C18996636AF4F6ABF4EA2DEB9E179F26D6CDA7ABDA860B6E158B573ABA1E1FAD8A395241FD0921117A1AB5D900E681AAEF493DFD5AD15CD9DE33CAF597DB58717172A6102DFE88965DBEB198D29815593FDFEB5E9F55F0E2130190D4A73B5F03A4F8FBA4D18032AE90872FE93D76F94AF1273FC3768D6DC7025A2FF2C130F9881B3DBD0DFFF6E2F23231E0B0DC476E2BF7E772645999185039F4DACFACE354730516CA29CC460CD6D0ADD401EC9F4C0C2D648529F0FDCAF764B7933F2E12156A6C3EAFDCB98B97681656D0EAE5573C1D1B6F13CA6EB47AF995150F67892FAF7E62CA360AE7427AD818EF185E47D012A6BA9E96105BF559B2DE49D66F5556617807385D20001D2006AB85859F167F448B7181F2F7B6D02FF26E271FF16F11EB7629B7D52F72F5325F72A15ABD6FDD5028F7D2DCB2B24D9155E4F2B42C94C2257E74EEA4EC40E7F0AD92540C2D14FBFF0AB7F0477239270485EFCFC338794FD4EEA6F84A43AC2D8FB537EE276721BEAF199EC5264FAD361826CD562FBF509DAFA5B972759844B793BFE0EF9C35CCB18E41E45E4A0B20BF033CF76DCCDA58643194ACFA2C156DEFB894B7113E038E84937701B3DB17EEDFDD6059FBE4A7B5FD3605A17C49FFF16C4ADFBEB28BF2AC70B1781FEDA2D265BD3121FAD3278D46B020DE2CAAEBA6E22B6BD32BD92078EE684F808AB8C54B6F9E5470B8C80E0BCF8D4B34FBBFFFEDB031FD6167DAD031A0D27DDAEAE5CF89E81DB1FA9C6831E1891183A04F693606E1B94C342ACAB8F53A2D9EC54DDFD3DD4E3E916290970791DA94AEEF881BF90B0A03A9EBE31491B5699C569040A59F690056E1E42D802CFA2C8B1F2C7FD5A0459F14745632C82E8683C9DAF42A6BD3957C69B3F8E3993F88EC589F32EB62CBB9AC8FFF6CCA0DD5FC056E5912ADB2D6211DD11B969B28D6504A38501EE2EF3891F798FC1F0F860925D4982749743BF984AD773C1D5AD8EEF6B89FDC08FB9E8BEDE765C8653CAE9ECEE695AE67C78AF6DA5A1E84D955AB97DF954296A786E36DE4B4860C973518264D2168BDCC7B5EFECF3C8B60D1735A85F80BC781F8036B73F216408DB604B2088475B01A9C2CDF86151BB80DCB5F78317F938EE82D1D0C4E64079A8BFDE436AF5850A97DE6C91BBC9F655593598CDD4E7E391826E75E8C51D5E7CF0D2505B77351003B02CA4F077DDFC5848C25A484556FC98A27B36AE5B1D98A187EBFB69EAB555CABB2BC3259EBAA8E7789682833A22316C0C23A00506720001DA410D42210EEE2F5B0DCBDFBC802F692392465854F26B2238B441FC3828FCB51C722B9DCAAEBBA0D4EB0782ECC3D5A74FE96AB8CCF3915892AE038901D038D751FC6EEC9562FBF1A0C9326C7D3CA4E4E4C50C96317B97A5579CFC7FDE48EB6DC599D3BC36AB770DEDEB311E910A293040E0E08C0801479322E90D7CBDF107FEBB3CFE40F865FF6ABF4ECCBF4FCBD783F6F995E5ED4206E70BE5FA5237ADBAAAB5586751E620068DCFB478ED7E9B0C44DE8245C4A8B19E30923CBBA17EB8814D5B7D5CBEF8EFBC9D3F0FD1185E9DCACCCF558590575FE3A1DD15BD67582E80387CAC9C7004A3CD72FC45F35C84C603DDCCB0EAC7E721AA405F1F7657BB917241B0ADD8058713FBC8EB72FD320709C936E6CAB6E50D211BD1D6B60E5F9C8EDB48BAEAAFA80FA91B5E9C7FC5DDF7BFA59D0CF83167F7C3F599DABD83DAE6352F53EBC9FAEFBB89F3C6DF5F227C1F2F71105F1C7FB5ACFABF51C4BAB77F8A4562FE763BCE5951FF10E543E83110055020BA0C2B3FAF1EFFDD4EAF88859FD1EDCA25755CFFE91B5E97E3AA24FC38BFDF160987CC42FFCDFDF9CD23BAF1B8583BB1689B2A2C06F891E8456ECFB0D11BD29B7ADC2CAE0C57615592B754C175B7BD6AD07387C6216426F1FCB9A2E7F5BDB88E32EC4ABF236215EEF17E37E72275657AF3E9E653024813575A7A7ACC52FAB28C317806D030BA0822D7EDAEAA7E301C1EAC4B281D5BA6D64B6FD17A2F9F85F1F115D67F9B1F88B8924B1EC997570BD5D9158B382E7C33E6F5A56B955C55FD6A6CFC2E72B519F5FEAF372F695E2EF42AE93E28FCB00C743D6A6CF9DE54B99AD961024F233E5B505507E5A824C3C4B67C2AA28C7129C8B3F7E9639EB576C33895934F572FECE630FF231E5FA126217E20F1C0410800696F0039B1373F3EE60F0E779F2032F9322CC6A901CD7D17BF2B7105A575623A91B43FE2DB380D57EAF65636959454A9EEF87E1F30D714E1FEAED8A621A59F059E3B259C703874D3AA20F9CE54BA28E6841044E789D1537E8758CBCE3F2B1E567D846261EC931078968D641190C9389A8DB99F11C2D0C48ADAC7F8F07C36421A18B9F8155BC01001C021080066CFD93E3016ACB1F2C8187015BEC2CF124C7FB53FB98D60EC76AC042EB4C6FCF9F3226CA12889C2519B86935B0F2B3F0A497EBE836569E6BAEDBC9DF97EE5F8E575CB56C703C78F770A0A9C59CB61096B1BCC9E37BA231CC36F28485190F2FC3338D48D1E7D555FE90DBB27740C6BF5AF504E018800014E801A0A5F52F88C2CF316BC861918EE8BD2C0CF8AC1B83713F39D33314786E1ECB1A6894655A3A74A3198681591055BA5CE502AE2498DC12B5DE368361F2EBF0B9707E55D4031C1696E54B776CE4B6FA5ED616381DDE10B39A5B04B76F9BE85AFCFDFDBDE974DC4F16E6CFD6F5D2C7B63A3FA143F6589F6BA90B05C081812490154136F0E1A162DA9E0F86C9ED32FBAD23783C8B9DD598C8A155628918EBD6C5AB9BFE2EEBC5CB5ABDFCEE7F1C35BEFC97ED690319C040E3DDDFD676BCBE8CD0F3E25D3335E599B0FA5DE841D4F571628920BA8EE1D88F88E87B44749B08431F81E30502101C25560395B567433C8CFBC99995016808B72FBC982855D67C80652EBB4C1D5579F3F98063C26C153CCB8DF5DBAA13D13CB87E7ECD60053C4DACFF7DD1BDC4E87BCA3AB6DCD6587F3F1DD1A7FC9BC312AC2CDDF07542CE60D6B1FAE9F28310FC61887FC5A0E76BF0E0167DF6F0256285EB0A04A0015CBC87CF3A1600C11744F48355C54ED6A631117D2716EB1444E87C26103988AEA8CF6732C1621D11A8CA7F4D21B6D0B3C2788D79B0524EA47B0D9C2E31CB76D1FDA93B59EB941FE2FC9A6C35F73A4B31CB23E359D95BBDFC0911FD5322BA2DE605BEC0F047D5B08BD99E40392000C19C637C30BD973F8FC3B76983A4CBB21A955562888A123ECAD43324BEFC8774443F53C2D29C0145EFDFEDE4EF0F86C9AFBB9DFCC56098DCAEF21A81E3C1B30A5665C126221AB5A7FFD81E35FE49188A8507785E9AB64D97C7CB4B24A2BC66D772D6A66769C8F297AE653D8731581F6B3A50B03F2000C15152568459D6822A858E1713288781B1EA188B235CA56CBD5F1971A9D77903E3025096759EAB4C0DA8EC08CEE8B48E9E389478F5F25CCD603520F6EA0B04A0C1278DC6D77F3D9DBE55BC25A81B318163E13518599BF2903111000018CB49444154BE9F8EE8579BD6A54CF97ADB4D1340D6B1C21802F59266569626111A41B03FF4B3C0D639FEED75B2E47A793CCB22A89F8D30CBC89088CE8970FFAFC2835B74F5F0E575CC64D15CEF1088FB03C3C0189CA2F8E387547F1E1AF2451EBE4FF43AFDB217BFE500B25B177FBC9DDE361670BF8AA8F4EAA4CBB48E3D1826E71CF7A7672D01605BC42CD33C372F11FD463FE75EC7CF7B5E8A2C923FCF1A5F527039AF7B2EA74810730BF1C2DEAC4F45C2106C1FBCD981199771680FA5256EC267B3DBC91F8B048C982B6867890E7AFC414D9920F6A27D254E76A56B19E47283F87BBD4AF900AC4B240C8106C384C6FDA43118266DAB03238FA105A2651137DE15D7E57DD14888480ED00E4AA0859E6550400C607D800BF884D10FE1213E943AC92135A67C63948B732799ADAB64237AEE28C3A5FB753AA2B78CE59F13D19F5370DB1665F8EA7A59B182625ED5173CEF2A00BB2213C32331B1F83E2B2BD97B064BBA821107B8019E954F0BC25DD70BCC8005F04491563F5E76A00FE23744F397F899E552B51A82C130697ABDFF552D6E1EABB8812DD1E7B96AD31199210AE9883E484774669DAF167A9E455097C75617883FB00DB282596EBA9DFC0FE2FBA59A36718EBCE7ADE429ABA313B300863100896826FE444708AC8076FF125DB73DD63AB05B600104510EC52AB88ACB548EC3C7FB6CAB3E4EF9EFF3546B12CFFDB56A76722C289EC220B931CB5FB7938F06C3A4BD4ED9005449AB974F79DAC4F039190C9385216062D67E6F0818CBDA6D94BD30DC0CAC80EB63B52387D2B61C33B0008228757D401DCBD8D23CBA163283704BE2EF151FDFFA64F127CBB712538C841659C6D4B29E789990E2BBE9F6969693C13069B3A5A5D5CB396EF22A9B0DB901C0D6F09EEB713F69B0E59E97C96747FEF1FE65C55FA43AF788E6C26F12D90E14A0BD4DDE32B05B20000111F959BF357E405F13D9963FCB0DCC8846626B2FF474446F581606AB4E65EA6CB9AAC279BC616DEFD469C1BA68C54885EF2CF2CEB9E165CBC72E9364C0E921EFCD562F7FC4F7DFDFDF9B469F0DFDDD73077B99F55E2770DC4F9E125DC70132618818B0226C4C90C9217535309C0A10808088FC07B16E0FA8104337D7714D8AFD4BCF15BAE2F15FA9725C379567A50BEBAEC2FA895C5F74BEDAD26109C7825368866D2E65C307F10776C960987CC4CFD0B99895D3B2DA7B9D276D0DF41243D6A8DEC335F601018EFDABB171E1648000040785E5EA21B25FE8D6CB5D0AA96C36655AD5F55BB2CAC986A74C8313CE8F05D75CA896492AC96699D0E6B017F2F872B9D8FEFF88CDCE31FE1FD8263AD1C97AAEBB9D7C61C8242DF6B41B5897C1C2CF8A07B4EA237FB77AF973690167C6FDE4DE5A277C023CB8553E4CA46EC68553046F78507BAC2C5DCFB523B7E5F83512563475AC77B758ED5BBACEBA7E44B3064ED7AB8C45C38333A1755956E6232F17D7F3ED6E271F656D9A8EFB49430CBC5B98AD09C0BA14C4EBCEE7ECF6B68FED5FE4258859E1C7FDE44EAB975F8467A0894CE062AC1940407D4116303808BC98B532880CC2C7E37EF2F1766AB848A6E628F5B64B47D468F5F2AB713F3993961075AC42316809E2B2714FBA116CF5F2E744745B37BC00AC43D6A6FBE9883E75D699F76BC8465F988566957B316BD3B37444EF599D9D589294A6D5CB2F08D3C1558E9E2E0EEC075800C1DE89254084F5CFC267D40A65B98F88AEA732DB85F8E3248A548CC757048F49A8AD74D675F15C57DAC52C1B3A2FF1C3BBEEE37E728787DE209A3582AD5EFE6485CB00C01C29FEC47DB7E02A7432752744D75672B96D8932DFE3E31475A83CEBBC04E26F33B46B18E2AF1E400082BDA07BE04E462A0B1476D5DEA4159022665796ACF47A2692576259910BEA0BB9AD132F3851F18BB2D19A88EFB17216CAF0C464AB975FC875E37E7203714FA00AC47DB5305B8DBCA75BBDFC79787E9A44D71DB8552DFF1ACFC21E8BCF1DF7931B9B94096640F0D513B880C1CE10BDFC9F10D14FCB88B202D7EF845443D2EAE5178361721E84DF82CB371353C5ED02DDE0F0EF6E277F311826B7A58B4BBBA7BC6B138B7DF45C5C31F43EDD4E3E0AABDA44F359102ED01082AA2872C386FB703218264D9EB2B128962FECF7ED74447FB4CA93BF57ED0CAAD8BFF7797818000E1D08405009599B3E4F47F4815A36A5D9787D378B848DDAA7D48C1E16DD4E3E21A226BB6C5ABD7CBA6FF78D1682AD5EFE7C304C6E135DC727C6B01ACB98D0D3AEB4B2A2B0DBC95F84C0F7F976836132D9A56806A781774FEA65E179A62AE6ED8EC5D27AEFA6562FBF3BEE274F3127303846E0020695908EE883AC4D63B5AC91864191CB8A3F764DCAEF7C2C755CF3F7B89F9C4997D1BE5FD85A8885DFEFF07A4FFC69D798BE0EB14FCFD5152B83689EF5386FE8C2EC0B107F6023B2EB312DE7C87BCFBA87C3F02F730BBF3ADE6725CB8DC6F695B4040E4527D29C8718804305021054463AA2965E5694D96A252378090C7A7FCB05CA43BFFCF2CFF763DACEDA745FD7C9B0749883505B629763FCD4F5B9E27596B02EFA6DD479DAEDE42FB8A193D6D3A2F305A0043CB8B839F38DB60686ACF8065BFDB4F52F1DD187650BB63A4FFA3BFF7612A26E84308829856C60008E050840B0353CAB5F19D76E592B16C3DBF1B861FFEA4FA67B19C22455C35DB0B5425B2965728AD138EAC1549BAAF13AE37D793F2D9AD5BA2B2F53987F73E6AF18F76FEFD6537098C84E10D1B2B88A3DDB6108A28997A1BE0ABA23E5249899DB8BFADC951DA3302C0C38324E75CC42C40082521459F2B4ABD20BF0E675ABC4AFE9EF1622896169E0D87D60C5ECF16F0E70D7FB588920FA5A4512624AB97FADFF8BFCBF21D6095489F54E883DD7553DB7D92C8BF8A6F50C5938E2EF112791D52196186C9707B7E8F3872F17E3D88F1D5800412974DC1DD1F2902DCECBFBB5DE36468180F9432CFE2F30915347ED0BEB7A31DAA5D5EDE4EF132DC72CA986EB1BB9CE8AA1F2AE719135458CF7C7DB20D6095482756F5AEF0D1D2AD1EAE5D3AC3D1B9268CD72DF288AA3D5DF0DDE69F5F2056B7CB050822382AD7FA726FE8820008181E182B4B6594AD27044C64D2FBECF4B64E0ED8CFD5A9640E486222C6B12110F65523B2C8BC76098FC9ABF1B22FB2A2C7BD372F9F26F793C6B99BCE6B29C562FBF92AE5F22A2C13041AC13D818F90CEBFBCEDB9EB37E8988AAECC859CF9D7E0F69C6FDE49EECAC052BE09DCA2A05768AE5E67D708BA6A73C2731042058C2CAFCF482B72DD16759A9E472BD1D6F53C615A4E3DCC23EBF245A705FD662D062D5B8FC55513CA4B89EDF10CDAF41D34B84D16558960DCBAA28FFC6FDE42CC400364402C86FABB902E09471E25BA7FA3E55B1A867E23E7FBCE9F893B1F7534CFC31AD5E7EA593A3C0F1F0F02535A4303CB55840C40082D258D63BCFB568C5FDC86358C7B5BECB7D7579723BB616ECFB259DB5699CAA6CE898D0D5C4D6175DA3AC60FE61EB7FD6EDE47BBF66E03859279E5558009B44D53CCF5E0C60999859A2C56C783C2B87075BF9B4B863CBDF295B0161010451446FF94ABE308B62FA2CD153246C4AD461C1EDCCCB42A3F1A2F4496D112DFEC232E9261F2B37D7A5277035916BF84DF86CC68EA15D7241345F16C50802B00E9655DF125CE15E1C753BF925CD06713FDBD4E216F32614B9A22D20FC0E172DEE1EBEA44691E03B154B20042028CB3C6B55C7FE79DFF5012CF1E67DD7622F967012326A6F57749E95A3EAFB1DA2EBF826E9E2B2AEA35CAE8F297EBE69C5F749ACD8BFD0A89DAFD320025084BC2763E11F44F378BB1B44D716B72A122E64B803D162673456BF50FEA3562FBFCB7582083C5CB4A0E3DF0F6ED14FACF5A76211C428FF808888B2367D3F1DD1AFF4722F41432EF35CB891B2E64334A8E585EE612B868888681CFA3241D8D4E2BEF604AE1C02862D9803BA9E1338B6AF777CB9CCBBFE3C051DCFAF4A04CB06D81E4571BC7299BC6F79E0E54DEE4DAF03A5DDC10549201FEB2C6070984877AFFC4D443FE5DFA7E80A86051010119125FE22DB9A162A25D6AEF43EE2E792F8F3AC83DA7DACC520D14CF485CF5A99EDB5452FB8BA1EEBEDB460B56295ACEF5E999E60E4F987B93C1E6AA3ECF90010236BD357C6B2A58E4C5118C9A6CFB17CF7688B9F2C57BEAB2222F00C9DA4C3E2C12D7F140BCF1D7C8AE28FA86602F09346C37DF063EBC0EEF02C54C6CB7C61A063EFE5AFB3523D2B9FE5AAE976F249B014CCAD59FBB6FE79E28D970F86C947D63EC675FD4BEB986562048DF8AAC7225672DEC00E860985B82BB001C29D74D2EFA874446F67629A425E6E59D9F4F3DCEDE48FA5CB7743EBDF99AE43ACC39A3AF35DB77AF993F03925A289B50DA81F0F5FDAFFCF07B7682AFF78D96E6B572F6A9705FC49A331FDEBE9B451B40CEC16FD123784C86B5223EF5BFBC97DF536D67EB160EE60F99B0BCD7DF7D48BEACFFCDBF7F2FFF76F9E25DFE2DF31AB5D115EA0BD976D29B3A5CBB8EB81CDA95A0CD6A14CF257AB973F22A21F4AEB745519C05CD6AA49684100DEA559620AFED707889701CC445CC32741ED04A006E2AF1E70DC1E513C29C18AB7B17EC7DC9C7A7B7D9CD058FCCDB89F3CADF3D465599B5EA5237A43FC36851AAF138DD4341D515256141A96D1F77970E960F56B066B1F115D5BFE361D63ED1428127A5EC30181E83FFF5A9489C4A40B9908B26916B057B67E0795E9042109E4B090CF9FF7DDFA7D6AD4C205ECB97759FCC1FDBB7F5231B552514F5ABA222DB7AECCBEB38EA3F7D7E586F9399F84CD6B3BEB07895950F439CBE51CC318046383A8DCF8648C6EEC58FC059A62398DFB49231D5103E26F3DB4EB48C610C96D4EB551912E609D6C213FAD8E1DCF405381F8BBD2EF225927671F2F1EF142C6242229E43090CF9FD5393B558B9FA656164029F460F5DB0F599B3E4F47F13911B3367D968EE843B5AC68B0D55BE988FE5864D58AF5CEAD17781D7AE631976BCC252C076116CBFF8A4266DA8A4C280C02CDC7EB76721A0C93F9FF80B37FE1FAAD8653167A1E417C2DC5E059581640223AE767A2CA8C7ECB151C0B41D1C879B2D1793A0CACE7D31AEEE5949FE35A5800192BF62FF61B544F91F80BFC05919DCD271336D43E2F2D51273365E5B1AC17B16828E6C1D93C6444F933AC066959D0C2CE6A60AC63701C9EDC3E1DD1CFD6A90F37BAAD5E3ED5D7A3D5CBA7E9881A3CFCCC263187A78AB4FC9D7AE0780C995061BD07F4F32ED78FFBC98DF03C5F55957861855DE8F5B1E7415A00439219C4DF81202DF30F6ED12B167AF2EF94C51F51CD0420916DF963E10777F0EE10AEDBCFF43AEDDAD1EE162F1B55EEEBB980CB881339D7EFBE2C80458D9BE7F2E26DBB9D7C212983B7B5CE7D1537F06098D060387BACD9FA67257CC002B83AB201D1CBE5275844760A2DC1C5DF5BBDFCEABF75A6539A852D546269F3CAB49E5DEB996051CABF839512D49007B7E899B7EEE14B7AC3127AA72CFE886AE002D6491E65923E9018523DDA0D620551CBED3DA1A65FA2ABBA7CF5B29850092FE3665D867EF1DC4BDE7EECA2D56C60A19B909AB1658D6300816721B082C989E052222AB6AA31D6FD29ACFA179B08C0D87B2C9688A2EAF28488BE4744E744F54C340371641670F8BC7AF892CE10033863EF16402DFEF47ACB0D0C4B60F58817E0C4137F5E3C9ED57BD6AE4DFDA9F711BF7F5B360122F4CEF72EFE560D2CE7B1F758FCE96BB1817B76EEE285F8AB064BE4C946455AFD20FE6658D636EB5D1171BB5E51105DEB209340ACB2CA5AC3D9D300E177B8F0B328DCC14DFE7DEACF29510D2C801E52E8C9CF7DD7EB54F12C5B31AB97D7D3B69223767F46D561652A1395B3E46D128FC716449DEC218FADEB07362316582E638ED0B8CC28937C41341BDA294CBD269F854ADCC0DE33A19759C8B14621040F0BFD2CA273B6CCDE2D809A4F1A8D295BF762C3C3C002582D5670B45EAE5FDC5E2C8FFE6DC5C4050BE1E7C7204CCAC6D659EB56157F1C33C8F17E4476C3C4D71CC91EEBF1E0D662ECABD5985843C1C0B2B088F5CED0EB88E6F3EE5E88DF955C43CB9B61D5C57A565ABDFC89F630B47AF9DD2AEA05B68F7E16F15C2E535B0B20116605D927AB58AE2CCB9363ED9B0F8C7C4C56A998CB3C6BD37D221AE87DBC6B56A6BC222BEA315DDB7D13B3E85903CCC2CA704D248E78928A6C61F5BC5C753B796516B7A27794F5DD3A0E8681392EF09CCEA8950084E0DB3F5E9034AFB7DCBCFBA9697D88049A5F590D1DD12C0E9007BEAD12FC3F76071A9172781D1B236E78DE41AC3ABBDF0AD38874A07EDCEDE45F12D1430A49203CDC14DCC0E098A8950004FBA7E8E558B4BD5E074132C3CAB2E6755E02482CD3DACB7254652E0850B07D4E5D147A9D9EA2C48F74440D230E70B2499257D6A61FA723FAB9AE87E7ADF08E03E1078E95DAC50082FD9185699CC2F7A5E9DC78B9FC24F2AD4E107F338A2C20599BA6D600CE729BD87123C787F8DB124593CB9F2A9EC5DBEB28CA583C167F55B97ED311FD3C9BCD613E2F47C7FF7931CCAD5EFE5C0E02BD8FC1E601D836B000822562D62558F556C3B2F811D9717C7A5F6BBF6E271F0D86499BD76FB3EE60111E43AC6819985164FDF3DE31622CC02B9A8DF35995202C8C99CDDA34ED76F2F7C7FDE4293280C1B1030B2020A2D52C7B459627B0C084C89FF24E5A5AF58ED6FF82C726732C18EE48F860732CA107F1B78C25FCF4B2D8BB85C5D6B89F9C6D22BC7466AFF66438A316BC0EE2EF8266E26F02F1078E1558004194B23181599B9EA5237A6FD7F53B3462D9D2BC8CB78B65FB86ED2744F48FE988DEDAFD9900102716F7CA948DBD6BF5F2E7E37E72679DF2F9BB55AED7E1E59948E43CC0AB940DC021000B2088121BBB4B6D07F1A7C89C7994753C926EA82C0BAB251443BCD59B3B3A1D0056C2BAC73D4B78F8FE35D17CF0E5394184FDC33AE57319D63B2CE6C108E2EF2A7C87F80347092C80006C112B2B3236E65F2C9B7AD50C6D00F64D4C6495B977832BF6BCC281A19F11D1BBE2795A18933094398F3DDC744E6200EA0C2C80006C11DDB894B1A612D9AEA9B2D65800EA402CF357AEE7EF9658DC82F87A5795DD94E5F37231EEDF0D39430900C7040298C14A64B3E9DB3ED8773D0E8D98C5AF4CFC1F0087861C424ADEE79630B4EEF32A8684298A3BB484E7B89F9CA9B29B9BD40180BA021730007BA028301EE20F1C1B2B0C03739788FEB51A149A88CAC7E35983A09719005A0EFDB26A99001C1A700103B0472CF71886D701C786145B3A94C1B0C03D0DE2EF420C09D3584588C56623B19E31ED121E0C93C9AA65027068400002B007F40C2B3A2E0AD63F708CAC725FC7E2FF8295B0106B28186F781819FF978EE80CB17FE0D8810004604F688B44D120B9001C3A32D9C2125F9EF5DB70053F2D539E1767189B19449481EC5F70D4200610803DE20C96BB34340500C744D140E78C989183C4E7E5AAE24C3E57BAEC562F7F4E44EF50186EA6AAF98801A83B108000EC815892873157E952403B00874418E4F94D2BD4A18C354EB2EED87CBA4C5EDEEDE493C13069763B391121E9039C0E700103B0638A1A39233104E20F1C24627EEA37C3EF25D7AF1664599BC6F2181C8BD7EAE5D3E00A6E8A758F0ACA5F284FCF4A229FB5C130A1713F69646DFA7CBDB305E0B080000460C7AC12E3878C6070C8A4237A2F6BD395F81D9D922D88B25658FE15D1722C5E18A7EF79F879BF441D96626D651CA2B4FE85ED3E08E52F4DE508C031011730000080CAC9DAF4753AA2B7C2F768B6BB35F30D2F0F717A1744F41B226ACB3242CCDED5B89F2C59C9B3364DBB9DFCF160987C248FADAD8EDD4E4E836142DD4E0EF72F38292000010000EC142B0CA2CC0C38321B58CED51B965F12514766080B91C7717E93C13099BB9021FAC0290317300000809DA163EC649C5E517C6C106B1322BACCDA749F443C607015FF3A1CE7AAD5CB2FBA9D7C12DCBBCD6E271F494BA1147F08B500A70804200000805DF28360E9BB920B2D8BA023CCEE8DFBC98D74449FD26242C8943FBB9DFC29119DD3F5CC1E44446D2930C332883F70B2C0050C000060EB646D7A4544BF4A47F461649BA5F982797999E4291681219B772AE3FB8888BF5F0E86C9B93C3E00A7080420000080BD628C7DB9345D5B59B196B5E9AADBC927E37E72C31A6F10D32D0230032E600000007B21361D9C97192CB6BF12DFBF12DB9EB1F8D316444B68567D4E001C0A1080000000768E350834517CDC3EB5DD99F8FE76AB97DFF5CAD0E55933906CE31C01A8331080000000768E9E9583E83AF1C3128144F497B1E3C9E15F785FBD8DCE3686F003A70C6200010000EC0D6FAA364B9C954D0A09FB4ED2119D59C7432C2000B000020000D8034290FD81C89C03DB9C364E5AF1AC7841B17D535B1365D97A2E60004E0D08400000003B4708B356CCB2A7E3F5E4A7B6EC656D7A55C6AD2BE20AEF73B9D59D1900870104200000805AE059E4BC0C5E43B87DAB4CB6AF70FF7E1A2B1780630631800000000E066F3CBFAC4DDF4E47F4472BB6CFCB3406E0948105100000406DB1C60A64D4302E2F3D4B1F6F5BC28208C0C90001080000A036C4049F47898CE085EF65AC84001C3B7001030000A835B1A9E1BCE16262D3C0C9FD01385520000100001C14DE3880456308168D1F08C0290117300000805A21E7F935D62D89383D8308630D1DC3DB575F6B000E0B5800010000D49A58CC5E6CAE5F7D1CCF8D0CC0290201080000E028C8DA743F1DD1A756AC1F441F008BC0050C0000E02088B96EC3BA01D1F2902FBC2CB2EFABCA2A09C081000B200000808324C40A36AD98406BEE5FEF3700A708042000008083C773F11AB182E37444ADDDD710807A0101080000E0E4C8DA74958EE86CDFF500605F2006100000C0D1101B424602F1074E9DFF0FCDC7488BEF17F12E0000000049454E44AE426082"

happypng_bin$ = SPACE$(LEN(happypng$) \ 2)
FOR count& = 1 TO LEN(happypng_bin$)
ASC(happypng_bin$, count&) = VAL("&H" + MID$(happypng$, (count& - 1) * 2 + 1, 2))
NEXT count&
OPEN "splash_happy.png" FOR BINARY AS #1
PUT #1, , happypng_bin$
CLOSE #1

splash& = _LOADIMAGE("splash_happy.png", 32)
SCREEN splash&
_DELAY 5
SCREEN _NEWIMAGE(640, 480, 32)
KILL "splash_happy.png"
_FREEIMAGE splash&
PRINT "CONTINUE YOUR PROGRAM HERE"
------------ end code -----------


From Garry
http://creativeminds.webege.com/SMF/index.php

Posted on Jan 1, 2013, 5:35 PM

Respond to this message   

Return to Index


My GrandDaughter

by (Login GarryRicketson)
R

This is my GrandDaughter, in QB64,
--------- code ---------
'************************
'* SPLASH SCREEN VIEWER *
'************************

DIM Andrea5jpg$
DIM byte~%%
DIM count&
DIM splash&
DIM Andrea5jpg_bin$

Andrea5jpg$ = "FFD8FFE000104A46494600010100000100010000FFDB004300080606070605080707070909080A0C140D0C0B0B0C1912130F141D1A1F1E1D1A1C1C20242E2720222C231C1C2837292C30313434341F27393D38323C2E333432FFDB0043010909090C0B0C180D0D1832211C213232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232FFC000110801E0028003012200021101031101FFC4001F0000010501010101010100000000000000000102030405060708090A0BFFC400B5100002010303020403050504040000017D01020300041105122131410613516107227114328191A1082342B1C11552D1F02433627282090A161718191A25262728292A3435363738393A434445464748494A535455565758595A636465666768696A737475767778797A838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE1E2E3E4E5E6E7E8E9EAF1F2F3F4F5F6F7F8F9FAFFC4001F0100030101010101010101010000000000000102030405060708090A0BFFC400B51100020102040403040705040400010277000102031104052131061241510761711322328108144291A1B1C109233352F0156272D10A162434E125F11718191A262728292A35363738393A434445464748494A535455565758595A636465666768696A737475767778797A82838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE2E3E4E5E6E7E8E9EAF2F3F4F5F6F7F8F9FAFFDA000C03010002110311003F00AD69762388A96AAD24E4923775A26B284479599B7FA5635DBDCC270BC8F5ACE3B9C6CBA6E1629392326ADC537CC0835CCBBBCF3A82DC8ADD81B620C9E69BA6D6B71BB58EB05CF9B6183D856379BB64CE7F0A45BF58ADCA93C11597F6B592E4007A9A85069DD92AD7B1D75A4FBD2A75B9284826B1ECE7083AF152BDD297C8E6B394537A0EC5F170AF281FCEAE4ED188339AC58A60D26718AB924892458CD3518DEEC15D1716556B3EB52D816284F6ACF8C7FA3F0DC55DB19B6A95A6D2B68357EA490BA9BA3CF35B368E3CD03A5732CFE5DE17CF1F5AD6B7BACB820F5A4F6D02269EA122EF033513106302AB5DB179054B9C462A12D0A64D0B01D2AD13F2D66876033532CA7654EA048E4F205430C3BA5E455942BB734E8C00F9A05CBADC6CD097C0C54315ABACA083C55E918EC381CD5285A5137238A34674D36EDB9AF0F00034F63822ABAB102A50E1B19A97AA222AEEE36F0858437A5711E2C97CFB65543D0E4D7637D2AFD9C826B86D557CE040344346392B9C4C88CDD7B544E7691CD5DBC5D8E4552615D0E4DB29080739CD4833B71EB4CC02B81D69E80E3DA936DF90AC3962DA38C03F4AB0A3083B9A8D40634F0A738C54A7D2D61AF302E7774E2A48DB91818A4DBBBB54AA99C0145DF407A8E91588F97BD16D6811B73F2C6A78D38C6326BA1D2B474B95592553B693B25A32BA1991E9724B0997A28F5AA91281360F6AEFEFADADE0D359238C28DB8E05708854DC722A60E4DF912D92DCDB47346460035CF5E6872AE5C72BFEED75E5506D38AB0D123C58C0AD149277259E5E600927CC08C7B55F471E5633915D26A1A1C7282510063DC5631D2258739236FEBFCA9A973EE0B4338C5BC1C7435526D3F209039FA56D25B14382B5616D0B73B78AA52D6C071AFA648493B4FD052C7632ABF2A715DC41A579872471570684AC33B45129B05A9C5ADAB9C601A9A3B790360D76434550385A77F6322907149CDDB70D8E563B372DC9356DB4969D4715BCD62B19C85AD2B386368C6540351195F606DA3876D1E485B251B1EB835A5673DC40A10120576325846EBCA8AA0DA4216E062876B6A174F7304DD5D87DC0391EC09AD0B6D6990A87522B5534C55382A08A56D1227F9B6735178F615916A0B986EA2DDD3EB492794A323155E2B0688FCB903D29AF03927AD1777B582C482504F15299FE4C71500B66500D02266639A76645C96298EEC8AB2676078AA09BA263B86054A5C1C1155C8C4E5D0B4D76C8A493C547FDB0BB0E335198C4CBB49E2AA4D6F1C3C0E056B4E17F88CE574F42BC938BBB8279C54882284F071511648D86C4E28960F370C090056B64B4E866DF72492E1073BBF5AA24C972490E40A95AD5666C16231E86A48E3446D99A2CB7DC69DF7085191402C4D5A5008A6855C6053CFCAB9C5672F798EFD087665B934F2360E6ABBCB87A0C9BBA9E95826AF62F91A5742ECDEFD78F4A9046027150473C60F2E33F5A97ED08460106B6719773394BA0DC076FA53845BFB52C6A19B8AB001418C509BB6C24D153CA7593AF156932383D69B232AF2D5035DA01919A3DE931A2C93C633504ADB7E955D6E4B6700E290CA597A54EB7122541BC8352EEDA3A7355E3122B7238AB04F07BD34AC8762A4D6818111AE07A9ACE9B4A9275C211F5278FE55D010B9393F80A6F9648E70ABFAD526FB9A3EE726344955CB226F61E9FFD7AB7044913859D0E7D2BA354C29DA30B4AB1AB0C6DC0F5F5A2ED137673DA8D9413A0D848C76ACFB5D35D6E32181CF4E6BB092C2290E76803B9C75A88697197C8CA2FB1A86DAD531DAC677D8AEA35E1777D18545E54E8DCC6DF91ADDFB0BFF0C84014E16F2260F04D139BB69A8F4EA6106910F2A79A9165201DC48ADB6121E1E25603D46698D6F68FF3496C3F018FD01A4B4056E852827DB1E33FAD5882E42B1353A41A732F78FEAD8FE752C7A5DA483F777473EF83FE152F9A4F529B33DA62F3E7B55E82E00994678A79D0A55198E447FD2A03A65E44D9F2C9FA73FCA9E8848D67995DC60F4A73DCA94001E6B24A5C4432EAC3EA2A15B87DC460D2DF51B7D8DD32E1179E6ACEF0631CF35851DC96C6E3D2ACFDAFE5C669343D4D649803826ACC72027AD73DF6AF9C735763BC0B8C9A3619B7BC74A5C8CF4ACF5B9538C1A985C0CF26A74B86C5E539149BCAF51C55759B8273556EB51D89B71CD265A7620D4AEC962ABD2B9F99FE7F9AADCF76189C8AA133AB0CD0A16F9837733752B18A442E3835CEC9015381938AED711CB10DF1922B3AE2C22624A8DA3D2B5568E9604CE5CB6DED522CA302AF4F6A9B8AE31EF595736D2C6D9439147334596D5B9E0D59424A8ACD89252A0E6B4A15CA8F5A560B0F0A49E0D5BB7B76918050734EB3B43248A369E4E2BB9D17488A060C600EC79E57350FB814F43D16371E64D1671D88AEC6DC5AA401440800EDB453628E7C9020603B7CA69C2D2EDD1B2BB4F6C9ACDBE80DDC8B528E092C24C22E769C715E5880FDB9971D0E2BD4AEB4ABB92D1879C8A71DC9FF000AF34913C8D46447232188CD38BD6C80BEC80814F82228492D914A855C7518FAD4C197A122A926989E82EC0DDAAB5CD82482AD6E51D08A8DE6DC3AF4AA5A3B92CCD974A5603DA9459003681CD5C12B13CF4A6957EA0D5AE67D42E431DABA274C55D81484E45451CC7EEB1AB08E00F6A55016A0C3DAABCBF28E2A779971C9AA92BA9EAD58CD3B5D9AC10D724C2588ACE86F1E296ACCD768836839AAC21F3D0BAF5AD284AEAE6357E2B237ADA769101356861BAD6469B3E17CB6ED5A5E62A375AB6D37A092D09246DA3205241779C82298F2023DAA169638CE78AA496EC2E5B794F5C5579642780B510BE8D87514D4BA473D6A1BE9626E588D89FBC29AC0AB7D68DDDC1A78F987CDD69A7602091378DA69863DAB81D055A71C714C09B81AA6D3246DBE4F1DE8B88124E5BAD3A25F2C939A8AE198B714276190ADB2B707A0A59222A00078A23F309E7A524AB2FAF1549B4B564B45716E4BE777148F6EDBF23A7B527EF03FDEE2AC676A8EF4F9D9291120607DAA6643B49ED42955193C54325EA004020E2A629BD596914E54FDE1A6953B4F348F7685F3DEA9DC5CCC46D40307EB58A4D3D8D672B44A936E0E406356B4FC16F99FF5AAB046CEE778E7DEACDB44125EB5E873C79795EE79CA9CBE266EC0029CD4F2355557013834D329DDED5CCECB45A1D04CD1EF5E4F15098117A818A64D76224CB74ACE9F5259010AC41A4B992D04EC8D2631A6718A85255693AFEB5942E09272C4D02729C8CE6A1BD7DE15FB1BAD2802A31216CF3C7D6A8A4ED2A0E0D485D907439AD3CB6046AF43F28C9F534C7624FA9A7337CB93C0F6A072320607BF5ACEC9EE69AB1EA48C64E7DA97241E79F6148393F28C7B9A91464F1F8934DDD2D016A3C3631BB9F6A95086233F80A8BE53DBA7735246013C703D4D11F3024C1DD8CE6A40B9191F9D22EDA937638C7145D0C6632307A523461BB0DBE95212BDC734CFC6935D869113DAC4C7EE8A3EC4BB700915328C0EBC53813EB427DC646B0C918F92461F8D2A5CDE46D82FBB1EA2A40589EB4A46EE6A6F7D51561FFDAD76AB830AB8FC454666826CB4B6AA09F4519FCEA456C1E69D843D850930B153C9B020E77A1F61FF00D6340B2B793EE5D01EC463FA8AB86247E368FCA81671B76C50A561945B4C6C164955BDAA93D9DF9946D43B7D987F8D6C49A6065C2922989A7CF0E3CB998E3D4D4A7DC1C4AC7CFB74CC8AC3EB55175676B8F2F0703BD6B325E1601D9587B0FF00EB540F6BFBC2EC8BF9524ECEC1617FB4484C03504B73E6726AB4CA49381815559E4CE029A765AB1EA5991F7718150370B82290BB01920D46270DC77A6ACF4B956668419F2861011F4A648473BA3FD2AEDB44E6052B8A4921933CA8355A31348C896DADA41965E6B1353B558A22C9C8AEA648C8CE63CFE154E7B68DD0EF8CE29C5761EC7236EC4C78C62B734CB269467CB673E8A09AAC2D564B8F2E3040CE00AED34BD16E2DE15F9973EB9FFEB5152096ACA8BD2E6968FA62C11A4AF100DE84735D279E23DB8518AC316974485372C07A026946981DFE77624562D86FB9B0DAB2C721CC8A17EB558EBA06EC3EE1DB155A3D3ADC29601C91EA6A65B18026E16E0FB119A42B22ADC6B4FE51524F35C4EA9017B92E8A79E4D7A3180228D902E0FF00B35CC6AB162ECE139EF4BADC664E97A7CD75C0257EB5B1FD81301F3364FB56C6976462B749368C900D6AC6B9049154E4D6C51C45D6992DBAE79359DB263C08DBF235DC6A2AA571C564F96A87A0A1325A462DB58C93360E453248258A52982457407087200A8F6AB4809009A6DDC0E7CD9CBBF760D38891060E6BA4F2D719DA2AA4B6EAE7951436C2C7237B2DC938456FAD51792EC81BF2547B576ED63130E547E54D7D36D59398C03EDC51CDAEA6AA692B58E462432AE76FE7562299A225429FCABA14D2E145C28A51A5465B207354A4B6E8632577739E8E6904B9098AD1F39E45191CD691D2541CA8A51603381537EC4A899C5DC2F4CD65DCCF3E4820815D0BE9F203C1A85B48370C15CE29F3762651BEC6043E749C2213EF8A94ADC45D10D7A0E9FE16B68ED94805891D4FFF005AAFAF852D187CFBB1E99A529212A5747016E6528188A9C1933CD7783C27678C13263B61B18A7278474F1D4CA7EB2552995C9A6A707893F0A77CC3A577DFF08A69C39DB20FFB6A691BC37A5C685B631C7AC84D57327B8B92C700C1EA331484E4D773FD89A695276363FDF3559F4DB05E541007FB54B9E2FA0729C6BABA1E4E3EB49F79705C67EB5A7AC59A4B28F29B681E959D1E9C14F3213F8D541AEA43562131E0F2C3F3A40C738045596D372DC4A7149FD95927F7A411DF1D6AA4D257119B7AEEA847AD60BF9BB890C6BAB6D299FEF4BCFF003A58FC3E8CC096E7D3B5671959DEC74D3A918AB34731086DC0119CD5E7B16F2F783D2BA73A045B3705008F4AA12E9529CA8900155CF196E6756D27747287CE329DBC62A68E39BEF1CD7451F87F03717073ED5A7068702A0DDCD37517D939DD377BA39886299B1C9C55BFB33273924D7551E93028C6D0454C9630A71B462A7DA5F74354FCCE3DB4D375C36EFC2ABC9E1CDCF81BFF000FFF005577EB6B07B64548B1C23A81494FA0DC51C247A2045FF544E3D6992E96594911E00AEE6458874518AA92F94AA700668E71A8A389532C7944B72C0771FE18A8F37321388483D8015BF705558B6DC13DF155D982F21727D8552A97E8165D01B0ADD3269C0E4F3D7D2933950148C7AD001FE1FC4D5B4913AEC3DB007BFA0A1371EBF90A3683F74F3DC9A45041C0393EB59E8C7B138607E523F015222E0E0FE42A143D71F9D4C871CE7F1A2FE41AB44EB81C1193520CFA7E3512303ED536EE3145D5F518A0007DBD698EABDAA4EDCF5A88F5A6A482E20E949827914A7EEF14A9C54C936EE521C9C641A781E86900DC78A795C0F4A52292D069009E6A41B47434CC74CD2E295DAEA1A0F5386AB2A4540171CD4B18CD2DC76D4941C9A79C63346D00645006451629223603AD675CCADBB03A55BB99362902B1DEE086E69DB412B362904B722A68A05639DA3F2A805D81D573F854D16A50AFDE18A96AC6918ABEE591650C830D1A83EB8AC9D4ACA3B53B90607B569AEAD6B9C16FD2AAEA57904D0FCA43534CA953B6B721B59D8C430C4558F39F1C36699A70824830462AC496D09FBAC4551915C492F7C1A8E59250872808FA54CD6D81912FEB5048B3AA1C4808F7356DDB7616B94B4B8526D5409063A9AF448A289634041AE1B45DABAAAB48BBBAF03E95E842E94469B6DC9FC2B29EAEE525A0A163F307C873F4A9159158E22E7E94C37326FC2C03EB4D125CB337C807E1536683724591B6922303F0A1A498A8C20150E2E990824034BE54C5466403F1A02C49234F818207AD72BAA6F378718CFF00F5ABA8784E41337EB5CB6A49FE9C70FDE8B81D75842BF63427FBA291F0A4815069ED22DB229390062A46DC64E943199BA80E2B24F5AD9D4B18158E47CD8A5101EDD06688D3E6CD1229C0F4A58B8602A9DD88B0572B551860D5D6E16A9B8C1E69218D63ED437DDCD1D714F603653B5C08D5475A95105460E07152C79EE292D5EC04814639A85D76B645580B5132F345BB0817E6193488079A291BE51C5247CB8E69C572E823B4B241F664FA55AC5548519AD8043834C2972380D52C0D1C6075A2B33FD2B7E0B1C54862B8033BE9AB011DE5C4DCAA703DAA18217940F35F03D3353082693EF1A24B39B0086345C05B9B7510158B19AC7FECE9A6EF803DEB616CA66192E685B768890589A6238ED46DB64DB43722AA184835D05D69DE7DC962D8A61D287AD2E61BA6D987E5F34BB30718ADCFECC5E39A79D323001CD3E64F717B391CF98F0722AC429F356AFF006747BBDA9CBA7AA1C834F9D07B3914E45223ACE643B89AE85AD3200CD42F631A0271531690DC198EBC002ACA0E94388F7E14735228F6AB21AB17221194C1A8DA22CC714B16D07E6A9772E72295BB10D91C76830493CD27D9C1CE0D4E1C05A8B7ED3C525A815258C235519D54648AD294EE049154644DED8A3946B531E701DB9031511507A0ADA3A687E83142E9607B55464BA8D41DCE7BE55396FC051938C9E07A0A42D93C0CB52818C64EE6ADDAB6A8C9B0DC76F3C0F4A50ADC6781E942B056F56A94104E4609A5749021CA7030DF80A9029CF23F0A60193EA7D6A40C48E3F3A96EE3245FBC3B9A9875F7F5A85464FA0F5A941E79146FA8C93923FAD318629C0E3AD0481459AD589BB8C0D96C5380C7D29B919C014EC927150B7DCA43D4F3C53F7173C9A84020F1D2A5514D6A8AD471183C52A9CD34F078A72F1F78D435D82E8957A7352C62A251CF35326338AA7745225E71C1A0B614D3B1C5437126D4A9B9467DCBB337159B3000F357256DD9C5674E4E6AAE91362290F1C74AACE7279E94E932055762718ED436BA0D012077A92363B08C135548CD58815C1C0A2CF719B3A5380A5592B499E2C7DD22B374B6915B05735A8CC48E62FD29BDF41B2B3184F5C8A82558590E1C8AB0FB7BC5FA55794C78398F03E947A88ADA41F2F5742BF360E306BD217CE31A6107BD79A69CE06AD198FE5F9BBD7A5A239897F7B8FC695476B02D879497CC1C8029442F962D20C7D69191438266FD6981615663E6126B218BE52F96774BF8E69AD1C3B0664E3EB49BEDFCB3C9229A648020F949146A343A45B6C8CB1CF6AE5353119D41867AFF0085752F2C7B8622CF1D715CAEA52A8D41C95E7750924EE86B53AAB264FB3260F1B454E1416241ACAB2BA536CA00C60715616E3DE8DCD7D9916A6A0115952B2B11B5715B173179E99CF35922331C98614B4D9912A6E2324C8502962EA053AE186463AD47093E664D5A69E84169C7CA6A931C9C55E7E56A8B0E68F401E171DE9CCBF2D227CC306A574C28A181001C5491FDEC51B32334E857E6A169A889994015589C9AB646073559B1BA9A7D4646F9DB4900DD3014F71F2F5A2D173709F5A2E23B8B45C40A2A52BCD36D86215A9714AC0465466970294F5A518A5601BB452E2968A6842E2AB4FC738AB23A556B86EA29C9033264C3484D21EB8A571F3934C24D62D26754761CC07AD33B734A338A46148A133E949EF4B8C534934AE21D9E2A1B83B613CD4BCE2AA5D1222347992CC91CCE4D5B8F96AAA8096CD5C4E0735BC55D1C93DC9421C528E0E29F1BF18C518CB669DCCC5EAB51B707A53BE86992734EE045338DB8AA8A7E7E956665C5568C7EF2A59515A97908D9485B9A6E78C51DAB3D6F63A6C7100E461385F5A72024F1C0EE69DB7E605B00761529231C8007A0AEC69338F71BB0374E07AFAD3C15098E829B9C8C9FC053C20032C413D8545DF5042A9C2F1C0F4A9813819FCAA1032704E4D4AA4038073EA693B7507E4499C7B9F4A903607F5A8438E7D2A642A40FE54EC807AFCDD4F14FC535460D49DB354982222B834E4029E7040E290617AD672DCAB0743CD381E73DA933B874A0600A4ADB8C79208C8A5519E48E94D538A783BA9340921F9CD4B1F06A35C54B1B0CE29ABD8A44E181AAB744918AB270AB9AA53C858903A509B43BF628C9C1EB54661EFCD5C97EF540CA1BA8A95BDC6B73365240E6AB92319AD0B8840427154E28F7B6DEF5774FA059108EB9238A9E36F9F2302B423D1DE419045598F4260A59DB18A49D87CA45A487331C30ADC65980ED58BA7C5B2EC80F8FC6B71A36FF009E83F3AAD5099525F347F08AAF299197FD58ABAC8FCFCE2AACCB28076B8CD177D048C9B504EAD12B0D996C57A3C5E4F909B9C935E6D1BBAEA71F98D9F9874F4AF4A8046608F1193C7A54D4D4A439CC1E60E096A6074CB62327F0AB407CE008BF1C53D43E4FEEC7E559219441CC67107E94E224DAB887F4AB804A633F280691964217E6029DD015D84A4F08315C96A4186A0E0A8CEE35D9BA3EECF98315C7EA9B86A0E430C6EA49D8A8EE5EB4CE06EAB6C9C7154219B681C55E57DEB45D3D8EA8A1F1C980466AA4E4193352A9C1354E57CC942688A8F4193E01E288172F4E94AB8181CD25BFDFC5368E72C32900D5500127D6AEBFDD354CAF391557EC2638601153B72A054210F19A7B1DA68BDC091A201320D361077505F2053E13CD0ACC07B7439AA8D8CD5B7CED35531834240364C05A7D82937298F5A26E82A4B0C7DA53EB401DAC23112FD2A4A6447F76B4FA7710D3D6968EF454A00A314518A60281556E0039AB75527FBA4D393D00CB6FBE46298477A73F2E48A46071586A752D84C1A6B734EED4D6A56013B53474A5C518EF4F715C4FA9AA9787086AD1AA57A405C1AA44CB628479DD56E3E7AD5641CF1CD58438AD123965B9613834B9E69AA4629460D3E5204CE3A50CA3D68618A8DC9A2FD18114F81F4A86200C99A9256C0C1A6C1C9E94A496C8D21B9642E690AE0F34E1C74349C9EB586A99B9C4630707E66FE5520041E0EE3EBE951861DB8F5352AED2BF29C0FE75DE9D9D8E27E82ED18383CFA9A66E3BB1D877A77DEFF657F9D22A8CE0FE550D5DDC5A20DD93C7007EB52AB0241238F4A8F1CF239F4A900C9F97AF7345931928601B91927B54EB8AACB8DDCFE752871D3B50DA5A31D8977FD71530CEDCD57DD9ED53A9CAE01A6DDC0039CD1BB3C1A6E40A5CF7ED53E831EADD4529C629990178EB4ABC8C9A95D87614669C1B0304D370734BDC668B30B13C678A76E0A734C560054134E338079A9B94B42CCD7195C0355724E79A407753C28C53572922AB7279A88E49A9DD7E6C1E95111CF069C741AB5C6CF1E61359D02E6603A569CE36C26B3A103CDCD4B526EE533A6B30022D5D906623CF18AA16ADFBB156CBFEE8E4F6A7A6C2673F114FB73750735AC44647DE35971321BF395E335B59876FDCFD2AA3B09951B61E379AAB36DC101CD683AC3D769AAB30882E421355A21182A02EA4854962181E6BD42096510261147D45798BB0FED18CA263E603A57A545148604FDF007EB535124914B62D99A6DE304014DF366DC7320C7D6A3F27E6199BF0CD462140CC4C84D657024695FCB20CA3F3A85DC60666FD69B24502C44976C7A9AC5D4F55B2B68C00E4B76028571E88D8967B653B9E75071DD80AE3752BDB737AD89C1F98FDD39FE5591A86A535D4879DABE8335491950E48C9AA54DC8148EAD7548F68D993EE454CBAD220C135CC0BC51F2D27DA91B8C1CD0A932FDAC8E9DB5C888C03CFD2A28F52566CE456346AAD1F0BCD4915B9ED9A1C55C8751CB737D6F636239AB3010CF953915CC490DC20CA64D4965A84F6EFFBC071EF46880EB491B0E6AA03824D360BF8AE23C03CD3F6A9E54D2B831E8E4F5A7BD401BE6C549B86F00F4A6D210A580A9213EB4C6008F96A48C714276403E5384AAC0735624FB950018618E9400930E2A7D357FD254541719C8C558D2F26E57346E23B38F88D7E94EA646498C538534C614B480E4D2D200028C528A298099E2AA5C9F909AB66A95D9C29A977033B39CE28ED4A300D2124F4AC9B674F418693AD3FEB4DC7346FA85C611E9498C0E6A4C0C714D39A04D91B0E38ACEBEC9E0D6A118ACDBBC16E69AB3265B15A203A5590062A18C0EB8A9D57D6B5395B1E29DB6845A9586168D882371800542E33531069841C555EC05674E39E944433D2891BB53E11C7159CF6D0D698E0BCD3C0A52A31EF48A48ACD2EE6E70F1A8CE5B851D053B3CE7F2029A303EF1CB52E40E9F7BB9AECD77383D0562C7DCFA7A52A06C678CFAD2039E41C0EE69C1F031D17F9D2948121EA5587F334646DC2F03F9D301EF8E3B0A99173C9EBFCAA6ED9445920F352822919476FCE80A303F953BAB889BA8E3A5489C53148C629EB8FC29BD7518FC01CD04EE14CC9CD39548E73C54B4CA49120E28FA5008A5183C516B0D081BE6C0A7D3428069C4E173493D47618EF818AADBBE7A49A7CB605461B2C2851DEE389757A75A379A4452454C9096EA28BB1FA14999B3CF4A8C9C9EB57E5B5F4AACD6EF9C629356DC1113CABE5106A8211E667B569496E1633BAB2F8F348154ACF629DCDEB4983002B43686435CFD8F986618CE2BA38D3317BD46CC6F63051992FC8DBC66B644A48FF0055FA563CA920D470BEB5B6B1CFB074ABBA6AD62485E67FF9E554E7925DA7118ABED0CDEA2AA4D149839702926C3439E7690DF26F5006E15E9D6D1C26DA32598F00D7995CA94BD425F27238AF4AB59B16B1811678029547A2296DA16F6C2241C1CD34C9026E3B0F1D6A392ED95BFD5003D6B91D7BC56202F02955246091D6B34AFA09BB16F5AF125B242D0C111DDD89231FA570B34EF3B125893514B7E9365D9F39F5354CEA312640C56D08AEBB8ADD4B404879C53559B279E6A99D4C336D0D8153C33A672587E755CAF70B96E146924E95B76BA66EC36DAC9B5B98D5B248AE86C7508F00123F3A577B032CC5A5803A54C9A7953C8ABF6D731483A8ABE8B1BAF045435A85CCA8ECD48E454726942507E4AD80814F02A546C718CD166F50B9C8CBA54F684BA67156ED26675DADC1F7AE9195241B580C567DD698AA3CC8B83ED532571DCAA839C914E7196A75BB46CDB243B5AAE9B6849FF5831EB9A7A8D22A00CA2A78F01324D4FF00674DBF7E9AD6CBB80DF4AE04323065A857EF55EFB1AF4DE28166BFDE14D35D4467CE496AB7A4F37238A65C5B843F781AB3A547FBFA69A0B1D526360C53853538514B4AE01DE969A339A75001450293340013C552BA3F255D3D2A8DDE025260B72870D484E38A50334A5462B33A06F5A422948C73484FE545BB80741467D450BD29A464D2600DD2B2AEC665AD47E060D655C9FDE629C77227B045C1C5580B9155A3F5AB90E1856B6D0E57B8F8D06DEBCD4E501033D2ABE76355891FF73C75A7A92453220195350EDCAF5A466E31DE9064D0EE80A730F9B153420EDE6A29412F53C5D3AD435D4DA98E039F6A4240A5393DE9ACA3BD459A36383DE58E17F1269FB4EDE385EFEF51A95EA785A9339193923B015D6DBD91C56D07C79239E1076A793C67193D80A8B3EF96A78257033CF734E4958561CA0839079EF5329C83E94C0571D38FE74EDC38207E14980A3FC8A07CA73D693DF3CF7A728FCA9356F8469122E0E0F4A970334C41F37BD388A9B3EA3170075A785E38A6F24548A462AA29F501BC74A56E0F14BF2839A41D73517D47B8A78A82E66DAB8A9A461B7359733B3C87278A3D4AD5081F2D8352AF518AAFBB9E9CD4D1924E68B34C69DCBF0924815AD1C7B50565C1F794D6CC472B4B5B9444573DAA191455B6AA373204CFAD36D2D02E665F4E402A0715971FCD272455FB9E549359CB82E79C5546C1D4D3B2995250A71F5AE8E22193835C7A1C1FBD5AF6176FB82E7359B8D9DD1ABD509709FF00131043E2B6501DA332FEB58974505EA963D6B4C343B0618D3BB466C99C2F797F5AA5726203EF1352B4B10E8A4D412B2B2E447FA555EFA05B439CB92A6FD76E73915E9F6C25FB3478C0E057985DEEFB729098191DABD06E664B7B30C6E02803BB6294AF6B31F431BC65AFC9A3D9991640188C28E3935E3D73ABCB74CD24CE5989CF35A1E31D586A5AAC81642F145F229CE73EA7F3AE55FEEF06B5A30B6AD129179B507E81B03EB5526BF62D80DFAD56C647DEE6A2604F4ADAC985D1796ED838E4D5F8EF1F8E4E2B1A324F6A98CA40C5292E9628DF4D44AE3E6ABB0EACEA7EF9C7D6B935B866E3A55CB7918F534D404CF40B0D78C68097CFE35BF63E224661B9B1F8D797C171B78C9FCEAFDBDE6D71F37EB594A31DAE4A3D723D5965600118ABC9396E4579CE9FAA05DB97FD6BAAB3D5E3D839AC9C6C06D34AC1B34925F0C6D3541F5042B90C3F3AA335E03D0D4B43DC7DEDC2C728914D745A5B5BDE5AA37058D70D7D720C2D9353784F5A22F05B97E09E39A37D00F485B184F6A5FECF88F6352C2FB9454E78005435663291D3E3C71914CFECF4EBB8D5E3DE93B51A81CF5EDBF94FC126AC694B8928D44665E4D3F4A3FBCC53433A05CE29C2981BB5381E281077A3B520E683C77A0070345309342925B9A00739F96A85DF4157A5FBB59D76DD314A40B72B671494839A43C73593B1D238E00A6D190694E292D4561A302826931CD041EC38AB4900C94902B26425A639AD394902B3181329AA57339BD0910F38C55888851C1A81071522FE55AEA73327EAC335625C08C0AAE3B54B2A9D80935222B363752903612298F8041CD0CC48C0A7D00AAE7E7A954719A8181F32A6519193594AE6D4D0FCE391484E79349904E28273C52BDF435385239071F37614E43818FE2EF512313C039F5352AEC6E3B7EA6BB36D8E15A802327071EE69CA4E39FCA93CB19079C761520033D327F954B6D8C137631DFD29EA08A6018CF5FAD2E72293F3044BCB0E2A645238A8A3EB9CE0D4E0E39038A25A14850B8E69E8431E690734A00CD4DF9456158F65A51D39A38E71462994C00F5A6EEDBC53F703C5453C8AABC52DC7B6C57B99F68DAB545989A7BB658934CE0D3BBEC17B8E538C6454CBC9E2A0FC78A9A32037BD1D468D3B6E48AD7881007358D6CD923B56AAB05506959DF56592C876827359739DCDCF4A9AE272FC0E2A948481C9E68B924326D2A411599B7131F4AD36E54D67B2E24E684FB85C5584EFF635B5A75910DBDBA566478F95B3D2BA6B62AD082B59B577765DCC9BE2A2E80DB9AD481633182233F95665D97FB68C2E456E4264F246140AB10C20E3E58FF4AAF3894A9C281578F98472C0552B9CE0E65C7E34F5BDC0E4B506905FA6EC601E715A1E29D417FB22455CEF6E17F3E7F43597A9B05BC187DC6A0D6647B848E3C74CE7F4AA7D2E52D51C0C90BBC8735049115522BA19ACCC6C70B5524B3DC0935D10928ABA1A8F739F68CE32053446C4735B0F6248C01C5406D1C1231C53553F981C4A6A981D3F4A68DD93C55C16EC298D195E7BD5A926C9688140EE2ADC6A02706A38FEEE0AF26A440541CD35625930385EBCD4A8DB79CD56078A7ED246054349EAC2C5F86E9B780AC78ADAB7D464503E7FD6B99886C3EF57A3980039ACDC55F61D8EA5354664FBDCD3975327AB573CB723A50D721578359F2311B37979BA1277566E99A87D93528E4CF01B9AA33DD8316375674133B5CA2A0676670A02824924E3A55C62D203E94D1AE85D59A38EB815ABD40F5AE47C193B49A6E5D4AB67A30C11DBFA57580938AE696FA0C5E79A46E052FAD31C9A9D40C5D40EE96AC694BF3554BD24CC6AE69279A2D6DC0DBA5ED4DCD2E38A5600E71C504D0180E2909E69806734A0F34942D1A804ADF2D665C365AB4671F2D664E407F5A521C77213413818A5C834D350EC740BDA9323346714848ED4EC03F8DB40C6DEB5186E290E473DA95C44539C0CD67025E426B4272367359F1FCB21F4AB8A66550954E0D3C1CF6A6AF27A548B5AEBB18344919C9A5766E412691549191413EB48922C06EA6918845CD39C0078A8657E30054B6C774421B3264D4EA78C66AAA925FA54E3A544D1B43614E7B527E34A38A4C7148D2E7069D724617E9D6A61D77371E82A227E6E393E9E94E53C6075EF9AEBB59EA70EE4DB8F63CFAD11B1CF1F9FAD3540C601E29C063DBD054E83D7A1296E39140C7AF3498278CF3DE95001DB8A96EE34C90608E2A71902A25C0E9D6A70C31ED4D5C2E3D17BD38B734CCD397E614EC985C729F6A5C0EF4DCE32690938CE693D07B08C40AA57126EE00A9A698AAE0D5132127AD28D9BD46302F3CF4A6B03BB8E9526E07EB4D39C6455C937A587B8D538356114E41C5575196AB699E05434A2597E0EA38AB8CEDB4552858A8E956C39229586458249DD513A62A66393CD42CFCE2992D95A43806A948486CF5AB739AAC464517E85211251D0D6CDA6A11C3080CD58AB1F3C53820CF24D2B20DCD19A6F36E8346DC56CC2D218C664007D6B9B8D10BAFCD8AE92DA28442BB9C9A2C3E838E3F8A427F1AAB398B69C64D5F22103E5526AB5C300876C407E14D81C5EA457EDA084603D48A6A0FB44F83DBBD3B57691AE704018A5B2E173D4D525EE97044775A71237633598D69ED5D448E0A0ACDB8897391DE882EE5986F6AA0679CD566B6CE78ADA3163A0A6790339C5697E883739E92D0E3814C1660F51CD7446019C114C36ABE82A94AC4D91CF9B201B3B691AD4EDE149FC2B7C5B8CE08A6B5B63A0AABBB858C35B30AB9DBCD35ADD82E6B68C43A1A85E25C1028E6B08C88D083F38A9302ACBA63802A374C0CD377DC86AC3772A8C1155669CA9200C0A7CCD84CE7915992CCCDF4A7057D4561CF7058F5E2960999655742CA54EE56524104720822A9672FC55BB206599500C924003D69344DB53E81F03ABFF0064A1667660705998924F52493F5AECD474AE6FC2D1795A5A003B9AE8771E2B867A48A2427E5A69FBB49BB8A4661834934061DE1CCC6AF690077ACEBA6FDF9FAD69E93CAE698FA1AE706984F14A69AC715366217B504D00F7A463CD0005F02963F9854780E2A5401529DC08E7E98CD664E4892B464249ACD9CE6439A96CA86E333C5148738A6EE3DE9266E38D34E00A5249A631245362109CF14E2485EB4DE8BC5233714B44220B87CAE2A9C63353DC1F96A084EDEB571BF43399326474A9141351ABF38A9D5805C0AB3164F1A9C62A19B21B1DAA788E067355A7625A96C4031565C77AAAE486C54A1B07150CE46EA7B8588D33B8FA54CA79CD408F83528240ACDEACDE3B0E6714D27D690E08A6F7EBC50D97A1C405C9C83CF76A791B979FBBEA2A346E081C0F43DE9E370233C1EC2BAB54CE3D2E3D54E3D7D29E33BB079F7A4042F438348AD83C834A49B1EC4C38181D2A44247279FE9512FCCDE86A404838ED52B45B88907726A404E05443AF27152203DBA53E6E83260723A714E040A419C62932318C547518BB8678A6C8C00C934D66C1AA93B92D8CFEB43770229E42CC6A12C314E6C9CE78A8828E73549263B21E327A548AD8E09A45200A6B104F14EED68521E30ADC739AB0BC5545241E6ACA927149BD4A45F88E56AC21C0C1AA9003B6AC03F2F340C73904F155DBAD48C6A2931D2909904C322ABF39C55961EF5048066A7D06860186EB52281DFAD45F29A764D1B0C9BF76194907F0AE8ADA58842A02126B9E473B9404CF35D35A6FF2570800C53F4014C921E123C556B8F38A1DC40AB72EE039702B3AEE48C2E0B924D20390D5414B927CCC93DA92CDF11E4D58D4AD37B175AA76AAC3E522AF9B4D0D205D793F2A85DB774A57CFAF1511381C5256DD9A340CA40CE69B824F1520391CD15ADFA8840A3BD23A67A53D4923A529539AABF36E896C88C581834C65ED8AB3C11EF50C80D3BD9EA892A491063835559086F6AB8C73D6AB3039E39149EAEE166CA8D8CD4131CF02ADB2FA0E6A075C726AD3760B7733A64C03C564CE70F5B5391CE7A563CC0B31A9826DE9A10CAC630549CF35A9A0AABEA96A78E2419ACC030715A9E1E8DBFB561C671E60AD657047D1DA2A88EC235C76CD6A83CD65E92C3EC89F4AD1DDCF15E7C96A224DDC53246E0D3327D69AF900F3500634E7F787EB5B1A5604758F37321ADAD357108354D6833433CF148C4E3A520619A376454B10A0D349CB52E69B9E69200E9CD48A72B5116ED4E070B4D011C8E437359B31CB9357653926A849CB1143B150DC3B53382DCD264818CD1C9EB53A9B0ECF3C5319B008340214F5A61E6A5BD6CC4C0B7181485B8A5DBF2E698722A92B30656B86A8A323BD25D361C0A6A7DDE2B548C26D9616A419CD429BB1D2A556F5A1D88B92EF38C0A6F53CD216E38A61DC0E69A24560BBBAD569C007D6A5CE5B9A8A4C12706A5AB80C403AD484E3AD4718201A7673D6B368DE22E477A46C1E94807BD212053487BB3895CE73C13DAA60700AFDEF56EF50A040786C1FAD29CE735D8F7393A12A0CFD3D29C49DF800134C46391EB528FBDD38F5A861AA1E1475CD4B8007A9F4A888240F5A91171D4E7DEA6F6E83B0E539EBD2A55257A74A6601A9B231CF4A69A6B50240777D29090A69CA542F151BC898E7AD0FC808A7902AFBD67B1279CD4B3CC1CE0540588E0528AEE52D43731140E7EF0A693CF34BBF8E6A96DB0EC38851DF14D19A43F31CD05F27029EFAA2AC8527E6156A227209AAA02922AC2B01802A6CD6A5234A320AD4A080306ABC19D99A79049E6A1B57D42C48C5319A89D948E94D3C66A07908CD55D5B5420739A89FDE90C873416F5E6A1DAE34862A8E7D69FCE2941414F5741D6968B42B7042F9182056FC0F218941931C7AD73EC54E30D8ADCB358BC8059C9356B441625919075626A94CCADD23CE2AF1D9FC11E7DEA06490B7200146A24616A2C71C0C7B566C3205525B835BBA9DB103762B027555438A69D8DFA68324B85DDD78A779AB8EB58B2CC55C8CF4A549D891F35691B262E636438A5DC4D67A5CF6356125DDC0AA517B482E5B53C50CC49C5405CAF7A56718C934356DC96D12703BD35CF18A84DCA8EA6A26B904E73C50FC818F618CD576EB4E6B952BC545E7AB0E7AD53BA42D46B839E2ABCCA7153B38238A824CB0E6A5C9263B19B2F420D67BA618FF00856A4EBD722B3E4E01357BAB22248A2C073C735BDE148FCCBE5E395C64FD6B0A4386C8AEAFC1B19376C7008DB93F9D5CDFBA2563DAB4D9088157A6062B452520D615A4B885707B55BF39B6F5AE07B81A7E612D8A6CB210A4E2B3C4CE39DD419DFA1E94728103B93260D6ED936D807358129C367BD6A5B4E044066877680D4DD934BBC0AA42661CE69FE616151602DEFCD031D6AB07DBD69CB2AE3AD098890B53C3616AB3C831C531E462320E28F501F238049ACF76CB1229F24849E29F1443665A9151762B77A5FC69D2E01C0A881029686B7B81A6838FA52939A0F23DA8B05C37F14D66047BD04605308F94D1BB114EE31BA9A8C474A6CE7E6A10E0715A231916E39015C77A7355507073DAA5F300C533326C1E0D0E463AD42673D29DBD7BF5A5D4069602A16E724512365B15097ED4276D0099063AD2F4CF7A6A83B7AD049159F2EBA1B2173C53180233412077A6924F14ECF74C13B1C62A608EA40FCEA539C8DB827D0F6A6A91DC61A954E1B0DCFF00B55D6EEE5B9CC87A9C7FF5EA40C7823F2A675EA323B629E38381CFBD2E4D6E2245383D71520231D307B5440827A67DAA40C3E9EB9A895A3B9498F5CAF26A45CB75A66EC76A7291D734BA0C78C05CD549E701B68A9E77558F21B9F4ACD2E092C4669EBD05BEE2B30CE69A3E63ED49F78F22948EC2AD59EE348715F534D1E94B91DFB530B0278A5CCB61A4389C1A3E553F5A43D01341E80D2B0D0F2C074C549138E38A833F5A9A11DEAEFA148D8B6C6CC55831FCBC0AAB68723A55F50C6B293BEE329B444026AAC880035A3229C55095181A480A27863499C1A9640738C54446DA357D00030271433607BD3430CD238C9CD2BF61DAC4C922EC04839AE82C644FB38C464D73A9BB6F0B9ADCB0FB43C200014555CAB1759E520E0051502E4BFCCF93563C838FDE3FE54D486307233F8D2D589105EA86808C738AE4EF616E70315D74EDCE2B22EE256CF1531D5D8D6279F6A0AE9211CD663DC3C473BF8AEAB56B40D9DABCFD2B96BBB195C700D764236644D3E85FB2BE12819AD9898E3E5AE6ECA096301429AE8ED11962F9873572DAE90D27D498EE3D6A190B0EF5397E403D6AB5C3000D64C1E852965DA79A8D67CF19A82E1B39359AD7522B1C1E2B68D3BEC44A691BE8548C669C064D60C37B20E1B9AD4B4B92DD4512835A949A65CC153D69DC63A549180DC9A5643D7A62B09DBA94B4666CE99CD635CFEED8D6FDC0CA9C566FD84CEDDEAA095EE89923124DCCCA54576BE17B98ED30190E5B8CD52834748D72D57ED2DC24AAAA38CD393E80A173D3F4F712420AD5FC678C551D1202968B9EE2B5C22D723D1D84D2B95C28EF46454DE58269A62CF7A5CDDC4D15665DFD2963574C61BF5A95A200F5A69E08A577D042F9F3A9C1E451FDA4F1F0CB4EDF8E715149B1C72BCD3B5C094EAC38CAF14F1A9478E6B35E30690C07A834EC846A7F68A7734FFB744C305AB15A36CD218D80A565719AEB2AB3FCAD915A48E0A0AE6A06656EF5A315E328DA4647AD16622E5CECC7BD5424669AD7018F34C32AD472B348B24E79229BB8E29A250052875229E83B8BBCE39A696C52330A8A46F978A3D02E559086724D11B03C74A899B2E41A9110B74A6AE6522CA95039A5555EE29A2D9881F3529B7947426AD19B14A2934E2B1E3151B4130A63433F5A9D131A6399540AACDB33C5122CDD3AD42A181F9E895BB0245AC938C53B231D2A307029C1877A8B235B8D6033499E78A56714CCD24B5D02E71E33D14E7D73D6A4DA010471EC6A159154E08FC477A9CB938C807FA5766EEECE51E1B3D060FAD212DDFA76C526E1D3B7A5283838EFEF4A52D2C90C72061F3139FA5481BA77A62123B71521C1E40C1F6A81244A4E5718A40428393C5351C6DE460D57B89370C0A4A57E83B09338638078A85704E0F4A600475E690E7208AA69ADC6912640381FCA90939CE699BB8F7A6B3E71EA29A51456FB126EE694F5E299B895A55E7AD526F61A1C5E94648A4E09A5273C566DB00DD53C41B23150E0022ADC78E314A32D0B2FDA31CE2AFEF39C0ACEB7201AB6395E2A6C98C7C99F5AA533738A95836DEF54A40D9EB4EF6158692735194DDD69C7246714C6623AD1268A434A2D27980718A7609E86985429E6A2F61EE4AAF95E38ADDB29A28E01BA5FCAB9EDCBB7E63815A564D1B27CAA5AAF60D4D66BD8CF11A96F72294CA4A6718A802B9C109814D99C1F9475A96D8244724A7354A725B26AF795F2126A94A9CD28B46D131AE132C462A81B20DCE2B724894E6A150AA47A574C6572B731FEC617F871F8529CA0DB5AF3F96300552960072C0D1CCC48CF6639A8E43BC7239A94821B18A423E6C62A93EA8525732E584BE4564CFA7C8A095E4D74CD0F3D29C6D948E456D09BD919BA699CADB59CD90581CFD2B6EDAD9801C55E1689D854F1C4AA3A7352E6EFA828A4471295001152B81B4D3CFB8A6120F6A8E65628A2E9926960FDD8CE2AC328350C802AF34B9ACF41B4AC4AAE65E2B6746D2DEE670C721477C566E916ED7172140EA6BD234DB28ED61000C1A552A59581CECAC8B56E8618828EC2A5DEE1A9C304D3B6D73366371A1DB3CD2EE2075A5C0A6B0E2856B0362707AD18A6E39A936F14262233F7A9AD8CF4A9C28149B413C8A2E040141EA294ED1C62A529814D2871549D808B683F5A4207A54BB78A6B28F4A5EA04611734EC0A36E4D382F153B6C21842F7A50AB48CBCD34920E28DC639905308EC0D29634D268BA006C8F7A85DC81529E698C074A76B6A265293839ABB6AC80609E6A36514CF2C2F43434EC235444240086AB08B81838AC7596645F958E2837371DCF342B93634E50C0E474A6F983BD6635E4FDEA33792FF0077269DB4158BEFB589C0AA328DAF934D3732FA75A63333FDEEB4ACCA44A1D76F5A6B3822A020E38A67CC3A9A5A27606D93B4982314CDF9EF50331FC69A9230E0F34D46EEE2B9CC201BB00F27B1AB00051C9AAE0856C751DC8AB04A950579F635BDAE65B884E4E4FDEED8A7062783F9D44393F2F07BE6A4CE0608C1A5CAC1226527EB53ABF1803F035591C81C807DC549BB0B9EA287AEC56A874AC153238354D9B7134493339C0E95064669AF30572504F4CD23640C6E07E94C6C6382734C19CF349ABB1BBB15188634A5B2D9C537A1E948641D3A51256D4A489F70028575E86A10C0F535200A69A0EA48580E940E70475A682A074A55639A4D95E84BC95A9620411CF3508626A68472493496BA82342D864E6ADE4A9F6AAB6FD07AD5E58CB8C1AC9AB3286348A47BD5595D318EF571AD38E2A94D6ACA7BD525715C849522ABB91BB814F60CBC5441B072454CB41A649F2A8A6ED0D4DF30668127B52B2E852771E620A992B9ADAD2D36C3BB681586F3B1000C0AD4B13BA31BA4E3D05536D21F434AE24D9192181AA1685A672EF52CA371DAB9C54F0C38000153BB05A0D964DA08C565CCFC9E6B5275C0358370C039C9C55A89AC2CC8DDC9CD57C820F343BB678E95131E2B5512DBB0E2E08E6A3965555C66AB4AE41E0F15524672DD78A6E2F742276EB9079A683CF3500918B719A9864F06A95FE44327501FAD3CA81D052449B7AD4C471C537E43B916541E94DDDCD295209CD464900D669ADEC3B5C713CD21C15E95186207CD4A5811C537B89AB1149BB185A625B4B29C3D4E3AD6D691A735CCAAC54EDEFC50F413669F86B4BF2879A47D335D681802A0B6B61044154600AB00F15839366521EA297140EB41353E6486291B814BCF5A43CD0980D519E9520E951A9C1A9474AAD004E734A79A2940CD240348346297BD267268EA00466A322A4CFB5230269D84407AD2FE34E38C534F4CE28BDC630D300E6A5A681CF153E4862311B6994F61934D38A6BDE10D2B8A6106A53CD31C71C51D74422021B34EC1C52E2909A2C912C5CF18A4C739A4C353CE42D37B68098C2013D298C993D2A6C0033DEA36345EC84C888E4D355371A982834F08A39A9B2905CAFB0034C700AD59382738A61009A56680A6D1E4D46C8C0D5F6518A632A9154AFD4471C06C7CF4A7B73CF7F51480863D437B52EDCF46C7B1AEB7B11D0555247038A7A8C77C9EF9A6FDDE0F069E381D3359B60870C038C63DAA19662015EDEB523938F5AA52312DC64534D5EC1A8A1D7BFE7484803351700F34AD8A6EC86AE3DB9C1078A713C7150862DC0152A8DA3E6A9458C2C4E0F4A4200E48CD39D73CA8A40A4AF3C53764086E083C77A994903A53000A6A418E9EB58A6D8FC855EB4F0DED51ED20D3D7AD5A88C9D1948E9CD4D0E03557C8EC2A684827349F61A2FC0C55B35A2B2F19ACC8CE2AC82696AC0B9F682074AA935D75E39A6B3126A26149B4B702BCB20EA7AD55772586055DDABBB914D3103DA9A6BA8EC5139CF140DE31573C914863C76A57687D4A6E00C12715B9A6EC5841084E7BD634CB9E00C9ADDD252468C02A40FA516D3561CEB62E20F9F1B6AD8DABC77A7ADBB90309FA548B64DB8338381ED473450D1467859949C572F7EA16639AEE2E10C8B855E2B96D62CD802C14F1D69A923483D4C16939A88C80F4FE751CCE54907B5519EE8282456D1B5AE5C8B6F2127A542726B2A5D4CAF4AAFF00DAACEDC9C0AD126C2C6D1C83951532313F78735949A88238356E2B92E33C5134D69717A9A41B24015386CD5357240352EEC2F5A4AE96E3D07CA72383CD5560D9A79738F6A84C877545B9B46C2C2B918C1A7C1E5961BAAACAD93D6923760C3D29462AE4CA4923A9834FB57B7DE7EF7B1ABBA5DC1B67C0C6056559DCFEEB04D5DB7C6ECD0D3BD9995CECED6F629146EC66A560A4E57A573714A5718AD3B5BDE02B1AC251D6E2B9A38A7638A6A306190694839A36001C5231A7038A631C9A5610A0629E38E951A1E79A941CD1710751463DE971499ED4F718A70290E051476A041DA98C4F5CD3BA531B14BD40613ED49BBB538E298DC1A6C680FBD341C134A7919A5DB4AEFA0EC47BB2714869C579A43D68109BB14C2C09C669C40DD50B03E6714D3B210A462902E79340E9C9A556C8F6A5BEC2171914DEBC52927B50719A696A4B0C537000C9A5DC075A631DD46C343777CD9ED4FEA335081D69C1B8C628EA492718E94806452E72290B6074A57571BD488F420D3490052B707EB4D238E945EEC1239050993C107B9ED5205DDD0E47B50AABFC2723D0D3C6D5F506BA2EBA993D0163EF9CFD69C3F2341E7FA5364385C03F9D46DB02DC8259B9C633EE2ABEE05B34AD80D9279A6B0DC72050A36D4A4B51095279A76D0569B80714E000343BBDC76B0E8FE518029E724734D604638A5C7BD35A0D919241A69721BAD39860935160B3555DF51D921E188E829E4924119A8D41C134F2DD0014456A34EE39998D4AADC0E2A119A9D54D27B8344A878FBB56620A5B238A8109039A9E307AD46A98D685B41839AB4AB95AA01CEEABF0E0A7349B650D75C530F3DAAD8883629B243B695D88A0463348AC476A9DE23E9503295A97AEA1701966C28C9357D343BB9465B62123203375FCB359CD71F67FBBCC94EB67904BE6976DC79CE4E69BB25762D64EC8B91E90D0CBFBE1D3B1ADEB348D0000015942EDDC0DEC4E3B9E4D5DB1943CA013815CD29B6ECB436853513A8D3ED5653923815A9F65B59015DAA4FB573D71A92DBC6228987B906A38752603EF1FCEAA3350DD5C6D36695E59A5A9F94641AE7F51B759519768E78AD4378651C9CD519245F3306B58CEEF621A68F39D634C7B6909E706B01E01CE6BD7B50D363BAB624A83C7A579CEA9A79B5988EDDABA6327B2348546F4672F3DAA1EA2A9B5929E41C56D4D137A55592238ADA32BE9B1A732B58CE4B6643906AE43BC30E71F8D3D6260334E550A771A6E49E88575D0D285FE401AA40D8E86A9C72035234B81516BEC24C98BE4F5A8A57DB51EF6620A826ACC36AD3105850959D90A535121850CA726A77830C31C55C584463818A6AC7BE4F6AB504B5395C9C9966D22CA819AD6880502A9DBC5B455A5C835125743DCB2AE73C1E2A5F3C45CB362A8BCE90AE58D5292E3CF6C03C7D6B1E477B1AC20D9D25A6AB9942AB715BAB32B007775AE0EDEDA44390E79AD5B691E0396909FA9CD4CA0FA16E0AC7521BDE93393CD665ADF2B9DACD57C30EA2B36AC66D5898018A7038A629EF4ECD2B5891F9A375340A50314F510B9A4CF34DC734BD28631C48C530F4E683C9A69A68069EB48578EB4A690E693B8EC2630296941CF18A09C0E68018739A0F3480E69D919A9B08615A8F1CF3D6A56241A61EB9A7A2111EDE6838030294E69B8CF5A77258BC63934C61CF1D294E052039146C02632D4D3C1E69F51B1C9C557416A378A0714A452118C545F51B264FBB415CD3549E2A6FBCB56C57B15B69CE69BB7E6CD4E50EE39E94A028152BC81B38CDA76E7033EA293771D7F3A407DC83EF4A222E3738F97B62B7714D99EFB8BC1C7506AA4CE776339153CAE11701B3F5AA4482F9CD24C490FD99E739FAD34E73B718F7A6AB1DF8EB4F63820E7F3A766B548A5A08ABCD2E02B7AD0013CF4A4C8268D777A87A1272DC67148DF2F19A6E18F4A419EF54A4BA176171D734CC60D48B1B50D1E6A6E876100214E29460F5A8B7321C1E94F0D9E829AB812019A7AE462A30474EF56218F70A9F3B0C95727191530CAF41C526DC0EBC52E49E01A4D3DC3A92EE0318AB11CC5462AA1069C1BE5C134AF62AC684775CF5E2AD070E339AC5CF3D6AD40ED8EB52F442B1724E9599396CF06B437161509B72ED9C71493BAD50D2B991F317E4E4D5F8012B51C91AA4B81CD58897038AC6AB35846C49D2A559194654D300278C53D1141E4F158285D96D927DA0F7353A5D123AD539829E41A80391C66ADC397612699B915E738DD5233EE60735831CC43735A56D2348C2AE9EE4B3A48087B7C1F4AE47C4BA61910C88391E95D4DB36100A6DCC4B2A90466BB918AD1DCF2392D9B69E0F159D292A71B6BD1351D21416602B93BFB58C3152066AE2EDB9BA69EC60190918071481C29C1E6A696C646CF96327B0CD4D6BA6B9FF5CBCFA75AD636DC994AC55562CC302B421B379403822B46DADA08D80DBCD68A246A3802AB45A984AA4BA1420B1545191CD4F8118C28153484E302A300F719A4DADCCF57B90B938E952DB404F34D6077018E2AEC6151060F3517B9A4603CAE16A27B808303AD457377B14D53B79CDC49D2A2D766F0A7DC4BD49E51B86715269F6EF9CB03F8D69AAA84E40A432228C2F5F6A22DDF536BDB445852156ABBDC107BD3E30E796A59530BC2D0E7676128F716098EE0724574B62FE6443279AE5A39106322B6B4FBE841DAC40351369C499C7B1BC8053B6F7A8A370467B549BAB9EDA980A41C71461B14648A32687E603739FAD2D1C7A50695C03B535A8CE0500E69E81623DD834BCE3348C0839A32C714202458D98640A945A4D2AFC833F4A894480633814AB25C5B9CA48C3E868B6A2631ADA542432107DC629AC0E3906AFC7ADCF18C488AE3DC62A51A869971C4D69B0FF79303F951615CC7622A22706AF5DA5B87CDBB12B54DB05A90C3231C534827A52E3078148370A7CDDC90DBC5230C74A97B531BA50DA42232B914D2B834EDC4505B8C91493BEC09098A0201CD05A82DC628B05FA08383C8A91092702A1CE4D2ABEDE945C2D62D10318A4DAB4CDCC573DE93326DC914C4CE2C8217AE693E44524654F7A463DD97E98A86594018C835D16EA6772291B71E99A8F0073D3EB46727D29E0E472B914E5249D8127622E8DD39A7B0CF2694AE5B8E29DE5313DE94B57B9488C31538069E14E3918A91610AD963CD4846F0074A877B8ED621390383489C93D49A98C63A75A72200693BB562D2EE22866E31C523264F3C5588D0E79A4900CD55D2E81D4A3227CD9C66999DA7DAA794E7A715063229ABB18A0E4822AFC3C0155A040464D5B53C800605297702475268452A0E6A6DC36D467E6E454B4D02123CB67352F97C75A646BCD5B5872BC1A9E855EC55C60D4F0119C66A682D0337CC6AE1D3A341B81A1276B0F56471AE0532694AAED534F9A411A6D5AA2492739A76B1AC202084962C4D5884002A48A3DC98350BB794D8AC2A47AA65B5A9638009CD40E7DE93CD53484AF73583D51246588EA6A32FCF5E69659157A554964006ECD2511F42DC6D93C9AD7B160A0126B8D9F51F2B853CD0BAD5CAAFC92115D94617D44D5FA9E931DE22AF06AADD6BD05B83B88FC4815E7CFABDC4DC1639FF006723FAD57796476CB126BB1527D592A9AEA745AB78A03021071EB9AE625BF370FBCF434E783CE5E6A016854E00E29C7476348A8A45BB69232DD6B4E3641CE2B1040EA72055D467DB9C74AB7A9138296A6A8488F20734C3F2B633C5514BA615219C3756A1A7632F6762C9607A52E702A9FDA15470DCD412DF9159ABBD06A2681751D4D43717AB18EB5992DDB3600A88079E503B55C616F88B5157345236BA6C92769ABD0C51DA2FBD431110C400FBD562081A46DF21E3D2938DF736B24854F3676E3216AE476C1796A7C6AB18E0535E5C13497621BBEC4C08ED4E27D7A5575727A53C9C0A4E28047B6493EEF06A482CCAB039A88487B5588A62300D63CBD98B99A37F4FDD20118E4D6CA69F315CEDAC1D2662B3065AEBE29D9E3DD9AC9AB331919CDA7CC9C95AAEC0838C735766D5079DE583F5ABB15B5B4E9B8E326959937313914B9CF6AD2BAD3D5065187D2A88B6989E1734790C876D34A81568D9CD8FBB511B6949C629EC1A15CE3D6A1FB6C10E77119A92E629215624715C86A976CAE7692294527B033AA1A8C4DDC0A985C23F4615E749A94A38DC6B42DB5765FBCC7F3AD1C51173B850AFE94E16CAC7A561E9D7ED338C1AE80DC854031CD4DAC0B52ACB1ED3815094CF35248E5CD3338EB536B942631DE98C79E29C47349D284912381CAD444E4D4806EA694E69AB031A40A6633C54BB05349145BB86E47D0E2971DB14E3CD380CF419A16FA011631C52118A97CA627EE9A0C6DD02926A6DAEC24C742A4F24F1563E515997174D6FC720D4B6B7EAE70E39AA4AE896718E4AF20FE06ABB7EF3A8C7D2A7918B363191503673C1C56D1D5EAC9490E58D5475CD26D51CF6A69271DB3ED4A064F5E29A5ADCAE55BA264DA4F4069C46D351AE13914E59413D7351A5C487795BB926902907029F9279A6F2A72714F45AB2B71F800E714EDA8C7834C0C0F5A554C9CE68767A8D12025063B50C0119A4DD83B734E6C2AF6A894ADB05B529CE00E9554649ABD2A96E6AB2AE5FA53E66B51A45889485AB0A09C1EC2A3890F7A9F254614511577718E1C8A0819E3A526F27DA9ACFCE293DC1682A1F9B157A062A40AA51A679AD7D32D1AE24CB7DD15374DD8A4C956072B919AAD35DBC2C51B35BF23C36A847048AE7AF9A3B8258119AB8AB6A8DE976213287E735096C355662F0B64734A260C39EB56E2DEA6E958D1866DAA4B1AA17378A5CF22A19EE4A46706B16E2E8F273C9ACDC5376225A1B11DEA64F35379E5F9AE72DE4F9F24D6EC255A315855A6A1D09BDC579AA85CDC36C357A48FE526B3EE7005286BAA148CA698BBFCD522918E2A1902ABF1DEA68B1C0240AEF835CB74572DCB3147BF9E956045EA2A28CAC7CE6A71701BA0AA5AEE2E5B02A106AC08475EF51ACE9D7A54BE7AF6A2374F563D6DB00847A521451C628F3C1C8CE29BBF23355715990B4433C544C8D8F7AB64293D69CAA845691977172B6662C0E58E7AD3248F6B60F5AD490A2026B2DE40F3524D5F50E5D07322ED1C54F6C8139EF4D23200C558B600B73D050DDDDC515A176DE00E43BD5B2EB1F03A542AC3185A432C69C39ACE4DBD8BF52C99F29F28AAC166918F045491DC45D88A8E7D4238BF880FC692E6B869D0953CC8F82B4E3381D6A283508E4EAC33560341213D09A25A3D4195DAE573C714F495988C5452D9067DEA4FD2A5B286479D630BD4814BD510D23A5D095DA5E7EED745797496F0E10E0E2AAE9F6AB6769BCE338AC8BDBD33CC403C0AE66F5D0C5BBB268A4F3272E4D6BDBDE15C286C573F1C810726A7170BD4355476259D42C33390E5F23EB53A4816508715CCC77D2C63E4908FA1A7C57B334A0B3127D4D2E50B1D4C91153B94F15133AF3803355229E67039C834E28CA7716C0A924CED5A4611904715C65D431CE58329AEBB54B94652BD4D73129E48C0A6A4D741A39F9F4F087E434D5B476C75AD6962A5F2B6A6EC7E95B29DB721C7CCBBA347E530CD7404EE358DA5B0C671CD6E00BB32C4544BDE2E29244278E94C619352168877A9A1B75B81FBB393E959B8B0BA2AF7E7A52639AB52D94D1FDE8DBF2A8369EE2A6D7DC066EC0C8A01279A0F14F48A4906154FE02A93421DF211EF4A2DBCCE541A7AD9B20DD270293ED9E412170452B6A26C745A6C8C727815A70E9F1A2F4C9AA569A9798F8622B4D2E11B9C815766886D91BC41460A8A8E4D91C65B68E3DAA67923CE4B7EB59D7D71BA3289DEA5B1239BD42E51EE18902A9962791C55FBBB24619EF54FCBC700F3496A52DCE74CA0AF0306A277C8C814DCE3BE698DCB7A0F6AEAD2FA1228639EE0D38B13C0A367A1CD2053BB1CD124D0C556E71CD3D54839C7149C83D39A52C6A5A4B518F694FAD2094F5EB4DED498C62A5F9EA34B4D09E37DDCF7A7E727AE2ABAB052003527999346FA0EFA1206C1A7EF078351039352B050A3D6A5A717A8FA6A239C8C0A6C683E94E5C1A19B9C0A2D7DC6BC895700F5A76EC0ED50AE714EE7B9A72492BA116576E326A391013C114DC9C0A9ADADA5BA982A034934D859172CED3CF000AE8ADA048200A063D4D49A7699E44632BCD683C51A27CE40A1F2A651CC6AA36C4C54F35C75C5CDCC2FB831DA3B62BB9D55A02855704D73735AAB7519A51B44DE12B18C9AA3CA7E65C54CB728E0F634B7368064AAFE959A5C46C41AA728F42F9AE58B89B729E6B1EE5FB935A0CC25185E954EE20C29C8AB8B7177681EA84B672C4106BA2B423CB1EB5C8C4E524C035D1D9480C6083595769EA289A521F97DAB36E8020902ADC932EDC679AA734995E0D73457606CC968B739E79A78858B0001A79FBD9C55A8DF680715DB14EDA95ED1A5A0AB6A5507352ADBE00C1A6BCDD3D297CC23A1ABE75B1939CD921B7C2F26952307BD45E6975EB4CDE7B1AD232BEE4F3CBB96C4219873528B5FCAB3848EA724D4C97AEA7D452925BA1F34B7B9796C1988DA401EF529B40839355D750DC320E295AE8B8EB427D589CE613DA8643CE6B9F9C9827C62B73ED381D6B3EEC2C877628B9519CBA907DA814E0D5F81B310DBDFBD62CA7B22E2B42D1DFCB0391552924B5364D1A8B2AC29F3B735977BA8203953934F96179392D50FD89179619FAD65ED3955C896A523A8CA49DB9A8279AEA4E4938AD26B78C7445CFAE29A624239A2352EC2CAC6509AE117E573F5CD5CB4D6A6B761E6127EB52490263E515426B7393C553AAF6B05CEAECB5B8AE4E09C37D2B62DAE846DBD48CD79EDB3324831C574D6B312ABCD09396AC6D5CED5B5996E22D99DBF4AA68A558F39CD65A4DB54735A16F2175CE6B1715B994A0D6A4B29729815147E7F439AB0BFA54D1E38A49BD999B2D5BA12A3353EEDB22A28EB512300302AFD941B9B795C8AB649A90158A204B7E154AFAFF000A70D4FB99028C8AE7EF65CB1C1AC5EE043737592773567972EDC1A86E59D8F069D170BCD11BBD43A8F66E39A96160E306A9CE79EB8A92D1F2E0035767613D4D8B7DA8EB8ABF7F22A5B064386ACC4608C326A3BCBA59005DD52F442F205BF7070CA4D696997DB2E17A8C9AC852190600C8A9A02DE6A9E98AA84AE4DAC7A1C5751EC0CF8354AF5ADE76C00A0FA8AAB6F8920049ED5957176B0DDEC0D9A995BA823612CA0EE7349332C03E41C516CDE7C408349242DC83C8A4055B8BBDC9CD60DC4E43920F15B92DA9C1039AC1BD81A2720F4A169B021D6F2E4EE0706AD0BC994E0138ACD85C20C66A6170ADC034EED81A2B7C4B60939FAD4B2B91112393590D26D6C8EB56A1BD461873CD39262BA226772A4B5416EBE64DC8AB771710EDC645578258D5B8EB59BBDF419C507C8208A38C7F8D214556CE4E280FF435D53B5EE25AEC2E483914190A1DDDA9A4F34EDC36ED27352DB6C360F3189C8C1CD001CF279A8836C6191C5485C11C50FB0EE3B27D6976E79CE0D20240E47E3407143BEC087043D4914F504F434C5618E69CB9FE135326C64A09C7BD0AD93C9E69A11C8E7A53E34EF4F7D5B2C954E0600A42A7140627DA903367AE6B37AEE0890120734F8C65A9A07A8AD4B0B096560C50ECF5ED4005AD935CB00570BDCD74F63696F688362AE7FBC40CFE750416E02ED52062A7FB2B9FE3FD69B95C122EBEA31A00A08ACBD42F438243FEB4C9EC266C9539C7BD61DFB4B002AF9A9BB65A486CB72CEDD722A16980EA6A979FCF351C93EE3459EC696B13BB870493587A8228CB01CD5892E76120D54B8943A75AAE491491423BA688E292E6732A601C50F002093D2A8C8EA92E33C56D18DF71B562F585AC6DF339E6B4BCC4846D4ACCB7B88F1D719A9C4AA4FCA735138A94ACC12D09249DC9EB509B87E84D4AEA31D6AB4838F7A5C96600B2B6FE7A55F8DD1D40CD648DD9249E2A48673CF6AAF212B9AEE10A0C1E94C6916B3FED0D83C9A413E464D0A3A8B7344367A500B7A1FAD5386E0EEE4F156C4C1BD289C9F4138A241C8C6334AB112DD29F132E074CD5A578C75C0A95292049149E061F7739A6224E3B1AD512447A629449183C629B9BEA5248CE16B3381C1AB3169A7AB9CD5B13281818A8DEEB1DEA2ED6AC771A34D847CC40CD2496D1C632A00A6B5DF19CD5692ED89C134D098E6619C546D20C60D4465C1273503C8C4F14723B021CF211C540D20CD058EEC9350BB61BBD528DF515C90C84F4151B8DFCD20719CD05AB4B37F120BB1B12869700735BB0205407A115916F9F33815B2A19E3000E69C1F99A4362D4277915AB1868A2C8ACEB3B760C370C56D0C6CC0E6A2A4D3D113565A58745F34633D6AC2019EB50C430306A6242D73B473966204B851DEB76306DE018F4AE7A2B810B06233571B52F35368E2AAEEDA89A259EE0BE45625D3E09E79AB4ECFC9359D70771A9BDF70221CB64D29183483A7BD304EB9DBDEA9764220B85667C52D8C6EB312D53E413D39A9A25E722A95D2D02F6412CA4360D53954B3EEC9AB13F193545262CC41A4992685B671D78ABB17041ACEB6233D715703E0F5E94D584D1D05BDCEDB623DAB99BBBA637C5BDEB72C5D5D707906B3F57D3FCA7F353A1A24ECC4BB1ADA3DE9202935D0AB2B2F3DEB82D3EE4C4719E6BA5B4D40F01CF1532B35B8AC69496E73953C562EAB1654929C8EF5BB05DC52719150EA31ACD03617B54497705A1C331C1A744986DC29B720ACA4104510C802F279AB8A1BB13B8E3355C15527279A919FE5AA333E0E6949316849248A4F5A877B039538AAFE6ED393CD31AE33C8E954A2FA035731C3B37CBC539986DC1EB554C8DD1968C823A918AE99454741244ACC73C134D0ED9E466A3F3081C60D2F9873F70D4269741D9DEC4B92DD722943607506A0F319BDA9E738CD09DC6DF626121618342901B9350A6ECF353F960F39A56EA3E61F827A54A8CDC54414839C114BBC838C8A95A82562CACADD2A656E055618C0C75A9D4E7AD27BD8D10FEADE952050307AD314679C1ABF610F98F975CFB5425777B88BDA6596E1E6C8B91E8456CABBEDD88981F4A65AA4CCA008580F7535712DAE49E10FE54EE25A102473E32AA49A6CB25CC2373A381EE08AD8B5B5982E5EA6BC8A37B56420138A91DCE713516C7DEAC2D6EECBAE4D5B910C53329ACDD5A12F6A48EB5A2B14629B81D33519B85EC6A83CBB188E78A85A71CF356E3A5D1A2B1A12B24AA79E6B31E5D8D87A7477009C669268FCC1BA92B9690D79C6C38AC99048F313B4D5CDAE1B9E957234856D99C81BAB48B511C8C705C371C54A934A8D4D66DCC76FAD5A861CF27AD52BC9E82499225E3F195E2AC2C824ED4C11A8A7A003DAB2EB6077219109381D2A163B4E055A6E18E0D55942E41C8AB4D256627A0F538EB48EDC631519396C5283F360F4A51D191763D4B29E4D3D2670C4738A63608001A72803D335768F41F3772D4370C0E49A94DC163D6A9AB9DDC8E2A4E18F151CA172F4570578CF1528B803D6B3C311C014E0E6A5C6CB62AF72F1BAE30335199988C678350021873814D238E0D4A885C943B01D734C2CDBB3CE28FA5216C647156C188589A42FC6075A3700A6A2390339A1B6B442DB71C47BF3519CF438A5073C1EB4D3C373576B6A0C36F3D2909ED4B924F14CC65AA24F417536F48B449DF9AE8E2B2F2D86173593E1E42A0B11C574C93C4382466A1AE4D10A4DD879B74D838E698908539AB01830C8A6965079EB5328DD117233B477C5358B0E40C8A5600820D440BA36339150D01680DCA3228DBB39C5344FB796A6C978854E0D0D262257B81B719AA2EC09CE2A9BDF6D9883D2AC890326E1C8A6AE0C46231C55411319B71E953A4CAC4F18A78E79A7B3B8AF714600A95321723A544632CBC1A4F38A7C952E56D90588EE1F39C5578D70738A965393E951EF08C0134E37EA2628DE240455D0C76E6AB29F9B3C1AB19CAD52925A585766B695382429AD7BE8964B5391DAB9AB190A4B5D4090496BC8CF14A4D326FA9C7B0D931C718357D666080D56BE40B33638A6C529298A492487B9A967A91F376735D0C372AD160915C33DC2C0495FBD501D5672DC4AE3D83114DEAB415AECDCD62350C5940AC5561BB39A8E6D4659576B366AA99B07D2A755B83349A51B7922B3E7973D0D42F3311C13509E7BD5A577A93624DD918A8572188ED4A580EA29554B722AAF2BD8A4EC643609EE29A724E060FAD5816F9190C4FD69CB063248E6B47A13A15DA10C318A746842ED0718A9CC27A82452A40E4E454B9396C3D48847F28CE0FBD3C22B0C0E2A76B66299C52AC41579A96DA04312218C139A90A2AA824D0ABF371D289A0798055C8FA524AEEF2653892AC6CF1928320552D85A4ADD13FD8B4C1088F2C47248F7AC7B64324C4953CF7ABB47A304B526894E7A559113F50334A5A3838620D559752546C2D26ADB1D31A4E5B9AB650F9AD86E3EB5D15B2C51280AAB9AE086AF2A12CAC47D2AE5B788665E4B023D08A9E5E6D50DD067A1A5F0897B0A92DF5A4693664571716A9F6A19DD8F606A6B70DE7870C7F3A4A37D4CA50E57A9E802E772706A067DE48AA16D231880AB91E7BD2D193639FD463D93938AA2D10990A9E86B7756B62D1EF02B977B9647DB42D469E873FAC68F242C6488654E49AE6E42C09C835E991BFDA130C2B3EEF46B69D8968973EB8AA5251D0699C0287CE5549CD68DADA5C4FC1040AE962D0A247F957FAD6A43A3A84C9E2AE55125A1A2672274A241154AEAD1E381941AEB2FE116A8C41AE4AF1A4666218E2A2CD94998EB1B83CF1F8D5989DD383CD569B786C8A482E183E1856BAD877669090B106A5DDC7CD554382C08A94382690AF7164FBB95355D8AE39A9198ED2077AAEE7B55C6E361BC01914EC96E3BFAD4058371536FDA066934D4AE4DBA8E038EBCD4AB9C7BD4225079C53918139E94E31BEA2D59657A608A77008A8C31C7149D0E49A567B0D5FA9607348A083D6A20F9FA53FCDCF0053BD9D84AE9D8B05C631CD307B9A62B1CFA52970A696961A4481B0DCD32438E477A8CBE79A70900033D6959F71EC381C8C1A40BC1E6985BD69A5C1EF44935A858771BA82C297008C8A4F21D8F14ACD6A2561A809CD5BB7B276704A360F7C715A3A369F13CEBF68E47A5773F62B7FB3811A8C01D05294925A90E5D8E6AD36DAC400E2A608D2B07526B45F4E590F0302AC25A242B50E49EC4DCAB1DC98C052A734E92E548E4E2A6F2D5CF0A3F2A8A7B21221EC695C4539A762C363558490ED193CD6635A4F0B939C8A9527C0C3536AE3E6E85B9242548AAB9E7AD4325D8EC7351F9BBB9E953662B961A049181356E15006DAAB1BF1C9A995F8C83CD0E37D04C98C2AAD9C50B1F2706A0379B080C69FF6D8D46E0296BB08B28110124D46EA8C722B3EEEE8C89F264541677720251F3F5A766D6C1B97A407F1AAB3425DB39C54BE692DEB5260BAF22A744C486C03E4C679A9C3F38E955D10A54EBCAF4E6AB46363D66F2DB20F35723D6E78D362EDC7B8CD65C8405273CD5713B6FC76A6935BEC2D0BB7578D23EF61F95312E06CC838A80C9195E7154E59B2FB538142490AC2C972EF29C8E29010C720D45BBD697DD69A42BD87331EA2A2967DA39EB4EC64726A0922DFC52551F60E6EE4B14BE68CD3F79E411C5320508B8C54842D572FDA1088C187353801076AA8D22A9C6714EF38E3839A1DEF7624FA1B49A2A6396028FEC10EDF2C95592FE42D90D9156E2D42420E4E2ADAB1DAA840A7368B7111E19580F4CD5578E480E0AFE95B0F7FC609CD674970AEC72452D64C9950B6C57F332BB7A5467681C9A91A12FF00EACF26AE5968CF28DD336052765B984A0D3284781D39AD8D36052C0B283F855A8B48B68DB23923BE6ADA43145C83CD67CF7561D88EE6DD0A9DCA315CF5ECB05A64478DC6BA3BC56961C29AE1B5659E2998383EDEF447E2B1AD28ABDD90CD74D21273554B12D96381554C8C0EEE69DE6EF5C1AE8713AEE4E597D6982420E7B546FB580C1E050C7E518A717D915756346DAEDA26056BABB2949C106B8FB3B662EAEFD0574D657519214715151744725595F63B4B49BF76335A114AAD8E79AC4B37063196FD6AFC790722B1B35A33034DE312C454F7AE3757D25E29CB28382735D5C72330C1A7CB6EB3C7861445D986C7190FEE9029EB521704641AD1BED29D72E9C8AC393CC52C0A918A6EED94A572637421CB30CD42DAE2E30781593717A0BF965B0699E52C801F4EB5564B7DCDA9D9AD4B5752BDEA9DA38AE72ED7C994ABF7E95D12DE471C655474F4AE6F5293CEB8DDE831551DC6F4293C418F4E2A07B74CFA55BB3899DCEEE6ADB58EF3D39A275147E2424EE6761367151193CB1EB9AD23A730E0534E9B85E4F3E94E35105CCD69F72E471559A4626B5469D8273C521B241D85355609D922AEAE67C48CC72455C4B091FA9C8A7B2AC23B5584B820020D5C6574434EFA0D5D34E314A74E651F2F3529BCF4EB4D5BC264C6684AFD05EF959A2953F84E293CB91B2369ABE2725B1C548242C3B714ED67B87333392193B0A985A4ADD0558562CD81814F2D221EB4D5986BB94CD94C4E4FE941B79B38C1AB46671DF349F6861DA93858ABC8A9F669B3D29FF659476AB1F6A66ED4AB3C85B0471424F761ADB52B7D86527923152ADB228C39E6AC6F6FC2A19369349C3B8F7DCB1143085C819A70201E060556825556209C54F90D8C74A57B6886A25CB37092649FA574565AA15C2B1F96B978BE592AE2124F5A86B4D44D763B2DC1D4321C83509259B1593697CF18033915B76FB67018100D6328D88945A1F1404E00153CB6E5132455EB38900C9EB5625489C6D2E296C64D9C85C900E3159B35BBB9CA2D7652E91131DDD6B32EEDD6DC1C0A2FA9272A74E9776738A46B7953DEB5DE456EE2A06CF5ED4D4EFA0EDA19A26957865C5392EB1904E2AC4C14F6AA33C5C7031557BB0E8170C5CEE0D4B14DB86D3555629338C9C54AB032366ADC525622FA97171B79A42A47205566B8DADB4F6A916F13B9153CB2E83DC9C4C53B54BF6CDA3DEAAB4F1919047E7559652CC73CD4FB34F52AE5F6BDCF6C541F6B98B1C1C0AAF2297E01C52C60478DC79A1A5D105C937CAC72CC714D926F286E249FA505D4B6334D3B5F834D4536C9B847379A33C8A78C7355F88D89ED4A9382DB69A685CD725DC0F03AD0EC5109C7E94DE01A5DDB8629DD27A86AD6A568672CC413564124648AAEB0012E738FC6AD021579E686B5D01F742296049CD3873CD3188C645406562FB7B54B498AC4B244B275ED42C6AAB8CD20618C669ACD95E0F35506F61DAC5C89487E78156632376DAAA921230C715346DF356966BA9E8AB125C465572A6B0E594AC849635B72312A6B26E2DC1C9EF52AF7DC4C96DEE4A0041AE86D2E77C7CB572318DAC173C56DDACDB4014A5792B3329DBA9BBE781D0D37CF19ACC373F3523487A83CD472348CAC694974480074A8DD22994870083D8F7AA3F686039A635C37406A15EE063EA9A3F94C5A0236FA1CD73B2131B61B8AED5A50C0EF20D606A5A7AC8DE620E7DABAA13B7C4691A8D6E6402DDB906B434DB3334C0C8481E94B6F02C31EE75CE2B4ECA58E419E07B553972EC2954EC5AF26351B158629D042B0BEE53514A70320E3F1A64575938358377D4CEE6FC37A554726B56DB5708A371AE57CD057AD47F6A21F19A5A05AE7A1DAEA31CBCE40AD04B9565C0615E751DE3AAF0C45489ACCB6E726538F4CD26BB21591E85B971F3104573FAD5ED8DBC4E176197070063AF6AE72E3C4F3CD034713142411BBBD7293CD76D292D3BC99EBB989A5677B326C32E0CF3DD704EFCF506B6EDC35BDB0591817C7354ED2210A79B272C6A705A6618079ADEEB637A6AEB50C124B01C566DFA81973C56E88CC63047CB58FA8057C8C71445DE5A17244162D835A8B8EBD6B0E0251B1823EB5A11CE55706B3C44252772925B22F6E1ED9A89C0233DEA13381D290CC4E7D2B9BDEE8C6D58523AE6AA48E138CD365B83CF3549E5DCD926AE9A93D2426BA892312DCE4D3958F000A63B64D3E32A2BBA1169117D491720E314E5501BA734880E4F34F076839EB4ED606BB01186069C8E77633D69B927048A702038E2949F415F4278142B673C54CDB5B277540BC678A9E3646E36D3E5695C2CC8E54C4795EB55C6F00927357E4198C802B3C9643CF4A9772B4DC58C36735606EDC2A0439EFC5582A30083426DA10D762AC476AAEAC7CCC93C5492CA14F26A9FDA5431145AE87E84ECC37935623BA0542D674926572BD6963620027AD4B5A0E3A9B31CC01C66ADC127CDC9AC781B27906AF46581C006A25B6A8B4AC6E445702B4ED26647C03C573F0B4830706B460988EA0D44DA5AA1F2B3AE827DF160361AA3CC8877C8C715916F72D1B673C5698B81730ED26B28F9984E0D161F564893AF159D7D7D1DC464A9AC8D41668188E4A1ACB5BB910EDE48A9BDD9CEDD997CC8AAFD6A7237A7CB59F12BCB28C0ADD580456F961CD5D9A2548C810B1639A63C5D4115667942E48A8B7975E945DEC53F21B140BD48A90C6A54F14F560ABCD30C8334F9DA07E6519AD83E40EBEB50AE9E5473935B36D08B8936A8AD63A332C3BB19A6A4B725A5D0E41AD8A8E01A84A18C640E6BA29ED0AB631491E94D28CEDE2A9C9DAC2B18D146586EC5135ABC8B81C1AD69ADBC8E318155B0738152DBD907333205ACB1B7CD4AC0A8E95AAF11738C54134185C1149360667985F8A8D9240D900D5C4B701B22A60AB9E40AD5492158A61DD579524D209719E08ABD84E9814D3146C718028B5F57A0CCD9653FC39A9629895E6AD35B215C1C5305A03D0D4B95F4EC26D90BCD8AADE780D9AD136EA38237531608C3729CD117761CC8ADE69C679A8DEE31D6AFF0094AD4C92DE32B8DBCD5AB5EE175B91ADE04601813529D457B53E7D31BA823F3AA9FD9B3E490991F5AD3A1DB1A91EE4EDA86E43CE0D575BCDC70C69CBA64F9E9C53BFB258724F34B950DD54F423017CDCF5ABD113D4715516D8A3E58F4AB01F6F7E2A52D08724CB40E7EB4BB89AAC5891B9681212943EC88B32CEFE31503BE1F834D32617AF35197EF49AB0598D925E724D34CD91C5412BE49C75AAFE6114F95F61587DC39DA40EF4CB44647C96A648E48C814B0B31E4D371276352560D1601E6A3821E724D53371818CF351A6A820241F9BF1A5CBA7BA0A5736F6E0544C101C922B31F58320F9179F7A8A269EE09DED807B54723DD8731727D5A38DB6A10C7EB558DE79C3E66FD699FD9B0A364F5FA9A8E544887157CCB617327B96D2EE254C77F5A8D595E51CF7AA270DCEEFD6A4B60E66C807029C57DE5AB5CE8E0804EEA0F4AD410C712E0281EF8AC48AF7ECEA3D6A29B5690E7078ACF54CDF434AEAE7E6D8B8C5539A08661CB11F4C562B5EBE4B6EA8135260E496CD691B05D3342E23488E73CD46B26E1C556176B7048EF48331BF5E2AD24D0268B0ECE16A2F35C9C0AB2A519300E4D3163C3E40ACDD28484A4D8C58773618D24F6F184E38C54FF00F2D72053A50190E6AD452F850A4D9924F50053A2CEDC30A1C90E46314A3A6722B4BBB075268DB8C834FE71926A25318E9D69E08CF5A2F2B586F7245CECC819FC28919B8207348C76A70690B12066B3490277D89D1DB6F4E6A44675C9C5568E420E7356373123D0D292E8CABDF41E9393D45432AEECF6A7383191834E5024C9CFEB4A3AB04880150060D4D2CAAB6F9193F4A8258FCB1525BB02A5585697BA26CD99AE5A43919A960B20FF0033120D680B78D79E2A40001B6A5EDA31EA431DA47C022A45B540D9038A91180241AB3045E636139350DB5BB04EC4B616514AE3702057556D616514619A0466F5233542CEDBCB8C65467BD3EE6F42700E31532986E6848F63021262880F4D82B35F54B20FB6308DF4C7158775A819E4280F1F5A8C04501B19350A3CDB8D34B73A546130DF173EA2A68DD97A71593A5DCF9120CE4A9AE99AD5278BCC888CFA0A52562B9F42BB95B88F6C8066B365B28F76156ACBAC914803022A7F2F7A8205276B6863522B720B0B278DF7EDC8AB9793A797B1860D3ADE5D802E0FBD56D5A112A8643822A6E72F533248090706A38D255F9700D44649D460E78A7C73BE79C8A2DDC57D449DA45C64531016E735382D3B631576D2C016E41A7143BDC9F438764C1DEBB38FCB78B1C1158105A6C0074A965BD7B51D0ED1DE86FB85D16AE6CE077DC05393C854DA00ACA8F568E57E0FE06A61365F214E3D69736A4B691475484024E38AC53192720D7417EA64889079ACA5858F6A7D4685B28039E6AC5CE9C0AE453ED2331B0DC38357A55ECA69A7603949A0111231CD547E056FEA16A48CE39AC3954AB7229F36BA027D08B7718A6B1E78A5C0DDD714D247639A4E2DB0BE838B023934A18EDE2A2C8638A78DD9C76AB718AB05C7A83D7BD054B1278A09DA0734E401F8069A5D11361F1461874A9FC84F4A96D212DF2E2B463B441F7BAD656B315CE7DA595CE4FE556ADDC85F98553793121F4A9049F2822B77256B16B42F0756E82A3B8608BF5A8A29412477A8A5932719CD676D4D23DCAD29CBE2A2257181D6A49B3D4F1553706C81C1AD62D2DCD1324672A3834AAFBC75A84AB6704D3972BD28BC5B15C9CC8B8E6A266CE7069870C7938A6367760537A68318C7033DEA06724F4A95CF18C556663C8C62AA3EA038381F5F4A1A562BC0C5404F393D29FE6055C11C51649D9136656B89D9783D4D54F989F5AB175223F41CD3A01BB9DBC5351BA337A6C16EC53923815A115C853BBB542022A9C0A8643F2F153656B0B5DCD2790489B855595094CF39ACF49E68DB27A5598AE1DDBE61C54CACBCD94892CED8CCDF3E40AD46448940403350C2C02F029D2CA31B45272BEDA1BA564559E5C7DF354A4980E0743535C3A8CE79354DDB2B9A1733652D08A5970A40354CCC065475A92638E455660BB771AD6104F564B6AC11CD24126771C7B1AD782ED654CE327D2B058FA739A96DAE3C99306AF92DAA052E8CE8ADE6F9BA55EF3D300F02B22DE753C8EF4B73232E08A9926D96EDD0D1173B98E30295A62548AC586EB2C496E45595B8DDDC1A4D36C7643A504D405981F97356130CA7E6A4D80A9DB4F660B4208E7C361BAD5B18C6475ACF9A328DBBD69D15DB236D65E3D69C9595D02D0D0E08C9A637D78A4591594629A4FCC6B2B5D8EE4B1101719AB2ADC75AAA853069C1B27AE055EE3B36CB45B70EB4C4611B724FE1402A538A6B7246292693D4AB16DDA39630029CF6CD55F29D4FA539262BC63A5580C26504F5A4AEB725EDA10249C1539245488493DE93CA2ADB80CFE14F50DFC4314A6D7516AC9E084CEE0574367651DBA863C9AC2818C24135A42F82C592DFAD437D00D1B8B95894946AE76FB502CC42F5355EFB53DE4AA37EB55600647CBF2688C2FAB6264A82477CE2B56087728DDC556857E6031C56B44AA105549C5225BB0E01634E3AD6AD85EBC4A06722B18B132631C55C42540DA6B9E5A8D5EC7570F9174A0BAAE7E9563EC70C2BBF008AE72DAF190ED1CD680BC99E3DBCE295ECB525AD0B81ED1D8FCA01FA546F6F048DD6B3B69EC79AB2818A524F5307148926D2EC5B9E777FBD4C4D16D5C72C0531B7AF2335197994E79C536EC4B48B91E91029F948C55916B1C438231591F6A9030018FE74E79E50A7E634EF7EA2B58D1690274606A095D66428FD0D62B5DBA92726AD5ADCA38FDE1C134927B93228DCDAC96F30787257DAAEDBEA5D124E2B5238239908C83591A9E97220668C647B55BEC4A46B4663953820FE34D36C03648E2B918351BAB39029E83D6BA5B3D6A19D42C8429F7351CAD0683EEC0450CA7A50B2B491865E6A6B8104D09008FCEB3ED59918A86E050936176C7CCF249952BFA5655C59C872C178ADF555272719A8AEDD522385AAB69A899CACB68EFD062A94914919C1ADE1731863B96B3EFA442C4A8EB5516EDA05FB19D1ABE739A91A53D075A804AF8E8699F68C0248C1A5D4B4582DF2E5B8A7594804DD6A83DCEE1EF572CD7690C7BD5D95F50BF447596410A86C0AB8C16B26D1F0A306AF99B68CEE19A8D49DB6394201E7AD26483E82BADBAF0F595AC4079EE643F41FA573BA959C9689B810CB9ED5B45AD8B534F429A3ED9393D6866CBF5AA693FCD922A6F3958567349B3556167271D7355C80B820D3D987704D42E771C018AB8A8AD6C512071D73417CF41FA541B70302A4423047F4AA9A4F6403B6F524D46EE40C034E7236E455691F6216AA5D99495C7190203B8D5392F17918CD56B8BB62318CE6ABE5BA9156A36668A9DF72E4531958861C0AB0D871B4567249B4F435761DCC33DAA249A7A113834491D9A86CBF3561515382001491151D4E689FE63F2D46CF731E56F51AFB09F94534C2A47CC715011286CED38FA54725C30EA0E7D2AF5D89E5B90DCA95CF3C0A2D1999B9A826BA0E36B020D3EDA5017E51C9A25156B33482B9AC93F943079A46906DDD550331C0EB4F9411177A86B435B3B95E590BB13559E5038A7E0B72735198F775CD546C90DB446C7350B6D752A3822A720275CE2A07DA4920D6BEA26AE880A051D6A3CFB0E29CE707B9A89C8073D29D9EC5345FB39F630E6B5655F362CE6B994728C1949AE82D98CB077E95536FA0A2EFB99326E864216A58A765201A9648099880334F6B17080ED3F95294AC5356D8912EC018A985C657682335523B499CE446DF95598AC652725081512B5B51C5E9A8E6914637F3504CF1E32303156CE9B339F9413F4A58343919FE73F854AD351BBD8CD178CA70B9A9E1BA77620F4AD43A205FE1FD29C9A3C4BEB44A49E89D888AEE56856593EEA12BEC33565E2741F3230FAA91FCEBD07C1D636F6961E6EC0CECEDF330C91838ADBBFB3B4D4594CB0A36DF515CD3AAA2EC852A8F6B1E48BF7300734A848E99CD7A75F687A5CB6A505A421F1C301822B87974ED8E50718A50AA9E838CEE63167DC4E29525607157A7D324284AB74ACE6B79933804E3D2B6E752564691D8B91DDAFDD38CD4A2652D927159A21919778539A9024980CC0D1CB162B3347ED0318623154E6BBDD90A4D579A751C1CE6AA1B8456E0D0A9A7BEA4B2D470BBC9935AD6D1851CE2B07FB40A9181F8D28D425240C900D36A6F426CDEE756258C0E319A0DD8FBA0D60A3995796C8AB308238151EEBD823136E2949F7AB4B74BF70F5AA103622F7AA26E365D649E01A8946CB98B8BB3D4EE6CDA048919C724735A11DCDA33ED18AE35B5273000A29D6575217DDCD67CADAB9CD2D59DB4725897C1001AB12FD9801B48C572A8EDF7B2735695E72327349BD3426DDCDD55B79318619AB06CE37030456042640D939AD18EE4A0E49A2DE64D8B27468CB6E0DFA523E8EA54FCD4897C49EBC512DFAA8C6EFD69DD5C12667C9A34684E5EA33A60C8D9FCAACB7EFB243E4FD6B3AE6CAE33BD01FA8A7A3D07C9DD92FD9668E50437435AB1A34AA031CD72335EDF5B920B1C0F5E6B42CB539CC60F26AA4AC84E3A6E69DF6876F748481B1BD540AE5EE747BCB397821D7B15CD6F1D56656C11C9F5A71BEDEB87504D09B48CDC2E60457334476C8C47D6AC4775B5B39A92EB4B9AFE40F080A3DF8ACCB9827B2936480FD6A53B89591B2B7A0A8F9B9A93CF5950E4E4D734AD2939F9AA55BC784E4934D5C4DBE86E35A43226E3806B36E921589978C8AA33EA533F08E40AA8B70F2B329249A141BD8564899668B18DB9A89A14933C63355BCC317CA50E053A3BD0C718C55B83BDD6A53D3543D6D31FC356EDA304E2A05999CE0F4AB819604DC064D2E6EE1A177CE48D028E31514B7609C6FE3EB59F2BC930F97350C96F36DC9CD1A3DC2E7FFFD9"

Andrea5jpg_bin$ = SPACE$(LEN(Andrea5jpg$) \ 2)
FOR count& = 1 TO LEN(Andrea5jpg_bin$)
ASC(Andrea5jpg_bin$, count&) = VAL("&H" + MID$(Andrea5jpg$, (count& - 1) * 2 + 1, 2))
NEXT count&
OPEN "splash_Andrea5.jpg" FOR BINARY AS #1
PUT #1, , Andrea5jpg_bin$
CLOSE #1

splash& = _LOADIMAGE("splash_Andrea5.jpg", 32)
SCREEN splash&
_DELAY 5
SCREEN _NEWIMAGE(640, 480, 32)
KILL "splash_Andrea5.jpg"
_FREEIMAGE splash&
PRINT "CONTINUE YOUR PROGRAM HERE"
PRINT " This is a program for Andrea, Es una programa para Andrea"
_DELAY 2
--------------------- End Code ------------

Posted on Jan 1, 2013, 5:01 PM

Respond to this message   

Return to Index


She's a real cutie!

by Pete (no login)

Nice example program of how QB64 can render JPEGS from the binary file.

Pete :)

Posted on Jan 1, 2013, 5:36 PM

Respond to this message   

Return to Index


Thanks, and this leads too ..

by (Login GarryRicketson)
R

Thanks, it also works for png, and I imagine bmp. I am thinking this could be used to load various images, all self contained in the code.
Also I wonder if it could be used to load a image as a sprite sheet, array,..
But I am not sure, yet exactly how to explain what I mean, I guess I need to try some things, and then maybe I can be more clear,

Posted on Jan 1, 2013, 6:02 PM

Respond to this message   

Return to Index


*Adorable! I'm surprised you could post that lo-o-o-o-o-ong string here!

by (Login qb432l)
R

*

Posted on Jan 1, 2013, 6:17 PM

Respond to this message   

Return to Index


*That surprised me too

by (Login GarryRicketson)
R

Posted on Jan 1, 2013, 6:22 PM

Respond to this message   

Return to Index


* Long string capability is one of the few N54 posting perks we have.

by Pete (no login)

Posted on Jan 1, 2013, 6:22 PM

Respond to this message   

Return to Index


*His string is definitely longer than mine...

by (Login burger2227)
R

Posted on Jan 6, 2013, 5:57 PM

Respond to this message   

Return to Index


Bright White Background Color in QuickBASIC?

by (no login)

I'd like to create a routine that displays black text against a background that alternates between so-called "white" (actually gray) and "bright white."

But when I enter the numbers for those two colors as backgrounds, they both display as light gray.

Is there a way to get a bright white background color, in addition to the so-called "white" in QuickBASIC?

Will in Seattle
a.k.a. "Clueless"

Posted on Jan 1, 2013, 9:49 AM

Respond to this message   

Return to Index


palette in screen 0

by mn64 (no login)

screen 0
color 0, 7
print "hello, qb paperwhite"
palette 7, 63

Posted on Jan 1, 2013, 9:57 AM

Respond to this message   

Return to Index


and to get white on bright white...

by mn64 (no login)

screen 0
color 0, 7
print "hello, qb paperwhite"
palette 7, 63

Posted on Jan 1, 2013, 9:58 AM

Respond to this message   

Return to Index


sorry, copy didnt copy, here

by mn64 (no login)

screen 0
color 7, 1
print "hello, qb paperwhite"
palette 1, 63

Posted on Jan 1, 2013, 9:59 AM

Respond to this message   

Return to Index


Also...

by (Login qb432l)
R

SCREEN 0
PALETTE 1, 63
COLOR 0, 1
CLS
LOCATE 12, 16
PRINT "Black printing on alternating whites background"
DO
_DELAY 1
IF cl = 7 THEN cl = 63 ELSE cl = 7
PALETTE 1, cl
LOOP WHILE INKEY$ = ""
SYSTEM

In SCREEN 0, only attributes 0 through 7 can be used as background color, but attributes 0 through 15 can be used as foreground. Also, CLS following a COLOR statement will make the entire screen background color.

-Bob

Posted on Jan 1, 2013, 4:13 PM

Respond to this message   

Return to Index


Hey! That worked! (Sort of)

by (no login)

Many thanks, Bob.

Now I feel like I'm finally in the ballpark.

Your code displayed first one screen with bright white background, and then after I pressed a key, it displayed a second screen, with the plain "white" (really gray) background.

So, you've taught me that my old beater of a laptop actually is capable of displaying the combination of text and background colors that I'm chasing after.

Now, the question is, how to get lines of text to alternate between those two background colors, like horizontal zebra stripes?

I'm sure the sticking point for me is that I don't understand the distinction between what the COLOR, PALETTE and SCREEN statements do.

So it looks like I'm in need or a tutorial. I've tried to find that's comprehensible to me on the web, but I'm afraid the ones I've been able to turn up so far use a lot of technical jargon that goes right by me.

If QuickBASIC were a car, I would need a tutorial on the level of "press the gas pedal with your foot when you want to go faster."

Will in Seattle
a.k.a. "Clueless"

Posted on Jan 1, 2013, 4:36 PM

Respond to this message   

Return to Index


For alternating background colors...

by (Login qb432l)
R

Just set attribute 1 to bright white, and then use 7 as your second background:

SCREEN 0
PALETTE 1, 63 'bright white
COLOR 0, 7
PRINT "This is black on white"
COLOR 0, 1
PRINT "This is black on bright white"

If you want the background color to extend right across the screen, then use:
COLOR 0, 1 'for example
PRINT SPACE$(80); 'the semi-colon prevents scrolling

Then LOCATE and PRINT on the background you've just created.

The SCREEN statement simply establishes a screen mode. SCREEN 0 is text mode only, other screen modes are graphics (as well as text).

The COLOR statement establishes the color in which you want to print, as well as the background color you want to print on. So, in the example...

COLOR 0, 7

...you are stating that you want to print in black (0) on a white background (7). The first number represents foreground color, the second, background.

The PALETTE statement establishes what hue to assign to each color number (attribute). An attribute is like a variable (0-15) to which you can assign any of 64 different hues in text mode. Then when you use COLOR 1, for example, you're really asking to use the hue that you've assigned to attribute 1. In most cases, the default palette is more than sufficient, but in your case, since you wanted a bright white background, we had to assign bright white (63) to a background attribute (0-7).

-Bob

Posted on Jan 1, 2013, 5:57 PM

Respond to this message   

Return to Index


You want stripes? Here are stripes...

by Solitaire (Login Solitaire1)
S

All in SCREEN 0:


CLS
PRINT "Press Enter after each display of stripes to see the next one..."
INPUT "", E$
CLS 'vertical stripes
FOR x = 1 TO 77
    COLOR , x / 5
    FOR y = 1 TO 23
        LOCATE y, x
        PRINT " "
    NEXT y
NEXT x
INPUT "", E$

CLS 'horizontal ribbons
y = 0
FOR x = 2 TO 23 STEP 4  
    y = y + 1
    COLOR , y
    LOCATE x, 1
    PRINT SPACE$(80)
NEXT x
INPUT "", E$

CLS ' horizontal stripes
z = 0
FOR x = 1 TO 24 STEP 4
    z = z + 1
    FOR y = 1 TO 4
        COLOR , z
        LOCATE x + y, 1
        PRINT SPACE$(80)
    NEXT y
NEXT x
INPUT "", E$

CLS 'multicolored ribbons
z = 0
FOR x = 1 TO 77
    z = z + 1
    IF z = 16 THEN z = 1
    COLOR , z
    FOR y = 1 TO 23 STEP 4
        LOCATE y, x
        PRINT " "
    NEXT y
NEXT x
INPUT "", E$

CLS 'horizontal ribbons
z = 0
FOR x = 1 TO 24 STEP 3
    z = z + 1
    IF z = 8 THEN z = 1
    COLOR , z
    LOCATE x, 1
    PRINT SPACE$(80)
NEXT x
INPUT "", E$

CLS ' plaid on black background
z = 0
FOR x = 4 TO 77 STEP 8     'vertical ribbons
    z = z + 1
    IF z = 8 THEN z = 1
    COLOR , z
    FOR y = 1 TO 23
        LOCATE y, x
        PRINT "  "
    NEXT y
NEXT x
y = 0
FOR x = 2 TO 23 STEP 4  'horizontal ribbons
    y = y + 1
    COLOR , y
    LOCATE x, 1
    PRINT SPACE$(80)
NEXT x
INPUT "", E$

CLS ' vertical stripes alternating width
FOR x = 1 TO 77 STEP 2
    COLOR , x / 5
    FOR y = 1 TO 23
        LOCATE y, x
        PRINT "  "
    NEXT y
NEXT x
INPUT "", E$

CLS ' vertical stripes narrow
z = 0
FOR x = 1 TO 79 STEP 3
    z = z + 1
    IF z = 8 THEN z = 1
    COLOR , z
    FOR y = 1 TO 23
        LOCATE y, x
        PRINT " "   'add extra space for wider stripe
    NEXT y
NEXT x
INPUT "", E$

' uses VIEW PRINT to display multicolored screen with strings
COLOR 11, 2
CLS
LOCATE 21, 15
PRINT "Solitaire"
VIEW PRINT 1 TO 18
COLOR 14, 5
CLS
LOCATE 15, 15
PRINT "See you later"
VIEW PRINT 1 TO 12
COLOR 13, 6
CLS
LOCATE 9, 15
PRINT "Goodbye"
VIEW PRINT 1 TO 6
COLOR 10, 3
CLS
LOCATE 3, 15
PRINT "Hello"

COLOR 7, 0
END


Posted on Jan 1, 2013, 11:55 PM

Respond to this message   

Return to Index


LSD Flashbacks

by (no login)

Thanks, Solitaire!

That was a trip!

But I'm afraid it's a bit over the top for my SEEFIRST.BAS program. ;)

Posted on Jan 6, 2013, 5:20 PM

Respond to this message   

Return to Index


i've got that tutorial, it's aimed at newbies and will take you far

by mn64 (no login)

http://www.network54.com/Realm/QBZips/mpgitqbi.zip

let me know if the colors don't suit you, i'll help you fix them.

Posted on Jan 2, 2013, 1:13 AM

Respond to this message   

Return to Index


Thanks, menn!

by (no login)

I just downloaded it!

Posted on Jan 4, 2013, 9:55 AM

Respond to this message   

Return to Index


What does palette 7, 63 do?

by (no login)

I've been trying to expand your little program to produce two lines, one under the other, that would print like this:

"COLOR 0, 7 should display black text on plain white background"
"COLOR 0, 15 should display black text on bright white background"

But the backgrounds of both lines come out the same color of white.

Perhaps the limitation is in the display on my old Toshiba Satellite 2545XCDT, or the video card inside it?

I'm running QuickBASIC under MS-DOS 6.21

Here's my failed attempt:
==============================================================================
'palette in screen 0
'by mn64 (no login)
'Modified by Clueless in Seattle 01-01-2013 to try to print lines
'alternating between plain white and bright white backgrounds

SCREEN 0
COLOR 0, 7
PRINT "COLOR 0, 7 should display black text on plain white background"
COLOR 0, 15
PRINT "COLOR 0, 15 should display black text on bright white background"
PALETTE 7, 63
PRINT "Did that work?"
==============================================================================

Where have I gone wrong?

Will in Seattle
a.k.a. "Clueless"

Posted on Jan 1, 2013, 4:14 PM

Respond to this message   

Return to Index


you have to sacrifice an attribute. it doesn't have to be 7.

by mn64 (no login)

i bet i get what you're doing, and i alternate color 7 and color 3 for that :)

but then there is no color 7 and color 3, or color 15. those are just color-holders. by default, 7 holds white and 3 holds cyan, and 15 holds bright white but if you use it as a background, you get 7 anyway.

i think when i answered you, i tried using palette on 15 first. i don't think it worked, because if you change 15 you still get 7 when you use 15 as a background. so using palette on 15 all day won't change the background color.

that means using it on colors 8, 9, 10, 11, 12, 13 and 14 won't work either. you can only use 0-7 as backgrounds, or you will get those colors anyway.

so we changed 7 to bright. but you want to still use it. okay, how about color 2? use palette to change color 2 to bright white, and alternate 2 and 7:
SCREEN 0
palette 2, 63
color 7, 2
print "hi"
color 0, 7
print "hi"

use palette once, after that it's redundant (unless you're changing to other colors instead.)

Posted on Jan 3, 2013, 12:32 PM

Respond to this message   

Return to Index


Thanks, menn! That did the trick!

by (Login Clueless_in_Seattle)

And thanks to everyone who has contributed ideas and code samples.

You probably guessed right, menn, about what I'm up to with this.

I want to modify my SEEFIRST.BAS display so that the background color alternates back and forth with each subsequent file display like this:

FILENAME.001 This is 1st line of text from FILENAME.001 [white background]
FILENAME.002 This is 1st line of text from FILENAME.002 [grey background]
FILENAME.003 This is 1st line of text from FILENAME.003 [white background]
etc.,
etc.,

Will in Seattle
a.k.a. "Clueless"

Posted on Jan 6, 2013, 9:55 AM

Respond to this message   

Return to Index


*you're very welcome

by mn64 (no login)

Posted on Jan 6, 2013, 10:10 AM

Respond to this message   

Return to Index


Speaking of palettes, menno, did you ever...

by (Login Kewbie)
R

figure out a way to sort those colors to my specs?

Just kidding, I know that we agreed to give it up.

How's life been treating you?

Kew

Posted on Jan 3, 2013, 11:31 AM

Respond to this message   

Return to Index


AAAAAAAAAAAAAAAAAAAAAAA!

by mn64 (no login)

long freaking time no see!

...no, these days everyone uses _RGB and redoes the palette instead of trying to sort it. but i did sort them in the shape of a heart, once :D

Posted on Jan 3, 2013, 12:22 PM

Respond to this message   

Return to Index


*Cool! I don't suppose you kept the code for the heart?

by (Login Kewbie)
R

Posted on Jan 4, 2013, 9:41 AM

Respond to this message   

Return to Index


i thought you'd get the reference... it was obscure though :)

by mn64 (no login)

i didn't actually sort the colors "in the shape of a heart."

that would be a cool project, or maybe it would be crap. :) good to see you!

Posted on Jan 5, 2013, 10:24 PM

Respond to this message   

Return to Index


You can only get it in SCREEN 9

by Solitaire (Login Solitaire1)
S

This will not work in Windows newer than XP, which do not allow full-screen mode. It will work with QB64.

SCREEN 9 'for full-screen mode to compare results
SCREEN 0
COLOR 1, 15
CLS
PRINT "SCREEN 0: Backcolor is 15, Forecolor is 1"
INPUT "", E$
SCREEN 9
COLOR 1, 63
PRINT "SCREEN 9: Backcolor is 63, Forecolor is 1"
INPUT "", E$
SCREEN 0
COLOR 7, 0 'return to default colors before ending
END

Posted on Jan 1, 2013, 11:03 AM

Respond to this message   

Return to Index


you can do it in screen 12, but remember he sometimes uses actual DOS

by mn64 (no login)

to do it in screen 12, just use PALETTE to change attribute 0 to bright white.

it ought to be something like...

PALETTE 0, 63 + 63*256 + 63*256^2 'haven't tested it, just typing it in.

if this is one of the times he's using a real version of dos, he should have expected results. if screen 9 works in windows xp i can't guess why 12 wouldn't.

Posted on Jan 3, 2013, 12:20 PM

Respond to this message   

Return to Index


It depends on which version of XP...

by (Login qb432l)
R

XP 64-bit won't run QBasic graphics programs, but 32-bit will.

-Bob

Posted on Jan 3, 2013, 11:44 PM

Respond to this message   

Return to Index


*plus there is dosbox, though as ted says it might be "inferior" to qb64

by mn64 (no login)

Posted on Jan 5, 2013, 10:26 PM

Respond to this message   

Return to Index


Ted's right...

by (Login qb432l)
R

QBasic under DOSBox is flakey. Speed issues have always been a problem, no matter how much you tweek it. And now, under W7, I've also encountered color anomalies, in both the IDE and with text mode programs. Sometimes they clear up after running the program, sometimes not. I'm afraid the writing is on the wall for QBasic. Thank goodness there's QB64.

-Bob

Posted on Jan 6, 2013, 5:02 AM

Respond to this message   

Return to Index


honestly, i've never had a problem

by mn64 (no login)

i don't find ted's take on it so controversial-- for running qbasic programs, qb64 *is* better than qb in dosbox. except for programs that use SOUND, qb64 (the sdl version at least) is total crap for those. (i don't know what kind of specs would make that not so.)

but qb64 is generally superior to qb anyway. now, this could be a windows thing. obviously dosbox isn't made for running qb, it's made for dos programs in general (primarily dos games) and it works pretty well in my experience. that doesn't make ted wrong, of course.

Posted on Jan 6, 2013, 6:58 AM

Respond to this message   

Return to Index


DosBoxQB,Linux

by (Login GarryRicketson)
R

DosBox has always worked quite well for me, for QB stuff, using linux, but to be honest, I have never been able to run any qb64, using dosbox, it says that is a windows program,
QB programs are for dos,dos box seems to work fine, for any programs that are for Dos, to me anyway.
from Garry

From Garry
http://creativeminds.webege.com/SMF/index.php

Posted on Jan 6, 2013, 7:35 AM

Respond to this message   

Return to Index


qb64 is a windows program

by mn64 (no login)

it's also a mac program and a gnu/linux program. there is no dos version of qb64 (though a 64-bit version of dos would be interesting... like a horse and buggy that could do vtol.)

you can only run dos programs in dosbox.

Posted on Jan 6, 2013, 7:47 AM

Respond to this message   

Return to Index


* Happy New Year!

by (no login)

Posted on Jan 1, 2013, 12:00 AM

Respond to this message   

Return to Index


Note to Garry...

by Pete (no login)

Hi Garry,

As promised, Jan 1st, I updated Groups. You are now in the "R" Group, which means you can now edit your posts, use photobucket to post pics, etc.

Pete

Posted on Jan 1, 2013, 12:02 AM

Respond to this message   

Return to Index


Thank you

by (Login GarryRicketson)
R

Yes I also got a notice in my e-mail,
also Happy New Year

Posted on Jan 1, 2013, 3:13 AM

Respond to this message   

Return to Index


Hey, Pete and everyone, yes, Happy New Year...

by (Login qb432l)
R

I must say that January 1st looks great without a hangover. Us old dudes tend to go to bed early, even on New Year's eve, unlike our younger selves. As a result, no excessive drinking and no hangover, no trying to remember where you parked your car before you wisely took a taxi home. Also no New Year's resolutions to live up to. To be honest, I can't remember when I made my last resolution, but I know for a fact that, whatever it was, I didn't keep it.

Just a few of the advantages of senior-citizenship.

-Bob

Posted on Jan 1, 2013, 6:47 AM

Respond to this message   

Return to Index


* lol

by (Login MCalkins)
Moderator

Posted on Jan 1, 2013, 7:03 AM

Respond to this message   

Return to Index


Us old dudes

by (Login GarryRicketson)
R

"Us old dudes tend to go to bed early,"
Al though I do go to bed early, I usually get up pretty early, but then I am not really that old yet (59).
By the grace of God, I have not had a hangover, in 28 years,
http://creativeminds.webege.com/SMF/index.php?board=7.0
I quit drinking when I was younger, if I hadn't I wouldn't be here today,
This year (New Years eve) was kind of depressing, cause I am not at home, but my wife called my, so that helped, she callled at 10:pm , I was just about to go to bed, by the time we finished talking, it was already 11:30 !
Anyway, again, happy new year every one,..

Posted on Jan 1, 2013, 7:54 AM

Respond to this message   

Return to Index


Us old dudes, redux

by (no login)

Thanks, Bob, for bringing me my first smile of the new year.

I got a big grin on my face when I read your comment:

"Us old dudes tend to go to bed early, even on New Year's eve, unlike our younger selves"

As for me, I was in bed last night at 8:30 (and awake this morning at 4:30).

And like you, I'm happy to have left partying and hangovers in the trash bins of yesteryear.

I'm well into my seventieth year now, and have been struggling against disabling chronic illness for the last twenty years, so I can no longer afford to squander my time or energy like I thought I could get away with back when I was a youngster.

It's a beautiful sunny (albeit smoggy) winter morning here in Seattle, and I feel blessed to be able to enjoy it working at my laptop in my daybed, instead of nursing one of those horrible hangovers I used to call "The Holy Terrors."

Thanks for that reminder and for cheering me up on the first day, not just of the new year, but of the rest of my life,

Will in Seattle
a.k.a. "Clueless"

Posted on Jan 1, 2013, 8:32 AM

Respond to this message   

Return to Index


Happy New Year one and all!

by Solitaire (Login Solitaire1)
S

It looks like I'm the oldest one on this forum, at the age of 75, and starting to feel my years.

I'm still actively teaching an introductory course on programming at the college level. I started out years ago with QBasic, but had to switch to Visual Basic when the new Windows OS would no longer work in full-screen mode. With each new version of .NET, we had to upgrade to the latest VB.NET version.

Now my supervisor asked me to switch to C++/C#, since that's where most of the jobs are and we need to prepare the students for future employment.

I wrote my own course syllabus and spent years preparing hundreds of original little demo programs to introduce each new concept. I placed the demos into a WORD document, arranging the code along with comments, explanations, and original lab problems for each class session. It became a substitute for a textbook, and each class I would print and hand out several pages from my document. I would revise the demos and the text document each semester as I discovered new ways to make improvements and additions. I also prepared and handed out original supplementary material.

When preparing a new demo, for simplicity I sometimes write the code in QB first, and then translate it into VB code. I teach new concepts using Console applications for the most part, and then reinforce the concept using Windows Forms applications.

It may take hundreds of hours for me to revise my demos and documents, and I'm hoping to have it ready in time for the Fall semester. I'm just making a few revisions to the Spring semester material, still using Visual Basic. The last day of the semester (as I have been doing for years) includes an introduction to C#.

Uploaded a photo to Photobucket but unable to place it here.

Posted on Jan 1, 2013, 9:46 AM

Respond to this message   

Return to Index


*Just paste the link to your Photobucket pics in the message box.

by Pete (no login)

Posted on Jan 1, 2013, 1:20 PM

Respond to this message   

Return to Index


Where do I get the link?

by Solitaire (Login Solitaire1)
S

I don't see the option for it. At Photobucket, I can just upload, not download. I tried copying the url on top when I got to my photo, but it didn't work when I pasted it here.

Posted on Jan 1, 2013, 2:24 PM

Respond to this message   

Return to Index


Screen Shot

by (Login GarryRicketson)
R

I am going to see if I can get a screen shot, To explain, but also
if you select the image, on photobucket, then right click your mouse,
You should get sort of a "drop down window" that shows various tags, select and copy the one that says "image tag",
[linked image]
And this,
[linked image]
Down at the bottom, where it says URL, and has the mouse pointer, you should be able to select and copy that,then paste it into your post,
Hope this helps.
from Garry

Posted on Jan 1, 2013, 3:12 PM

Respond to this message   

Return to Index


Photo of myself

by Solitaire (Login Solitaire1)
S

Thanks, I think I got it now.

This is a picture of myself taken about 10 years ago. I use it for all my other forum profiles.

I do look a lot younger than my age. I'm 75 now. People are surprised when I tell them how old I am. It's all in the genes.


[linked image]

Posted on Jan 1, 2013, 3:38 PM

Respond to this message   

Return to Index


*Looks like you got images figured out

by (Login GarryRicketson)
R

Looks like you figured it out, Based on the photo, I would look like I am 90, and I am only 59, you look younger then me.!

Posted on Jan 1, 2013, 3:59 PM

Respond to this message   

Return to Index


Solitaire is dyslexic...

by Pete (no login)

She's really only 57!

Kidding aside, I picked up on that looks a lot younger than the age she posted, too.

I have a pic that does that for me, of course in my case, I took it 30 years ago. It's hanging on the wall, behind my desk. The photo keeps looking less and less like me all the time, and more and more like my son. I keep telling him I'll sell it to him in a few years, he keeps telling me by that time, he'll inherit it. Not sure where he got his snarky sense of humor from, oh well

Pete :)

Posted on Jan 1, 2013, 5:43 PM

Respond to this message   

Return to Index


*You've got that backwards, Dorian (nice to meet you, Solitaire - very nice picture).

by (Login qb432l)
R

*

Posted on Jan 1, 2013, 6:08 PM

Respond to this message   

Return to Index


Can you help me figure out how to insert images?

by (no login)

> Garry Ricketson (Login GarryRicketson)
> R
> Posted Jan 1, 2013 3:59 PM
>
> *Looks like you got images figured out

I don't have a login account.

Do I need to create one if I want to insert images into my posts?

Will in Seattle
a.k.a. "Clueless"

Posted on Jan 5, 2013, 10:03 AM

Respond to this message   

Return to Index


*i think you just post the url

by mn64 (no login)

Posted on Jan 5, 2013, 11:13 AM

Respond to this message   

Return to Index


login account, posting images

by (no login)

All though I do have a loggin acount, I am not logged in, and this seemed to work fine, I just pasted the URL in,as Mn says,
Image below
http://www.garryricketsonartworks.org/granite_roses.JPG
I think I read a FAQ discussion about this, I will see if I can find it again, and get back to here with a link to the thread, for more details.

Posted on Jan 5, 2013, 1:03 PM

Respond to this message   

Return to Index


login account, posting images

by Garry (no login)

Well sorry, when I clicked preview, it lookded like that was going to work, so I guess you do need to be logged in, and also I am pretty sure it has to be photobucket.com where the image is stored, so you would need to start a account with them too,..I will get back again with more details.
from Garry
Let's see if this works
http://i1140.photobucket.com/albums/n566/GarryRicketson/th_QB64-1.png

Posted on Jan 5, 2013, 1:23 PM

Respond to this message   

Return to Index


Posting photos,Now I am logged in

by (Login GarryRicketson)
R

Now that I am logged in, I do see the option to submit photos, So, that means you do need to start a loggin account, and be logged in, of course though, you can just paste in the URL anyway, and if people want to see the photo, they will follow the link, and look at it. But to actually be viewable as part of the post, you would need to be logged in,
EDITED: Apparently it dose not have to be photobucket.
END EDIT

and also upload the image to photobucket.com,you will need to start a account with them too, but it is for free.However, you would need some where to store the photo, or image, photobucket.com is free, and I recommend that.
This 1st image is not at photobucket, and probabley not visable.
Edited: I was surprised to see it did work, so I guess it dose not have to be photobucket, I had just pasted the URL in.

[linked image]
However this one should show,


[linked image]
I hope this makes sense, if not feel free to tell me, and I will try to explain better. I couldn't find anything in the FAQ's maybe I will try to write some explanation, and submit it there,..?
from Garry

From Garry
http://creativeminds.webege.com/SMF/index.php

Posted on Jan 5, 2013, 1:39 PM

Respond to this message   

Return to Index


My work station

by (Login Clueless_in_Seattle)

I'm going to try to insert a photo. I'm not sure it will work. The "preview" of this message doesn't show the photo. sad.gif

Here I am working in my daybed. All my equipment consists of hand-me-downs from FreeCycleSeattle.

These days I'm working on a hand-me-down laptop with a dead display, so I have it plugged into a monitor (hand-me-down, of course!) on a cart (also hand-down) next to my bed (do I have to add that the bed is also a hand-me-down from FreeCycleSeattle? I don't know how I'd get by were it not for the kindness of strangers).

Off to my right (your left as you look at the photo) you can see my old (hand-me-down)Toshiba laptop on which I run MS-DOS 6.21.

I use steel broiler pans (hand-me-downs, what else?) under these laptops as makeshift cooling trays, to try to dissipate some of the heat that builds up when I rest them on a pillow on my lap in bed.

Switching back and forth between the two computers is a tiresome chore, because the steel broiler pans are so heavy, and I suffer from chronic muscle and joint pain. But playing with these computers is an absorbing pastime that keeps me busy while resting in bed, where I spend a considerable part of each day these days.

Will in Seattle
a.k.a. "Clueless"

Posted on Jan 6, 2013, 10:19 AM

Respond to this message   

Return to Index


If at first you don't succeed....

by (Login Clueless_in_Seattle)

[linked image].html

Posted on Jan 6, 2013, 10:36 AM

Respond to this message   

Return to Index


Finally!

by (Login Clueless_in_Seattle)

Now if I can only remember how to do this next time:

1. Upload photo to PhotoBucket
2. In PhotoBucket click on HTML code to right of photo
3. Past link into message:

Photobucket

Posted on Jan 6, 2013, 10:40 AM

Respond to this message   

Return to Index


nice setup

by mn64 (no login)

i guess with the two computer screens in front of you, it doesn't matter if the clock radio is on its side. i can't even tell if it's on.

Posted on Jan 6, 2013, 6:35 PM

Respond to this message   

Return to Index


Congratulations

by (Login GarryRicketson)
R

That is great, you also explain it in a much simpler,clear way then I did, I am not too good at explaining things,
but glad to see you got it,
I have mentioned it before, but I had dropped out of computers, back at a time when I was just using Dos, then when I got back into them, a lot of these new things had me completely confused,..but some of them are pretty good,..
ok well take care and enjoy your self,
from Garry

Posted on Jan 6, 2013, 11:15 AM

Respond to this message   

Return to Index


*My pleasure, CIS! Lots of smiles around here :-)

by (Login qb432l)
R

*

Posted on Jan 1, 2013, 6:26 PM

Respond to this message   

Return to Index


happy new year, thebob... have a quick demo

by mn64 (no login)

it uses the textmode-flavor routines on your graphics forum

http://www.network54.com/Forum/648955/message/1357063517/actually+solitaire+wrote+an+operating+system+once...

Posted on Jan 1, 2013, 10:11 AM

Respond to this message   

Return to Index


*whoa... sorry about the front page. michael or solitaire, if you can fix the url there

by mn64 (no login)

(i forgot how much you can accidentally do to the layout here... eeeeee.)

Posted on Dec 27, 2012, 8:44 PM

Respond to this message   

Return to Index


Praeludium B-dur (Das Wohltemperierte Klavier Teil 1)

by J.S. Bach (no login)

http://www.youtube.com/watch?v=zoH0JumyFrE

x$ = "t92 l32 o3b->f>d<f<a>f>c<f<b->f>d<f<f>a>f<a<g>db-d<f>dad<g>db-d<d>f>d<f"
x$ = x$ + "o3e-b->g<b-db->f<b-e-b->g<b-<b->>db-d<c>de-d<<b->>dgd<<a>>cfc<<f>a>e-<a"
x$ = x$ + "<b->>dfd<fb->d<b-dfb-f<b->dfd<l32 g>def+gab->c<b-gab->cdef"
x$ = x$ + "cege<g>cec<eg>c<gaege<a>e-fgab>cdc<ab>cdefg"
x$ = x$ + "<d->faf<a>dfd<fa>d<adfaf<b->f>d<f<g>f>b-<f<a>f>c<f<f>f>e-<f"
x$ = x$ + "<b->f>d<f<g>fb-f<a>f>c<f<f>f>e-<f<b->f>d<f<b>g>f<gcg>e<gc+a>g<a"
x$ = x$ + "da>f<a<d>b->a<b-<e>b->g<b-e>cb-c<f>cac<<f>>d>c<d<<g>>db-d<g>e>d<e"
x$ = x$ + "<a>cdefgab->c<b-agfe-dcd<b-agfe-dcde-dc<b-agfe>>cb-c<<f>>cac<<d>b->a<b-<e>b->g<b-<f>a>g<a<a>a>f<a<b->g>f<gcg>e<g"
x$ = x$ + "<f>a>cfc<a>fc<afa>c<af>c<afcfedc<b-agfa>cfa>ce-g-<<l4d"
y$ = "o2>dfb->dab->df" 'arpeggiated
x$ = x$ + "l32" + y$ + "l32" + y$ + "l16 o2b>dg>dgb>df"
x$ = x$ + "l32ga-gfe-de-fe-dc<b>cdc<bagabagfe-dc<b-a-efe-dc<b-a-gfe-d"
y$ = "o3c>e-g>cgb->ce-"
x$ = x$ + "l32" + y$ + "l32" + y$ + "l16o3fa>cfa>ce-"
x$ = x$ + "o3l32cde-fga-b-agfda-b->cdc<b-ab->cde-fe-dcde-fga"
x$ = x$ + "b->cde-fgafl8>d"
y$ = "o2b->dfb->fa-b->d"
x$ = x$ + "l32" + y$ + "l32" + y$ + "l16o3e-gb->egb->d"
x$ = x$ + "l32o3egb->gb->d-" + "l32o3e-g>cgb->c"
x$ = x$ + "l32o3fa>ce-fa>c "
x$ = x$ + "o4 fd<b-ab->df<dfd<b-ab->df>b<a-fdb<af>d"
x$ = x$ + "l32o4e-de-dcde-dc<b-ab->c<b-agfgagfe-de-fe-de-dc"
x$ = x$ + "l32o2b->dfd dfb-f fb->d<b- b->dfd dfb-f fb->d<b->dfd l8b-"
x$ = x$ + "l4o2b-"

PLAY x$

Posted on Dec 27, 2012, 4:43 PM

Respond to this message   

Return to Index


*cool

by (Login MCalkins)
Moderator

Posted on Dec 28, 2012, 3:44 AM

Respond to this message   

Return to Index


Merry Christmas - Christmas comes just once a year...

by Pete (no login)


Christmas comes just once a year
But every day, our forum's here
From January through December
It's here for every forum member

And while this site may not be growing
Thanks to all, who keep it going
Let's try and treat each other right
Merry Christmas to all, and to all a goodnight
----------------------------------------------

Wow, what did the wife put in the eggnog this year?

Pete :)


Posted on Dec 25, 2012, 10:25 AM

Respond to this message   

Return to Index


*and if win8 leaves you maligned, at least free bootloaders are signed

by mn64 (no login)

Posted on Dec 25, 2012, 10:34 AM

Respond to this message   

Return to Index


Michael, go home!

by Pete (no login)

You're making me look like Scrooge. I told you you could have x-mas off!

Best wishes to you and your family this day. I hope you can get that religious rift repaired or behind you in the coming new year. Quite honestly, and solely from my perspective from knowing you from your post here over many years, you're too good of an individual to be cast into a mold.

Merry Christmas,

Pete

Posted on Dec 25, 2012, 10:55 AM

Respond to this message   

Return to Index


*Thanks. (I am home, btw...)

by (Login MCalkins)
Moderator

Posted on Dec 25, 2012, 11:43 AM

Respond to this message   

Return to Index


...

by gopus (no login)

I bet you this was the first thing you did on Christmas Day, WASN'T IT??!?


WASN'T IT??!?!?!

Posted on Dec 28, 2012, 9:24 PM

Respond to this message   

Return to Index


there's a bunch of things pitt could do to make his effect work, here's a couple ideas

by mn64 (no login)

i haven't looked at the code, so i'm not sure the best method for his project.

* how many spotlights are there? just 2? he could combine the spotlights into a single (dynamic) graphic, and then use that. voila, no overlap.

* instead of adding the filter to the image, he could copy the regions from the image to a new black background.

* a sort of combination of 1 and 2

* place a circle around each spotlight and do collision detection. make sure the filter routine refuses to draw in that circle region. but this will make one spotlight better formed (more evenly faded) than the other. it wouldn't be so great.

Posted on Dec 25, 2012, 8:07 AM

Respond to this message   

Return to Index


I'm trying to recreate lost QBASIC program

by (no login)

Back in the early 90s I wrote a short program in either QBASIC or QuickBASIC (I can't recall which).

I first called the program SEEFIRST.BAS and later renamed it CFIRST.BAS and eventually compiled it into CFIRST.EXE.

I wrote the program to run under MS-DOS 6.21. I wrote it because I was unable to find a DOS program equivalent to a CP/M program called DIRFIRST.COM. DIRFIRST.COM produced a sorted directory of the first line(s) of text files. It was very helpful in CP/M, what with the 8.3 filename limitation.

When I would put an identifying header line (or lines) at the top of each of my text files, DIRFIRST would then display a sorted directory, showing those header lines next to the filenames, like this:

FILENAME.001 This is the first line of FILENAME.001
FILENAME.002 This is the first line of FILENAME.002
FILENAME.003 This is the first line of FILENAME.003
etc.,
etc.,
etc.,

So I had a primitive kind of long filename system.

In the last few years I've taken up MS-DOS again, as a way to escape the kludgy complexity of Windows software, and have set up a little hand-me-down laptop to use as an MS-DOS text-editor.

I dug out my old CFIRST.EXE program, and the BRUN45.EXE file, and placed them in my DOS utilities directory. But when I try to run CFIRST.EXE the program stalls on a blank white screen. And I have to kill it with ^C.

When I press ^C I get this error message:

"File not found in module SEEFIRST at address 1F9C:0361"

"Hit any key to return to system"

I think I may have forgotten what parameters to enter at the DOS command line when running CFIRST.EXE. So I tried to find the code I wrote years ago, or any notes I might have made.

I hunted around for my old disks and printouts with the code but haven't been able to find them. And all my BASIC manuals are missing too. I'm afraid I tossed all my BASIC stuff years ago when I was trying to clean up the boxes of old stuff piled up in the back bedroom

All I was able to find was an empty ring binder with beat up divider tabs labeled labeled QBASIC, GWBASIC, MBASIC, etc. and a single scrap of a printout with what looks like QBASIC code on it. All the rest of the contents of that binder are long gone.

St this point, since the old program doesn't work anyway, I think the best course to take is to just try to recreate it from scratch.

However it's been over a decade (probably more like nearly two decades) since I last dabbled in BASIC programming. And I no longer have my manuals. So I'm going to need some coaching to get started on this project.

Would this be an appropriate forum for me to start in?

If so, I'd like to start by posting an outline of the steps I believe my program would have to go through to achieve the desired output to the screen of my laptop. And then get your feedback on what I might be overlooking, or what might be superfluous or out of order, etc.

Let me know if you'd be willing to work with me on this project. Or, in the event that this wouldn't be the best place to seek such help, could you refer me to a forum that might be better suited to this kind of work?

Will in Seattle
a.k.a. "Clueless"

Posted on Dec 24, 2012, 10:03 AM

Respond to this message   

Return to Index


You are welcome to start the project here.

by Pete (no login)

It would help to provide the computer operating system you want to write this on. Win98 and XP changed how the DIR shell results were output. An undocumented /x switch was added to XP, to help get long file names, too.

There are a lot of directory examples on this forum, too.

QB no longer runs on 64-bit machines without being virtualized like being run in DOSBox. The better news is QB64 does run in all new 64-bit systems, and even runs in Linux. It is 99.something QB compatible! QB64 handles long file names without using any tricks we needed in QB.

I would recommend downloading it at: http://www.qb64.net/forum/index.php?board=2.0

Pete

Posted on Dec 24, 2012, 11:52 AM

Respond to this message   

Return to Index


I'm running MS-DOS 6.21

by (no login)

Thanks, Pete & mn64 for your offers to help me on this project.

I'm running MS-DOS 6.21 on an old hand-me-down Toshiba Satellite 2545XCDT.

http://tinyurl.com/Toshiba-2545

I'm not running any version of Windows, just plain MS-DOS 6.21 at the system level. (But I *am* also running DOSSHELL (from version 5 I think) of MS-DOS, so that I'm able to task switch).

I like working in the simpler more elegant environment of MS-DOS. It gives me the feeling that I'm in control of the computer, rather than the other way around.

I'm afraid my memory is so poor these days, due to the effects of chronic illness and the drugs I take to control its symptoms, that I can't remember a thing about the program I wrote back in the 90s. So I'm just going to have to start from scratch.

I have the QBASIC that came with MS-DOS 6.21, and I also an old floppy labeled QuickBASIC 4.5.

Which program do you think would be the best fit for this project?

As soon as I hear back from you guys which version of BASIC you think would work best for me, I'll go shopping on the web for a manual. (I can't believe that I really gave all my BASIC books to the thrift store. But I guess that's what happened to them. They certainly aren't in the file drawer where I used to keep them. My memory has gotten so bad that I could hide my own Easter eggs and not be able to find them ten minutes later ;o)

In the meantime I'll start working on an outline of what I think the program is going to need to do. (I'm home sick with what feels like the onset of the flu or a cold, so I don't have to go to the holiday get-togethers tonight and tomorrow. So I can work on this tonight and tomorrow).

Will in Seattle
a.k.a. "Clueless"

P.S. I'm having trouble figuring out how to register at this website. Can one of you point me toward the registration page?

Posted on Dec 24, 2012, 6:03 PM

Respond to this message   

Return to Index


No need to register.

by Pete (no login)

You are welcome to sign in as you have been doing. If you want a user name, visit http://www.network54.com and register there. That will allow you to make a user name and password that you can use to sign it at any Network54 forum, this being one of them.

I would recommend installing your QuickBasic disk. It has a "Help" screen that you can access for the keywords.

QB64.net has a WIKI that you can use as an online sourse for QuickBasic keywords, too.

http://www.qb64.net/forum/index.php?topic=638.0

Hope you feel better soon,

Pete

Posted on Dec 24, 2012, 6:11 PM

Respond to this message   

Return to Index


ok, don't look at this one if you're trying to do most of it yourself :)

by mn64 (no login)

' WARNING: THIS PROGRAM OPENS ALL YOUR FILES IN BINARY MODE: USE AT OWN RISK

'show filenames and "headers"
'coded by request
'2012 mennonite
'public domain: use / modify / reuse / share for any purpose

' this program is free software and comes with NO WARRANTY.

foldersep$ = "\"
oscommand$ = "dir \temp /a /s /b > \tempfile.txt"
'IMPORTANT NOTE: change \temp to \ or c:\ only when you're sure it works the way you like

'foldersep$ = "/" 'remove first apostrophe for mac or gnu/linux
'oscommand$ = "find /tmp > /tmp/tempfile.txt" 'remove first apostrophe for mac or gnu/linux

shell oscommand$
filetoopen$ = "\tempfile.txt"
if foldersep$ = "/" then filetoopen$ = "/tmp/tempfile.txt"

open filetoopen$ for input as #1

do while not eof(1)
line input #1, p$ 'get filepath and filename
'print p$

for findfolder = len(p$) to 1 step -1
if mid$(p$, findfolder, 1) = foldersep$ then
folder$ = left$(p$, findfolder) 'get filepath
filen$ = right$(p$, len(p$) - findfolder) 'get filename
exit for
end if
next findfolder

h$ = ""
on error goto 10

if folder$ <> older$ then
color 7
print
print "new folder? ";
color 15
print left$(folder$ + space$(70), 68)
color 7
older$ = folder$
end if

'warning: do *not* ever, ever, ever change "binary" to something else...
open p$ for binary as #2
if lof(2) > 79 then
h$ = input$(80, #2) ' get the "header"
else
h$ = input$(lof(2), #2)
end if
close #2

'resume from error
20 for filtertheheader = 1 to len(h$)
eightbits = asc(mid$(h$, filtertheheader, 1))
if eightbits < 32 or eightbits > 126 then
mid$(h$, filtertheheader, 1) = "."
end if
next filtertheheader

print left$(filen$ + space$(12), 12) + " " + left$(h$ + space$(70), 67)
_delay(.01)
if inkey$ = chr$(27) then close : end

loop

close

end

10 resume 20

Posted on Dec 24, 2012, 8:07 PM

Respond to this message   

Return to Index


I had to look! Now, can we walk through it?

by (no login)

Hi again, mn64!

That was a nice Christmas present you left for me to find when I got up this morning!

I suspect you may have done most of my work for me already, so I'd like to thank you for your generosity.

I think my first step will be to print out your code and study it.

And then to try running your program on my little Toshiba laptop to see what happens.

Will it run under the QBASIC that came with MS-DOS 6.21? Or will I need to install QuickBASIC?

After I take it for a test drive, then I'd be grateful if you (or others on this forum) could help me walk through it, command-by-command, so I can understand how it works, (and begin re-learning BASIC programming in the process).

Will in Seattle
a.k.a. "Clueless"

Posted on Dec 25, 2012, 8:16 AM

Respond to this message   

Return to Index


i can walk you through it, sure.

by mn64 (no login)

if you can get qbasic (or quickbasic, either one) installed, i think it will probably run. if not, it may only need slight tweaks to get it going. i used dos and qb for decades, so i'm probably still pretty familiar.

i don't normally write entire programs on request, but this looked like one i could tap out in a hurry, i still have fun doing stuff like this. plus, it's a great idea, imo. a lot of the stuff i wrote in qb was about organizing/finding files and displaying information about them.

i think i will start out with fewer details (though we'll see...) and sort of grab your arm and run you through the code at a faster pace. if you want me to slow down and focus on something that isn't "just like riding a bicycle," feel free to ask for clarification.

cheers,

menn

Posted on Dec 25, 2012, 8:24 AM

Respond to this message   

Return to Index


okay, here's a lot of annotation all at once... (raise your umbrella)

by mn64 (no login)

so the first three paragraphs of code start with foldersep$ and the next one: foldersep$ and after that: shell oscommand$

...what this does is use the SHELL command to run DOS commands (or whatever operating system you're using) and create a file. for dos:

SHELL "dir \temp /a /s /b > \tempfile.txt"

should create (>) file called tempfile.txt in the \ folder, which is assumed to be c:\ but could be a:\ ...the file will be made from the output of "dir \temp /a /s /b" so you should change that to "dir \ /a /s /b" when you're convinced it's safe. (you should try it out.)

this list (tempfile.txt) will be loaded by the program, and all the files listed inside it will be opened. they're opened as binary and read using input$(n, f) so it should be fairly safe. but it's not tested in dos or windows yet.


-> open filetoopen$ for input as #1

this opens the file \tempfile.txt as file handle 1. it's only reading the file a line at a time. we'll put that as our main loop.


->
do while not eof(1)
line input #1, p$ 'get filepath and filename
'print p$

this says "while the end of the file (eof(1)) isn't reached, read a line from the file to p$. it would then print the line, but print is 'apostrophe'd and commented out.

the commands we used: dir /a /s /b says "list the files, including hidden files (/a,) search through folders (/s,) and put everything on one line including the path (/b.) so p$ contains the path and the filename.

to separate those, we use foldersep$, which is set to "\" for dos (in gnu/linux, it's "/".)

so for each line (p$) we go through it like this:

-> for findfolder = len(p$) to 1 step -1
-> next findfolder

that's we go through p$ one char at a time, from the last char (len(p$) to the first. backwards! (step -1)

to get each char:
-> if mid$(p$, findfolder, 1) = foldersep$ then
-> end if

for findfolder...next is iterating through the number of chars, back to one, so findfolder is equal to whichever char it's on.

if that number char is equal to "\" (going backwards) we know we've found the place in p$ where the filepath ends and the filename begins. so we use left$ and right$ to get those:

-> folder$ = left$(p$, findfolder) 'get filepath
-> filen$ = right$(p$, len(p$) - findfolder) 'get filename

and we get out of the loop, as it's done its job:
-> exit for

there's a chance the variable we're using for the first line of each file (h$) won't be cleared each time, so we cover that:

h$ = ""
on error goto 10

the on error goto 10 makes it so that if it tries to load a file that just won't open, it knows to skip the lines that process each file, and go to a line number after those:

'warning: do *not* ever, ever, ever change "binary" to something else...
open p$ for binary as #2
if lof(2) > 79 then
h$ = input$(80, #2) ' get the "header"
else
h$ = input$(lof(2), #2)
end if
close #2

WE WILL GET BACK TO THAT. that processes each file to get the first line.

there was also fun bit before that part, basically it compares the folder path (folder$) to a backup variable (older$) and if they don't match, it assumes we've moved from one folder to another in the listing. if so, it prints "new folder? " and the path. this is an alternative to printing the filepath never, or printing it for every single file.

after the skippable part:

'resume from error
20 for filtertheheader = 1 to len(h$)
eightbits = asc(mid$(h$, filtertheheader, 1))
if eightbits < 32 or eightbits > 126 then
mid$(h$, filtertheheader, 1) = "."
end if
next filtertheheader

this is fun, too. it goes through every character of h$ (we got h$ from the first line of the file) and if it isn't something you can type on a keyboard (we assume ascii 32 through ascii 126 are the printable chars) it changes the non-printables to "." so it won't mess with the screen output.

finally, print the first 12 chars of the filename(filen$) since this is DOS and 12345678.123 is 12, including the "." and the first 67 chars of the first line of the file (h$) because 12 + a space + 67 = 80, and that's our screen width.

print left$(filen$ + space$(12), 12) + " " + left$(h$ + space$(70), 67)
_delay(.01)
if inkey$ = chr$(27) then close : end

the if inkey$ line checks for a person hitting ESC and closes the file and quits early if they do.

and we close the loop through the list of files:

-> loop

we close the file containing the list:

-> close

and end the program:

-> end

10 resume 20 <- is where the program goes if there is an error (trying to open the file if it can't. for example, you can't open a folder as a file. that will give an error.) so on error goto 10 sends it here, then this line sends it to 20. i much prefer "try: (do this) ...except(error): (do this instead)" but qbasic doesn't do that.

now, the only part not covered at all is this:

open p$ for binary as #2
if lof(2) > 79 then
h$ = input$(80, #2) ' get the "header"
else
h$ = input$(lof(2), #2)
end if
close #2

so... what happens here is that file #1 is our list of files. since that's open, we'll:

1. open each file on our list, as file #2
2. check to see how long the file is
3. if the file is 80 or more bytes, just get the first 80 bytes
4. if the file is less than 80 bytes, just get the whole file.
5. close file #2, so we can use that handle for the next file on the list.

now that i've explained this, i've found a small bug in the program. we do all this to get h$, which is the first 80 bytes of the file.

but that assumes that there are no newlines (in dos, CR+LF or ascii 13 + ascii 10) when in fact, there might be.

in theory, this could screw up our output by printing an unexpected newline, which we could prevent by using INSTR() to chop off first anything after/including ascii 10 (takes care of os/x and gnu/linux) and then after that, chopping off anyting after/including ascii 13 (cleans up dos and perhaps ancient mac files.)

we could clean up h$ with a couple lines of code that way.

in practice, the program isn't really screwing up like that because we're turning all non-printables into "." so CR+LF will just turn into ".." and no real problem, unless you're a serious perfectionist. (in which case a couple lines with INSTR and left$ should make you happy.)

TADA!

now, i realize that might not answer all your questions. you may have more now. s'ok, you can ask.

HTH,

menn

Posted on Dec 25, 2012, 9:09 AM

Respond to this message   

Return to Index


BASIC handbook recommendations?

by (no login)

I have poor eyesight and cognitive impairment, which makes it difficult for me to read and process information from a computer screen. For some reason I find it much easier to read and understand printing that's on paper.

So I'm going to need to replace my lost BASIC manuals.

I used to have two QuickBASIC books: one was like a dictionary of commands, with examples of how to use them. And the other was a tutorial style "how to" book, that was like a course in QuickBASIC programming.

I'd like to find a replacement for each of those books, so that I'll have handy references to help me relearn BASIC programming.

Can you recommend any titles, authors or publishers? (And also warn me against books or authors to avoid?).

I searched my favorite online used book seller clearing house, and found a gazillion QBASIC and QuickBASIC titles, all selling for just a few bucks each (often with free shipping!). But I was overwhelmed by so many titles, and couldn't figure out how to pick ones that would be helpful to me, without being able to leaf through them to get an idea how understandable they are.

Will in Seattle
a.k.a. "Clueless"

Posted on Dec 25, 2012, 8:24 AM

Respond to this message   

Return to Index


i did one, you can download it here...

by mn64 (no login)

http://www.network54.com/Realm/QBZips/mpgitqbi.zip

yes, it's a screen tutorial. if you unzip it though, you should be able to print the .IKI files (they're mostly plain text) to paper. warn you, at a typewriter-size font, it's a good half-inch-thick stack of paper. about 70 pages (three times that if you want to emulate the screen display.)

i'd be interested to know if there is any way to adapt the material for someone i your situation to something that can be used electronically. the first edition (no longer available, as far as i know) actually talked out loud, but editing it was brutal. i figure making a file for a real screen reader would be a better option than that.

p.s. chapter 21 has been removed from the newest edition, the one i made for qb64. don't get me started on chapter 21 :)

i make no claim that this is the best tutorial out there. i spent months on it, tried to make it cover most of what i knew over 20+ years, and i stand by the feeling that it's "pretty good." YMMV.

Posted on Dec 25, 2012, 9:16 AM

Respond to this message   

Return to Index


*QuickBasic by MS Press and Revolutionary Guide to QBasic

by Pete (no login)

Posted on Dec 25, 2012, 9:24 AM

Respond to this message   

Return to Index


Books: Could this be one of them?

by (no login)

Hey Pete, I found this title online. Could this be the one?

"Microsoft QuickBasic," second edition
by Douglas Hergert, published by Microsoft Press (1988)



Posted on Dec 25, 2012, 9:39 AM

Respond to this message   

Return to Index


The cover is not the same as the one I have.

by Pete (no login)

It was the original MS QuickBasic book that came with QB45, back in 1990. Probably not around anymore, but I bet you could find it at a public library. I recall the ones in my city carried it.

Pete

Posted on Dec 25, 2012, 12:14 PM

Respond to this message   

Return to Index


Original MS QuickBasic book that came with QB45,

by (no login)

Is it Microsoft Quickbasic by Douglas, Hergert

If not could you post here the author's name?

How about the ISBN?

Do you know what that was?

Will in Seattle
a.k.a. "Clueless"

Posted on Dec 26, 2012, 3:16 PM

Respond to this message   

Return to Index


Mine has been packed away in storage for years.

by Pete (no login)

Plain white cover, with black lettering.

I'll be Solitaire has her copy available, and could post more info.

Pete

Posted on Dec 26, 2012, 5:22 PM

Respond to this message   

Return to Index


Are "Thank You" Messages tolerated here?

by (no login)

Some forums, especially list-serves, discourage the posting of "thank you" messages, regarding them as clutter and even as a kind of spam.

So I'd be grateful if one of you could clue me in on the policy here on the QBasic and QB64 Discussion Board.

But, in the meantime, I'd like to say, thanks, Pete, for that description of the cover of your manual.

I checked the Seattle Public Library catalog, and they don't have it. One of my complaints against our Seattle library system is that they have little use for old or "outdated" materials, and every year have a massive book sale where they sell off tons books to raise funds (to offset the Draconian budget cuts of the last few years).

So many of my favorite books, movies and CDs have disappeared from their collection :o(

Will in Seattle
a.k.a. "Clueless"

Posted on Dec 27, 2012, 6:33 AM

Respond to this message   

Return to Index


hahahaha! yes...

by mn64 (no login)

thank you messages used to be more common here, and are enthusiastically ENCOURAGED...

but i think there's no sense in berating people into thanking you... sort of misses the point. please feel very free to thank anyone here, as often as you want. if it's over the time, someone might reply "ok, ok, we get it." more likely they wouldn't know what to say to it, rather than you've done anything against ettiquite here. though i'm pretty sure i did something against spelling.

no one that i know of in the history of this forum has ever reacted negatively to a thank you post.

Posted on Dec 27, 2012, 11:02 AM

Respond to this message   

Return to Index


*wth, "time?" i meant "... the top"

by mn64 (no login)

Posted on Dec 27, 2012, 11:03 AM

Respond to this message   

Return to Index


Re: Original MS QuickBasic book that came with QB45,

by Solitaire (Login Solitaire1)
S

The Douglas book is a consumer item that was sold in bookstores. I believe the original manual that came with the software did not have an author, as it was published directly by Microsoft and their staff.

I think it had a blue and white cover and came in two separate editions, either as one or two volumes. Part 1 was a keyword reference, and part II was a tutorial. The single edition combined both parts into one volume.

I happen to have both editions somewhere, but since I have several hundred thousand books in my house, I am unable to locate anything that's been stashed away in cartons years ago, and buried under piles of newer books.

Posted on Dec 27, 2012, 2:26 PM

Respond to this message   

Return to Index


That's right, I remember now...

by Pete (no login)

But I think there was one book, with two distinct sections, keywords and tutorial. No author, just published by MS seems right, too.

I haven't been able to find one online, either.

Thanks,

Pete

Posted on Dec 27, 2012, 2:36 PM

Respond to this message   

Return to Index


There's one on ebay

by Solitaire (Login Solitaire1)
S

but the seller wants $56 for it. It's a 3rd edition, which I haven't seen.

http://www.ebay.com/itm/Microsoft-QuickBASIC-Compiler-Manual-1987-Vrs-3-0-/150947752510?pt=LH_DefaultDomain_0&hash=item23252fea3e

PS: It just occured to me -- Version 3 may refer to an earlier version of QuickBasic. The latest one was 4.5.

Posted on Dec 27, 2012, 3:16 PM

Respond to this message   

Return to Index


I found another one on ebay; version 2

by Solitaire (Login Solitaire1)
S

Posted on Dec 27, 2012, 10:23 PM

Respond to this message   

Return to Index


That's out of my price range

by (no login)

Hi Solitaire,

Thanks for helping me search for that elusive title. I appreciate your coming to my aid.

But I'm afraid that 56 bucks is more than I can afford to spend these days.

I'm a low-income, disabled senior, scraping by on a very small monthly Social Security benefit.

I've found some QuickBASIC titles for sale on the web for well under $10 (including shipping) so I think I'll take a gamble and order one of those.

In the meantime, if you ever unearth your old QuickBASIC books, and it turns out you have a duplicate copy of that Microsoft manual, I'd be honored to give it a good home. (I still can't believe that I actually tossed all my BASIC manuals; I'm still clinging to the the fading hope that I'll find them in a box buried in my back bedroom one of these days).

I'd be grateful for any help you can offer me on getting my old program SEEFIRST.BAS (posted under the "Eureka!" thread) up and running again.

I haven't been able to do much the last few days. I've caught some kind of bug that has made all my disabling chronic symptoms much worse. But I try to put in a few minutes on the project each morning; the time of day when I typically have the most energy and stamina.

Thanks again for your help,

Will in Seattle
a.k.a. "Clueless"

Posted on Dec 29, 2012, 8:48 AM

Respond to this message   

Return to Index


I FOUND IT!!!

by Solitaire (Login Solitaire1)
S

A miracle! I had an inspiration to look at a pile of old software packages against a wall under the window and found my original boxed package of QuickBasic 4.5! This version has the 2-volume manual set. The bottom 2/3 of each cover is plain white and the top 1/3 is dark blue. There is no author listed, only "Microsoft" at the bottom right. One volume is entitled, "Programming in BASIC" and the other one is, "Learning to Use Microsoft QuickBASIC."

I have the original disks and registration card, and it's all in a like-new condition. Inside the package was an order form for additional reference material, including a 3-ring binder containing the written copy of the on-disk "Advisor."

It came with either 3 3 1/2" disks or 4 5 1/4" disks. I have both sets, must have gotten the extra set at a computer show many years ago. Both my sets are in like-new condition. All the disks are double-sided low-density.

Posted on Dec 27, 2012, 6:54 PM

Respond to this message   

Return to Index


while you're there, could you see if you have a copy of "hands-on basic"

by mn64 (no login)

http://i510.photobucket.com/albums/s349/bbter/000_0945.jpg

this is the book that got me into BASIC more than 25 years ago. i followed it up with some basic primer from sams... not as easy to find. by the time i was doing graphics i was getting used to qb40, with its incredible help system. i was excited to learn screen 9 worked in basica, too. i had basica.com and basica.exe, and i'd never heard of "gw-basic" until many many years later.

Posted on Dec 27, 2012, 8:33 PM

Respond to this message   

Return to Index


* http://www.os2museum.com/wp/wp-content/uploads/2011/09/dos-3.21-basica.png

by mn64 (no login)

http://www.os2museum.com/wp/wp-content/uploads/2011/09/dos-3.21-basica.png

Posted on Dec 27, 2012, 8:43 PM

Respond to this message   

Return to Index


That was GWBasic

by Solitaire (Login Solitaire1)
S

That was the BASIC course I took when I got my Master's degree in 1989. I also took Turbo Pascal and LogoWriter.
Those were the only 3 programming languages offered at that time for the "Computers in Education" degree.

Posted on Dec 27, 2012, 10:19 PM

Respond to this message   

Return to Index


rebranded, to be certain

by mn64 (no login)

i'd never heard of gw-basic. gw-basic was microsoft, our dos was ms-dos.

but on the pcjr, it was ibm dos (pc-dos) and then after that, ms-dos.

ibm's dos was (of course) ms-dos, rebranded. i knew that after not very long.

but basica was gw-basic? i'd never heard of gw-basic. so it could have been gw-basic rebranded, but there was just no frame of reference. i think i first saw gw-basic in my teens, but i'd been playing with basic for a good number of years.

Posted on Dec 29, 2012, 7:13 AM

Respond to this message   

Return to Index


GW-BASIC vs. BASICA

by Solitaire (Login Solitaire1)
S

The original IBM PC computer had BASIC built into the hardware, so you could run a BASIC program even without a hard drive or a floppy disk. The A in BASICA stands for Advanced. It added more functionality to the BASIC that was built into the IBM PC machines. Running the disk with BASICA supplemented the BASIC that was built into the hardware chip. This was proprietary and clone computers were not permitted to duplicate it.

Back in those days there were dozens of clone computers that tried to emulate the original IBM PCs, but they were not allowed to duplicate the hardware exactly. BASICA would ONLY work on True Blue IBM machines. It depended on a proprietary chip that was built into those machines sold exclusively by IBM. GW-BASIC needed to include the BASIC instructions that were not on the BASICA disk. The GW-BASIC EXE added software instructions to take the place of the instructions on the IBM hardware chip. It did exactly the same thing as BASICA but it would work on any of the clone computers. It was legal, since the proprietary hardware was not copied to the clone machines.

When I took the BASIC course back in 1989, the school was using genuine IBM computers, and we were given BASICA disks to use. However, I had a clone at home and the disk wouldn't work on my computer. (I had a Packard-Bell 286.) That's when I found out about GW-BASIC, but don't remember the details on where or how I got it.

PS: I heard that GW-BASIC was written by Bill Gates. When it worked, he remarked, "Gee Whiz, it works!" That's where the GW comes from.

Posted on Dec 29, 2012, 9:34 AM

Respond to this message   

Return to Index


gw-basic and basica, the plot thickens

by mn64 (no login)

"Microsoft did not offer a generic version of MS-DOS until v3.20 in 1986 and before then, all variants of the OS were OEM ones. Depending on the OEM, BASIC was distributed as either BASICA.EXE or GWBASIC.EXE. The former should not be confused with IBM BASICA, which always came as a .COM file."
http://en.wikipedia.org/wiki/GW-BASIC

i had both BASICA.COM and BASICA.EXE. i always wondered what the difference was. back then, i wasn't doing stuff advanced enough to notice a difference. i guess when i had the ibm both worked, but i already had both: when i switched to a 286 clone, i can only suppose BASICA.EXE is the only one that worked, and i was told or assumed that the .COM was a sort of stub loader. in retrospect perhaps it was: but of the rom, not the .EXE ...which makes a LOT more sense.

my ROM BASIC came on a cartridge. not as cool as a c64 maybe, but certainly as close as ibm ever got.

Posted on Dec 29, 2012, 5:04 PM

Respond to this message   

Return to Index


My books are somewhere else.

by Solitaire (Login Solitaire1)
S

Don't know if I have that book, and if I do, it's buried in another room. I need to know the author and what it looks like physically (size, color, etc.) just in case I come across it, which I doubt.

Posted on Dec 27, 2012, 9:39 PM

Respond to this message   

Return to Index


believe it or not it was mostly rhetorical

by mn64 (no login)

i just got nostalgic seeing pictures of these old books. i wouldn't be at all surprised if you had some of those "three ring binder in a 'box'" books that were so popular with ibm and/or microsoft.

glad to see you're still on the forum, and thanks for inspiring the blast from the past. i didn't find the book (i don't have it) but i did find a picture of it online, and that's pretty neat. have fun...

Posted on Dec 27, 2012, 9:49 PM

Respond to this message   

Return to Index


A bargain at half the price!

by (no login)

I found a worn-out copy of Revolutionary Guide to QBasic, missing the CD, for sale on the web for only $232.94 (plus shipping).

Such a deal!

Will in Seattle
a.k.a. "Clueless"

Posted on Dec 31, 2012, 8:40 AM

Respond to this message   

Return to Index


QuickBasic books on ebay

by Solitaire (no login)

Go to ebay and enter QuickBasic. You will see several books, including the original manual, on sale ("Buy it now") or at auction. The prices vary but you can get a good idea of what's available, most very reasonably priced (around $5 or $8 each), and many with free shipping. You can pick up several books for a total of under $15 or $20.

Good luck.

Posted on Dec 26, 2012, 9:17 AM

Respond to this message   

Return to Index


I have purchased Revolutionary guide to QBasic

by Ben (no login)

from amazon. It was not bad. I recommend you give it a read, especially the graphics stuff.

This one really teaches programming techniques that can be adapted to all languages. There is little use for a programming book that is a language reference because that information is easily available in QB help and internet.

Posted on Dec 26, 2012, 12:41 PM

Respond to this message   

Return to Index


"WARNING...BINARY MODE" ??!!

by (no login)

Hi menn!

I'd like to take your little program out for a test drive.

But I'm worried about that caveat in the header line:

"WARNING: THIS PROGRAM OPENS ALL YOUR FILES IN BINARY MODE: USE AT OWN RISK"

I'm afraid I haven't a clue what the means.

Can you explain to me what the risks would be to my machine and the data I have stored on my hard drive if I were to try running your program?

Will in Seattle
a.k.a. "Clueless"

Posted on Dec 27, 2012, 6:39 AM

Respond to this message   

Return to Index


Binary is a read and write mode.

by Pete (no login)

That means when a file is open in binary mode, you can modify the code and make statements to add to it or write over it. That would require you use a PUT statement, and the file number of the binary file that is open. I don't think anyone would make such a mistake, but it is always good to just make a back up of any file you open in binary, and put it in a backup folder, just in case. That way you always have an original copy. Of course with a directory program, that would be a lot of back ups.

Pete

Posted on Dec 27, 2012, 11:31 AM

Respond to this message   

Return to Index


it's also a read-differently mode, which is why i used it

by mn64 (no login)

my main concern is that it would "touch" a file and perhaps change the date. i'm pretty sure that won't happen, iirc you'd have to PUT to it, at least. but i don't rely on "iirc" here, i thought i'd point it out explicitly. in case it works differently than i expect (though i think it won't.)

if you open a huge program or a raw image file, you could have a "first line" that is megabytes long. in dos (which is the target environment here) that could easily be an issue. so i used binary mode to get max 80 chars more easily. it's the most BASIC way i know to do it, but there might be a better way that i actually don't know. i put in a slightly exaggerating warning so people that don't know better would back off, and people that do know better would shrug it off. likewise, the \temp folder. almost too bad it's sort of moot now, but i had fun writing it and now i've got my own version.

Posted on Dec 27, 2012, 11:39 AM

Respond to this message   

Return to Index


you know will, i'd love to offer a couple "extra safe" ways to run this

by mn64 (no login)

when i started using dos, it was all from floppies-- didn't even have a hard drive. (then again i was less than 10, so it goes without... anyway!)

so "installing" dos meant running SYS A: and copying autoexec.bat and config.sys, if not *.* (i seem to recall being careful which system files copied instead of SYS'd over, back then msdos.sys was a real binary file, not a text config, you could write stuff to the wrong area-- then it wouldn't boot, but all else was fine-- and if files occupied the wrong place it wouldn't SYStemize either.)

but if you screwed up, you could just make another floppy. took a minute or two. compare this to reinstalling windows (even 3.1, although you can boot dos+win 1.01 from the same 1.44m floppy.)

so you know, you could try my program out with a dos floppy, and just make sure you're on a: instead of c: (a:\> / c:\>) when you run it.

you could also make a boot cd for freedos, and use qbasic from there, or gnu/linux, and use qbasic from dosbox, or gnu/linux, and use qb64 from there.

a good boot cd will warn you before installing anything. a good gnu/linux boot cd won't even mount your hard drive (i'm glad i don't make these terms up) without asking. so it's a pretty safe environment to mess with (like the one i'm using to type this) and then when you are done playing, just reboot. nothing changed, nothing saved (unless you write it to the floppy or a usb drive or something.)

do you need to do that to run my program safely? probably not. would it add tons of safety? TONS. is it a GREAT tool to have handy, regardless of the program? so much. if you have a cdrom, freedos is priceless. better than msdos, imo, unless you're running windows.

and a gnu/linux cd can do more still, including run qb64 OR qb from dosbox. these are things to try when you have time. they're wonderful things, like the days of boot floppies (well ok, maybe better. but it would definitely take you back.)

Posted on Dec 27, 2012, 11:50 AM

Respond to this message   

Return to Index


How about putting a seatbelt in your coupe?

by (no login)

Hi menn!

Now that I've found and fixed the problem with my klunky old station wagon, SEEFIRST.BAS, I'd like to take your little sports car for a spin.

I figure that instead of trying to streamline my old beater, I would probably do better to just have it towed to the wrecking yard, once I have a newer, smaller replacement for it.

As you may recall, I hesitated to run your code because you warned me that it would open my text files in binary mode, and that there was a very remote possibility that it could alter my files in some way, such as changing their date stamps for example.

Since I only plan to run the program in directories which contain ASCII text files, couldn't we just change the code so that it opens my files in whatever mode it is that is non-binary? (How many different "modes" are there for opening files, anyway?).

With that "seatbelt" firmly in place, I'd love to take your little two-seater for a spin, and then if it works for me, I'd be able to junk my old rattletrap.

Would your code still work with that one minor modification, i.e., changing the open file mode?

Will in Seattle
a.k.a. "Clueless"

Posted on Dec 31, 2012, 8:07 AM

Respond to this message   

Return to Index


Open the files with INPUT.

by Pete (no login)

INPUT reads the file data sequentially. An entire line can be retrieved with thr LINE INPUT statement.

OPEN "MYFILE.BAS" FOR INPUT AS #1
DO UNTIL EOF(1)
LINE INPUT #1, MYLINE$
PRINT MYLINE$: REM PRINTS EACH LINE TO THE SCREEN.
LOOP
CLOSE #1
END

-----------------

Pete

Posted on Dec 31, 2012, 8:35 AM

Respond to this message   

Return to Index


he's not ASCIIng for very much...

by mn64 (no login)

originally i suggested that it would be easier to simplify a program that used dir /b than one that parsed multi-column (multi-line-format) DIR output. i stand by that advice.

furthermore, i'd rather edit my own code than his, so i'm happy to take the easy way and set this up for him. once he has what he needs, it will be much easier to help him simplify it further.

i have a question for him though, than i need before i can get under the hood: WHICH files do you want to look at? just list the extensions (.txt .bas .etc) and we're good to go. it won't be until later today, but i've got it.

happy new year,

menn

Posted on Dec 31, 2012, 9:42 AM

Respond to this message   

Return to Index


he's not ASCIIng for very much...

by (no login)

Hi menn!

I assume by "he" and "him" you mean me; right? So, I'll proceed as if your remarks were addressed to me as well as to Pete.

I agree that it's a good idea to figure out what it is I want a program to do before starting to write the code.

The general answer to that question is that I'd like to have a program that runs under MS-DOS 6.21 that will display a list filenames and the first x number of lines of text from each the files in a directory.

It should ignore all obvious non-text extensions such as .EXE, .COM, and the like.

It should allow paging up and down the list.

And sorting of the list by first line or by file name.

As for file extensions, I use the three letter extensions as a means of dating files, via a code I developed years ago, that uses all the numerals and most of the alphabetic characters, so the program would have to open all the files in a directory. (And then perhaps have some kind of filter to skip first lines that are obviously not ASCII text. But my intention is to only use it to look a directories containing text files).

I still haven't tried running your program (out of sheer cowardice), so I don't know what the screen output would look like. I think that before we go any further, I should take it for a spin. I don't know for sure, but I think the code that Pete posted should get around my worries about opening files in binary mode. So, I guess that all I have to do is figure out how to insert that into your original code; right?

In the meantime, I've got my old SEEFIRST up and running. So there's no hurry. I'd like to go through the code of SEEFIRST, as time permits, and start trimming the superfluous code. An example of which is the part where I had instructions to trim the header and footer text from the DIR display. Now that you've told me about the /b switch for the DIR DOS command, I can delete that code.

What that amounted to was my re-inventing the wheel by creating a QuickBASIC routine to do the work that could have been done by simply adding the /b switch; two characters that could do the work of several lines of my klunky kode. I suspect that there are more examples of that kind of reinventing the wheel in my program. My approach was (and I have to confess, still is) to just patch together commands one after the other until I get the result I'm after.

But that was part of the fun of it. Sort of like feeding tokens into the slot machine until I hit the jackpot.

Now I'd like to step back and try to learn how to approach the problem the way an experienced programmer might look at it, starting with creating an outline of the structure of the program.

Will in Seattle
a.k.a. "Clueless"


Posted on Dec 31, 2012, 12:00 PM

Respond to this message   

Return to Index


ok i lied, but i'll have it to you next year

by mn64 (no login)

i thought i'd have more time today. today was exciting and fun, and totally got in the way of this. i know what i said, and i'm sure it will be okay, but i'll get it tomorrow or next year, whichever comes first.

have a good 2013!

Posted on Dec 31, 2012, 5:34 PM

Respond to this message   

Return to Index


Take your time, menn!

by (no login)

There's no hurry.

I've got my SEEFIRST.EXE working again; ever since discovering and correcting that SET DIRCMD /p switch that I had forgotten about in my AUTOEXEC.BAT file.

And, the truth is, when it comes to BASIC programming, I've made a resolution to try to follow that old adage: "If it works; don't fix it!"

Years ago I was trying to teach myself Spanish, and so thought it would be fun to try writing a little flash card program in MBASIC to help me with vocabulary learning.

Well, I managed to knock out a few lines of code that worked just fine. I'm talking maybe ten or twelve lines of code that displayed words from a vocabulary list in a text file, then waited for me to enter my guess at the meaning, and then told me if I was right or wrong.

It worked fine.

But, the heck of it was that I kept on thinking of little features and enhancements to the program, until the program itself took over all my waking hours for weeks and weeks. I soon switched from MBASIC to GWBASIC and the result was that I ended up spending all my time re-writing and debugging the program and never again used it for vocabulary drills. I never had any time for the Spanish. The program and taken over all my waking hours.

I suspect that the task of programming is like a Skinner box set up to give the programmer intermittent positive reinforcement. It was over fifty years ago that I took a Psychology 101 course at the University of Washington back in the heyday of behaviorism. We were taught in that class that the most effective way to increase the frequency of a behavior is not to reward it every time it occurs, but rather to only reward occurrences of the behavior intermittently.

That's exactly what programming does, doesn't it?

How many times to you have to write, run, re-write, run, re-write, run, etc., ad infinitum, until you finally get the reward of your code actually doing what you want it to do? (Well maybe for you it always works on the first try. But for me I have to try and try and try again, before I get my tasty little food pellet from the Skinner box).

So, since I *do* have my old SEEFIRST.BAS up and running again, I'm now fighting (perhaps vainly) against the overpowering urge to tweak it, just a little, here and just a little there.

I have such precious little energy available to me these days, that I can't really afford to get caught up in another of those endless loops of tinkering with my klunky old code (no matter how much fun it is!). I have a project to work on, and my SEEFIRST program is supposed to be a tool for working on that project, not a project in and of itself.

Sheesh! I wonder if there's such a thing as BPA (BASIC programmers anonymous). ;o)

So, take your time, menn! Please!

I need to get a grip,

Will in Seattle
a.k.a. "Clueless"

Posted on Jan 1, 2013, 8:18 AM

Respond to this message   

Return to Index


That is so true.

by Solitaire (no login)

I have quite a few programs with countless revisions to keep adding more and more new features, making it better (and longer) each time.

It's so rewarding when it actually works, that you want to keep doing it.

Of course, there's the possibility of introducing new bugs with each revision, but that just adds to the motivation to keep working at it until the problem is solved.

And the cycle keeps repeating itself, like a DO loop, with ever-changing conditions to continue or stop.

Posted on Jan 1, 2013, 8:55 AM

Respond to this message   

Return to Index


Finally hit the wall

by (no login)

Hi Solitaire!

That Spanish vocabulary flash card program finally go so large that it hit the GWBASiC memory limit, so I had to go back and keep stripping out comment lines, to give me more room.

Of course that meant that I was also stripping out any clues to myself explaining what in the heck the routines were supposed to be doing. I've got a whole box full of floppies containing the dozens (or could it be hundreds?) of versions of that program that I dubbed "Guillermo's Spanish Tutor."

The final irony is that I didn't know any better back then, so the program I ended up with was machine specific, i.e., it would only run on the machine that I wrote it on. And, of course, that little workhorse of a laptop top has long since died and gone to cyber heaven. So I'm left with a box of disks containing the product of hundreds, if not thousands of hours of work, and I can't even run the the dang thing for old time's sake. Ack!

Will in Seattle
a.k.a. "Clueless"

Posted on Jan 1, 2013, 9:44 AM

Respond to this message   

Return to Index


actually solitaire wrote an operating system once...

by mn64 (no login)

it didn't start as an operating system, originally it just showed lights on the screen. ever see tron? that's kind of how the mcp started.

solitaire's lights program will develop sentience this year, and become skynet. until then, here's a slightly less involved demo fit for the season, using my textmode-flavor graphics stuff:

' textmode-flavor graphics routines (plus happy new year example code)
' including gprint, glocate, gcolor, gbackcolor, gscale
' 2012, 2013 mennonite
' license: creative commons cc0 1.0 universal
' (public domain) http://creativecommons.org/publicdomain/zero/1.0/

screen 12 ' the following works in other screen modes, too
randomize timer
dim ccs(1 to 9, 1 to 2)
ccs(1, 1) =415: ccs(1, 2) = 289
ccs(2, 1) =185: ccs(2, 2) = 128
ccs(3, 1) =108: ccs(3, 2) = 75
ccs(4, 1) = 70: ccs(4, 2) = 48
ccs(5, 1) = 48: ccs(5, 2) = 32
ccs(6, 1) = 32: ccs(6, 2) = 20
ccs(7, 1) = 20: ccs(7, 2) = 12
ccs(8, 1) = 10: ccs(8, 2) = 6
ccs(9, 1) = 02: ccs(9, 2) = 2

for extra = 1 to 10
for p = 1 to 9
gcolor int(rnd * 9 + 14 - 9)
_delay .04
cls
gscale p
row = ccs(p, 1)
cl = ccs(p, 2)
glocate row, cl
gprint "000000000000000000000000000000000000000000000000000000000000000000000"
glocate row + 1, cl
gprint "0x00x0xxxx0xxxx0xxxx0x0x000x00x0xxxx0x000x000x0x0xxxx0xxxx0xxxx000x00"
glocate row + 2, cl
gprint "0x00x0x00x0x00x0x00x0x0x000xx0x0x0000x000x000x0x0x0000x00x0x00x000x00"
glocate row + 3, cl
gprint "0xxxx0xxxx0xxxx0xxxx0x0x000x0xx0xxx00x0x0x000x0x0xxx00xxxx0xxxx000x00"
glocate row + 4, cl
gprint "0x00x0x00x0x0000x00000x0000x00x0x0000x0x0x0000x00x0000x00x0x0x0000000"
glocate row + 5, cl
gprint "0x00x0x00x0x0000x00000x0000x00x0xxxx0xx0xx0000x00xxxx0x00x0x00x000x00"
glocate row + 6, cl
gprint "000000000000000000000000000000000000000000000000000000000000000000000"
next p
sleep 1
if inkey$ = chr$(27) then exit for
next extra

end

sub gscale(s):
shared gscalep
gscalep = int(s)
end sub

sub gcolor(c):
shared gcolorp
gcolorp = c
end sub

sub gbackcolor(c):
shared gbackcolorp
gbackcolorp = c
end sub

sub glocate(row, column):
shared gposxp
shared gposyp
gposyp = row
gposxp = column
end sub

sub gprint(p$):
shared gscalep
shared gposxp, gposyp
shared gcolorp, gbackcolorp
' # means "use the foreground color here."
' . means "use the background color here."
' _ means "transparent - don't draw this block at all" (you can layer!)
' 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f means "do color attribute 0 to 15."
' any letter after f: "use the foreground color here."
if gscalep < 1 then gscalep = 1
pcolorp = gcolorp
for p = 1 to len(p$):
select case lcase$(mid$(p$, p, 1))
case "#", "g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"
pcolorp = gcolorp
case "."
pcolorp = gbackcolorp
case "_"
pcolorp = -1
case "0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"
pcolorp = instr("0123456789abcdef", lcase$(mid$(p$, p, 1))) - 1
end select
if not pcolorp = -1 then
if gscalep > 1 then
line ((gposxp - 1) * gscalep, (gposyp - 1) * gscalep)-STEP(gscalep - 1, gscalep - 1), pcolorp, bf
else:
pset (gposxp, gposyp), pcolorp
end if
end if
glocate gposyp, gposxp + 1
next p
gposxp = 1
glocate gposyp + 1, 1 'gposyp = gposyp + 1
end sub

Posted on Jan 1, 2013, 10:05 AM

Respond to this message   

Return to Index


*Great stuff (lol@skynet).

by (Login qb432l)
R

*

Posted on Jan 1, 2013, 3:13 PM

Respond to this message   

Return to Index


what the point of this program was

by mn (no login)

i tried many times to get pete into graphics. he just wasn't interested.

but he was willing to make ascii art. so i made him some routines so he could draw graphics using ascii-art techniques (locate, change color, print strings) but they would produce graphics.

it was a waste of time.

i forgot it was here, i forgot i wrote it, but i still think it was a cool idea.

Posted on Oct 4, 2014, 4:03 PM

Respond to this message   

Return to Index


all i've got right now is the filter, i'll get to the rest when i can

by mn64 (no login)

'IMPORTANT NOTE: it doesn't really work to have a blacklist of unacceptable filetypes.
'this has a whitelist of acceptable filetypes, separated by semicolons.

whitelist$ = "txt;bas;htm;py;sh;css;pl;me"

'check the whitelist for file extentions
spl = 0
while spl < len(whitelist$)
nsp = instr(spl + 1, whitelist$ + ";", ";")
if nsp > 0 then
checkext$ = mid$(whitelist$ + ";", spl + 1, nsp - spl - 1)
spl = nsp
end if
wend

Posted on Jan 1, 2013, 3:52 PM

Respond to this message   

Return to Index


i've written the rest, but i can't find the elusive...

by mn64 (no login)

i'd just post the code, but the problem might be because of paths or filenames that start with "."

since you're testing it in dos, i couldn't be sure if your tests would even have the problem. even then, i'd only expect michael to be able to find the bug. so it'll have to wait.

even when i'm done, it hasn't got a pager. i'm not willing to write a routine to do text screen paging for qb's memory limitations. it would involve a 3rd file and beloved binary mode. my program that you have should work alright, it should just be tested on a few folders before you trust it.

not that you have to use it. the one i'm working on uses input instead of binary, but there's an issue with the filter that's really sneaky.

good luck.

Posted on Jan 2, 2013, 7:14 AM

Respond to this message   

Return to Index


ok will, i think this does it. no paging of course, but you can try it

by mn64 (no login)

'show filenames and "headers" (no-binaries version)
'coded by request
'2012, 2013 mennonite
'public domain: use / modify / reuse / share for any purpose

' this program is free software and comes with NO WARRANTY.

'IMPORTANT NOTE: it doesn't really work to have a blacklist of unacceptable filetypes.
'this has a whitelist of acceptable filetypes, separated by semicolons.

whitelist$ = "txt;bas;htm;py;sh;css;pl;me"

foldersep$ = "\"
oscommand$ = "dir \temp /a /s /b > \tempfile.txt"
'IMPORTANT NOTE: change \temp to \ or c:\ only when you're sure it works the way you like

'foldersep$ = "/" 'remove first apostrophe for mac or gnu/linux
'oscommand$ = "find /tmp > /tmp/tempfile.txt" 'remove first apostrophe for mac or gnu/linux

shell oscommand$
filetoopen$ = "\tempfile.txt"
if foldersep$ = "/" then filetoopen$ = "/tmp/tempfile.txt"

open filetoopen$ for input as #1

do while not eof(1)
line input #1, p$ 'get filepath and filename
'print p$

for findfolder = len(p$) to 1 step -1
if mid$(p$, findfolder, 1) = foldersep$ then
folder$ = left$(p$, findfolder) 'get filepath
filen$ = right$(p$, len(p$) - findfolder) 'get filename
exit for
end if
next findfolder

ext$ = ""
if instr(2, filen$, ".") > 0 then
for findext = len(filen$) to 2 step -1
if mid$(filen$, findext, 1) = "." then
ext$ = right$(filen$, len(filen$) - findext) 'get file ext
exit for
end if
next findext
end if

'check the whitelist for file extentions
checkext$ = ""
spl = 0
while spl < len(whitelist$)
nsp = instr(spl + 1, whitelist$ + ";", ";")
if nsp > 0 then
checkext$ = mid$(whitelist$ + ";", spl + 1, nsp - spl - 1)
if lcase$(checkext$) = lcase$(ext$) then
exit while
else
checkext$ = ""
end if
spl = nsp
end if
wend

h$ = ""
on error goto 10

if folder$ <> older$ then
color 7
print
print "new folder? ";
color 15
print left$(folder$ + space$(70), 68)
color 7
older$ = folder$
end if

if checkext$ <> "" then
open p$ for input as #2
if not eof(2) then
line input #2, h$ ' get the "header"
if len(h$) > 80 then h$ = left$(h$, 80)
end if
close #2
end if

'resume from error
20 for filtertheheader = 1 to len(h$)
eightbits = asc(mid$(h$, filtertheheader, 1))
if eightbits < 32 or eightbits > 126 then
mid$(h$, filtertheheader, 1) = "."
end if
next filtertheheader

print left$(filen$ + space$(12), 12) + " " + left$(h$ + space$(70), 67)

if inkey$ = chr$(27) then close : end

loop

close

end

10 resume 20

Posted on Jan 3, 2013, 8:41 PM

Respond to this message   

Return to Index


are you redoing this in DOS, or in some other OS?

by mn64 (no login)

if you're doing it in dos, i can help you with this in qbasic. there is also python for dos (only if you don't have basic...) but it only works in 32-bit.

qb64 is what i would recommend, if it runs. if you're planning to do this in dos, forget qb64, only because that's never going to run in any version of dos. but once we know what environment you're coding for, we can probably help much more.

i bet michael has the finished version before we can hint at it.

Posted on Dec 24, 2012, 1:20 PM

Respond to this message   

Return to Index


EUREKA!

by (no login)

Yesterday while hunting through old files on floppy disks, still trying to find that code I wrote years ago for my old SEEFIRST program, I came across a note in a log file saying that the BASIC code for another program could be found on a floppy labeled "WRK" (my abbreviation for "work"). Well, I had already looked through every box of floppies I could find, multiple times, and had never come across any disks labeled "WRK." So I figured that that elusive "WRK" disk no longer existed.

Then this morning I was digging around through the boxes in the back room, hunting for a blank cassette so I could make a copy of a decades old tape of xmas tunes that had been partly eaten by a tape player years ago. I thought I might be able to salvage what remained of it by copying it to a fresh (sort of) cassette.

I was unable to find any blank cassettes, (I think I probably tossed them all out a few months ago during one of my periodic purges), but I *did* stumble across a little cardboard box labeled "Floppy Disks to Sort." It contained about twelve dozen floppies, some of them unlabeled. So with renewed hopes I went through them one-by-one, and I'll be danged if I didn't come across one labeled "WRK"!

I popped it into my little laptop and found a directory on it named QBASIC, and a sub-directory named SEEFIRST, which contained SEEFIRST.BAS!

So, now I've got my old code back after all! What a nice Christmas present!

I'm only able to work at my computers for short periods of time, due to chronic pain and fatigue, and I'm afraid I've reached the limit for this morning's session. So the task of trying to run that old code will have to wait until after my midday nap. I'll report back this afternoon.

Will in Seattle
a.k.a. "Clueless"

Posted on Dec 25, 2012, 10:13 AM

Respond to this message   

Return to Index


*congrats! incidentally, if you manage to post it here at some point, i'd be most curious

by mn64 (no login)

Posted on Dec 25, 2012, 10:31 AM

Respond to this message   

Return to Index


Here's the code for my old SEEFIRST.BAS program

by (no login)

Hi again, menn!

Here's the code from what I believe was my last working version of my QBASIC program that I named SEEFIRST.BAS. The file I found on that old floppy is dated November 1995.

As you will see, the program includes a sub-routine written by a BBS friend to strip out the high bits from WordStar files. (Yes! I was still using WordStar in those days, because I had a ton of old WordStar files left over from my CP/M days. It was my plan to eventuallyconvert all those old WS files to plain text files, but to tell you the truth, I can't say if I ever got to that project.

I think it may also call some ancillary DOS programs that expand the QBASIC command set, but I couldn't swear to that.

One of the things it was supposed to do was alternate the colors of odd and even numbered lines. It was also supposed to include PageUp and PageDown commands.

This code will give you an idea of my "hunt-and-peck" method of programming back in those days. I would just leaf through my manuals hunting for commands that I thought I could press into service to get my desired results. I had no concept of program structure or flow.

I'm not even sure if this program will run on my current machine. I haven't tried it because I have to confess that I've completely forgotten how to run a .BAS program. (Getting old can be so humiliating) ;o)

Here's the code (such as it is):
=========================================================================
DECLARE SUB WSLineBreaks (lines!, InputLine$, crposition!, display$(), arrayrow!, FileName$, LinesToPrint!)
DECLARE SUB HighBitOff (char%, fileline$, SkipRoutine$)
'QB Program: Displays First X Lines of Each Textfile in a Directory

PALETTE: COLOR 0, 7: CLS
lines = VAL(COMMAND$)
IF lines = 0 THEN lines = 1
color$ = "Odd"

'Write DIR directory listing to a textfile named FILE.LST

SHELL "DIR>FILE.LST"

'Strip superfluous header lines from the directory listing in "FILE.LST"

OPEN "I", #1, "FILE.LST"
FOR headerline = 1 TO 4
LINE INPUT #1, headerline$
X = INSTR(headerline$, "Directory")
IF X > 0 THEN Directory$ = headerline$' Create string for directory name
NEXT headerline


arrayrow = 1' Set 1st row of Display array
LinesToPrint = 0 ' Set counter for total number of lines to be dislayed
ArrayRows = (128 * lines)
DIM display$(1 TO ArrayRows, 1 TO 2)

DO UNTIL CLOSECHECK > 0
SkipRoutine:
SkipRoutine$ = "off" 'This is an awkward way of turning off the SkipRoutine$
'variable which may have been turned on in the sub-
'routine "HIghBitOff. The purpose of the SkipRoutine$
'variable is to allow terminating the HighBitOff sub-
'routine when a non-text file is encountered and goto the
'SkipRoutine label. There surely is a more elegant way to
'achieve this but I haven't discovered it yet.

'Discard EXE, COM, ZIP files and <DIR> listings

LINE INPUT #1, line$
IF line$ = "" THEN GOTO skip
ListName$ = LEFT$(line$, 12)
IF ListName$ = "FILE LST" THEN GOTO skip
Ext$ = RIGHT$(ListName$, 3)
IF Ext$ = "EXE" OR Ext$ = "COM" OR Ext$ = "ZIP" THEN GOTO skip
SKIPCHECK$ = LEFT$(line$, 18)
SKIPCHECK = INSTR(SKIPCHECK$, "<DIR>"): IF SKIPCHECK > 0 THEN GOTO skip
'Discard footer lines in FILE.LST after last filename is read
CLOSECHECK = INSTR(SKIPCHECK$, "file(s)")
IF CLOSECHECK > 0 THEN GOTO CloseFileList

'Remove blank spaces from filename as it appears in LISTNAME$

Ext$ = "." + RIGHT$(ListName$, 3)
eight$ = LEFT$(ListName$, 8)
name$ = RTRIM$(eight$)

MakeFileName:
FileName$ = name$ + Ext$

'Open file and extract the first x lines of text

OPEN "I", #2, FileName$
FOR XLine = 1 TO lines
IF EOF(2) THEN GOTO CloseTextFile
ReadNextLine:
LINE INPUT #2, InputLine$
IF InputLine$ = "" AND XLine = 1 THEN GOTO ReadNextLine
'Test InputLine$ for WS mid-paragraph carriage returns
crposition = INSTR(InputLine$, CHR$(141) + CHR$(10))
IF crposition > 0 THEN
CALL WSLineBreaks(lines, InputLine$, crposition, display$(), arrayrow, FileName$, LinesToPrint!)
GOTO CloseTextFile
END IF
fileline$ = LEFT$(InputLine$, 66)
SkipRoutine$ = "off"
CALL HighBitOff(char%, fileline$, SkipRoutine$)
IF SkipRoutine$ = "on" THEN GOTO SkipRoutine'The SkipRoutine$ may have
'been turned on in the
'HighBitOff sub-routine as
'way of passing the instruc-
'iton to GOTO the SkipRoutine
'label back to the
'Main Program

'Load filenames and first lines into Display$ array

IF XLine = 1 THEN display$(arrayrow, 1) = FileName$
display$(arrayrow, 2) = fileline$
LinesToPrint = LinesToPrint + 1
arrayrow = arrayrow + 1
NEXT XLine

CloseTextFile:
CLOSE 2

skip:
LOOP
CloseFileList:
CLOSE #1
KILL "file.lst"

IF LinesToPrint = 0 THEN GOTO NoTextfiles
'Display 1st line Directory

arrayrow = 1 'Reset array row counter for output from array to screen
display:
CLS
'Print directory name on first line of screen display

LOCATE 1, 1: OUT 984, 9: COLOR 15, 1: PRINT SPACE$(80)
LOCATE 1, 1: OUT 984, 9: COLOR 15, 1: PRINT "First Line" + Directory$

screenrow = 2
FOR DisplayLine = 2 TO 24
'iF color$ = "Odd" THEN GOSUB Odd ELSE GOSUB Even
'COLOR fcolor, bcolor
COLOR 0, 7
LOCATE screenrow, 1: PRINT SPACE$(80);
LOCATE screenrow, 1: PRINT display$(arrayrow, 1);
LOCATE screenrow, 15: PRINT display$(arrayrow, 2);
arrayrow = arrayrow + 1
screenrow = screenrow + 1:
IF arrayrow = LinesToPrint + 1 AND LinesToPrint < 24 THEN GOTO SingleScreen
IF screenrow = 25 AND LinesToPrint > 23 AND arrayrow = 24 THEN GOTO FirstScreen
IF screenrow = 25 AND arrayrow > 23 AND LinesToPrint > 46 THEN GOTO MidScreen
IF arrayrow = LinesToPrint + 1 AND arrayrow > 24 THEN GOTO LastScreen
NEXT DisplayLine
END


'Alternate color display between filenames in directory making reading easier
Odd:
fcolor = 0: bcolor = 7: color$ = "Even": RETURN
Even:
fcolor = 0: bcolor = 7: color$ = "Odd": RETURN

SingleScreen:
LOCATE 25, 1: COLOR 15, 1: PRINT SPACE$(80);
LOCATE 25, 1: PRINT "Press <Esc> to Continue";
DO
continue$ = INKEY$
LOOP UNTIL continue$ = CHR$(27)
END

FirstScreen:
LOCATE 25, 1: COLOR 15, 1: PRINT SPACE$(80);
LOCATE 25, 1: PRINT "Press <PgDn> to see more or <Esc> to Quit";
COLOR 0, 7
DO
choice$ = INKEY$
IF choice$ = CHR$(0) + CHR$(81) THEN GOTO display' <PgDn>
IF choice$ = CHR$(27) THEN END
LOOP

MidScreen:
LOCATE 25, 1: COLOR 15, 1: PRINT SPACE$(80);
LOCATE 25, 1: PRINT "Press: <PgDn> to See More, <PgUp> to Go back, <Esc> to Quit";
COLOR 0, 7
DO
choice$ = INKEY$
IF choice$ = CHR$(0) + CHR$(81) THEN GOTO display
IF choice$ = CHR$(0) + CHR$(73) THEN arrayrow = arrayrow - 46: GOTO display
IF choice$ = CHR$(27) THEN END
LOOP

LastScreen:
LOCATE screenrow, 1: COLOR 15, 1: PRINT SPACE$(80);
LOCATE screenrow, 1: PRINT "Press <PgUP> to go back or <Esc> to quit";
COLOR 0, 7
DO
choice$ = INKEY$
IF choice$ = CHR$(0) + CHR$(73) THEN arrayrow = ((arrayrow - screenrow) - 21): GOTO display
IF choice$ = CHR$(27) THEN END
LOOP
NoTextfiles:
LOCATE 1, 1: OUT 984, 9: COLOR 15, 1: PRINT SPACE$(80)
LOCATE 1, 1: OUT 984, 9: COLOR 15, 1: PRINT "First Line" + Directory$
LOCATE 3, 1
COLOR 0, 7
PRINT "No Displayable Text Files Were Found in This Directory"
END

SUB HighBitOff (char%, fileline$, SkipRoutine$)
HighBitOff: '(by Frank Zsitvay) remove high bit ASCII characters from WS files

FOR char% = 1 TO LEN(fileline$)
byte% = ASC(MID$(fileline$, char%, 1))
' IF char% = 1 AND byte% = 10 THEN
' filelinelength = LEN(fileline$)
' fileline$ = RIGHT$(fileline$, filelinelength - 1)
'This should detect and delete the line feed at beginning of line
' END IF
IF byte% = 173 OR byte% = 168 THEN GOTO NextChar
IF byte% > 159 AND byte% < 166 THEN GOTO NextChar
IF byte% >= 0 AND byte% < 9 AND byte% THEN
CLOSE 2:
SkipRoutine$ = "on"
GOTO EndSubRoutine
END IF
IF byte% > 128 AND byte% < 167 THEN GOTO NextChar
IF byte% > 159 THEN MID$(fileline$, char%, 1) = CHR$(byte% - 128)
NextChar:
NEXT char%
EndSubRoutine:
END SUB

SUB WSLineBreaks (lines, InputLine$, crposition, display$(), arrayrow, FileName$, LinesToPrint)
'Insert CR's into WS paragraphs and breakdown into single lines
FOR LinesToBreak = 1 TO lines
linelength = LEN(InputLine$)
fileline$ = LEFT$(InputLine$, crposition)
'Change _ to carriage return
MID$(fileline$, crposition, 1) = CHR$(13)
CALL HighBitOff(char%, fileline$, SkipRoutine$)

'Load filenames and first lines into Display$ array
IF LinesToBreak = 1 THEN display$(arrayrow, 1) = FileName$
display$(arrayrow, 2) = fileline$
LinesToPrint = LinesToPrint + 1
arrayrow = arrayrow + 1

'Remove FileLine$ from InputLine$
InputLine$ = RIGHT$(InputLine$, linelength - (crposition + 1))
'the +1 above will delete the linefeed following the carriage return
linelength = LEN(InputLine$)
crposition = INSTR(InputLine$, CHR$(141))
IF crposition = 0 AND linelength = 0 THEN GOTO EndWSLineBreaks
IF crposition = 0 THEN crposition = linelength
NEXT LinesToBreak

EndWSLineBreaks:

END SUB



Posted on Dec 27, 2012, 7:07 AM

Respond to this message   

Return to Index


i could make this program work for me...

by mn64 (no login)

i don't use 8.3 filenames like dos, and a lot of files don't end in "." on my filesystem, (some do start with it) but i'd have to change the part that casts out exe files, zips, etc.

in the version i made, it handles all file types (except folders) and changes non-printable ascii codes to a dot. that way when you open a binary/exe, if the first 80 chars are something like:

"ELF"

it would change that to: ".ELF.................................................." and all is well.

i could modify the program you have, but right now it's choking on my non-8.3. filenames. if i had a copy of qbasic, i could try it in DOSBOX, then dosbox would remap the system into the 8.3 filenames your program is looking for. but i'd rather modify the program than remap the filesystem.

Posted on Dec 27, 2012, 12:10 PM

Respond to this message   

Return to Index


I'm going to try running SEEFIRST.BAS from QBASIC

by (no login)

Thanks, again, mn64, for sticking with me on this project.

Before you try modifying my old code, I'd like to try loading it into QBASIC and then running it to see what happens. If that doesn't work, I've got a set of old QuickBASIC diskettes around here somewhere, and I can try running it under QuickBASIC.

I seem to recall that back when I was playing around with QBASIC and/or QuickBASIC, that those programs would show you the line a program stopped running on and give you an error message as a clue as to what the problem was.

So I may (with the help of you folks here in this forum) be able to repair that old program and get it up and running again.

And who knows, maybe it will actually run just fine on the first try ("Hope springs eternal!").

So that's my project for this weekend.

Trouble is I've come down with some cold or flu-like bug that's slowed me way down (from my already chronically slow pace), so I don't know how far I'll get today.

But I'll report back here on my progress (or lack of it ;o).

Will in Seattle
a.k.a. "Clueless"

Posted on Dec 29, 2012, 10:53 AM

Respond to this message   

Return to Index


Error on Line 2: "Advanced feature unavailable"

by (no login)

I loaded SEEFIRST.BAS into QBASIC under MS-DOS 6.21 (NOT a DOS box).

I got the above error message on line 2 of the program:

lines = VAL(COMMAND$)

Could "Advanced feature unavailable" be trying to tell me that I need to run my program under QuickBASIC 4.5 instead of QBASIC?

The meaning of that line from the program is starting to come back to me, I think.

Since I wrote the program to display up to 4 lines from a text file, then it makes sense that I would expect to enter the number of lines I want displayed at the DOS prompt, right? So, that COMMAND$ probably is supposed to contain the number the user (i.e., me) enters when running the program.

I'm afraid that for this morning I've hit the wall of utter exhaustion, so I'm going to have to head back to bed for lunch and a long nap.

But after my nap I'll try to get QuickBASIC 4.5 installed and take SEEFIRST out for another spin.

Will in Seattle
a.k.a. "Clueless"

Posted on Dec 29, 2012, 11:39 AM

Respond to this message   

Return to Index


Yes, you need QuickBasic AKA QB45 for that.

by Pete (no login)

COMMAND$ is not part of QBasic.

Pete

Posted on Dec 29, 2012, 11:48 AM

Respond to this message   

Return to Index


you Sort Of need it for that

by mn64 (no login)

pete's right, there's no COMMAND$ in qbasic, but then again, what's the point of COMMAND$? you need it to fancy up things so they can have compiled .EXE's that accept command line switches of their own. install qb45:

or just put the command line switch (here it appears to be an integer) in a variable. i like both solutions, really but depending on what's available, just using a variable is a lot easier.

Posted on Dec 29, 2012, 5:26 PM

Respond to this message   

Return to Index


Installed QuickBASIC 4.5, ran program, found 1st error

by (no login)

I found a couple of old QuickBASIC back-up diskettes and tried to install it.

The installation stalled, but I managed to copy over enough of its files to get it to work.

I loaded an ran my old SEEFIRST.BAS program, and it stopped on this line:

OPEN "I",#2,FILENAME$

The error message is: "File not found"

So, I'd like to take a look at the FILENAME$ to see what it contains.

I tried inserting PRINT FILENAME$ just before the command that produced the error, but nothing shows up on the screen. Could it be an empty string?

How can I find out what's in the FINENAME$?

Will in Seattle
a.k.a. "Clueless"

P.S. I recall very little of the BASIC terminology and jargon, so you'll need to talk down to me.

Posted on Dec 29, 2012, 7:12 PM

Respond to this message   

Return to Index


don't forget to use END

by mn64 (no login)

if you're using qb45 you can setup a breakpoint, but i found that too tedious to bother with for serious debugging.

try STEP. i think it's the F9 key but it's been years, so look on the screen (maybe it's F6...) when you press that instead of run / F5, it only runs the next command. great for figuring out what's going on.

you can also have it watch a variable. this is in the menus somewhere. setup a watch for FILENAME$ (i also found this one too tedious to bother with.)

lastly and most importantly, put in END on the line after you print the variable you want to print.

Posted on Dec 29, 2012, 7:28 PM

Respond to this message   

Return to Index


BINGO!!!

by (no login)

Are any of you old enough to remember the "I Love a Mystery" program that was on the radio when I was a kid?

Well, I feel like a detective, who with the help of my intrepid partner menn, just solved a baffling mystery.

Here's how we did it:

First I took menn's advice and tried putting in the END command (or is that a "statement"? I could never remember the difference between those two).

Anyway I put in these two lines, just before the line that produced the error message:

PRINT "This is filename$: "+filename$
END

But what printed to the screen was a properly formatted 8.3 DOS filename, in fact, it was the name of one of the actual files from the current directory, just as it should have been.

So, I scratched by bald head and wondered: "If filename$ is a proper filename for one of the files in the current directory, then how come QuickBASIC keeps giving me a "File not found" error at the command:

OPEN "I", #2, FileName$

Then it occurred to me that the above line, the one that caused the program to crash, was part of a loop. And on each circuit of the loop, it produced a new filename$ until it hit the trigger to tell it to stop.

So, I removed the two debugging lines I had inserted just ahead of that line, and instead tried menn's other suggestion of using the "watch variable" debugging tool.

And...

BINGO!

When I ran the program again, this time at the point that the program crashed, the filename$ showed up as:

Press an.key

I'm sure you're a lot quicker on the draw than I am and have already figured out the source of the problem even before I've finished typing this line of text.

But even I, as slow as I am on the uptake these days, recognized that text as snippets from the DIR output display, "Press any key to continue..."

So, I looked at the contents of the "FILE.LST" file produced at the very beginning of my program by the line:

SHELL "DIR>FILE.LST"

And sure enough, stuck in at the end of the file were these lines of text:

--------------------------------------------------
Press any key to continue . . .

(continuing C:\TEST)
19 file(s) 9,309 bytes
2,045,706,240 bytes free
--------------------------------------------------

So my program was working fine at creating filename strings up until it hit that snag.

I'm guessing that all I have to do to get past this problem is figure out why the DIR>FILE>LST command is writing that paging mode pause into the output file. Could I have put something in my autoexec.bat or config.sys files years ago that reconfigured the DIR command to have /p as it's default?

Whatever the reason, I now know where the problem is coming from, so now I can figure out a way around it.

Thanks a million, menn, for tipping me off to that "watch" tool!

It's great to have you as a partner in my fledgling detective agency,

Will in Seattle
a.k.a. "Clueless"

Posted on Dec 30, 2012, 8:20 AM

Respond to this message   

Return to Index


The Eagle has landed!

by (no login)

I tracked down the glitch in my old SEEFIRST.BAS QuickBASIC program:

Somewhere along the line, way back when, I had addeed a SET DIRCMD=/o/a/p to the AUTOEXEC.BAT file I had been running on my old (and now, long since, dead) laptop.

When I revived my old QuickBASIC project this year, I just copied over the AUTOEXEC.BAT file from the hard drive of that old dead laptop, and picked up the project from there.

I had long since forgotten about that SET DIRCMD line in the AUTOEXEC.BAT file.

But once I figured out what the problem was, and tracked it down to the AUTOEXEC.BAT file, all I had to do was go back to my SEEFIRST.BAS file, and insert a /-p after the DIR command like this:

SHELL "DIR /-p>FILE.LST"

And, voilà! The program works again!

Thanks a million, folks, for holding my hand as I worked through this.

I could never have mustered the energy or confidence to tackle this problem without your help.

Now I'd like to spend a little more time cleaning up the code; simplifying it and making it more elegant. So I'll be grateful to any and all who would be willing to stand by on the sidelines to lend a hand.

But, now, it's (well deserved) nap time!

See you on the flip side,

Will in Seattle
a.k.a. "Clueless"

Posted on Dec 30, 2012, 12:26 PM

Respond to this message   

Return to Index


first simplification: use /b in your shell command

by mn64 (no login)

DIR returns several columns of output, and special lines that are different from most. "Directory of:" comes to mind.

"dir /b" on the other hand, just gives you the same kind of input throughout. your program will be simpler, because it won't have to fiddle with the input so much, but it would require editing so much of the program.

the one i made uses /b, and by no means is it necessary for you to change it to work that way.

but sometimes the best way to simplify a program is to start from the ground. it doesn't mean you have to redo all of the code, but you create a new file, put the first part of your program there, and edit that before going on to the next section.

a little simplification at a time by making small changes isn't impossible, but it's less likely to happen that way.

Posted on Dec 30, 2012, 12:34 PM

Respond to this message   

Return to Index


Re: first simplification: use /b in your shell command

by (no login)

Thanks, menn, or that tip about the /b switch!

I'm afraid I've been down for the count for the last few months, and am only now getting back onto my feet. To add insult to injury I suffered a seizure in January that wiped my memory of the preceding few weeks as clean as a freshly washed blackboard.

So, now that I'm semi-functional again, I'm trying to go back and pick up where we left off. I've been re-reading our old posts and trying to piece together my previous attempts to get my old CFIRST (a.k.a. SEEFIRST) program up and running again.

I could have sworn that I did actually have it working again, back when you were helping me. But when I try to run it now, it just stalls on a blank white screen. So I'm back to square one.

Did you ever see that movie, "Memento" about the guy who could only remember the last few minutes? Everything previous to that was gone from his memory.

I feel like that guy.

Will in Seattle
a.k.a. "Clueless"

Posted on Apr 29, 2013, 10:34 AM

Respond to this message   

Return to Index


all statements are commands, in q/basic

by mn64 (no login)

basic is made of commands... the commands in turn can be either a function or a statement.

you can lump SUBs in with statements, or you can make them their own category. they're user-defined statements. user-defined functions are just that: user-defined functions.

a function is a subroutine that returns a value of its own.

for example, the screen statement will initialize a screen mode. the screen function on the other hand, can be used in place of a variable:

p = screen(r, c) ' where r is the row and c is the column, p will be set to the ascii value of whatever character is found at that row and column. the screen function has a single value that is the result of going to r, c. user defined functions work the same way, except you have to tell it which variable to return when the function ends.

Posted on Dec 30, 2012, 12:29 PM

Respond to this message   

Return to Index


Debug help

by Pete (no login)

Yes, that is almost certainly looking at either a null string, or some leading space in front of the filename, and that causes a file not found error.

I would check to see what that file FILE.LST file looks like, especially how the data is spaced in the file. Recall I mentioned DIR has changed in the output of such files with changes in operating systems. I use Windows, so I would just open that file in notepad. If you don't have a program like notepad to open it in, you cold use:

OPEN "FILE.LST" FOR INPUT AS #1
DO UNTIL EOF(1)
LINE INPUT #1, x$
PRINT "*" + x$ + "*": REM SHOW EACH LINE BETWEEN ASTERISKS. ** = a null string.
SLEEP: REM Press a key each time to move to the next line.
LOOP
CLOSE #1
END

--------------------

That should get you started. Also...

LINE INPUT #1, line$

in your program. You could add under it...

PRINT "*" + line$ + "*": REM SHOW EACH LINE BETWEEN ASTERISKS. ** = a null string.
SLEEP: REM Press a key each time to move to the next line.

--------------------

I would also examine these lines:

ListName$ = LEFT$(line$, 12)

Ext$ = RIGHT$(ListName$, 3)

--------------------

LEFT$(line$, 12) means take the first 12 spaces of the line and make those ListName$. If there was one or more leading spaces, that would make a problem, like...

   pete bas

It should write it as:

pete     bas

If it is like the first example, those blank spaces would have to be stripped off later by adding: name$ = RTRIM$(LTRIM$(eight$)) instead of just the name$ = RTRIM$(eight$) as it is written, now.

If that pete bas example file isn't in the first 12 spaces at all anymore, then you have to count where the DIR file is storing it, and adjust those areas of program that strip it out.

Also, you could modify this line to catch any lines with only spaces:

IF line$ = "" THEN GOTO skip

change to:

IF LTRIM$(line$) = "" THEN GOTO skip

-------------------------------

For more help just post some, not all,of theoutput you get if you run that test program I posted for you. This forum does not preserve leading spaces, so eitehr type alt+0160 to make a leading space, or just use a # sign to indicate a blank leading space.

Good luck!

Pete

Posted on Dec 29, 2012, 10:51 PM

Respond to this message   

Return to Index


*What a nice surprise! So glad you found it.

by Solitaire (Login Solitaire1)
S

Posted on Dec 25, 2012, 3:19 PM

Respond to this message   

Return to Index


I've forgotten how to run .BAS files!

by (no login)

I've Googled for how to run QBASIC OR .BAS programs from DOS command line

But can't seem to turn up anything helpful.

So, until I can score a replacement for my old QBASIC manual, I'm going to need a refresher course on how to run BASIC programs in DOS. I'm sure there's one out there, something aimed at third or fourth graders, which would be about right for me, if I could just find it.

Any suggestions?

Will in Seattle
a.k.a. "Clueless"

Posted on Dec 27, 2012, 7:11 AM

Respond to this message   

Return to Index


Re: I've forgotten how to run .BAS files!

by (Login MCalkins)
Moderator

qbasic /run filename.bas

Also, you'll probably want to end your program with SYSTEM instead of END.

Regards,
Michael

Posted on Dec 27, 2012, 9:16 AM

Respond to this message   

Return to Index


Where to store .BAS files?

by (no login)

Thanks, Michael!

I keep all my batch files in a directory named C:\ BAT, which I include in my path statement in my autoexec.bat file.

So, where would you recommend I store my .BAS files?

I'm thinking of creating a directing named C:\BAS and adding that to my path statment.

Is that as good a place as any?

Will in Seattle
a.k.a. "Clueless"

Posted on Dec 27, 2012, 9:54 AM

Respond to this message   

Return to Index


dos/qb really doesn't care where your .bas files are

by mn64 (no login)

it helps to have them in the same folder as any data files (saved games, images, whatever) you want your program to use. if you're having trouble, just put the files in the same folder as qbasic.exe (or qb45.exe, i think 4.5 is called...)

qb64 doesnt care what folder your .bas files are in either, but i can forsee more potential problems there than if you're using standard old quickbasic/qbasic.

Posted on Dec 27, 2012, 12:13 PM

Respond to this message   

Return to Index


Write a batch file to run your programs.

by Solitaire (Login Solitaire1)
S

I dug up some old batch files I wrote a long time ago, back in the days of DOS. Here is a simple one:

@echo off
e:
cls
cd\DosProgs\QBDATA
c:\qbas\qbasic
cd\
c:
cls

You will have to substitute your own directory names for the ones I used above.

The next one is a bit more complicated. It changes the PATH temporarily and resets it when the program run ends. (This is for pure DOS -- Don't try it if your computer is running Windows.) It also offers a choice of where to store and retrieve data files. Again, use your own directory names:

@echo off
cls
echo QuickBasic 4.5
echo Default directory is E:\DOSPROGS\QBDATA.
echo QuickBasic data directory is C:\QB45\DATA
echo Choose 'D' for default, 'Q' for Quick or 'L' for present location.
echo.
echo.

SET OLDPATH=%PATH%
PATH=C:\QB45;%PATH%
choice /c:dql
if errorlevel 3 goto location
if errorlevel 2 goto quick
if errorlevel 1 goto default

:default
E:
cd\
CD DOSPROGS\qbdata
call c:\qb45\qb
goto end

:quick
C:
cd\
CD qb45\data
call c:\qb45\qb
goto end

:location
call c:\qb45\qb
goto end

:end
PATH=%OLDPATH%
SET OLDPATH=
cls

Posted on Dec 27, 2012, 9:58 PM

Respond to this message   

Return to Index


Thanks for those sample BAT files, Solitaire

by (no login)

You've given me some good ideas to work with!

I'm grateful for the kindness of strangers (I depend on it to get by these days ;o)

Will in Seattle
a.k.a. "Clueless"

Posted on Dec 29, 2012, 10:29 AM

Respond to this message   

Return to Index


Hey, Solitaire is no stranger!

by Pete (no login)


No stranger than I am, anyway. And there are plenty of people here even stranger than we are! :)

Now go install QB45. It's the only way COMMAND$ in that program of yours is going to work.

Best of luck with it,

Pete

Posted on Dec 29, 2012, 11:54 AM

Respond to this message   

Return to Index


message for GARRY from qb64 forum

by mn64 (no login)

the qb64 forum is getting pretty silly. i'd like to be there when i can.

this old forum is not currently as silly, though it certainly has been. solitaire and michael have accounts here. thebob is a regular. pete stops by. would you like to join us?

even if i make it to the other forum, i'll still reply here.

then again, i'll certainly understand if you're not interested. this message might not make it to you.

best of luck in your endeavors, i left the forum 4 years ago. i came back, hope you decide to also.

Posted on Dec 23, 2012, 11:32 AM

Respond to this message   

Return to Index


Thank you

by (no login)

I have been here a few times, not sure if I am actually registered , but seem to be able to post ok, I am pretty sure I did register here some time ago, just never been very active.
I was also looking at Matts post, "I had just downloaded the QB64 program for Windows, and I saw that when I ran the qb64.exe, it said that the SDL_image.dll was missing from the folder",
I had the same problem, but trying to run a qb64 program,
using WINE, on Linux, it said the same thing, about the SDL_image.dll, but it was there, and all the permissions, were read ,write, etc, I even set it to allow executable, but it never worked. However there were some other factors involved, like my version of wine is outdated,...
Well Pete said, everyone usually comes back to qb64.net, and I never said, I would not ever come back, things always change, thank you for the invitation here, I am interested,
Ok well for now,that is about it, also Merry Christmas to everyone.
from Garry

Posted on Dec 23, 2012, 7:27 PM

Respond to this message   

Return to Index


registration is mostly optional, and comes with extra benefits

by mn64 (no login)

-> ever time you do this... you can fix it yourself instead of having pete's grammar tease you about it.

(p.s. he did head instead of heed, along with two other gems just today. but i've been slacking too.) also it's impossible to impersonate someone when they're logged in.

also there are a couple forums (which are low-necessity for anyone) that you can only post to with a login. for the most part, it's free reign/range here.

it does not take a lot of posters to keep n54 forums running. it's probably too laid back now, but you'd bring it up to at least 4 or 5 people who check this place regularly and reply fairly often.

there aren't many more rules here than over there, (i'm not an enforcer, more of a breaker but i've mellowed at least a little) but pete runs this place. i like a bit of anarchy, as long as it's not rules for the peons only and not for the senior crew-- but you're more likely to find the order you want here. it's still at least a little bit crazy, i promise. stop by any time, or make yourself at home. if you need assistance, you will often find that here, too.

Posted on Dec 23, 2012, 8:06 PM

Respond to this message   

Return to Index


Welcome (again)

by (Login MCalkins)
Moderator

Mennonite mentioned rules. Here's sort of a summary:
http://www.network54.com/Forum/171757/message/1067226652/
(I would add an exception to rule #4, that if the original topic has scrolled off of the 1st page (on subforums that don't bump topics), that you may start a new topic.)
There's also a homework policy:
http://www.network54.com/Realm/QBasicFAQ/QBasicHomework.html

If you want to be able to edit your posts, send Pete an email asking to be added to the "R" group. There used to be a rule against editing titles, but that doesn't apply anymore.

If you do start editing pages, be advised that the browser might cache the old page. You might have to manually refresh to see the changes. If you go to edit a second time, you might need to manually refresh the edit page. Be alert to the possibility of accidentally reverting your changes because of cached edit pages.

Regards,
Michael

Posted on Dec 23, 2012, 8:25 PM

Respond to this message   

Return to Index


those weren't the ones i was thinking of, but they'll do

by mn64 (no login)

very few of us get a big kick out of telling people what to do. if they only come to complain about something, and give no useful info, the replies vary (but are issued with an unusual amount of tolerance. we try not to scare people off.) people asking for homework help are usually directed to the homework help rules, those are the strictest. (we help. we don't help cheat.)

generally the rule is "don't be an ass." and don't say "ass" too often. oh, and if you are, at least make sure the person you're doing it to is still laughing. when it stops being fun and games, we've messed up and it's time to start over. fortunately, that can actually happen here. it has, quite a few times.

Posted on Dec 23, 2012, 8:39 PM

Respond to this message   

Return to Index


Late reply

by (Login GarryRicketson)
R

Thanks Michael,
It sounds like Pete is going to do that on the "R" group, in January, not to far away,
On the homework policy, I never do my home work, (not in school any more), never did it either, but that is another topic, for me, Schoool, yuk, but at home that is where one relaxes and enjoys himself, the same applies to work, I work at work, at home I do my hobbies, and enjoy, or try too, I don't bring my work home.
Qb64 and programming is more of a hobbie to me, and enjoyable, some times I do wish I had gotten into this back when I was younger. I am enjoying this forum, a lot more now,and have been reading a lot of real interesting stuff, that I still have not had any reply, or questions, but I am thinking I can learn more here, then at the other forum.
Glad to be here.
from Garry

Posted on Dec 26, 2012, 7:05 PM

Respond to this message   

Return to Index


*there's certainly a lot of stuff. 10-15+ years worth? and 99% of it works in qb64, too

by mn64 (no login)

Posted on Dec 26, 2012, 9:04 PM

Respond to this message   

Return to Index


Well, I'm glad that you're enjoying it.

by (Login MCalkins)
Moderator

No, I didn't think that you would be the source of homework questions.

The only time that I can recall Solitaire ever yelling at me was when I posted a solution to a homework question. I had been here for about a week, and Mennonite arrived right about that time:

http://www.network54.com/Forum/13959/message/1112633864/

I believe that that topic contains mennonite's second oldest post.

My first posts are on:
http://www.network54.com/Forum/13959/page-292

Mennonite's first posts are on:
http://www.network54.com/Forum/13959/page-290
http://www.network54.com/Forum/13959/page-289

I still tend to go a little too far in answering homework questions.

Sometimes, people will provide joke responses to homework questions, perhaps in some other language, or otherwise deliberately obfuscated. This is okay as long as it's not something a cheater could turn in, or mistake for a proper solution.

http://www.network54.com/Forum/648955/message/1306256593/
See Galleon's "Setup to fail" post and my response.

Regards,
Michael

Posted on Dec 26, 2012, 9:12 PM

Respond to this message   

Return to Index


*fun to do an over-the-top job they'd have to work too much to make believable it was them

by mn64 (no login)

fun, but not always reliable. obfuscation on the other hand can only teach so much.

Posted on Dec 26, 2012, 9:59 PM

Respond to this message   

Return to Index


I believe it was Alipha

by Solitaire (Login Solitaire1)
S

who wrote extremely complicated programs to solve very simple homework problems, using code that a beginner (and maybe also his teacher) would not be able to follow.

Remember Alipha?

Posted on Dec 27, 2012, 10:11 PM

Respond to this message   

Return to Index


* I think he was mostly before my time, but I have seen some of his code.

by (Login MCalkins)
Moderator

Posted on Dec 29, 2012, 8:24 AM

Respond to this message   

Return to Index


Alipha was a genius, only 14 years old when he wrote most of his code.

by Solitaire (Login Solitaire1)
S

Wonder what he's up to now. He bowed out of this forum when he started college.

Posted on Dec 29, 2012, 9:38 AM

Respond to this message   

Return to Index


14? That would make me twice the genius he was...

by Pete (no login)


I wrote my first code when I was 28!

Pete :)

Posted on Dec 29, 2012, 9:53 AM

Respond to this message   

Return to Index


i've tried to register on the other forum again

by mn64 (no login)

this time as mn64.

pete said that i registered "during the... period" where admin approval was required. yep, i know. only the way he said it made me wonder if galleon was "back" (he's posted in the past week) and i thought i'd give it another go.

i don't care which of the two logins i get, in the long run i only plan to use one of them.

and i suppose i can still post here. it's a bit like standing across a canyon and yelling "hey guys! over here!" but you know... close enough :)

Posted on Dec 22, 2012, 9:49 PM

Respond to this message   

Return to Index


Re: Knowing him he will crack this place first!

by mn64 (no login)

i don't do that.

and you don't know me.

Posted on Dec 22, 2012, 10:00 PM

Respond to this message   

Return to Index

 Copyright © 1999-2014 Network54. All rights reserved.   Terms of Use   Privacy Statement