This file, LUX800.JAR, is a "join archive". It contains the following files for ABC800 Kermit: k.bas k.hex kermcsum.asm kermpack.asm kmain.doc kmain.hex See kmain.doc for English-language documentation. All other commentary is in Swedish, written in the 7-bit Swedish National Replacement Character Set (Swedish ASCII). You can view the correct Swedish characters by using a Swedish terminal, the Swedish NRC on a DEC VT200, 300, or 400 terminal, or SET TERMINAL CHARACTER SET SWEDISH in MS-DOS Kermit 3.0 on an IBM PC or compatible. Each file begins with a line having the filename enclosed in triple angle brackets, for example <<< k.bas >>>. All the lines up to the next <<< filename >>> line are the contents of the file. You can break up this "jar" file into its consituent files using a text editor, or with a program like the following one, which is written in the C language. If you call this program "unjoin" and you have a "jar" file called foo.jar, then you would break up the jar file by typing "unjoin < foo.jar". ---(cut here)--------------------------- /* unjoin -- Split a "jar file" up into its original component files. */ /* The jar file is read from standard input. */ /* /* This program can be used on UNIX systems, and with Microsoft C */ /* /* Authors: F. da Cruz, C. Gianone, Columbia University, 1988 */ #include int files = 0; FILE *fd; char *name; #define BUFLEN 1000 char buf[BUFLEN]; char msg[100]; main() { while(1) { if (gets(buf) == NULL) doexit(0); if (chkhdr()) { if (files > 0) fclose(fd); if ((fd = fopen(name,"w")) == NULL) { sprintf(msg,"Fatal - Can't create %s",name); perror(msg); doexit(1); } else files++; } else { if (files == 0) { fprintf(stderr,"Fatal - not a joined file!\n"); doexit(1); } else { fprintf(fd,"%s\n",buf); } } } } chkhdr() { /* Look for "<<< filename >>>" */ int i; if (buf[0] != '<') return(0); if (buf[1] != '<') return(0); if (buf[2] != '<') return(0); if (buf[3] != ' ') return(0); for (i = 4; (buf[i] != '\0') && (i < BUFLEN); i++) ; if (buf[i-1] != '>') return(0); if (buf[i-2] != '>') return(0); if (buf[i-3] != '>') return(0); if (buf[i-4] != ' ') return(0); buf[i-4] = '\0'; name = buf+4; return; } doexit(x) int x; { /* Exit from program */ if (files > 0) fclose(fd); fprintf(stderr, "Done, unjoined %d file%c\n",files,(files == 1) ? ' ' : 's'); exit(x); } ---(cut here)--------------------------- The ".hex" files listed above are binary files encoded in hexadecimal: 2 hex characters represent one 8-bit binary byte. Line breaks should be ignored. Here is a C program to translate a hex file back into a binary file: ---(cut here)--------------------------- /* UNHEX.C - Program to translate a hex file from standard input * into an 8-bit binary file on standard output. * Usage: unhex < foo.hex > foo.exe * Christine M. Gianone, CUCCA, October 1986. * Modified Aug 89 to work right with Microsoft C on the PC. */ #include /* Include this for EOF symbol */ #ifdef MSDOS #include /* For MS-DOS setmode() symbol */ #endif unsigned char a, b; /* High and low hex nibbles */ unsigned int c; /* Character to translate them into */ unsigned char decode(); /* Function to decode them */ /* Main program reads each hex digit pair and outputs the 8-bit byte. */ main() { #ifdef MSDOS setmode(fileno(stdout),O_BINARY); /* To avoid DOS text-mode conversions */ #endif while ((c = getchar()) != EOF) { /* Read first hex digit */ a = c; /* Convert to character */ if (a == '\n') { /* Ignore line terminators */ continue; } if (a == '\r') { fprintf(stderr,"Illegal Carriage Return\n"); exit(1); } if ((c = getchar()) == EOF) { /* Read second hex digit */ fprintf(stderr,"File ends prematurely\n"); exit(1); } b = c; /* Convert to character */ putchar( ((decode(a) * 16) & 0xF0) + (decode(b) & 0xF) ); } exit(0); /* Done */ } unsigned char decode(x) char x; { /* Function to decode a hex character */ if (x >= '0' && x <= '9') /* 0-9 is offset by hex 30 */ return (x - 0x30); else if (x >= 'A' && x <= 'F') /* A-F offset by hex 37 */ return(x - 0x37); else { /* Otherwise, an illegal hex digit */ fprintf(stderr,"\nInput is not in legal hex format\n"); exit(1); } } ---(cut here)--------------------------- <<< k.bas >>> 2 ! ********************************************************************** 3 ! Program K.BAS Utg}va 4.11 1990-02-17 4 ! av Bo Kullmar 5 ! Ins{nd av Bo Kullmar 6 ! F|r ABC800M ABC800C ABC802 ABC806 8 ! Testad p} ABC806 9 ! ********************************************************************** 10 ! 11 ! KMAIN.BAS: 12 ! 20 ! Kermitrutinerna har Lars-G|ran G|ransson, 495, skrivit. 21 ! Vissa rutiner f|r menyhantering mm har Mikael Lid`n, 5651, skrivit. 22 ! En del maskinkodsrutiner av Kristoffer Eriksson, 5357. 23 ! 24 ! Enbart med UFD-DOS och LUX-NET (med priv. att l{sa bibl. med CALL) kan 25 ! wildcards anv{ndas vid s{ndning av filer med Kermit. 26 ! Programmet kr{ver ej inbyggd terminalrutin eller TERMOPT.REL p} ABC806. 27 ! Cursoradressering och blankning av bildsk{rmen f|ljer ADM3A. 28 ! Kermitrutinerna klarar s}v{l text som bin{rfiler och med eller utan 29 ! paddning av 8:e biten. Checksumma 1 och 2 hanteras. Programmet b|r 30 ! squezas f|r att inte ta f|r mycket minne. Det {r tveksamt om det g}r 31 ! att k|ra osquezat. I squezad version heter programmet KMAIN.BAC. 32 ! [ndra inte radnumreringen f|r Kermitrutinerna, f|r d} upph|r likheten 33 ! med monitorns Kermitrutiner! 34 ! 35 ! Har du optionsprom ver 10, och f}r din s{ndning stoppad av mottaget XOFF, 36 ! kan du g} tillbaks till menyn, och in i terminall{ge igen, s} ska stoppet 37 ! brytas. 38 ! 39 ! KMAIN g}r delvis att k|ra osquezat om man tar bort de inledande 40 ! kommentarerna och g{rna kommentarerna i FNF|rbindelse, rad 2890-2910. 400 ! 401 ! K: 402 ! 500 ! Detta program anv{nds f|r att s{tta defaultparametrar f|r Kermit- 510 ! programmet KMAIN. Anv{nds {ldre prom i datorn som ej kan maska 7:e biten 520 ! b|r oldprom s{ttas till "Oldprom=-1" i rad 1010. Kan ej tv} siffror i 530 ! hastigheten anges s} kan detta {ndras ocks}, men d} fungerar ej val av 540 ! split speed i programmet! 550 ! 560 ! Detta {r en l|sning som jag har valt eftersom det verkar finnas en bugg 570 ! om V24:an |ppnas med fel parameter s} kraschar systemet. Anv{nds gammalt 580 ! prom eller vill Du ha n}gon annan defaulthastighet s} {ndra parameter 590 ! nedan, men kom ih}g om Du {ndrar fel kan KMAIN g} fel!!! 600 ! 610 ! OBServera att om Du {ndrar parametrar felaktigt h{r s} kommer inte Kermit 620 ! att fungera! S{tt ej Oldprom och beh}ll E som sista bokstav f|r d} g}r 630 ! det inte s} bra! Oldprom anv{nds n{r Du har ett system som inte kan maska 640 ! bort 7:e biten och det {r detta om E:et g|r. Dvs om Du s{tter Oldprom f}r 650 ! Du aldrig ha maskning av 7:e biten p} med den sista siffran i parametern. 660 ! 990 INTEGER : EXTEND 1000 COMMON V24def$=16,Oldprom,Mtyp,Key99,Enh$=4,Enh,Printer$=16,Version$=4,Mqbin,Pack$=376,Csum$=40 1010 Version$='4.11' 1020 Dummy=FNInit 1030 ON ERROR GOTO 1050 1040 CHAIN Enh$+'KMAIN' 1050 CHAIN 'KMAIN' 1500 DEF FNInit 1510 ; CHR$(12) 1520 Huvud$=CUR(0,0)+FNF$(CYA)+'K, KERMIT-program f|r ABC800-serien, version '+Version$ 1530 Oldprom=0 : V24defhast$='D' : V24defpar$='S' : V24defdatabit$='7' 1540 V24def$='V24:VSA70C24.40E' 1550 Cu=PEEK2(SYS(10)+64)+6 1560 Mtyp=FNMtest : Key99=FNKey99 1570 IF Mtyp=0 POKE 65266,1 ! ATTRIBUTE 1 1580 Enh$=FNRunenh$ : Enh=FNEnhcs(Enh$) 1590 Printer$='PR:VSA58C72.5' 1600 Dummy=FNV24def+FNInitpack+FNInitcsum 1610 RETURN 0 1620 FNEND 2000 DEF FNMtest LOCAL A 2010 A=INP(53) : OUT 53,4 2020 IF INP(53)=4 OUT 53,A : RETURN 0 2030 ON ERROR GOTO 2070 2040 PREPARE 'MEM:' AS FILE 99 2050 CLOSE 99 2060 RETURN 1 2070 RETURN 2 2080 FNEND 2090 DEF FNKey99 LOCAL A$=40,S$=10 2100 S$=CHR$(0,0,0,0,0,0,0) 2110 A$=CHR$(62,24,211,34,6,7,33,226,255,197,1,232,3,126,246,0) 2120 A$=A$+CHR$(32,7,11,120,177,32,246,193,201,193,35,126,18,19,43,62) 2130 A$=A$+CHR$(0,119,16,229,201) 2140 Z=CALL(VARPTR(A$),VARPTR(S$)) 2150 IF (ASCII(RIGHT$(S$,3)) AND 35)=35 RETURN -1 2160 RETURN 0 2170 FNEND 2180 DEF FNRunenh$ LOCAL Drive,Adrenhl,Enh$=4,Dselect 2190 Drive=PEEK(64769) AND 31 2200 Adrenhl=PEEK2(SYS(10)+123) 2210 WHILE Adrenhl<>0 2220 Enh$=CHR$(PEEK(Adrenhl+2),PEEK(Adrenhl+3),PEEK(Adrenhl+4),58) 2230 Dselect=PEEK(Adrenhl+7) 2240 IF Drive=Dselect THEN RETURN Enh$ 2250 Adrenhl=PEEK2(Adrenhl) 2260 WEND 2270 RETURN '' 2280 FNEND 2290 DEF FNEnhcs(Drive$) LOCAL Adrenhl,Enh$=4,Dselect 2300 Adrenhl=PEEK2(SYS(10)+123) : IF Drive$='' RETURN PEEK(PEEK2(24683)) 2310 WHILE Adrenhl<>0 2320 Enh$=CHR$(PEEK(Adrenhl+2),PEEK(Adrenhl+3),PEEK(Adrenhl+4),58) 2330 IF Enh$='CON:' OR Enh$='NUL:' OR Enh$='PR:' OR Enh$='V24:' Enh$='' 2340 Dselect=PEEK(Adrenhl+7) 2350 IF Enh$=Drive$ RETURN Dselect 2360 Adrenhl=PEEK2(Adrenhl) 2370 WEND 2380 RETURN -1 2390 FNEND 2660 DEF FNV24def LOCAL A$=1,In$=1,P$=1,Tmph$=2 2670 Dummy=FNClr 2680 ; CUR(4,0) FNF$(CYA) 'A 300 bps' : ; FNF$(CYA) 'B 1200/75 bps' 2690 ; FNF$(CYA) 'C 75/1200 bps' : ; FNF$(CYA) 'D 1200 bps' : ; FNF$(CYA) 'E 2400 bps' 2700 ; FNF$(CYA) 'F 4800 bps' : ; FNF$(CYA) 'G 9600 bps' : ; FNF$(CYA) 'H 19200 bps' 2710 ; CUR(13,0) FNF$(YEL) 'V{lj kommunikationshastighet ( A - H ): '; 2720 A$='' 2730 WHILE A$<'A' OR A$>'H' : A$=CHR$(ASCII(FNInmata$(V24defhast$,13,62,1,2,1,CYA+CHR$(138))) AND 223) : WEND 2740 ; CUR(13,62) FNF$(CYA) A$ 2750 ; : ; FNF$(CYA) 'S Space (0) M Mark (1) O Odd (Udda) E Even (J{mn)' 2760 ; CUR(17,0) FNF$(YEL) 'V{lj paritet (S, M, O, E): '; 2770 WHILE In$<>'S' AND In$<>'M' AND In$<>'O' AND In$<>'E' : In$=CHR$(ASCII(FNInmata$(V24defpar$,17,62,1,2,1,CYA+CHR$(138))) AND 223) : WEND 2775 ; CUR(17,62) FNF$(CYA) In$ 2780 IF In$='S' P$='D' 2790 IF In$='M' P$='C' 2800 IF In$='O' P$='B' 2810 IF In$='E' P$='A' 2830 Tmph$=MID$('2240044455667788',2*(ASCII(A$)-65)+1,2) 2840 MID$(V24def$,6,1)=P$ 2850 IF LEN(V24def$)>=15 MID$(V24def$,14,2)=Tmph$ ELSE MID$(V24def$,14,1)=LEFT$(Tmph$,1) 2860 ; CUR(19,0) FNF$(YEL) 'V{lj 8 eller 7 databitar vid Kermit fil|verf|ring ( 8, 7 ): '; 2870 WHILE In$<>'8' AND In$<>'7' : In$=FNInmata$(V24defdatabit$,19,62,1,2,1,CYA+CHR$(138)) : WEND 2880 IF In$='8' Mqbin=89 ELSE Mqbin=38 2890 RETURN 0 2900 FNEND 2940 DEF FNClr 2950 ; CUR(1,0) FNF$(GYEL) STRING$(80,127); 2960 ; CUR(21,0) FNF$(GYEL) STRING$(80,127); 2970 ; CUR(0,22) SPACE$(36) 2980 ; Huvud$ 2990 ; CUR(2,0); 3000 RETURN 0 3010 FNEND 3020 DEF FNF$(F{rg$) 3030 IF Mtyp=0 RETURN F{rg$ 3040 RETURN '' 3050 FNEND 3550 DEF FNTkn$(F{rg$) LOCAL B$=1,Rad,Kol 3560 Rad=PEEK(Cu+1) : Kol=PEEK(Cu) 3570 IF Mtyp=0 ; F{rg$ CHR$(PEEK(30720+Rad*80+Kol)); 3580 OUT 56,14,57,SWAP%(30720+Rad*80+Kol) 3590 OUT 56,15,57,30720+Rad*80+Kol 3600 OUT 56,10,57,104 3610 ; CUR(0,61) FNF$(CYA) TIME$ 3620 WHILE SYS(5)=0 : ; CUR(0,61) FNF$(CYA) TIME$ : WEND 3630 GET B$ 3640 POKE Cu,Kol,Rad 3650 RETURN B$ 3660 FNEND 3750 DEF FNInmata$(In$,Rad,Kol,Inpos,Pa,Max,F{rg$) LOCAL Ut$=100,L{ngd,Pos,Fval,A,Ins,M1$=1,M2$=1,M3$=10,O8 3760 Ut$=In$ : Pos=Inpos : Fval=Pa AND 15 : Z=FNKom99(9) 3770 WHILE -1 3780 ; CUR(Rad,Kol) FNF$(F{rg$) Ut$ STRING$(Max-LEN(Ut$),32-63*(Mtyp<>0)) CHR$(139) ' '; 3790 IF Pos>Max Pos=Max 3800 L{ngd=LEN(Ut$) 3810 ; CUR(Rad,Kol+Pos-1); 3820 A=ASCII(FNTkn$(F{rg$+CHR$(138))) : IF INSTR(1,CHR$(3,4,27,192,129),CHR$(A)) RETURN CHR$(27) 3830 Z=INSTR(1,CHR$(128,161,163,177,179,172,164,127),CHR$(A)) 3840 IF Z A=ASCII(RIGHT$(CHR$(193,196,198,212,214,8,9,194),Z)) 3850 IF A=24 Ut$='' : Pos=1 3860 IF Pa>15 OR A=13 IF INSTR(1,CHR$(192,193,196,197,198,199,212,214,240,208,13),CHR$(A)) Z=FNKom99(9) : RETURN Ut$ 3870 IF A=8 IF Pos>1 Pos=Pos-1 ELSE IF Pa>15 Z=FNKom99(9) : RETURN Ut$ 3880 IF A=9 IF Pos15 Z=FNKom99(9) : RETURN Ut$ 3890 WHILE A=194 3900 IF Pos<=L{ngd Ut$=LEFT$(Ut$+' ',Pos-1)+RIGHT$(Ut$,Pos+1) 3910 IF L{ngd0 IF Pos-L{ngd=1 Ut$=LEFT$(Ut$,L{ngd-1) : Pos=Pos-1 ELSE Pos=L{ngd+1 3920 A=0 3930 WEND 3940 IF A=132 Ins=(Ins=0) : Z=FNKom99(9-128*Ins) 3950 IF Fval=3 A=A AND 223 3960 IF A=195 AND Pos<=L{ngd Ut$=LEFT$(Ut$+' ',Pos-1)+' '+RIGHT$(Ut$,Pos) : IF LEN(Ut$)>Max Ut$=LEFT$(Ut$,Max) 3970 RESTORE 4060 3980 WHILE O8<=Fval : READ M1$,M2$,M3$ : O8=O8+1 : WEND 3990 WHILE ((A>=ASCII(M1$) AND A<=ASCII(M2$)) OR INSTR(1,M3$,CHR$(A))>0) AND Pos<=Max 4000 IF L{ngdMax Ut$=LEFT$(Ut$,Max) 4030 Pos=Pos+1 : A=0 4040 WEND 4050 WEND 4060 DATA 0,9,' ',0,9,' .-',' ',~,' ',A,],' ',J,J,JjNn,A,],A 4070 FNEND 4080 DEF FNKom99(K) 4090 IF Key99 OUT 34,K 4100 RETURN 0 4110 FNEND 53000 ! 53010 DEF FNInitpack 53020 ! KERMPACK.ASM. 87-08-22 19.49 53030 DIM Pack$=376 53040 Pack$=CHR$(213,221,225,221,110,3,221,102,4,78,6,0,9,235,121,217,87,221,94,5,217,221,110,0,221,102,1,78,9,197,217,193,123,214,94,186,56,101,120) 53050 Pack$=Pack$+CHR$(167,32,97,221,126,2,185,56,91,3,217,126,35,1,0,1,167,40,70,221,190,8,32,17,126,35,214,32,254,94,56,2,62,94,71,126,35,217,3,3,217) 53060 Pack$=Pack$+CHR$(221,190,7,32,7,14,128,126,35,217,3,217,221,190,6,32,31,126,35,217,3,111,230,127,40,15,221,190,8,40,15,221,190,7,40,10,221,190,6,40) 53070 Pack$=Pack$+CHR$(5,125,238,64,24,1,125,217,177,18,19,217,20,217,16,249,217,24,149,221,110,3,221,102,4,114,221,110,0,221,102,1,113,105,96,221,78,2) 53080 Pack$=Pack$+CHR$(175,71,237,66,201,213,221,225,221,110,0,221,102,1,78,6,0,9,235,121,217,87,221,94,2,217,221,110,3,221,102,4,78,35,70,43,197,6,0,9) 53090 Pack$=Pack$+CHR$(217,225,69,76,123,214,10,186,56,6,121,184,40,2,48,24,221,110,0,221,102,1,114,221,110,3,221,102,4,112,35,113,120,185,33,0,0,192,43) 53100 Pack$=Pack$+CHR$(201,4,217,221,126,8,167,40,55,126,43,190,35,32,40,4,120,254,5,56,31,197,221,126,8,217,119,35,241,198,32,119,229,43,221,86,5,20,20) 53110 Pack$=Pack$+CHR$(217,209,19,254,126,32,18,6,0,24,14,24,169,61,32,9,6,1,213,217,225,221,114,5,217,126,35,79,254,128,56,15,221,126,7,167,40,9,18,19) 53120 Pack$=Pack$+CHR$(217,20,217,121,230,127,79,221,126,6,167,40,40,121,230,127,254,127,40,21,254,32,56,17,221,190,6,40,16,221,190,7,40,11,221,190,8,40) 53130 Pack$=Pack$+CHR$(6,24,12,121,238,64,79,221,126,6,18,19,217,20,217,121,18,19,217,20,24,167) 53140 RETURN 0 53150 FNEND 53160 ! 53170 DEF FNInitcsum 53180 ! KERMCSUM.ASM. 87-08-16 16.16 53190 DIM Csum$=40 53200 Csum$=CHR$(235,35,35,94,35,86,35,78,35,70,33,0,0,121,176,40,11,26,133,111,62,0,140,103,11,19,24,241,125,7,203,20,7,203,20,125,230,63,111,201) 53210 RETURN 0 53220 FNEND <<< k.hex >>> 8F0061000C208000000012002202E127D40A3219874C020090472A2A2A2A2A2A2A2A2A2A 2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A 2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A87430300903E50726F677261 6D202020202020202020204B2E4241532020202020202020202020205574677D76612020 342E31312020202020313939302D30322D313787130400900E617620426F204B756C6C6D 6172871A05009015496E737B6E6420617620426F204B756C6C6D6172872706009022467C 72204142433830304D204142433830304320414243383032204142433830368716080090 1154657374616420707D20414243383036874C090090472A2A2A2A2A2A2A2A2A2A2A2A2A 2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A 2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A87060A00900187100B00900B4B4D41 494E2E4241533A87060C009001873D140090384B65726D6974727574696E65726E612068 6172204C6172732D477C72616E20477C72616E73736F6E2C203439352C20736B72697669 742E874915009044566973736120727574696E657220667C72206D656E7968616E746572 696E67206D6D20686172204D696B61656C204C6964606E2C20353635312C20736B726976 69742E873C16009037456E2064656C206D61736B696E6B6F6473727574696E6572206176 204B726973746F66666572204572696B73736F6E2C20353335372E870617009001874C18 009047456E62617274206D6564205546442D444F53206F6368204C55582D4E455420286D 656420707269762E20617474206C7B7361206269626C2E206D65642043414C4C29206B61 6E873A1900903577696C64636172647320616E767B6E6461732076696420737B6E646E69 6E672061762066696C6572206D6564204B65726D69742E874D1A00904850726F6772616D 6D6574206B727B76657220656A20696E6279676764207465726D696E616C727574696E20 656C6C6572205445524D4F50542E52454C20707D204142433830362E87421B00903D4375 72736F726164726573736572696E67206F636820626C616E6B6E696E672061762062696C 64736B7B726D656E20667C6C6A65722041444D33412E87491C0090444B65726D69747275 74696E65726E61206B6C6172617220737D767B6C207465787420736F6D2062696E7B7266 696C6572206F6368206D656420656C6C6572207574616E87481D009043706164646E696E 6720617620383A6520626974656E2E20436865636B73756D6D612031206F636820322068 616E74657261732E2050726F6772616D6D657420627C72874A1E009045737175657A6173 20667C722061747420696E746520746120667C72206D79636B6574206D696E6E652E2044 6574207B72207476656B73616D74206F6D2064657420677D7287461F009041617474206B 7C7261206F737175657A61742E204920737175657A61642076657273696F6E2068657465 722070726F6772616D6D6574204B4D41494E2E4241432E874B200090465B6E6472612069 6E7465207261646E756D726572696E67656E20667C72204B65726D6974727574696E6572 6E612C20667C7220647D20757070687C72206C696B686574656E87222100901D6D656420 6D6F6E69746F726E73204B65726D6974727574696E657221870622009001874F2300904A 486172206475206F7074696F6E7370726F6D207665722031302C206F636820667D722064 696E20737B6E646E696E672073746F70706164206176206D6F74746167657420584F4646 2C874F2400904A6B616E20647520677D2074696C6C62616B732074696C6C206D656E796E 2C206F636820696E2069207465726D696E616C6C7B6765206967656E2C20737D20736B61 2073746F70706574870D250090086272797461732E8706260090018745270090404B4D41 494E20677D722064656C76697320617474206B7C7261206F737175657A6174206F6D206D 616E2074617220626F727420646520696E6C6564616E6465874B280090466B6F6D6D656E 74617265726E61206F636820677B726E61206B6F6D6D656E74617265726E61206920464E 467C7262696E64656C73652C2072616420323839302D323931302E870690019001870891 0190034B3A8706920190018747F401904244657474612070726F6772616D20616E767B6E 647320667C722061747420737B7474612064656661756C74706172616D65747261722066 7C72204B65726D69742D874FFE01904A70726F6772616D6D6574204B4D41494E2E20416E 767B6E6473207B6C6472652070726F6D2069206461746F726E20736F6D20656A206B616E 206D61736B6120373A6520626974656E20874B08029046627C72206F6C6470726F6D2073 7B747461732074696C6C20224F6C6470726F6D3D2D312220692072616420313031302E20 4B616E20656A2074767D2073696666726F722069874C1202904768617374696768657465 6E20616E67657320737D206B616E206465747461207B6E64726173206F636B737D2C206D 656E20647D2066756E676572617220656A2076616C206176871F1C02901A73706C697420 737065656420692070726F6772616D6D657421870626029001874D300290484465747461 207B7220656E206C7C736E696E6720736F6D206A6167206861722076616C742065667465 72736F6D20646574207665726B61722066696E6E617320656E2062756767874E3A029049 6F6D205632343A616E207C70706E6173206D65642066656C20706172616D657465722073 7D206B726173636861722073797374656D65742E20416E767B6E64732067616D6D616C74 874B4402904670726F6D20656C6C65722076696C6C204475206861206E7D676F6E20616E 6E616E2064656661756C7468617374696768657420737D207B6E64726120706172616D65 746572873E4E0290396E6564616E2C206D656E206B6F6D2069687D67206F6D204475207B 6E647261722066656C206B616E204B4D41494E20677D2066656C21212187065802900187 4F6202904A4F425365727665726120617474206F6D204475207B6E647261722070617261 6D65747261722066656C616B7469677420687B7220737D206B6F6D6D657220696E746520 4B65726D6974874C6C0290476174742066756E676572612120537B747420656A204F6C64 70726F6D206F6368206265687D6C6C204520736F6D20736973746120626F6B7374617620 667C7220647D20677D72874F7602904A64657420696E746520737D2062726121204F6C64 70726F6D20616E767B6E6473206E7B7220447520686172206574742073797374656D2073 6F6D20696E7465206B616E206D61736B61874F8002904A626F727420373A652062697465 6E206F636820646574207B72206465747461206F6D20453A657420677C722E2044767320 6F6D20447520737B74746572204F6C6470726F6D20667D72874F8A02904A447520616C64 726967206861206D61736B6E696E6720617620373A6520626974656E20707D206D656420 64656E207369737461207369666672616E206920706172616D657465726E2E8706940290 018709DE03860F8886118752E8038601EDCEC604801600CEC51E800200CEC524800200CE C52A800200E1CEC630800A00CEC53E800200EDCEC644801600E1CEC65E800A00CEC56C80 0200C77801CEC672807E01C72800CEC6F4812E00870DF203CC04342E3131B65E80870CFC 03CF00003600B504008707060485130087121004860BC23080CC054B4D41494E9DB9870E 1A04860BCC054B4D41494EB9870CDC058C300121222701008709E60594E9D10CB98749F0 05DDDDD21FD086AC00CF01FDB7089DCC2D4B2C204B45524D49542D70726F6772616D2066 7C72204142433830302D73657269656E2C2076657273696F6E209DC25E809DB60A00871D FA05DDB51E8088CC0144B6140088CC0153B61E0088CC0137B6280087190406CC10563234 3A56534137304332342E343045B6048087120E06E7D119C740009CD12DE39CB532008715 1806CF00008E00B5248088CF0000FE00B52A808722220695C12480DD8ABE0A8602C7F2FE B82CDEB8900C4154545249425554452031871A2C06CF0000B501B6308088C23080AC00CF 01FD4F02B53E8087163606CC0D50523A56534135384337322E35B6448087184006CF0000 0E03CF0000C50D9CCF000056129CB5040087074A06A0DDB8870554068D8710D0078C7800 A9236F0000B60179018716DA07C73500D116B500FF888603C73500B82CE1B8871DE40795 C73500D116E18ABE108603C73500B82CC100FFB888A0DDB88707EE078524008712F80786 05CC044D454D3AB9BBC76300B8870A02088606C76300B887070C08A0DEB887071608A0DF B8870520088D87162A088CE400A120DB0000B6027A0128007A130A0087113408DDDDDDDD DDDDDDD4D70CB602FF87303E08C73E00C71800C7D300C72200E3E4C72100C7E200C7FF00 C7C500DEC7E800E0C77E00C7F600DDD4E00CB600FF873A4808C200FFC72000E4E8C77800 C7B100C72000C7F600C7C100C7C900C7C100C72300C77E00C71200C71300C72B00C73E00 D4E00C9DB600FF87195208C200FFDDC77700EDC7E500C7C900D4D50C9DB600FF87135C08 C600FFD12BC602FFD12BD217B53800871C660895C202FFE0D20ED10BC7230088A7C72300 8ABE05A0DEA9B887077008A0DDB887057A088D871884088CA700DA239E0000B604D12401 25D2200400412587108E08C701FDD115C71F0088B500FF87109808E7D119C77B009CD12D B502FF870DA2089A5B00C102FFDD8DB88722AC08C102FFDF9CD115C102FFE09CD115C102 FFE19CD115C73A00D4D40CB604FF870EB608C102FFE49CD115B506FF8713C00895C100FF C106FF8ABD06A0C204FFB9870CCA08C102FFD12DB502FF8707D4089BA2FF8708DE08A0CC 00B98705E8088D8718F2088CE0001124D70001D224B6030125D220040041258723FC08E7 D119C77B009CD12DB502FF8895C200FFCC008BBE0AA0C76B60D12DD115B8870D06099A91 00C102FFDD8DB887221009C102FFDF9CD115C102FFE09CD115C102FFE19CD115C73A00D4 D40CB604FF87361A0995C204FFCC04434F4E3A8BC204FFCC044E554C3A8B86C204FFCC03 50523A8B86C204FFCC045632343A8B86BE06CC00B604FF870E2409C102FFE49CD115B506 FF87132E0995C204FFC200FF8BBE06A0C106FFB8870C3809C102FFD12DB502FF87074209 9B6CFF87084C09A0DEA9B8870556098D871E640A8C3C040120330400B6047A0101008225 01007A1001009A250200870C6E0ACF00002204B50400873E780A94E1DDD21FB9D086AC00 CF01FD8804B9CC0A41202033303020627073B98894D086AC00CF01FD6F04B9CC0E422020 313230302F373520627073B98754820A94D086AC00CF01FD4F04B9CC0E43202037352F31 32303020627073B98894D086AC00CF01FD3204B9CC0B4420203132303020627073B98894 D086AC00CF01FD1804B9CC0B4520203234303020627073B987528C0A94D086AC00CF01FD FB03B9CC0B4620203438303020627073B98894D086AC00CF01FDE103B9CC0B4720203936 303020627073B98894D086AC00CF01FDC703B9CC0C482020313932303020627073B98740 960A94EADDD21FB9D083AC00CF01FDA403B9CC28567B6C6A206B6F6D6D756E696B617469 6F6E7368617374696768657420282041202D204820293A20B93B8709A00ACC00B600FF87 4CAA0A9A4400C200FFCC014191C200FFCC01489786B888C21400AC00EAABFDC73E00ABFB DEABFDDFABFDDEABFDD086C78A00D10C9DACF6CF07FD7D04D10BC7DF0088D10CB600FF88 9BB9FF871AB40A94EAC73E00D21FB9D086AC00CF01FD0D03B9C200FFB98752BE0A948894 D086AC00CF01FDF802B9CC3E532020537061636520283029202020204D20204D61726B20 283129202020204F20204F646420285564646129202020204520204576656E20284A7B6D 6E29B98735C80A94C71100DDD21FB9D083AC00CF01FDA102B9CC1B567B6C6A2070617269 7465742028532C204D2C204F2C2045293A20B93B875ED20A9A5600C202FFCC01538EC202 FFCC014D8E88C202FFCC014F8E88C202FFCC01458E88B888C21E00AC00C71100ABFBC73E 00ABFBDEABFDDFABFDDEABFDD086C78A00D10C9DACF6CF07FD7E03D10BC7DF0088D10CB6 02FF889BA7FF871CD70A94C71100C73E00D21FB9D086AC00CF01FD0C02B9C202FFB98714 DC0A95C202FFCC01538BBE07CC0144B604FF8714E60A95C202FFCC014D8BBE07CC0143B6 04FF8714F00A95C202FFCC014F8BBE07CC0142B604FF8714FA0A95C202FFCC01458BBE07 CC0141B604FF872A0E0BCC1032323430303434343535363637373838DFC200FFD10BC741 009FA7A1DE9CDFD30FB606FF8712180BA2C20480E3DED328B93DC204FFB9872F220B95C2 0480D110EC93BE11A2C20480EBDFD328B93DC206FFB98A12A2C20480EBDED328B93DC206 FFDED20DB987562C0B94C71300DDD21FB9D083AC00CF01FD3701B9CC3C567B6C6A203820 656C6C657220372064617461626974617220766964204B65726D69742066696C7C766572 667C72696E67202820382C203720293A20B93B8746360B9A3E00C202FFCC01388EC202FF CC01378E88B888C22800AC00C71300ABFBC73E00ABFBDEABFDDFABFDDEABFDD086C78A00 D10C9DACF6CF07FD0302B602FF889BBFFF871C400B95C202FFCC01388BBE09C75900B56C 808A07C72600B56C8087074A0BA0DDB88705540B8D870C7C0B8C7B00C125720000871E86 0B94DEDDD21FB9D093AC00CF01FD6900B9C75000C77F00D213B93B8720900B94C71500DD D21FB9D093AC00CF01FD4900B9C75000C77F00D213B93B87129A0B94DDC71600D21FB9C7 2400D112B98709A40B94C20A00B9870BAE0B94DFDDD21FB93B8707B80BA0DDB88705C20B 8D870ECC0B8C2B007A062200011A268711D60B95C12480DD8ABE06A0C200FFB98708E00B A0CC00B98705EA0B8D8718DE0D8C1F0142261601011A26B6037A020100612681268717E8 0DC13200DE9CD115B504FF88C13200D115B506FF8726F20D95C12480DD8ABE1B94C200FF B9C70078C104FFC75000A19CC106FF9CD115D10CB93B8725FC0D8603C73800B82CEBB82C C73900B82CC70078C104FFC75000A19CC106FF9CD114B88723060E8603C73800B82CECB8 2CC73900B82CC70078C104FFC75000A19CC106FF9CB88717100E8603C73800B82CE7B82C C73900B82CC76800B887191A0E94DDC73D00D21FB9D086AC00CF01FD17FFB9D029B98727 240E9A1F00E2D119DD8AB88894DDC73D00D21FB9D086AC00CF01FDF4FEB9D029B9889BDE FF870A2E0E860AC602FFBC8714380E8602C13200B82CC106FFB82CC104FFB88709420EA0 C202FFB987054C0E8D8738A60E8C8104E225780407822561268126A126D126E9261A26B6 0A0A276400212751277127790199270A0D0100120D01001A0D0A00410F8726B00EC200FF B60EFF88C106FFB512FF88C108FFEC88B514FF88E6AB00CF01FD3304B53800870ABA0E9A DD03DEA9B88742C40E94C102FFC104FFD21FB9C20CFFAC00CF01FD40FEB9C20EFFB9C10A FFC20EFFD1109FC72000C73F00C12480DD8DA7A19FD213B9C78B00D10CB9CC0120B93B87 14CE0E95C112FFC10AFF96BE07C10AFFB512FF870CD80EC20EFFD110B510FF8715E20E94 C102FFC104FFC112FF9CDE9FD21FB93B873AEC0EC20CFFC78A00D10C9DAC00CF01FDF9FD D10BB516FF8895DEE0E1C71B00C7C000C78100D4D50CC116FFD10CD311BE08A0C71B00D1 0CB9872AF60EDEC78000C7A100C7A300C7B100C7B300C7AC00C7A400C77F00D4D80CC116 FFD10CD311B53800872B000F95C13800BE22C7C100C7C400C7C600C7D400C7D600E5E6C7 C200D4D80CC13800D20ED10BB516FF87180A0F95C116FFC718008ABE0BCC00B60EFF88DE B512FF8750140F95C108FFEC96C116FFEA8A86BE3F95DEC7C000C7C100C7C400C7C500C7 C600C7C700C7D400C7D600C7F000C7D000EAD4DB0CC116FFD10CD311BE12E6AB00CF01FD C102B5380088A0C20EFFB987371E0F95C116FFE58ABE2C95C112FFDE96BE0BC112FFDE9F B512FF8A1A95C108FFEC96BE12E6AB00CF01FD8A02B5380088A0C20EFFB98739280F95C1 16FFE68ABE2E95C112FFC10AFF90BE0BC112FFDE9CB512FF8A1A95C108FFEC96BE12E6AB 00CF01FD5102B5380088A0C20EFFB9870F320F9A8000C116FFC7C2008AB8872A3C0F95C1 12FFC110FF99BE1DC20EFFCC01209DC112FFDE9FD20DC20EFFC112FFDE9CD20E9DB60EFF 8740460F95C110FFC112FF90C110FFDD9688BE2D95C112FFC110FF9FDE8ABE19C20EFFC1 10FFDE9FD20DB60EFF88C112FFDE9FB512FF8A09C110FFDE9CB512FF8708500FDDB516FF 87075A0F9B7DFF872B640F95C116FFC784008ABE1EC118FFDD8AA7B518FF88E6C78000C1 18FFA19FAB00CF01FD9801B5380087166E0F95C114FFE08ABE0BC116FFC7DF0088B516FF 874C780F95C116FFC7C3008AC112FFC110FF9988BE37C20EFFCC01209DC112FFDE9FD20D CC01209DC20EFFC112FFD20E9DB60EFF8895C20EFFD110C10AFF96BE0CC20EFFC10AFFD2 0DB60EFF8707820F83E20087308C0F9A2800C120FFC114FF99B8889CB706C61AFFBCB706 C61CFFBCB706C61EFFBC88C120FFDE9CB520FF889BD5FF8733960F9AA200C116FFC21AFF D10B93C116FFC21CFFD10B9988A7DEC21EFFC116FFD10CD311DD9686A7C112FFC10AFF99 88B8871EA00F95C110FFC112FF90BE11C20EFFC112FFC110FF9FD1129DB60EFF8726AA0F C20EFFC112FFDE9FD20DC116FFD10C9DC20EFFC112FFC118FFAFA79FD20E9DB60EFF871B B40F95C20EFFD110C10AFF96BE0CC20EFFC10AFFD20DB60EFF8711BE0FC112FFDE9CB512 FF88DDB516FF8707C80F9B5BFF8707D20F9B20FC873ADC0F8E000033302C392C2720272C 302C392C27202E2D272C2720272C7E2C2720272C412C5D2C2720272C4A2C4A2C4A6A4E6E 2C412C5D2C418705E60F8D870EF00F8C3400B927250001790B8715FA0F95C12A80BE0C86 03C72200B82CC100FFB887070410A0DDB887050E108D870608CF9001870C12CF8C960441 2487040087221CCF901D4B45524D5041434B2E41534D2E2038372D30382D32322031392E 3439870D26CF8600C77801CDC67280876D30CFC7D500C7DD00C7E100C7DD00C76E00E0C7 DD00C76600E1C74E00E3DDE6C7EB00C77900C7D900C75700C7DD00C75E00E2C7D900C7DD 00C76E00DDC7DD00C76600DEC74E00E6C7C500C7D900C7C100C77B00C7D600C75E00C7BA 00C73800C76500C77800D4F70CB6728087773ACFC27280C7A700C72000C76100C7DD00C7 7E00DFC7B900C73800C75B00E0C7D900C77E00C72300DEDDDEC7A700C72800C74600C7DD 00C7BE00E5C72000C71100C77E00C72300C7D600C72000C7FE00C75E00C73800DFC73E00 C75E00C74700C77E00C72300C7D900E0E0C7D900D4F90C9DB67280876E44CFC27280C7DD 00C7BE00E4C72000E4EBC78000C77E00C72300C7D900E0C7D900C7DD00C7BE00E3C72000 C71F00C77E00C72300C7D900E0C76F00C7E600C77F00C72800ECC7DD00C7BE00E5C72800 ECC7DD00C7BE00E4C72800E7C7DD00C7BE00E3C72800D4F80C9DB6728087704ECFC27280 E2C77D00C7EE00C74000C71800DEC77D00C7D900C7B100C71200C71300C7D900C71400C7 D900EDC7F900C7D900C71800C79500C7DD00C76E00E0C7DD00C76600E1C77200C7DD00C7 6E00DDC7DD00C76600DEC77100C76900C76000C7DD00C74E00DFD4F60C9DB67280877058 CFC27280C7AF00C74700C7ED00C74200C7C900C7D500C7DD00C7E100C7DD00C76E00DDC7 DD00C76600DEC74E00E3DDE6C7EB00C77900C7D900C75700C7DD00C75E00DFC7D900C7DD 00C76E00E0C7DD00C76600E1C74E00C72300C74600C72B00C7C500E3DDE6D4F80C9DB672 80877162CFC27280C7D900C7E100C74500C74C00C77B00C7D600E7C7BA00C73800E3C779 00C7B800C72800DFC73000C71800C7DD00C76E00DDC7DD00C76600DEC77200C7DD00C76E 00E0C7DD00C76600E1C77000C72300C77100C77800C7B900C72100DDDDC7C000C72B00D4 F70C9DB6728087776CCFC27280C7C900E1C7D900C7DD00C77E00E5C7A700C72800C73700 C77E00C72B00C7BE00C72300C72000C72800E1C77800C7FE00E2C73800C71F00C7C500C7 DD00C77E00E5C7D900C77700C72300C7F100C7C600C72000C77700C7E500C72B00C7DD00 C75600E2C71400C71400D4F70C9DB67280877276CFC27280C7D900C7D100C71300C7FE00 C77E00C72000C71200E3DDC71800EBC71800C7A900C73D00C72000E6E3DEC7D500C7D900 C7E100C7DD00C77200E2C7D900C77E00C72300C74F00C7FE00C78000C73800ECC7DD00C7 7E00E4C7A700C72800E6C71200C71300D4F80C9DB67280877480CFC27280C7D900C71400 C7D900C77900C7E600C77F00C74F00C7DD00C77E00E3C7A700C72800C72800C77900C7E6 00C77F00C7FE00C77F00C72800C71500C7FE00C72000C73800C71100C7DD00C7BE00E3C7 2800EDC7DD00C7BE00E4C72800E8C7DD00C7BE00E5C72800D4F60C9DB67280874A8ACFC2 7280E3C71800E9C77900C7EE00C74000C74F00C7DD00C77E00E3C71200C71300C7D900C7 1400C7D900C77900C71200C71300C7D900C71400C71800C7A700D4E60C9DB67280870794 CFA0DDB887059ECF8D8706A8CF9001870CB2CF8C00008924B100008722BCCF901D4B4552 4D4353554D2E41534D2E2038372D30382D31362031362E3136870DC6CF8600C72800CDC6 F4818774D0CFC7EB00C72300C72300C75E00C72300C75600C72300C74E00C72300C74600 C72100DDDDC77900C7B000C72800E8C71A00C78500C76F00C73E00DDC78C00C76700E8C7 1300C71800C7F100C77D00E4C7CB00C71400E4C7CB00C71400C77D00C7E600C73F00C76F 00C7C900D4F80CB6F4818707DACFA0DDB88705E4CF8D87010000FD00FE563234646566FE 4F6C6470726F6DFE4D747970FE4B65793939FE456E68FE5072696E746572FE5665727369 6F6EFE4D7162696EFE5061636BFE4373756DFE44756D6D79FE496E6974FE4875767564FE 56323464656668617374FE563234646566706172FE56323464656664617461626974FE43 75FE4D74657374FE52756E656E68FE456E686373FE496E69747061636BFE496E69746373 756DFE4472697665FE416472656E686CFE4473656C656374FE496EFE546D7068FE436C72 FE496E6D617461FE467B7267FE546B6EFE526164FE4B6F6CFE496E706F73FE5061FE4D61 78FE5574FE4C7B6E6764FE506F73FE4676616CFE496E73FE4B6F6D3939FFFEFE04800220 1E803920248079202A80A1203080D2203E80D1204480F2205E8032216C8071217280A221 F481CA210400F1210A004A2214007A221E00D22228002223320091233800791A75767564 FE56323464656668617374FE563234646566706172FE56323464656664617461626974FE 4375FE4D74657374FE52756E656E68FE456E686373FE496E69747061636BFE496E <<< kermcsum.asm >>> ; Fil: KERMCSUM.ASM ; Av: Kristoffer Eriksson, "SKE" <5357>, 1987. ; ;-Ver--/-Datum----/-Sign-/-Kommentar---------------------------------- ; 1.00 / 87-08-15 / SKE / KERMCSUM ; ; Kontrollsummarutin till Bo Kullmars Kermit-program K. ;* Summera str{ng f|r Kermit-kontrollsumma. ;* In: DE = VAROOT(Str{ng$) ;* Ut: L = Summa, bittar 5-0, ;* H = Summa, bittar 13-6. Csum: ex de,hl inc hl inc hl ld e,(hl) ; DE <- Str{ngens adress. inc hl ld d,(hl) inc hl ld c,(hl) ; BC <- Str{ngens l{ngd. inc hl ld b,(hl) ld hl,0 ; HL <- Startsumma = 0. Loop: ld a,c ; Slut? or b jr z CEnd ld a,(de) ; Summera. add l ld l,a ld a,0 adc h ld h,a dec bc inc de jr Loop CEnd: ld a,l rlc a rl h rlc a rl h ; H <- bit 13-6. ld a,l and 63 ld l,a ; L <- bit 5-0. ret <<< kermpack.asm >>> ; Fil: KERMPACK.ASM ; Av: Kristoffer Eriksson, "SKE" <5357>, 1987. ; ;-Ver--/-Datum----/-Sign-/-Kommentar---------------------------------- ; 1.00 / 87-08-15 / SKE / KERMPACK ; ; Packnings- och uppackningsrutiner till Bo Kullmars Kermit-program K. ;* Packa upp buffert. ;* In: DE pekare till inparametrar enligt: UInbuff: = +0 ;W Inbuffertens adress UInbuffs: = +2 ;B Inbuffertens slutposition eller l{ngd-1 (0-255) UUtbuff: = +3 ;W Utbuffertens adress UUtbuffl: = +5 ;B Utbuffertens l{ngd i antal byte (94-255) Qctl: = +6 ;B Tecken som markerar "tecken XOR 64" Qbin: = +7 ;B Tecken som markerar "tecken OR 128" Rept: = +8 ;B Tecken som markerar "tecken1-32 stycken tecken2" ;* In- och utbuffertarnas f|rsta byte anger n{sta oanv{nda position i resp ;* buffert, r{knat med sig sj{lva som position noll. De uppdateras med ;* aktuella v{rden vid retur. ;* ;* Inbuffertens position kan bli upp till 5 h|gre {n dess slutposition, ;* vilket inneb{r att om slutpositionen {r 251 eller mer kan man f|rlora ;* positionens mest signifikanta bittar, varvid v{rdet blir 256 f|r l}gt. ;* Detta beror p} att positionen bara kontrolleras mot l{ngden en g}ng f|r ;* varje avkodat tecken, och varje tecken kan vara kodat med upp till 5 byte. ;* [ven om bufferten bara inneh}ller korrekta koder, slutar positionen 1 ;* steg f|rbi slutpositionen (det blir ju f|rsta oanv{nda position), och ;* {r l{ngden 255 blir det 0 som lagras som position. ;* ;* Rutinen avbryts n{r n{sta inposition blir st|rre {n slutpositionen ;* (Inpos > Inslut), eller det blir 93 eller f{rre tecken kvar i utbufferten ;* (Utpos >= Utl{ngd - 93). Det senare vilkoret {r f|r att garantera att ;* en Rept-sekvens f}r plats vid uppackning. Den kan bli max 94 tecken. ;* ;* Rutinen returnerar i HL aktuell inposition - inl{ngden. Observera att ;* h{r f|rlorar man inte n}gra signifikanta bittar i positionen. ;* ;* Qctl, Qbin och Rept kan vara noll f|r att markera att de inte anv{nds. ; DE = Aktuell adress i utbuff, D' = Position i utbuff, E' = L{ngd av utbuff, ; HL = Aktuell adress i inbuff, BC' = Position i inbuff, ; B = Repetitionsfaktor, C = OR-faktor. ; Inbuff-positionen ligger i ett dubbelregister eftersom den inte kontrolleras ; mot l{ngden vid varje |kning, och d{rf|r kan r}ka bli h|gre {n 255. Unpbuff: push de pop ix ld l,(ix+UUtbuff) ld h,(ix+UUtbuff+1) ld c,(hl) ld b,0 add hl,bc ex de,hl ; DE <- Aktuell adress i utbuffert. ld a,c exx ld d,a ; D' <- Position i utbuffert. ld e,(ix+UUtbuffl) ; E' <- Utbuffertens l{ngd. exx ld l,(ix+UInbuff) ld h,(ix+UInbuff+1) ld c,(hl) ; (B = 0) add hl,bc ; HL <- Aktuell adress i inbuffert. push bc exx pop bc ; BC' <- Position i inbuffert. ULoop: ld a,e sub 94 cp d ; J{mf|r (E' - 94) med D' jr c UEnd ; Avsluta om Utpos > Utl{ngd - 94. ld a,b and a jr nz UEnd ; Inpos > 255, allts} Inpos > Inslut. ld a,(ix+UInbuffs) cp c jr c UEnd ; Avsluta om Inpos > Inslut. UCont: inc bc ; \ka Inpos i BC'. exx ld a,(hl) ; L{s Inbuffert och |ka Inadress. inc hl ld bc,1 << 8 + 0 ; B <- Reptfaktor 1, C <- OR-faktor 0. and a ; Ingen id` att j{mf|ra tecknet 0 med jr z UStoreChar ; specialtecknen, f|r {r de noll ; betyder det bara att de inte anv{nds. UchkRept: cp (ix+Rept) jr nz UchkQbin ld a,(hl) ; H{mta n{sta byte = Repetitionsfaktor. inc hl sub 32 cp 94 jr c Ux1 ; A <- max(A,94). S{kerhetskontroll, ld a,94 ; borde snarare meddela fel. Ux1: ld b,a ; B <- Repetitionsfaktor. ld a,(hl) ; A <- Repeterat tecken. inc hl exx inc bc ; \ka Inpos. inc bc exx UchkQbin: cp (ix+Qbin) jr nz UchkQctl ld c,128 ; OR-faktor f|r teckenkod. ld a,(hl) ; A <- P}verkat tecken. inc hl exx inc bc ; \ka Inpos. exx UchkQctl: cp (ix+Qctl) jr nz UStoreChar ld a,(hl) ; A <- P}verkat tecken. inc hl exx inc bc ; \ka Inpos. ld l,a ; L' <- A (tempor{r lagring). and 127 jr z Ux2 cp (ix+Rept) ; S}lla bort tecken som inte p}verkas. jr z Ux3 cp (ix+Qbin) jr z Ux3 cp (ix+Qctl) jr z Ux3 Ux2: ld a,l xor 64 jr Ux4 Ux3: ld a,l Ux4: exx UStoreChar: or c ; OR-faktor UStoreLoop: ld (de),a ; Lagra tecken i Utbuffert. inc de exx inc d ; \ka Utpos. exx djnz UStoreLoop ; Repetitionsfaktor. exx jr ULoop UEnd: ld l,(ix+UUtbuff) ld h,(ix+UUtbuff+1) ld (hl),d ; (Utbuff) <- D' = Position i utbuffert. ld l,(ix+UInbuff) ld h,(ix+UInbuff+1) ld (hl),c ; (Inbuff) <- BC' = Position i inbuffert. ld l,c ld h,b ld c,(ix+UInbuffs) xor a ; Nolla carry och A. ld b,a sbc hl,bc ; Returv{rde HL <- Inposition - Inl{ngd. ret ;* Packa buffert. ;* In: DE pekare till inparametrar enligt: PUtbuff: = +0 ;W Inbuffertens adress PUtbuffl: = +2 ;B Inbuffertens l{ngd i antal byte (10-255) PInbuff: = +3 ;W Utbuffertens adress ReptPos: = +5 ;B (Intern variabel, aktuell utpos vid start av rept.) ;Qctl: = +6 ;B Tecken som markerar "tecken XOR 64" ;Qbin: = +7 ;B Tecken som markerar "tecken OR 128" ;Rept: = +8 ;B Tecken som markerar "tecken1-32 stycken tecken2" ;* In- och utbuffertarnas f|rsta byte anger n{sta oanv{nda position i resp ;* buffert, r{knat med sig sj{lva som position noll. Dessa uppdateras med ;* aktuella v{rden f|re retur. Inbuffertens andra byte anger dess l{ngd ;* (0-255) i antal byte inklusive position och l{ngd-bytes. ;* ;* Rutinen avbryts n{r det }terst}r nio eller f{rre tecken i utbufferten ;* (Utpos >= Utl{ngd - 9) eller inbuffert {r slut (Inpos >= Inl{ngd). ;* Marginalen i utbufferten {r till f|r att kodningen av n{sta tecken ;* garanterat ska f} plats. Fast den {r on|digt stor, eftersom kodningen ;* av ett tecken kan bli max 5 tecken. ;* ;* Returnerar i HL -1 om aktuell inposition {r lika med inl{ngden, annars 0. ;* ;* Qctl, Qbin och Rept kan vara noll f|r att markera att de inte anv{nds. ; DE = Aktuell adress i utbuff, D' = Position i utbuff, E' = L{ngd av utbuff, ; HL = Aktuell adress i inbuff, B' = Position i inbuff, C' = L{ngd av inbuff, ; HL' = Adress i utbuff f|r ev repetionssekvens, B = Repetitionsr{knare. Packbuff: push de pop ix ld l,(ix+PUtbuff) ld h,(ix+PUtbuff+1) ld c,(hl) ; Position. ld b,0 add hl,bc ex de,hl ; DE <- Aktuell adress i utbuffert. ld a,c exx ld d,a ; D' <- Position i utbuffert. ld e,(ix+PUtbuffl) ; E' <- Utbuffertens l{ngd. exx ld l,(ix+PInbuff) ld h,(ix+PInbuff+1) ld c,(hl) ; Position. inc hl ld b,(hl) ; L{ngd. dec hl push bc ld b,0 add hl,bc ; HL <- Aktuell adress i inbuffert. exx pop hl ld b,l ; B' <- Position i inbufferten. ld c,h ; C' <- Inbuffertens l{ngd. ; Repetitionsr{knaren B {r nu noll. PLoop: ld a,e sub 10 cp d ; J{mf|r (E' - 10) med D' jr c PEnd ; Avsluta om Utpos > Utl{ngd - 10. ld a,c cp b ; J{mf|r C' med B'. jr z PEnd jr nc PCont ; Avsluta om Inpos >= Inl{ngd. PEnd: ld l,(ix+PUtbuff) ld h,(ix+PUtbuff+1) ld (hl),d ; (Utbuff) <- D' = Position i utbuffert. ld l,(ix+PInbuff) ld h,(ix+PInbuff+1) ld (hl),b ; (Inbuff) <- B' = Position i inbuffert. inc hl ld (hl),c ; (Inbuff+1) <- C' = L{ngd. ld a,b cp c ld hl,0 ret nz dec hl ; Returv{rde HL <- Inpos = Inl{ngd. ret PCont: inc b ; \ka Inpos i B' redan nu. exx ld a,(ix+Rept) and a jr z PchkQbin ; Ingen repetitionskomprimering. ld a,(hl) ; Aktuellt tecken. dec hl cp (hl) ; J{mf|r tecknet med f|rra tecknet. inc hl jr nz PInitRept inc b ; \ka repetitionsr{knaren. ld a,b cp 5 jr c Px1 ; Hoppa om inte B > 4. push bc ld a,(ix+Rept) exx ld (hl),a ; Anv{nd den sparade utpekaren och inc hl ; {ndra i utbufferten till repetitions- pop af ; A <- B = Rept.r{kn. sekvens med add 32 ; , samt }terst{ll ld (hl),a ; utadressen och utpositionen till push hl ; slutet av denna sekvens. dec hl ld d,(ix+ReptPos) inc d inc d exx pop de inc de cp 94+32 ; J{mf|r B med 94. (A {r nu B+32) jr nz PchkQbin ld b,0 ; Avbryt repeteringsbehandling efter jr PchkQbin ; maxantalet 94 upprepningar. PLoop2: jr PLoop ; (F|r l}ngt f|r ett enda jr-hopp.) Px1: dec a ; Om f|rra v{rdet p} rept-r{knaren var jr nz PchkQbin ; noll, ska den startas om. PInitRept: ld b,1 ; Tecknet {r inte likt f|reg}ende. push de ; Starta om repetitionsr{knare och exx ; spara utadress och utposition. pop hl ld (ix+ReptPos),d exx PchkQbin: ld a,(hl) ; Aktuellt tecken. inc hl ; Inbuffertadressen|kas f|rst nu. ld c,a cp 128 jr c PchkQctl ; Behandla tecken >= 128 med Qbin ld a,(ix+Qbin) and a jr z PchkQctl ; Avst{ngt. ld (de),a ; Lagra . inc de exx inc d ; \ka Utpos. exx ld a,c and 127 ; Nu slipper vi h|ga bitten. ld c,a PchkQctl: ld a,(ix+Qctl) and a jr z PStoreChar ; Ingen hantering av ctrl-tecken. ld a,c and 127 cp 127 ; Tecken < 32 och = 127 kod{ndras. jr z PCtrl cp 32 jr c PCtrl cp (ix+Qctl) ; Dessa tecken f|reg}as av Qctl men jr z PQctl ; kod{ndras inte. cp (ix+Qbin) jr z PQctl cp (ix+Rept) jr z PQctl jr PStoreChar PCtrl: ld a,c xor 64 ld c,a PQctl: ld a,(ix+Qctl) ld (de),a ; Lagra . inc de exx inc d ; \ka Utpos. exx PStoreChar: ld a,c ld (de),a ; Lagra tecknet. inc de exx inc d ; \ka Utpos. jr PLoop2 <<< kmain.bas >>> 2 ! ********************************************************************** 3 ! Program KMAIN.BAS Utg}va 4.11 1990-02-17 4 ! av Bo Kullmar, 1789 6 ! F|r ABC800M ABC802 ABC806 DTC2 8 ! Testad p} ABC806 9 ! Se vidare K.BAS. 21 ! [ndra inte radnummreringen f|r Kermitrutinerna, f|r d} upph|r likheten 22 ! med monitorns Kermitrutiner! 23 ! ********************************************************************** 30 EXTEND : INTEGER : OPTION BASE 0 60 COMMON V24def$=16,Oldprom,Mtyp,Key99,Enh$=4,Enh,Printer$=16,Version$=4,Mqbin,Pack$=376,Csum$=40 80 IF PEEK(39)=6 THEN Dtc2=-1 ! ta reda p} om det {r en DTC 2 1000 Dummy=FNInit 1010 IF FNF|rbindelse Rutin=FNMeny(1) ELSE Slut=-1 1020 WHILE NOT Slut 1030 IF Rutin=2 Eko=0 : Rutin=1 1040 IF Rutin=3 Eko=-1 : Rutin=1 1050 WHILE Rutin=4 ! Ta emot filer med Kermit 1060 Dummy=FNDisplaykermit 1070 ; CUR(3,0) FNF$(YEL) 'Mottag filer med Kermit'+Avbryt$ 1075 ; FNF$(YEL) 'Avbryt fil|verf|ringen med PF1' SPACE$(9)+'Avbryt |verf|ringen av alla filer med PF8' 1080 CLOSE 20,30 : S{nd=0 : Dump=0 : Nfile=FNFiles(-1) : IF Nfile=-1 OR Ec=-1 GOTO 1260 1090 IF Mqbin=89 Dummy=FNMaskabit7(0,V24) 1100 Dummy=FNRe(Im,1,5) 1110 IF Dummy=0 Dummy=FNFel('Ok, klart') 1115 IF Dummy=-2 Rutin=100 1120 IF Mqbin=89 Dummy=FNMaskabit7(-1,V24) 1130 IF 0 WEND 1140 IF Rutin=5 AND Dump=0 IF FNRfil Rutin=1 1150 IF Rutin=7 Dump=0 : CLOSE 30 : Rutin=1 1160 WHILE Rutin=6 ! S{nd filer med Kermit 1170 Dummy=FNDisplaykermit 1180 ; CUR(3,0) FNF$(YEL) 'S{nd filer med Kermit '+Avbryt$ 1185 ; FNF$(YEL) 'Avbryt fil|verf|ringen med PF1' SPACE$(9)+'Avbryt |verf|ringen av alla filer med PF8' 1190 CLOSE 20,30 : S{nd=0 : Dump=0 : Nfile=FNFiles(0) 1200 IF Nfile=0 OR Nfile=-1 OR Ec=-1 GOTO 1260 1210 IF Mqbin=89 Dummy=FNMaskabit7(0,V24) 1220 IF Nfile>0 Dummy=FNSw('',Im,1,ASCII('#'),Chktyp,5) : GOTO 1240 1230 IF Nfile-2 Dummy=FNSw(File$(1),Im,1,ASCII('#'),Chktyp,5) 1240 IF Dummy=0 Dummy=FNFel('Ok, klart') 1245 IF Dummy=-2 Rutin=100 1250 IF Mqbin=89 Dummy=FNMaskabit7(-1,V24) 1260 IF 0 WEND 1270 IF Rutin=8 AND S{nd=0 IF FNSfil Rutin=1 1280 IF Rutin=9 Im=NOT Im 1290 IF Rutin=10 Enh$=FNDefenh$ 1295 IF Rutin=11 IF Chktyp=1 Chktyp=2 ELSE Chktyp=1 1300 IF Rutin=1 Dummy=FNConnect 1305 IF Rutin=100 Rutin=1 : Dummy=FNTerm 1310 IF Rutin=12 Slut=-1 : GOTO 1330 1320 Rutin=FNMeny(Rutin) 1330 WEND 1340 END 1350 DEF FNInit 1351 ON ERROR GOTO 1495 1357 IF V24def$='' ; CHR$(12) FNF$(RED) 'Du m}ste starta med '+Enh$+'K, detta g|rs nu automatiskt!' : CHAIN Enh$+'K' 1358 ON ERROR GOTO 1370 DIM Oldsk{rm$=2048,Dirmap$=16,Dirrec$=256,File$(20)=16,Enh$(20)=4,Esc$=1,V24buff$=400 1380 POKE VAROOT(Sk{rm$),0,8,30720,SWAP%(30720),0,8 1390 POKE VAROOT(Dosbuff$),0,1,0,245,0,1 1400 POKE VAROOT(Textbuff$),0,2,0,250,0,0 1405 POKE PEEK2(65500)+2,VAROOT(V24buff$),SWAP%(VAROOT(V24buff$)) 1410 V24=9 : Inlu=2 : Outlu=3 : Chktyp=1 1420 ; CHR$(12) 1430 Huvud$=CUR(0,0)+FNF$(CYA)+'K, KERMIT-program f|r ABC800-serien, version '+Version$ 1440 Cu=PEEK2(SYS(10)+64)+6 1450 IF PEEK2(PEEK2(65500))>=10 THEN V24xoff=PEEK2(65500)+37 ! (Trol 33 f|r ver 8) 1455 V24tkn=PEEK2(65500)+6 : V24ut=PEEK2(65500)+4 1460 IF Key99 Avbryt$=SPACE$(16)+'Avbryt inmatningen med STOP' ELSE Avbryt$=SPACE$(16)+'Avbryt inmatningen med PF1' 1480 Eko=-1 : Im=0 1490 RETURN 0 1495 ; FNF$(RED) 'Beklagar, hittar ej '+Enh$+'K och kan d{rf|r inte starta programmet!' : STOP 1500 FNEND 1510 DEF FNConnect LOCAL I 1520 ; CUR(16,0) FNF$(YEL) 'Kermit: uppkopplad - terminalmod - PF1 till meny.' 1530 WHILE I<1200 : I=I+1 : WEND 1540 RETURN FNTerm 1550 FNEND 1560 DEF FNDefenh$ LOCAL E$=4 1570 ; CUR(17,0) FNF$(YEL) 'Specificera standardenhet'+Avbryt$ 1580 E$=FNVersal$(FNSpbort$(FNInmata$('',18,0,1,2,4,CYA+CHR$(138)))) : IF E$=CHR$(27) OR E$='' RETURN Enh$ 1590 WHILE FNEnhcs(E$)=-1 1600 Dummy=FNFel('Felaktig enhet!') 1610 E$=FNVersal$(FNSpbort$(FNInmata$('',18,0,1,2,4,CYA+CHR$(138)))) : IF E$=CHR$(27) OR E$='' RETURN Enh$ 1620 WEND 1630 RETURN E$ 1640 FNEND 1650 DEF FNFiles(Rsw) LOCAL Nfile,Aa$=162,I,Bin$=10 1655 IF Im Bin$='Bin{rfiler' ELSE Bin$='Textfiler' 1660 Nfile=0 1665 ; CUR(5,0) FNF$(YEL) 'Standardenhet: ' FNF$(CYA) Enh$ : ; CUR(5,39) FNF$(YEL) 'Filtyp: ' FNF$(CYA) Bin$ : ; CUR(7,0) FNF$(YEL) 'Ange filnamn:'; 1670 IF Rutin=4 ; TAB(40) 'Lokalt filnamn beh|ver ej anges' 1680 IF Rutin=6 AND (PEEK(24688)=0 OR PEEK(24688)=8) ; TAB(40) 'Jokertecken "*" och "?" kan anv{ndas' 1690 Aa$=FNVersal$(FNSpbort$(FNInmata$('',8,0,1,2,75,CYA+CHR$(138)))) : IF Aa$=CHR$(27) RETURN -1 1700 ; CUR(8,0) FNF$(CYA) Aa$+SPACE$(77-LEN(Aa$)) 1710 WHILE Rsw=0 AND (INSTR(1,Aa$,'?') OR INSTR(1,Aa$,'*')) 1720 IF PEEK(24688)<>0 AND PEEK(24688)<>8 RETURN FNFel('Jokertecken kan enbart anv{ndas f|r UFD och LUX-NET DOS!') 1730 IF LEN(Aa$)>16 RETURN FNFel('F|r l}ngt filnamn!') 1740 File$(1)=Aa$ 1750 Ec=FNKollenh(1) : IF Ec=-1 RETURN FNFel('Felaktig enhet!') 1760 RETURN -2 1770 WEND 1780 IF Aa$='' Enh$(1)='' : RETURN 0 1790 Nfile=Nfile+1 1800 K=INSTR(1,Aa$,',') 1810 WHILE K 1820 IF LEN(LEFT$(Aa$,K-1))>16 RETURN FNFel('F|r l}ngt filnamn!') 1830 File$(Nfile)=LEFT$(Aa$,K-1) : Aa$=RIGHT$(Aa$,K+1) 1840 Ec=FNKollenh(Nfile) : IF Ec=-1 RETURN FNFel('Felaktig enhet!') 1850 Nfile=Nfile+1 1860 K=INSTR(1,Aa$,',') 1870 IF Nfile>20 ; FNFel('Max 20 filnamn kan matas in!') : RETURN 0 1880 WEND 1890 IF LEN(Aa$)>16 RETURN FNFel('F|r l}ngt filnamn!') 1900 File$(Nfile)=Aa$ 1910 Ec=FNKollenh(Nfile) : IF Ec=-1 RETURN FNFel('Felaktig enhet!') 1920 IF Rsw RETURN Nfile 1930 ON ERROR GOTO 1960 1940 I=1 1942 WHILE I<=Nfile 1943 IF Enh$(I)='' Enh$(I)=Enh$ 1944 OPEN Enh$(I)+File$(I) AS FILE 2 1946 CLOSE 2 : I=I+1 1948 WEND 1950 ON ERROR GOTO : RETURN Nfile 1960 ON ERROR GOTO : RETURN FNFel('Fil: '+Enh$(I)+File$(I)+' finns inte - avbryter !') 1970 FNEND 1980 DEF FNTerm LOCAL Ctrlc 1990 Ctrlc=PEEK2(65413) : POKE 65413,0,0 1994 ; CHR$(12); 2000 IF Sk{rmstart=30720 Sk{rm$=Oldsk{rm$ ELSE Sk{rm$=RIGHT$(Oldsk{rm$,Sk{rmstart-30719)+LEFT$(Oldsk{rm$,Sk{rmstart-30720) 2010 POKE Cu,Kol,Rad 2015 IF V24xoff THEN POKE V24xoff,PEEK(V24xoff) AND 253 ! Bryt XOFF 2020 Slut=0 2030 Dummy=FNCursor 2040 WHILE NOT Slut 2050 IF PEEK2(V24tkn)<>0 Z=FNV24in 2060 IF SYS(5)>127 OR S{nd Z=FNTeckin 2070 WEND 2080 POKE 65413,Ctrlc,SWAP%(Ctrlc) 2090 RETURN 0 2100 FNEND 2110 DEF FNTeckin LOCAL A$=1 2120 IF S{nd ; #V24,FNS{ndline$; : RETURN 0 ELSE GET A$ 2130 IF NOT Eko ; A$; : IF Dump ; #30,A$; 2140 IF ASCII(A$)=192 Slut=-1 : RETURN 0 2150 IF NOT Dtc2 IF ASCII(A$)=(130 AND Key99 OR 215 AND NOT Key99) THEN RETURN FNDump 2160 ; #V24,A$; 2170 RETURN 0 2180 FNEND 2190 DEF FNV24in LOCAL A,Buff$=80,I 2195 A=PEEK2(PEEK2(65500)+6) : IF A>80 A=80 2200 GET #V24,Buff$ COUNT A 2205 WHILE Oldprom : I=LEN(Buff$) : WHILE I 2210 MID$(Buff$,I,1)=CHR$(ASCII(MID$(Buff$,I,1)) AND 127) : I=I-1 2215 WEND : WEND 2220 RETURN FNSk{rm(Buff$) 2225 FNEND 2250 DEF FNCursor LOCAL Rad,Kol,A 2252 IF Dtc2 2302 2260 Rad=PEEK(Cu+1) : Kol=PEEK(Cu) : A=30720+Rad*80+Kol 2270 OUT 56,14,57,SWAP%(A),56,15,57,A,56,10,57,104 2300 RETURN 0 2302 Rad=PEEK(Cu+1) : Kol=PEEK(Cu) : A=PEEK2(PEEK2(121)+8)+Rad*80+Kol 2303 IF A>32767 A=A-2048 2304 GOTO 2270 2305 FNEND 2310 DEF FNSk{rm(Buff$) LOCAL J,Buff1$=4,Buff2$=1 2315 Z=FNCursor : J=1 2320 WHILE J<=LEN(Buff$) 2325 Buff1$=CHR$(ASCII(RIGHT$(Buff$,J))) : Buff2$=Buff1$ 2330 IF Buff1$=CHR$(27) Esc=-1 2335 IF Buff1$=CHR$(30) Buff1$=CUR(0,0) 2340 IF Buff1$=CHR$(11) Buff1$=CUR(PEEK(Cu+1)-1,PEEK(Cu)) 2345 IF Buff1$=CHR$(12) IF PEEK(Cu)>=PEEK(Cu+2) Buff1$=CUR(PEEK(Cu+1)+1,0) ELSE Buff1$=CUR(PEEK(Cu+1),PEEK(Cu)+1) 2350 IF Buff1$=CHR$(26) Buff1$=CHR$(12) 2360 IF Esc IF LEN(Styr$)=3 ; Styr$+Buff1$ : Styr$='' : Esc=0 ELSE Styr$=Styr$+Buff1$ 2362 IF Esc AND LEN(Styr$)=2 IF Buff1$<>'=' Buff1$=Styr$ : Styr$='' : Esc=0 2364 IF NOT Esc ; Buff1$; : IF Dump ; #30 Buff2$; 2365 J=J+1 2370 WEND 2380 RETURN FNCursor 2385 FNEND 2390 DEF FNMeny(Alt) LOCAL Rutin,F$=1,Bin$=10 2395 Slut=0 2400 IF Alt=1 Oldsk{rm$=Sk{rm$ : Rad=PEEK(Cu+1) : Kol=PEEK(Cu) : IF Dtc2 Sk{rmstart=PEEK2(PEEK2(121)+8) ELSE Sk{rmstart=30720 2405 IF Im Bin$='Bin{rfiler' ELSE Bin$='Textfiler' 2410 ; CHR$(12) : Dummy=FNClr 2420 ; 2425 ; FNF$(CYA) 'Pf 1 Koppla upp terminalf|rbindelse' 2430 ; FNF$(CYA) 'Pf 2 Lokalt eko av tecken' 2435 ; FNF$(CYA) 'SHIFT Pf 2 Ingen lokal ekning av tecken' 2440 ; FNF$(CYA) 'Pf 3 Mottag fil fr}n v{rddator med Kermit' 2445 ; FNF$(CYA) 'SHIFT Pf 3 Dumpa data till lokal fil (utan Kermit)' 2450 ; FNF$(CYA) 'CTRL Pf 3 Avbryt dumpning till lokal fil' 2455 ; FNF$(CYA) 'Pf 4 S{nd fil till v{rddator med Kermit' 2460 ; FNF$(CYA) 'SHIFT Pf 4 Dumpa fil till v{rddator (utan Kermit)' 2465 ; FNF$(CYA) 'Pf 5 [ndra filtyp f|r Kermit, nu = ' FNF$(YEL) Bin$ 2470 ; FNF$(CYA) 'Pf 6 [ndra standardenhet f|r Kermit, nu = ' FNF$(YEL) Enh$ 2472 ; FNF$(CYA) 'Pf 7 [ndra blockchecktyp f|r Kermit, nu =' FNF$(YEL) Chktyp 2475 ; FNF$(CYA) 'Pf 8 Avsluta programmet och bryt terminalf|rbindelsen' 2480 ; FNF$(CYA); : IF (Key99=0 AND NOT Dtc2) ; 'SHIFT Pf 8'; ELSE ; 'PRINT '; 2485 ; ' Dumpa bildsk{rmen till skrivare ({ven direkt i terminalmode)' 2490 WHILE Rutin=0 2495 ; CUR(17,0) FNF$(YEL) 'V{lj funktion: ' CHR$(8); : F$=FNTkn$(YEL) 2500 Rutin=INSTR(1,CHR$(192,193,209,194,210,195,226,211,196,197,198,199),F$) : IF Rutin RETURN Rutin 2505 WEND 2510 FNEND 2515 DEF FNSfil LOCAL Fil$=16 2520 ; CUR(17,0) FNF$(YEL) 'S{nda fil (utan Kermit)'+Avbryt$ 2525 ; FNF$(YEL) 'Filnamn:'; 2530 Fil$=FNVersal$(FNSpbort$(FNInmata$('',18,9,1,2,16,CYA+CHR$(138)))) 2535 ON ERROR GOTO 2550 2540 OPEN Fil$ AS FILE 20 2545 S{nd=-1 : RETURN S{nd 2550 RETURN 0 2555 FNEND 2560 DEF FNRfil LOCAL Fil$=16 2565 ; CUR(17,0) FNF$(YEL) 'Dumpa fil (utan Kermit)'+Avbryt$ 2570 ; FNF$(YEL) 'Filnamn:'; 2575 Fil$=FNVersal$(FNSpbort$(FNInmata$('',18,9,1,2,16,CYA+CHR$(138)))) 2580 ON ERROR GOTO 2595 2585 PREPARE Fil$ AS FILE 30 2590 Dump=-1 : RETURN Dump 2595 RETURN 0 2600 FNEND 2605 DEF FNS{ndline$ LOCAL Sp,St$=80 2610 IF LEN(Textbuff$) GOTO 2625 2615 ON ERROR GOTO 2645 2620 INPUT LINE #20,Textbuff$ : Textbuff$=LEFT$(Textbuff$,LEN(Textbuff$)-1) 2625 ON ERROR GOTO 2630 Sp=PEEK2(PEEK2(65500)+4)-1 2635 IF LEN(Textbuff$)<=Sp THEN St$=Textbuff$ : Textbuff$='' ELSE St$=LEFT$(Textbuff$,Sp) : Textbuff$=RIGHT$(Textbuff$,Sp+1) 2640 RETURN St$ 2645 S{nd=0 : CLOSE 20 2650 RETURN '' 2655 FNEND 2660 DEF FNF|rbindelse 2860 OPEN V24def$ AS FILE V24 2870 ; CHR$(12); 2880 RETURN -1 2890 ! *** F|re RETURN kan kod l{ggas upp f|r uppringning om man har ett 2900 ! *** modem som klarar detta. Exempel p} s}dan kod finns i programmet 2910 ! *** KERM.BAS f|r TGC modem. Detta program finns i programbanken. 2920 ; 'Kan ej |ppna V24:an! Errcode: ' ERRCODE : STOP 2930 FNEND 2940 DEF FNClr 2950 ; CUR(1,0) FNF$(GYEL) STRING$(80,127); 2960 ; CUR(21,0) FNF$(GYEL) STRING$(80,127); 2970 ; CUR(0,22) SPACE$(36) 2980 ; Huvud$ 2990 ; CUR(2,0); 3000 RETURN 0 3010 FNEND 3020 DEF FNF$(F{rg$) 3030 IF Mtyp=0 RETURN F{rg$ ELSE RETURN '' 3050 FNEND 3060 DEF FNSpbort$(In$) LOCAL A$=100,I,A 3070 I=1 3080 WHILE I<=LEN(In$) 3090 A=ASCII(RIGHT$(In$,I)) 3100 IF A<>32 A$=A$+CHR$(A) 3110 I=I+1 3120 WEND 3400 RETURN A$ 3410 FNEND 3420 DEF FNFeltext(In$) 3430 ; CUR(21,0) CHR$(7) FNF$(RED+NWBG+WHT+FLSH) '<' FNF$(NRML+STDY) In$ FNF$(FLSH) '>' SPACE$(78-LEN(In$)) FNF$(CHR$(128)+NWBG+WHT); 3440 RETURN 0 3450 FNEND 3460 DEF FNFel(In$) LOCAL A$=1 3470 Z=FNFeltext(In$+' Kvittera med CE ') 3480 ; CUR(21,LEN(In$)+22); : A$=FNTkn$(RED) 3490 WHILE A$<>CHR$(24) 3500 A$=FNTkn$(RED) 3510 WEND 3520 ; CUR(21,0) FNF$(GYEL) STRING$(80,127) 3530 RETURN 0 3540 FNEND 3550 DEF FNTkn$(F{rg$) LOCAL B$=1,Rad,Kol 3560 Rad=PEEK(Cu+1) : Kol=PEEK(Cu) 3570 Z=FNCursor 3580 IF Mtyp=0 ; F{rg$ CHR$(PEEK(30720+Rad*80+Kol)); 3610 ; CUR(0,61) FNF$(CYA) TIME$ 3620 WHILE SYS(5)=0 : ; CUR(0,61) FNF$(CYA) TIME$ : WEND 3630 GET B$ : IF NOT Dtc2 IF ASCII(B$)=(130 AND Key99 OR 215 AND NOT Key99) THEN Z=FNDump 3640 POKE Cu,Kol,Rad 3650 RETURN B$ 3660 FNEND 3670 DEF FNPropen(Fil) 3680 WHILE -1 3690 ON ERROR GOTO 3720 3700 PREPARE Printer$ AS FILE Fil 3710 RETURN 0 3720 Z=FNFel('Skrivaren ej p}slagen, kontrollera ! ') 3730 WEND 3740 FNEND 3750 DEF FNInmata$(In$,Rad,Kol,Inpos,Pa,Max,F{rg$) LOCAL Ut$=100,L{ngd,Pos,Fval,A,Ins,M1$=1,M2$=1,M3$=10,O8 3760 Ut$=In$ : Pos=Inpos : Fval=Pa AND 15 : Z=FNKom99(9) 3770 WHILE -1 3780 ; CUR(Rad,Kol) FNF$(F{rg$) Ut$ STRING$(Max-LEN(Ut$),32-63*(Mtyp<>0)) CHR$(139) ' '; 3790 IF Pos>Max Pos=Max 3800 L{ngd=LEN(Ut$) 3810 ; CUR(Rad,Kol+Pos-1); 3820 A=ASCII(FNTkn$(F{rg$+CHR$(138))) : IF INSTR(1,CHR$(3,4,27,192,129),CHR$(A)) RETURN CHR$(27) 3830 Z=INSTR(1,CHR$(128,161,163,177,179,172,164,127),CHR$(A)) 3840 IF Z A=ASCII(RIGHT$(CHR$(193,196,198,212,214,8,9,194),Z)) 3850 IF A=24 Ut$='' : Pos=1 3860 IF Pa>15 OR A=13 IF INSTR(1,CHR$(192,193,196,197,198,199,212,214,240,208,13),CHR$(A)) Z=FNKom99(9) : RETURN Ut$ 3870 IF A=8 IF Pos>1 Pos=Pos-1 ELSE IF Pa>15 Z=FNKom99(9) : RETURN Ut$ 3880 IF A=9 IF Pos15 Z=FNKom99(9) : RETURN Ut$ 3890 WHILE A=194 3900 IF Pos<=L{ngd Ut$=LEFT$(Ut$+' ',Pos-1)+RIGHT$(Ut$,Pos+1) 3910 IF L{ngd0 IF Pos-L{ngd=1 Ut$=LEFT$(Ut$,L{ngd-1) : Pos=Pos-1 ELSE Pos=L{ngd+1 3920 A=0 3930 WEND 3940 IF A=132 Ins=(Ins=0) : Z=FNKom99(9-128*Ins) 3950 IF Fval=3 A=A AND 223 3960 IF A=195 AND Pos<=L{ngd Ut$=LEFT$(Ut$+' ',Pos-1)+' '+RIGHT$(Ut$,Pos) : IF LEN(Ut$)>Max Ut$=LEFT$(Ut$,Max) 3970 RESTORE 4060 3980 WHILE O8<=Fval : READ M1$,M2$,M3$ : O8=O8+1 : WEND 3990 WHILE ((A>=ASCII(M1$) AND A<=ASCII(M2$)) OR INSTR(1,M3$,CHR$(A))>0) AND Pos<=Max 4000 IF L{ngdMax Ut$=LEFT$(Ut$,Max) 4030 Pos=Pos+1 : A=0 4040 WEND 4050 WEND 4060 DATA 0,9,' ',0,9,' .-',' ',~,' ',A,],' ',J,J,JjNn,A,],A 4070 FNEND 4080 DEF FNKom99(K) 4090 IF Key99 OUT 34,K 4100 RETURN 0 4110 FNEND 4210 DEF FNDump LOCAL Rad$=0,I 4220 Z=FNPropen(8) 4230 ; #8,CHR$(10,10,10) 4240 I=30720 4250 WHILE I<32640 4260 POKE VAROOT(Rad$),80,0,I,SWAP%(I),80,0 : ; #8 Rad$ 4270 I=I+80 4280 WEND 4290 CLOSE 8 : RETURN 0 4300 FNEND 4400 DEF FNEsc LOCAL Tkn$=1,Tkn 4410 GET Tkn$ 4420 Tkn=ASCII(Tkn$) 4430 IF Tkn<>192 AND Tkn<>199 RETURN 0 4440 ; : ; FNF$(RED) '\verf|ringen av '; : IF Tkn=192 ; 'aktuell fil avbrytes!' : RETURN 1 4450 ; 'alla filer avbrytes!' : RETURN 2 4460 FNEND 4500 DEF FNKillfile(Lu,File$) 4510 ON ERROR GOTO 4540 4520 CLOSE Lu 4530 KILL File$ : RETURN 0 4540 ; CHR$(13,10) FNF$(RED) 'Kan ej ta bort inkommande fil p} grund av fel: ' ERRCODE : RETURN 0 4550 FNEND 4600 DEF FNClose(Lu,File$) 4610 ON ERROR GOTO 4630 4620 CLOSE Lu : RETURN 0 4630 ; CHR$(13,10) FNF$(RED) 'Kan ej st{nga ' File$ ' p} grund av fel: ' ERRCODE : RETURN 0 4640 FNEND 10000 DEF FNReadsec(Disk,Sec) LOCAL D 10010 POKE SYS(10)-511,Disk 10020 D=CALL(24678,Sec) 10030 IF PEEK(SYS(10)-491) RETURN -1 10040 RETURN 0 10050 FNEND 10060 DEF FNDiscerror$ LOCAL I 10070 RESTORE 10140 10080 WHILE I<4 10090 READ Kod,Text$ 10100 IF (PEEK(SYS(10)-491) AND Kod) RETURN Text$ 10110 I=I+1 10120 WEND 10130 RETURN 'ok{nd typ av diskfel!' 10140 DATA 8, 'checksummafel! 10150 DATA 16, 'd}lig disk! 10160 DATA 64, 'skivan skrivskyddad! 10170 DATA 128,'luckan |ppen! 10180 FNEND 10190 DEF FNEnhcs(Drive$) LOCAL Adrenhl,Enh$=4,Dselect 10200 Adrenhl=PEEK2(SYS(10)+123) : IF Drive$='' RETURN PEEK(PEEK2(24683)) 10210 WHILE Adrenhl<>0 10220 Enh$=CHR$(PEEK(Adrenhl+2),PEEK(Adrenhl+3),PEEK(Adrenhl+4),58) 10230 IF Enh$='CON:' OR Enh$='NUL:' OR Enh$='PR:' OR Enh$='V24:' Enh$='' 10240 Dselect=PEEK(Adrenhl+7) 10250 IF Enh$=Drive$ RETURN Dselect 10260 Adrenhl=PEEK2(Adrenhl) 10270 WEND 10280 RETURN -1 10290 FNEND 10300 DEF FNKollenh(Ix) LOCAL Kolon,Enh$=4,Ec 10310 Enh$(Ix)='' 10320 Kolon=INSTR(1,File$(Ix),':') : IF Kolon=0 RETURN 0 10330 Enh$=LEFT$(File$(Ix),Kolon) : Ec=FNEnhcs(Enh$) 10340 IF Ec=-1 OR Ec=30 AND PEEK2(65527)=0 RETURN -1 10350 Enh$(Ix)=Enh$ : File$(Ix)=RIGHT$(File$(Ix),Kolon+1) 10360 Enh=Ec : RETURN Ec 10370 FNEND 10380 DEF FNIx(Fd) LOCAL P 10390 P=PEEK2(65344) 10400 WHILE PEEK(P+2)<>Fd AND P<>0 10410 P=PEEK2(P) 10420 WEND 10430 RETURN P 10440 FNEND 10450 DEF FNMaskabit7(Maska,Fd) LOCAL Ix 10455 IF Oldprom RETURN 0 10460 Ix=FNIx(Fd) : IF Ix=0 ; 'Stopp, filen ej |ppnad!' : STOP 10470 IF Maska POKE PEEK2(Ix+18)+10,((PEEK(PEEK2(Ix+18)+10)-1) OR 4)+1 ELSE POKE PEEK2(Ix+18)+10,((PEEK(PEEK2(Ix+18)+10)-1) AND 251)+1 10480 RETURN 0 10490 FNEND 10500 DEF FNDisplaykermit 10520 ; CHR$(12) CUR(1,0) FNF$(GYEL) STRING$(80,127) Huvud$ 10550 RETURN 0 10560 FNEND 20040 DEF FNSw(Wc$,Im,Synk,Mqctl,Mchkt,Mt) LOCAL T$=1,S$=1,Ib$=100,Ib,Ub$=101,Ub,Tb$=256,Tb,Npad,Padc,Eol,Time,Chkt,Qctl,Qbin,Rept,Maxl,N,Eof,Fs,F$=40,D,F 20050 Npad=0 : Padc=0 : Eol=13 : Time=8 : Chkt=Mchkt : Rept=126 20060 Ib$=SPACE$(100) : Ib=VARPTR(Ib$) : Tb=VARPTR(Tb$) : Ub=VARPTR(Ub$) 20070 POKE VAROOT(Ub$),100,0,Ub+1,SWAP%(Ub+1) 20080 S$='S' : F=1 20090 N=0 20100 IF INSTR(1,Wc$,'*') OR INSTR(1,Wc$,'?') LET Fs=-1 ELSE LET Fs=0 20110 F$=Wc$ 20120 WHILE Fs 20140 Sector=FNOpendir(Enh$(1)) : IF Sector<0 GOTO 20766 20150 WHILE -1 20155 WHILE -1 20160 F$=FNReaddir$ : IF Ec AND Ec<>38 GOTO 20766 20165 IF F$='' GOTO 20765 20170 WHILE MID$(F$,14,1)='D' OR FNWild(Wc$,FNPackfilnamn$(LEFT$(F$,12)))=0 20180 F$=FNReaddir$ : IF Ec AND Ec<>38 GOTO 20766 20182 IF F$='' GOTO 20765 20186 WEND 20190 F$=FNPackfilnamn$(LEFT$(F$,12)) 20195 ; : ; FNF$(CYA) 'S{nder:'; 20200 IF FNOpen(Enh$(1),F$,Inlu,1) WEND 20210 IF 0 WEND 20220 IF 0 WEND 20222 WHILE NOT Fs 20223 ; : ; FNF$(CYA) 'S{nder:'; 20225 Ec=FNOpen(Enh$(F),File$(F),Inlu,1) : F$=File$(F) : Oms{ndning=0 20228 IF Ec RETURN FNSendpack('E','Fel nr '+NUM$(Ec)+' under |ppnignen av '+F$+'!',1,Chkt,Synk,Npad,Padc,Eol,V24)-2 20229 IF 0 WEND 20230 WHILE -1 20240 WHILE S$='S' 20250 Ub$=CHR$(FNChar(94),FNChar(Time),FNChar(Npad),FNCtl(Padc),FNChar(Eol),Mqctl)+CHR$(Mqbin)+NUM$(Mchkt)+CHR$(Rept) 20260 T$=FNSendbuff$(N,'S',Ub$,Ib,Synk,Npad,Padc,Eol,Mt,Time,1,V24) 20270 WHILE T$='Y' 20280 Maxl=FNUnchar(PEEK(Ib+2)) : Time=FNUnchar(PEEK(Ib+3)) 20290 Npad=FNUnchar(PEEK(Ib+4)) : Padc=FNCtl(PEEK(Ib+5)) 20300 Eol=FNUnchar(PEEK(Ib+6)) : Qctl=PEEK(Ib+7) 20310 Qbin=PEEK(Ib+8) : IF Qbin=89 Qbin=Mqbin : IF Qbin=89 Qbin=0 20315 IF Qbin<33 OR Qbin>62 AND Qbin<96 OR Qbin>126 Qbin=0 20320 IF Mchkt<>(PEEK(Ib+9)-48) Chkt=1 ELSE Chkt=Mchkt 20330 IF PEEK(Ib+10)<>Rept Rept=0 20340 IF 0 WEND 20350 N=(N+1) AND 63 20360 IF T$='Y' S$='F' ELSE S$=T$ 20370 WEND 20380 WHILE S$='F' 20390 T$=FNSendbuff$(N,'F',F$,Ib,Synk,Npad,Padc,Eol,Mt,Time,Chkt,V24) 20400 IF INSTR(1,'NY',T$) S$='D' ELSE S$=T$ 20410 N=(N+1) AND 63 20420 WEND 20430 WHILE S$='D' 20440 Eof=FNFileread(Tb,Im,Inlu) 20450 WHILE Eof=0 20460 POKE Ub,1 : WHILE FNPackbuff(Ub,Maxl-Chkt,Tb,Mqctl,Qbin,Rept) AND Eof=0 : Eof=FNFileread(Tb,Im,Inlu) : WEND 20465 Paket=Paket+1 : ; CUR(PEEK(Cu+1),38); : ; USING '#####' Paket; 20470 POKE VAROOT(Ub$)+4,PEEK(Ub)-1,0 : T$=FNSendbuff$(N,'D',Ub$,Ib,Synk,Npad,Padc,Eol,Mt,Time,Chkt,V24) 20480 N=(N+1) AND 63 20483 IF PEEK(Ib+1)>2+Chkt AND PEEK(Ib+2)=88 Eof=1 20484 IF PEEK(Ib+1)>2+Chkt AND PEEK(Ib+2)=90 Eof=1 : LET Fs=0 : F=Nfile+1 20485 IF SYS(5) D=FNEsc : IF D=1 Eof=1 ELSE IF D=2 Eof=1 : LET Fs=0 : F=Nfile+1 20490 IF T$='Y' WEND 20500 IF Eof S$='Z' ELSE S$=T$ 20510 WEND 20520 WHILE S$='Z' 20530 IF Eof=38 OR Eof=34 Ub$='' ELSE Ub$='D' 20540 Dummy=FNClose(Inlu,F$) 20550 T$=FNSendbuff$(N,'Z',Ub$,Ib,Synk,Npad,Padc,Eol,Mt,Time,Chkt,V24) 20560 IF T$='Y' S$='B' ELSE S$=T$ 20570 N=(N+1) AND 63 20575 IF Eof<>34 AND Eof<>38 AND Eof<>1 RETURN FNSendpack('E','Fel nr '+NUM$(Eof)+' vid l{sning av '+F$+'!',N,Chkt,Synk,Npad,Padc,Eol,V24)-2 20580 WEND 20590 WHILE S$='B' 20595 WHILE Fs 20600 F$=FNReaddir$ : IF Ec AND Ec<>38 GOTO 20767 20610 WHILE F$<>'' 20620 WHILE MID$(F$,14,1)='D' OR FNWild(Wc$,FNPackfilnamn$(LEFT$(F$,12)))=0 20630 F$=FNReaddir$ : IF Ec AND Ec<>38 GOTO 20767 20631 IF F$<>'' WEND 20633 WHILE F$<>'' 20635 F$=FNPackfilnamn$(LEFT$(F$,12)) 20637 ; : ; FNF$(CYA) 'S{nder:'; 20640 D=FNOpen(Enh$(1),F$,Inlu,1) 20655 IF 0 WEND 20660 IF Ec WEND 20670 IF F$<>'' AND Ec=0 S$='F' ELSE S$='C' 20675 IF 0 WEND 20676 F=F+1 20677 WHILE NOT Fs AND F<=Nfile 20678 ; : ; FNF$(CYA) 'S{nder:'; 20679 Ec=FNOpen(Enh$(F),File$(F),Inlu,1) : F$=File$(F) : S$='F' 20680 IF Ec RETURN FNSendpack('E','Fel nr '+NUM$(Ec)+' under |ppningnen av '+F$+'!',N,Chkt,Synk,Npad,Padc,Eol,V24)-2 20681 IF 0 WEND 20685 IF NOT Fs AND F>Nfile F$='' 20689 WHILE F$='' OR FNDcd 20690 T$=FNSendbuff$(N,'B','',Ib,Synk,Npad,Padc,Eol,Mt,Time,Chkt,V24) 20700 N=(N+1) AND 63 20710 IF T$='Y' S$='C' ELSE S$=T$ 20720 IF 0 WEND 20730 WEND 20732 IF S$='e' RETURN -2 20733 IF S$='E' RETURN FNFel(MID$(Ib$,3,PEEK(Ib+1)-2-Chkt))-2 20740 IF S$='C' Ec=0 : RETURN 0 20750 IF INSTR(1,'SFDZBC',S$)=0 RETURN FNSendpack('E','OK[ND pakettyp: '+S$+'!!!',N,Chkt,Synk,Npad,Padc,Eol,V24)-2 20760 WEND 20765 RETURN FNFel(Wc$+' ger ej tr{ff p} n}gon fil!')-2 20766 RETURN FNFel('Kan ej l{sa '+Enh$(1)+', '+FNDiscerror$)-2 20767 RETURN FNSendpack('E','Kan ej l{sa '+Enh$(1)+', '+FNDiscerror$,1,Chkt,Synk,Npad,Padc,Eol,V24)-2 20770 FNEND 21040 DEF FNRe(Im,Synk,Mt) LOCAL N,S$=1,T$=1,Ib$=100,Ib,Ub$=50,Buff$=254,Buff,Maxl,Time,Npad,Padc,Eol,Qctl,Qbin,Chkt,Rept,Fo$=20,Fl$=12,Wferr,F,En$=4,D 21050 Maxl=94 : Time=40 : Npad=0 : Padc=0 : Eol=13 : Qctl=0 : Chkt=1 : Rept=0 21055 Wferr=0 21060 Ib=VARPTR(Ib$) : POKE VAROOT(Ib$)+4,100,0 21061 Buff=VARPTR(Buff$) 21070 N=0 : F=0 21072 T$=' ' 21080 WHILE -1 21090 S$=FNRpack$(Ib,N,Synk,Time,Mt,Chkt,Npad,Padc,Eol,V24) 21092 WHILE Wferr 21094 Dummy=FNKillfile(Outlu,En$+Fl$) 21096 RETURN FNSendpack('E','Fel vid skrivning p} filen '+En$+Fl$+'. Fel nr '+NUM$(Wferr)+'.',N,Chkt,Synk,Npad,Padc,Eol,V24)-2 21098 WEND 21100 WHILE S$='S' 21110 IF (PEEK(Ib)<>N AND PEEK(Ib)<>((N-1) AND 63)) OR INSTR(1,' S',T$)=0 RETURN FNSendpack('E','Send-init ???',PEEK(Ib),1,Synk,Npad,Padc,Eol,V24)-2 21120 WHILE S$='S' 21130 Maxl=FNUnchar(PEEK(Ib+2)) : Time=FNUnchar(PEEK(Ib+3)) 21140 Npad=FNUnchar(PEEK(Ib+4)) : Padc=FNCtl(PEEK(Ib+5)) 21150 Eol=FNUnchar(PEEK(Ib+6)) : Qctl=PEEK(Ib+7) 21160 IF PEEK(Ib+1)<8 Qbin=0 ELSE Qbin=PEEK(Ib+8) : IF Qbin=89 Qbin=Mqbin 21165 IF Qbin<33 OR Qbin>62 AND Qbin<96 OR Qbin>126 THEN Qbin=0 21170 IF PEEK(Ib+1)<9 Chkt=1 ELSE Chkt=PEEK(Ib+9)-48 : IF Chkt<>2 Chkt=1 21180 IF PEEK(Ib+1)<10 Rept=0 ELSE Rept=PEEK(Ib+10) : IF Rept<33 OR Rept>62 AND Rept<96 OR Rept>126 Rept=0 21190 Ub$=CHR$(FNChar(75),FNChar(8),FNChar(0),FNCtl(0),FNChar(13),Qctl,Qbin OR 78 AND Qbin=0)+NUM$(Chkt) 21195 IF Rept THEN Ub$=Ub$+CHR$(Rept) ELSE Ub$=Ub$+' ' 21200 D=FNSendpack('Y',Ub$,PEEK(Ib),1,Synk,Npad,Padc,Eol,V24) 21205 N=((PEEK(Ib)+1) AND 63) 21210 IF 0 WEND 21220 IF 0 WEND 21230 WHILE S$='F' 21240 IF INSTR(1,'SZF',T$)=0 RETURN FNSendpack('E','Fil-huvud ???',N,Chkt,Synk,Npad,Padc,Eol,V24)-2 21241 IF T$='F' AND Fo$<>FNVersal$(MID$(Ib$,3,PEEK(Ib+1)-2-Chkt)) RETURN FNSendpack('E','Tv} fil-huvuden ???',N,Chkt,Synk,Npad,Padc,Eol,V24)-2 21250 WHILE S$='F' 21260 Fo$=FNVersal$(MID$(Ib$,3,PEEK(Ib+1)-2-Chkt)) : Fl$='' 21270 D=1 : WHILE D<=LEN(Fo$) 21280 WHILE (LEN(Fl$)<8 AND INSTR(1,Fl$,'.')=0) OR (LEN(Fl$)-INSTR(1,Fl$,'.'))<3 21290 IF INSTR(1,'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ][\',MID$(Fo$,D,1))<>0 Fl$=Fl$+MID$(Fo$,D,1) 21300 IF 0 WEND 21310 IF MID$(Fo$,D,1)='.' Fl$=Fl$+'.' 21320 D=D+1 : WEND 21325 En$='' : F=F+1 : IF F<=20 IF F<=Nfile AND File$(F)<>'' Fl$=File$(F) : En$=Enh$(F) 21327 ; : ; FNF$(CYA) 'Mottar:'; : Radpos=0 : Oms{ndning=0 21330 Ec=FNOpen(En$,Fl$,Outlu,2) : IF Ec RETURN FNSendpack('E','Kan ej skapa '+En$+Fl$+', fel nr '+NUM$(Ec)+'!',N,Chkt,Synk,Npad,Padc,Eol,V24)-2 21510 IF S$='F' D=FNSendpack('Y','',N,Chkt,Synk,Npad,Padc,Eol,V24) : N=((N+1) AND 63) 21520 IF 0 WEND 21521 POKE Buff,1 21530 IF 0 WEND 21600 WHILE S$='D' 21605 D=FNSendpack('Y',Esc$,N,Chkt,Synk,Npad,Padc,Eol,V24) : N=((N+1) AND 63) 21610 POKE Ib,2 21615 IF Esc$='' Paket=Paket+1 : ; CUR(PEEK(Cu+1),38); : ; USING '#####' Paket; 21620 WHILE FNUnpbuff(Ib,PEEK(Ib+1)-1-Chkt,Buff,253,Qctl,Qbin,Rept)<=0 : Ec=FNFilewrite(Buff,Im,Outlu) : IF Ec Wferr=Ec ELSE WEND 21630 Esc$='' : IF SYS(5) Dummy=FNEsc : IF Dummy=1 Esc$='X' ELSE IF Dummy=2 Esc$='Z' 21640 IF 0 WEND 21700 WHILE S$='Z' 21705 IF PEEK(Buff)>1 Ec=FNFilewrite(Buff,Im,Outlu) : IF Ec Wferr=Ec 21706 WHILE S$='Z' AND Wferr=0 21710 IF (PEEK(Ib+1)>=3+Chkt AND MID$(Ib$,3,PEEK(Ib+1)-2-Chkt)='D') OR Esc$='X' OR Esc$='Z' D=FNKillfile(Outlu,En$+Fl$) ELSE D=FNClose(Outlu,En$+Fl$) 21720 D=FNSendpack('Y','',N,Chkt,Synk,Npad,Padc,Eol,V24) : N=((N+1) AND 63) 21722 IF 0 WEND 21730 IF 0 WEND 21740 WHILE S$='B' 21741 D=FNSendpack('Y','',N,Chkt,Synk,Npad,Padc,Eol,V24) : N=((N+1) AND 63) 21750 Ec=0 : RETURN 0 21760 IF 0 WEND 21762 IF S$='e' RETURN -2 21763 IF S$='E' RETURN FNFel(MID$(Ib$,3,PEEK(Ib+1)-2-Chkt))-2 21770 IF INSTR(1,'SFDZB',S$)=0 RETURN FNSendpack('E','OK[ND pakettyp: '+S$+'!!!',N,Chkt,Synk,Npad,Padc,Eol,V24)-2 21810 T$=S$ 25000 WEND 25010 FNEND 30010 DEF FNRpack$(Buff,N,Synk,Time,Mtrye,Check,Npad,Padc,Eol,Lu) LOCAL Maxtrye,T$=1,D 30020 Maxtrye=Mtrye 30030 WHILE Maxtrye 30040 T$=FNGetpack$(Buff,Synk,Time,Check,Lu) 30045 IF T$='E' RETURN 'E' 30050 IF INSTR(1,' T',T$)=0 AND (PEEK(Buff)=N) RETURN T$ 30060 IF PEEK(Buff)=((N+1) AND 63) D=FNSendpack('E','Jag har tappat bort ett paket!!!',N,Check,Synk,Npad,Padc,Eol,Lu) : RETURN 'e' 30065 IF T$='D' Oms{ndning=Oms{ndning+1 : ; CUR(PEEK(Cu+1),50); : ; USING '#####' Oms{ndning; 30070 Maxtrye=Maxtrye-1 30080 D=FNSendpack('N','',N,Check,Synk,Npad,Padc,Eol,Lu) 30090 WEND 30100 D=FNSendpack('E','Avbryter! F|r m}nga oms{ndningar!!!',N,Check,Synk,Npad,Padc,Eol,Lu) 30110 RETURN 'e' 30120 FNEND 40030 DEF FNSendbuff$(N,Tp$,Buff$,Inbuff,Synk,Npad,Padc,Eol,Mt,Time,Check,Lu) LOCAL Nt,D,S$=1 40040 Nt=Mt 40060 WHILE Nt 40065 D=FNTom(Lu) 40070 D=FNSendpack(Tp$,Buff$,N,Check,Synk,Npad,Padc,Eol,Lu) 40080 S$=FNGetpack$(Inbuff,Synk,Time,Check,Lu) 40082 IF S$='E' RETURN 'E' 40085 IF Tp$='D' AND Nt<>Mt Oms{ndning=Oms{ndning+1 : ; CUR(PEEK(Cu+1),50); : ; USING '#####' Oms{ndning; 40090 IF S$='N' AND N IF ((PEEK(Inbuff)-1) AND 63)=N RETURN 'Y' 40100 IF S$='Y' IF PEEK(Inbuff)=N RETURN 'Y' 40110 IF INSTR(1,' TNY',S$)=0 D=FNSendpack('E','Avbryter! OK[ND pakettyp: '+S$+'!!!',N,Check,Synk,Npad,Padc,Eol,Lu) : RETURN 'e' 40120 Nt=Nt-1 40130 WEND 40135 D=FNSendpack('E','Avbryter! F|r m}nga oms{ndningar!!!',N,Check,Synk,Npad,Padc,Eol,Lu) 40140 RETURN 'e' 40150 FNEND 40220 DEF FNFilewrite(Buff,Im,Lu) LOCAL B$=0,Le 40230 POKE VAROOT(B$),253,0,Buff+1,SWAP%(Buff+1),253,0 40240 Le=PEEK(Buff)-1 40250 ON ERROR GOTO 40290 40260 IF Im PUT #Lu LEFT$(B$,Le) ELSE ; #Lu FNExpandtab$(LEFT$(B$,Le)); 40270 POKE Buff,1 40280 RETURN 0 40290 RETURN ERRCODE 40300 FNEND 40380 DEF FNUnpbuff(Inbuff,Inbuffl,Utbuff,Utbuffl,Qctl,Qbin,Rept) LOCAL A$=9 40390 A$=CHR$(Inbuff,SWAP%(Inbuff),Inbuffl,Utbuff,SWAP%(Utbuff),Utbuffl,Qctl,Qbin,Rept) 40400 RETURN CALL(VARPTR(Pack$),VARPTR(A$)) 40410 FNEND 40580 DEF FNFileread(Buff,Im,Lu) LOCAL B$=0 40590 POKE VAROOT(B$),253,0,Buff+2,SWAP%(Buff+2),253,0 40600 ON ERROR GOTO 40640 40610 IF Im GET #Lu B$ COUNT 253 ELSE INPUT LINE #Lu B$ 40620 POKE Buff,2,LEN(B$)+2 40630 RETURN 0 40640 POKE Buff,2,0 : RETURN ERRCODE 40650 FNEND 40730 DEF FNPackbuff(Buff,Buffl,Tmpb,Qctl,Qbin,Rept) LOCAL A$=9 40740 A$=CHR$(Buff,SWAP%(Buff),Buffl,Tmpb,SWAP%(Tmpb),0,Qctl,Qbin,Rept) 40750 RETURN CALL(VARPTR(Pack$)+163,VARPTR(A$)) 40760 FNEND 40950 DEF FNTom(Lu) LOCAL D,D$=50 40960 D=FNAntalintecken 40970 WHILE D 40980 IF D>50 D=50 40990 GET #Lu D$ COUNT D 41000 D=FNAntalintecken 41010 WEND 41020 RETURN 0 41030 FNEND 41080 DEF FNAntalintecken=PEEK2(V24tkn) 41150 DEF FNGetpack$(Buff,Synk,Time,Check,Lu) LOCAL D,B$=0,T$=1,P,A 41160 POKE VAROOT(B$),100,0,Buff,SWAP%(Buff),100,0 41170 IF FNAntalintecken=0 IF FNTimeout(Time) RETURN 'T' 41180 D=ASCII(FNGchr$(1,Lu)) : IF INSTR(1,CHR$(3,4,26),CHR$(D)) RETURN 'T' 41190 WHILE D<>Synk : IF FNAntalintecken=0 IF FNTimeout(Time) RETURN 'T' 41200 D=ASCII(FNGchr$(1,Lu)) : IF INSTR(1,CHR$(3,4,26),CHR$(D)) RETURN 'T' 41210 WEND 41220 IF FNAntalintecken=0 IF FNTimeout(Time) RETURN 'T' 41230 A=FNUnchar(ASCII(FNGchr$(1,Lu))) : P=1 41240 WHILE P-2A-P+2 D=A-P+2 41270 MID$(B$,P,D)=FNGchr$(D,Lu) : P=P+D 41280 WEND 41290 IF MID$(B$,2,1)<>'S' IF MID$(B$,A-Check+1,Check)<>FNCsum$(CHR$(FNChar(A))+LEFT$(B$,A-Check),Check) RETURN ' ' 41291 IF MID$(B$,2,1)='S' IF MID$(B$,A,1)<>FNCsum$(CHR$(FNChar(A))+LEFT$(B$,A-1),1) RETURN ' ' 41300 T$=MID$(B$,2,1) 41310 POKE Buff,FNUnchar(PEEK(Buff)),A 41320 RETURN T$ 41330 FNEND 41380 DEF FNGchr$(A,Lu) LOCAL B$=100,I 41390 GET #Lu B$ COUNT A 41391 IF Mqbin<>38 OR Oldprom=0 THEN RETURN B$ 41392 I=A : WHILE I 41396 MID$(B$,I,1)=CHR$(ASCII(MID$(B$,I,1)) AND 127) : I=I-1 41398 WEND 41400 RETURN B$ 41410 FNEND 41460 DEF FNTimeout(T) LOCAL D. 41470 D.=T*198. 41480 WHILE D.<>0. AND FNAntalintecken=0 : D.=D.-1. : IF FNDcd D.=0. ELSE WEND 41490 RETURN D.=0. 41500 FNEND 41550 DEF FNAntaluttecken=PEEK2(V24ut) 41600 DEF FNDcd 41610 OUT 65,16 : RETURN (INP(65) AND 8)=0 41620 FNEND 41690 DEF FNPutpack(Buff$,Npad,Padc,Lu) LOCAL P,D 41700 P=Npad 41710 D=FNAntaluttecken 41720 WHILE P AND FNDcd=0 41730 IF D>P D=P 41740 PUT #Lu STRING$(D,Padc) 41750 P=P-D : D=FNAntaluttecken 41760 WEND 41770 P=1 : WHILE P<=LEN(Buff$) AND FNDcd=0 41780 IF D>LEN(Buff$)-P+1 D=LEN(Buff$)-P+1 41790 PUT #Lu MID$(Buff$,P,D) 41800 P=P+D : D=FNAntaluttecken 41810 WEND 41820 RETURN 0 41830 FNEND 41880 DEF FNSendpack(T$,Buff$,N,Check,Synk,Npad,Padc,Eol,Lu) LOCAL D,B$=100 41890 B$=CHR$(Synk,FNChar(LEN(Buff$)+Check+2),FNChar(N))+T$+Buff$ 41900 D=FNPutpack(B$+FNCsum$(RIGHT$(B$,2),Check)+CHR$(Eol),Npad,Padc,Lu) 41910 IF T$='E' RETURN FNFel(Buff$) ELSE RETURN 0 41920 FNEND 41960 DEF FNCtl(T)=T XOR 64 41970 DEF FNChar(T)=T+32 41980 DEF FNUnchar(T)=T-32 42040 DEF FNCsum$(B$,C) LOCAL Sum 42050 IF C<>1 AND C<>2 THEN ; 'Ej implementerad typ av checksumma' : STOP 42060 Sum=CALL(VARPTR(Csum$),PEEK2(PEEK2(65304))) 42070 IF C=1 RETURN CHR$(FNChar(Sum+SWAP%(Sum AND 768) AND 63)) 42080 RETURN CHR$(FNChar(SWAP%(Sum) AND 63),FNChar(Sum AND 63)) 42090 FNEND 42460 DEF FNWild(Wc$,St$) 42470 IF LEN(St$)=0 IF LEN(Wc$)=0 OR Wc$='*' THEN RETURN -1 ELSE RETURN 0 42480 IF LEN(Wc$)=0 THEN RETURN 0 42490 IF ASCII(Wc$)=ASCII(St$) RETURN FNWild(RIGHT$(Wc$,2),RIGHT$(St$,2)) 42500 IF ASCII(Wc$)=63 THEN RETURN FNWild(RIGHT$(Wc$,2),RIGHT$(St$,2)) 42510 IF ASCII(Wc$)<>42 THEN RETURN 0 42520 IF FNWild(RIGHT$(Wc$,2),St$) RETURN -1 42530 RETURN FNWild(Wc$,RIGHT$(St$,2)) 42550 FNEND 42650 DEF FNPackfilnamn$(Fl$) LOCAL F$=12,P 42660 F$=Fl$ 42670 P=INSTR(1,F$,' ') 42680 WHILE P : F$=LEFT$(F$,P-1)+RIGHT$(F$,P+1) : P=INSTR(1,F$,' ') : WEND 42690 RETURN F$ 42700 FNEND 42800 DEF FNExpandtab$(In$) LOCAL I,Sp 42810 ON ERROR GOTO 42920 42820 Textbuff$=In$ : I=0 42830 WHILE I=0 AND Enh<=3 Enh=PEEK(PEEK2(24683))+Enh 60283 IF Enh>=12 AND Enh<=15 Adr=6 ELSE Adr=14 60284 IF Enh=30 Enh=PEEK(65529) : Ufd=-1 : Adr=PEEK2(65527)-1 60291 Ec=FNReadsec(Enh,Adr) : IF Ec RETURN -1 60292 Bitmap0$=MID$(Dosbuff$,240,16) : Adr=Adr+1 : Dirmap$=SPACE$(16) 60294 IF Ufd Bitmap1$=STRING$(16,0) ELSE Ec=FNReadsec(Enh,Adr) : IF Ec RETURN -1 60296 IF NOT Ufd Bitmap1$=MID$(Dosbuff$,240,16) : Adr=Adr+1 60300 WHILE I<16 60302 I=I+1 60304 MID$(Dirmap$,I,1)=CHR$(ASCII(MID$(Bitmap0$,I,1))-ASCII(MID$(Bitmap1$,I,1))) 60306 WEND 60308 Dirrec$='' : IF Enh>=12 AND Enh<=15 AND NOT Ufd Adr=Adr+8 60309 RETURN Adr 60310 FNEND 60340 DEF FNReaddir$ LOCAL N$=14,A 60342 ON ERROR GOTO 60380 60343 ! 60344 WHILE LEN(Dirmap$) 60346 WHILE LEN(Dirrec$) : N$=MID$(Dirrec$,5,8)+"."+MID$(Dirrec$,13,3) 60348 Dirrec$=RIGHT$(Dirrec$,17) 60349 IF ASCII(N$)>=48 AND ASCII(N$)<95 GOTO 60356 60350 WEND : A=ASCII(Dirmap$) : Dirmap$=RIGHT$(Dirmap$,2) 60352 IF A Ec=FNReadsec(Enh,Sector) : IF Ec RETURN -1 60353 Dirrec$=Dosbuff$ : Sector=Sector+1 60354 WEND : Ec=38 : RETURN '' 60355 ! 60356 IF MID$(N$,10,3)='Ufd' N$=LEFT$(N$,8)+' D' 60358 RETURN N$+SPACE$(39-LEN(N$)) 60359 ! 60380 Ec=ERRCODE : RETURN '' 60390 FNEND 60420 DEF FNOpen(Enhet$,File$,Nr,Typ) LOCAL En$=4 60430 Paket=0 : Oms{ndning=0 60460 ON ERROR GOTO 60490 60465 IF Enhet$='' En$=Enh$ ELSE En$=Enhet$ 60470 OPEN En$+File$ AS FILE Nr 60475 ; TAB(9) En$+File$ TAB(30) 'Paket:'; 60480 RETURN 0 60490 IF Typ<>2 Ec=ERRCODE : RETURN Ec 60500 IF ERRCODE<>21 Ec=ERRCODE : RETURN Ec 60510 ON ERROR GOTO 60540 60520 PREPARE En$+File$ AS FILE Nr 60525 ; TAB(9) En$+File$ TAB(30) 'Paket:'; 60530 RETURN 0 60540 Ec=ERRCODE : RETURN Ec 60550 FNEND 62650 DEF FNVersal$(In$) LOCAL Ut$=100,Pekare,V{rde 62660 IF In$='' RETURN '' 62670 Pekare=1 62680 WHILE Pekare<=LEN(In$) 62690 V{rde=ASCII(MID$(In$,Pekare,1)) 62700 IF V{rde>95 AND V{rde<127 V{rde=V{rde AND 95 62710 IF V{rde<128 Ut$=Ut$+CHR$(V{rde) 62720 Pekare=Pekare+1 62730 WEND 62740 RETURN Ut$ 62750 FNEND <<< kmain.doc >>> Luxor ABC800/ABC802/ABC806 KERMIT FACIT DTC/DTC2 KERMIT Program: Bo Kullmar (bk@kullmar.se) Lars-Goran Goransson (The first two o:s should have double-dots above them.) Mikael Lide'n Kristoffer Eriksson (ske@pkmab.se) Mikael Johansson ABC-Club All are members of the "ABC-Klubben", Stockholm, Sweden, a computer club. The name in english, is the ABC-Club. The ABC-Club was founded 1979 as a user group in Sweden for the Luxor ABC 8 bits microcomputer. Today, Nokia has taken over Luxor and Nokia sells IBM compatible PC:s. Today the club has a lot of members that use PC:s and other modern computers. The aim of the ABC-Club is today to be a user group for the old Luxor ABC computer users and PC users in Sweden. Language: ABC-BASIC II and some routines in assembler Documentation: Bo Kullmar Version: 4.11 Date: January 4, 1990 K/KMAIN ABC80X Kermit Capabilities At A Glance: Local operation: Yes Remote operation: No Transfers text files: Yes Transfers binary files: Yes Wildcard send: Yes ^X/^Y interruption: Yes, with Pf1/Pf8 Filename collision avoidance: No Can time out: Yes 8th-bit prefixing: Yes Repeat count prefixing: Yes Alternate block checks: Yes Terminal emulation: Yes, ADM3A Communication settings: Yes Transmit BREAK: No IBM mainframe communication: No Transaction logging: No Session logging: No Raw transmit: Yes Act as server: No Talk to server: No Advanced server functions: No Advanced commands for servers: No Local file management: No Command/init files: No Command macros: No Attribute packets: No Extended-length packets: No Sliding windows: No K and KMAIN are two programs that implement the Kermit file transfer protocol for the Luxor ABC800 family, i.e. Luxor ABC800, ABC802, ABC806 and Facit DTC, DTC 2. The computers uses the Zilog Z80 processor and has a proprietary operating system called ABC-DOS or UFD-DOS. The computers had a big market share in Sweden before the age of the IBM PC. They were also sold in the other nordic countries and to a lesser extent in the rest of Europe. Program Invocation The K.BAC is the start program and it chains to the main program KMAIN.BAC. K.BAC is listable and can easily be changed, though this is not the case with KMAIN.BAC because it is squeezed to reduce memory requirements. The program can be started with the BASIC command "RUN K" or by using a menu program. All the text in the program is in swedish and the program is controlled with panels and function keys. Parameters K/KMAIN first requests some communication parameters. If you just press return you will get the default values that can be seen on the screen. These default values can easily be changed by altering the start program K.BAC. The first request is for the communication speed. 300, 1200/75, 75/1200, 1200, 2400, 4800, 9600 and 19200 are supported. Split speed can only be used if the computer is switched internally for it and if it doesn't have the oldest version of the communication firmware. The second request is for the parity. Space, mark, odd and even are supported. The last request asks whether 8 or 7 data bits are to be used during Kermit file transfer. After this the main program is called and the menu is displayed. The main menu: Pf 1 Terminal mode Pf 2 Local echo in terminal mode SHIFT Pf 2 Remote echo in terminal mode Pf 3 Receive files from remote Kermit SHIFT Pf 3 Raw dumping of incoming text to a file CTRL Pf 3 Cancel dumping of incoming text to a file Pf 4 Send files to remote Kermit SHIFT Pf 4 Raw transmit of a file the remote system Pf 5 Change file type for Kermit, text or binary Pf 6 Change default device for Kermit files Pf 7 Change block check type for Kermit, 1 or 2 Pf 8 End the program and disconnect the connection SHIFT Pf 8 Hard copy to the printer. If keyboard ABC 99 or DTC 2 is used then the print function is the key that is labeled PRINT Terminal Emulation When you press Pf 1, your computer acts as a terminal connected to a remote computer. The characters you type are sent out through the port, and characters that arrive at the port are displayed on your screen, or interpreted as a cursor address for the ADM3A terminal. The Escape Key, Pf 1 The escape key, Pf 1, is used to regain the attention of K/KMAIN during terminal emulation. When you press the escape key, Pf 1, K/KMAIN displays the menu. Installation of K/KMAIN If you already have Kermit on your ABC80X, you can use it to obtain new versions of K/KMAIN by Kermit file transfer. If you do not have Kermit and there is no one from whom you can borrow a floppy disk to copy Kermit from, then try to download it on a IBM PC or IBM AT. The IBM PC/AT program ABCDISK or WABC can format a diskette for ABC800/ ABC802/ABC806 on an IBM PC or IBM AT with 5.25 " diskettes and copy files from PCDOS/MSDOS to the ABC-diskette. ABCDISK and WABC are commercial software that is sold in Sweden. Program Organization The programs are: K.BAC Startup program, semicompiled ABC-BASIC II code KMAIN.BAC Main program, semicompiled ABC-BASIC II code, squeezed Sources: K.BAS Startup program, source in a text file KMAIN.BAS Main program, source in a text file KERMPACK.ASM Source for assembler packet routines KERMCSUM.ASM Source for assembler check sum routines To change K.BAC, just load it, change it and save it. To change KMAIN, load KMAIN.BAS, change it, save it as a ".BAC"-file and squeeze it with the utility program SQUEZ. Documentation: KMAIN.DOC This text <<< kmain.hex >>> 8F006100DA444C03000036002202E1270404A71C8611860F8614DDB88601EDCEC6048016 00CEC51E800200CEC524800200CEC52A800200E1CEC630800A00CEC53E800200EDCEC644 801600E1CEC65E800A00CEC56C800200C77801CEC672807E01C72800CEC6F4812E0088C7 2700D115E38ABD06DEA9B50400CF00009E03B50A00CF00007F15BE0CDECF01006A0FB510 008A06DEA9B516009A7703C11600AFB888C11000DF8ABE09DDB52300DEB51000C11000E0 8ABE0ADEA9B52300DEB510009A2A01C11000E18AB888CF00004321B50A0094E0DDD21FB9 D083CF0100C315B9CC174D6F747461672066696C6572206D6564204B65726D6974C23000 9DB994D083CF01009C15B9CC1E4176627279742066696C7C766572667C72696E67656E20 6D656420504631B9E6D112CC29417662727974207C766572667C72696E67656E20617620 616C6C612066696C6572206D6564205046389DB98606C71400B82CC71E00B888DDB53A00 DDB54000DEA9CF01004706B54600C14600DEA98AC14C00DEA98A86BE0480F801C16C80C7 59008ABE0DDDC15200CF0200D71FB50A00C15800DEE2CF0300A22AB50A00C10A00DD8ABE 14CC094F6B2C206B6C617274CF0100C115B50A00C10A00DFA98ABE07C76400B51000C16C 80C759008ABE0EDEA9C15200CF02008C1FB50A00DDBE049BD3FEC11000E28AC14000DD8A 88BE0CCF0000E512BE05DEB51000C11000E48ABE10DDB540008606C71E00B888DEB51000 9A6501C11000E38AB888CF0000E71FB50A0094E0DDD21FB9D083CF01006714B9CC17537B 6E642066696C6572206D6564204B65726D69742020C230009DB994D083CF01004014B9CC 1E4176627279742066696C7C766572667C72696E67656E206D656420504631B9E6D112CC 29417662727974207C766572667C72696E67656E20617620616C6C612066696C6572206D 6564205046389DB98606C71400B82CC71E00B888DDB53A00DDB54000DDCF0100EC04B546 00C14600DD8AC14600DEA98A86C14C00DEA98A86BE04809700C16C80C759008ABE0DDDC1 5200CF0200761EB50A00C14600DD96BE1BCC00C15800DECC0123D10BC16500E2CF060024 1FB50A00802300C14600DF9FBE1CDECA016B0080C15800DECC0123D10BC16500E2CF0600 FF1EB50A00C10A00DD8ABE14CC094F6B2C206B6C617274CF01002A14B50A00C10A00DFA9 8ABE07C76400B51000C16C80C759008ABE0EDEA9C15200CF0200F51DB50A00DDBE049B98 FEC11000E58AC13A00DD8A88BE0CCF0000BC10BE05DEB51000C11000E68ABE08C15800AF B55800C11000E78ABE09CF00001E03B63080C11000E88ABE12C16500DE8ABE07DFB56500 8A05DEB56500C11000DE8ABE09CF00008A02B50A00C11000C764008ABE0DDEB51000CF00 000008B50A00C11000E98ABE09DEA9B51600800C00C11000CF0100EB0BB510009B86FC92 8C4B02492246020085F001C20480CC008BBE5394E9D10CB9D081CF01006F12B9CC144475 206D7D73746520737461727461206D656420C230809DCC1D4B2C20646574746120677C72 73206E75206175746F6D617469736B74219DB9860BC23080CC014B9DB99F8600C70008CD C67B00EDCDC68500C70001CDC68F00C71400B0EDCDCA016B00C71400B0E1CDCA019900DE CDC6A900C79001CDC6B3008602C6BD00D12CB82CDDB82CE5B82CC70078B82CC70078D114 B82CDDB82CE5B88602C6C700D12CB82CDDB82CDEB82CDDB82CC7F500B82CDDB82CDEB886 02C6D100D12CB82CDDB82CDFB82CDDB82CC7FA00B82CDDB82CDDB88602C7DCFFD12DDF9C B82CC6B300D12CB82CC6B300D12CD114B888E6B55200DFB5DB00E0B5E100DEB5650094E9 D10CB988DDDDD21FD086CF01005F119DCC2D4B2C204B45524D49542D70726F6772616D20 667C72204142433830302D73657269656E2C2076657273696F6E209DC25E809DB6E700E7 D119C740009CD12DE39CB5F100C7DCFFD12DD12DE793BD0DC7DCFFD12DC725009CB5F700 C7DCFFD12DE39CB5FD00C7DCFFD12DE19CB50301C12A80BE27EDD112CC1B417662727974 20696E6D61746E696E67656E206D65642053544F509DB630008A24EDD112CC1A41766272 797420696E6D61746E696E67656E206D6564205046319DB63000DEA9B52300DDB55800A0 DDB894D081CF01008C10B9CC1442656B6C616761722C2068697474617220656A20C23080 9DCC284B206F6368206B616E20647B72667C7220696E7465207374617274612070726F67 72616D6D6574219DB986088D8C6C00A126670000B601790994EDDDD21FB9D083CF010029 10B9CC314B65726D69743A207570706B6F70706C6164202D207465726D696E616C6D6F64 202D205046312074696C6C206D656E792EB99A1300C100FFC7B00490B888C100FFDE9CB5 00FF9BEAFFA0CF00002805B88D8CE4006A26DF0000B6017A05040094C71100DDD21FB9D0 83CF0100B80FB9CC195370656369666963657261207374616E64617264656E686574C230 009DB988CC00C71200DDDEDFE1D086C78A00D10C9DCF07000112CF0100990FCF01002A3D B600FFC200FFC71B00D10C8BC200FFCC008B86BE06A0C23080B99A6200C200FFCF01008A 18DEA98AB888CC0F46656C616B74696720656E68657421CF01001610B50A00CC00C71200 DDDEDFE1D086C78A00D10C9DCF07009E11CF0100360FCF0100C73CB600FFC200FFC71B00 D10C8BC200FFCC008B86BE06A0C23080B99B9BFFA0C200FFB98D8C38049924330401F92A B60469241A2BA2007909322B0A0088C15800BE12CC0A42696E7B7266696C6572B608FF8A 0FCC095465787466696C6572B608FFDDB502FF94E2DDD21FB9D083CF0100A20EB9CC0F53 74616E64617264656E6865743A20B9D086CF0100880EB9C23080B994E2C72700D21FB9D0 83CF0100740EB9CC0846696C7479703A20B9D086CF0100610EB9C208FFB994E4DDD21FB9 D083CF01004F0EB9CC0D416E67652066696C6E616D6E3AB93B88C11000E18ABE2A94C728 00D11DB9CC1F4C6F6B616C742066696C6E616D6E206265687C76657220656A20616E6765 73B988C11000E38AC77060D115DD8AC77060D115E58A86A788BE2F94C72800D11DB9CC24 4A6F6B65727465636B656E20222A22206F636820223F22206B616E20616E767B6E646173 B988CC00E5DDDEDFC74B00D086C78A00D10C9DCF07002F10CF0100C70DCF0100583BB604 FFC204FFC71B00D10C8BBE05A0DEA9B894E5DDD21FB9D086CF0100850DB9C204FFC74D00 C204FFD1109FD1129DB99ACD00C100FFDD8ADEC204FFCC013FD311DEC204FFCC012AD311 86A788B888C77060D115DD8DC77060D115E58D88BE42A0CC384A6F6B65727465636B656E 206B616E20656E6261727420616E767B6E64617320667C7220554644206F6368204C5558 2D4E455420444F5321CF0100E40DB888C204FFD110ED96BE1CA0CC12467C72206C7D6E67 742066696C6E616D6E21CF0100BF0DB888DECA016B00C204FFB388DECF0100BA16B54C00 C14C00DEA98ABE19A0CC0F46656C616B74696720656E68657421CF01008B0DB8A0DFA9B8 9B30FFC204FFCC008BBE0CDECA019900CC00B3A0DDB888C102FFDE9CB502FFDEC204FFCC 012CD311B51E019AC400C11E01B888C204FFC11E01DE9FD20DD110ED96BE1CA0CC12467C 72206C7D6E67742066696C6E616D6E21CF0100290DB888C102FFCA016B00C204FFC11E01 DE9FD20DB388C204FFC11E01DE9CD20EB604FFC102FFCF01000C16B54C00C14C00DEA98A BE19A0CC0F46656C616B74696720656E68657421CF0100DD0CB888C102FFDE9CB502FFDE C204FFCC012CD311B51E01C102FFC7140096BE2994CC1C4D61782032302066696C6E616D 6E206B616E206D6174617320696E21CF01009A0CB8A0DDB89B39FFC204FFD110ED96BE1C A0CC12467C72206C7D6E67742066696C6E616D6E21CF0100700CB888C102FFCA016B00C2 04FFB388C102FFCF01006715B54C00C14C00DEA98ABE19A0CC0F46656C616B7469672065 6E68657421CF0100380CB888C100FFBE06A0C102FFB8855600DEB506FF9A4700C106FFC1 02FF99B888C106FFCA01990080CC008BBE0CC106FFCA019900C23080B38604C106FFCA01 990080C106FFCA016B00809DB9BBDFB88606DFB888C106FFDE9CB506FF9BB6FF9FA0C102 FFB89FA0CC0546696C3A20C106FFCA019900809DC106FFCA016B00809DCC182066696E6E 7320696E7465202D20617662727974657220219DCF0100990BB88D8CD000E126CB0000B6 01912B88C785FFD12DB500FF8602C785FFB82CDDB82CDDB894E9D10CB93B88C13201C700 788ABE09C27B00B6BD008A1DC27B00C13201C7FF779FD20EC27B00C13201C700789FD20D 9DB6BD008602C1F100B82CC13801B82CC13E01B888C1F700BD128602C1F700B82CC1F700 D115C7FD0088B888DDB51600CF00007801B50A009A2E00C11600AFB888C1FD00D12DDD8D BE09CF0000D000B54B01E2D119C77F0096C13A0086BE09CF00002400B54B019BCFFF8602 C785FFB82CC100FFB82CC100FFD114B8A0DDB88D8C9600C12C910000B6017A01010088C1 3A00BE149423C15200B82CCF00009B08B93BA0DDB88A07860AC600FFBC88C12300AFBE19 94C200FFB93B88C14000BE0D9423C71E00B82CC200FFB93B88C200FFD10BC7C0008ABE09 DEA9B51600A0DDB888C10400AFBE21C200FFD10BC78200C12A8088C7D700C12A80AF8886 A78ABD08A0CF0000D50FB89423C15200B82CC200FFB93BA0DDB88D8C8D00912C880000B6 037901422D5000790988C7DCFFD12DE39CD12DB500FFC100FFC7500096BE07C75000B500 FF860A23C15200B82CC602FFBCB9C100FFB89A4000C11E80B888C202FFD110B504FF9A2D 00C104FFB8A2C202FFC104FFDED328B93DC202FFC104FFDED30FD10BC77F0088D10CB988 C104FFDE9FB504FF9BD0FF9BBDFFA0C202FFCF0100C500B88D8CBA00592CB50000B60339 2C192C790188C10400BE04816100C1F100DE9CD115B500FFC1F100D115B502FFC70078C1 00FFC75000A19CC102FF9CB504FF8603C73800B82CEBB82CC73900B82CC104FFD114B82C C73800B82CECB82CC73900B82CC104FFB82CC73800B82CE7B82CC73900B82CC76800B8A0 DDB888C1F100DE9CD115B500FFC1F100D115B502FFC77900D12DE59CD12DC100FFC75000 A19CC102FF9CB504FFC104FFC7FF7F96BE0BC104FFC700089FB504FF8084FF8D8C530121 284E0101422DB603790A6A2D04009A2D010088CF000031FFB54B01DEB502FF9A2501C102 FFC200FFD11099B888C200FFC102FFD20ED10BD10CB604FFC204FFB606FFC204FFC71B00 D10C8BBE06DEA9B56601C204FFC71E00D10C8BBE08DDDDD21FB604FFC204FFE8D10C8BBE 14C1F100DE9CD115DE9FC1F100D115D21FB604FFC204FFE9D10C8BBE34C1F100D115C1F1 00DF9CD11593BE12C1F100DE9CD115DE9CDDD21FB604FF8A14C1F100DE9CD115C1F100D1 15DE9CD21FB604FFC204FFC71A00D10C8BBE07E9D10CB604FFC16601BE29C26C01D110E0 8ABE1694C26C01C204FF9DB988CC00B66C01DDB566018A0BC26C01C204FF9DB66C01C166 01C26C01D110DF8A88BE19C204FFCC013D8EBE10C26C01B604FFCC00B66C01DDB56601C1 6601AFBE1894C204FFB93B88C14000BE0C9423C71E00B8C206FFB93B88C102FFDE9CB502 FF9BD8FEA0CF0000FBFDB88D8C5A040123550401F12DB603D1227A060100322B0A0088DD B51600C100FFDE8ABE32C2BD00B67B00C1F100DE9CD115B53E01C1F100D115B53801C104 00BE0FC77900D12DE59CD12DB532018A07C70078B53201C15800BE12CC0A42696E7B7266 696C6572B606FF8A0FCC095465787466696C6572B606FF94E9D10CB988CF0000D805B50A 009494D086CF01002406B9CC2A5066203120202020202020204B6F70706C612075707020 7465726D696E616C667C7262696E64656C7365B994D086CF0100EE05B9CC205066203220 202020202020204C6F6B616C7420656B6F206176207465636B656EB994D086CF0100C205 B9CC28534849465420506620322020496E67656E206C6F6B616C20656B6E696E67206176 207465636B656EB994D086CF01008E05B9CC305066203320202020202020204D6F747461 672066696C2066727D6E20767B72646461746F72206D6564204B65726D6974B994D086CF 01005205B9CC3353484946542050662033202044756D706120646174612074696C6C206C 6F6B616C2066696C20287574616E204B65726D697429B994D086CF01001305B9CC2A4354 524C20205066203320204176627279742064756D706E696E672074696C6C206C6F6B616C 2066696CB994D086CF0100DD04B9CC2E506620342020202020202020537B6E642066696C 2074696C6C20767B72646461746F72206D6564204B65726D6974B994D086CF0100A304B9 CC3253484946542050662034202044756D70612066696C2074696C6C20767B7264646174 6F7220287574616E204B65726D697429B994D086CF01006504B9CC315066203520202020 202020205B6E6472612066696C74797020667C72204B65726D69742C2020202020202020 6E75203D20B9D083CF01002904B9C206FFB994D086CF01001C04B9CC3150662036202020 20202020205B6E647261207374616E64617264656E68657420667C72204B65726D69742C 206E75203D20B9D083CF0100E003B9C23080B994D086CF0100D303B9CC30506620372020 2020202020205B6E64726120626C6F636B636865636B74797020667C72204B65726D6974 2C206E75203DB9D083CF01009803B9C16500B894D086CF01008B03B9CC3C506620382020 2020202020204176736C7574612070726F6772616D6D6574206F63682062727974207465 726D696E616C667C7262696E64656C73656EB994D086CF01004303B93B88C12A80DD8AC1 0400AF88A7BE1294CC0A53484946542050662038B93B8A1094CC0A5052494E5420202020 20B93B94CC3E202044756D70612062696C64736B7B726D656E2074696C6C20736B726976 61726520287B76656E20646972656B742069207465726D696E616C6D6F646529B99A7500 C102FFDD8AB894C71100DDD21FB9D083CF0100B902B9CC10567B6C6A2066756E6B74696F 6E3A2020B9E5D10CB93B88D083CF0100FD03B604FFDEC7C000C7C100C7D100C7C200C7D2 00C7C300C7E200C7D300C7C400C7C500C7C600C7C700D4DC0CC204FFD311B502FFC102FF BE06A0C102FFB89B88FF8D8C910041268C0000B601522E100094C71100DDD21FB9D083CF 01003A02B9CC17537B6E64612066696C20287574616E204B65726D697429C230009DB994 D083CF01001302B9CC0846696C6E616D6E3AB93B88CC00C71200E6DEDFEDD086C78A00D1 0C9DCF07007004CF01000802CF0100992FB600FF8517008604C200FFB9BBC71400B888DE A9B53A00A0C13A00B8A0DDB88D8C9100A1258C0000B601522E100094C71100DDD21FB9D0 83CF0100A801B9CC1744756D70612066696C20287574616E204B65726D697429C230009D B994D083CF01008101B9CC0846696C6E616D6E3AB93B88CC00C71200E6DEDFEDD086C78A 00D10C9DCF0700DE03CF01007601CF0100072FB600FF8517008605C200FFB9BBC71E00B8 88DEA9B54000A0C14000B8A0DDB88D8C8D00FA2C880000B602712E8A2E500088C2D100D1 10BE04801F008561009723C71400B82CC6D100BC88C2D100C2D100D110DE9FD20DB6D100 9F88C7DCFFD12DE19CD12DDE9FB500FFC2D100D110C100FF99BD0EC2D100B602FFCC00B6 D1008A19C2D100C100FFD20DB602FFC2D100C100FFDE9CD20EB6D100A0C202FFB988DDB5 3A008606C71400B8A0CC00B98D8C440071223F00008604C20480B9BBC15200B894E9D10C B93BA0DEA9B894CC1E4B616E20656A207C70706E61205632343A616E2120457272636F64 653A20B9D018B886088D8C5700112E52000094DEDDD21FB9D093CF01004B00B9C75000C7 7F00D213B93B94C71500DDD21FB9D093CF01003100B9C75000C77F00D213B93B94DDC716 00D21FB9C72400D112B994C2E700B994DFDDD21FB93BA0DDB88D8C1D007A06180001A22E 88C12480DD8ABE08A0C200FFB98A05A0CC00B98D8C59005A2A540001CA2EB6037A016400 7909790188DEB504FF9A3700C104FFC200FFD11099B888C200FFC104FFD20ED10BB506FF C106FFC720008DBE0DC202FFC106FFD10C9DB602FFC104FFDE9CB504FF9BC6FFA0C202FF B98D8C6700E12E620001CA2E94C71500DDD21FB9E4D10CB9D081D09D9DD0879DD0889DCF 01006AFFB9CC013CB9D08CD0899DCF01005BFFB9C200FFB9D088CF01004FFFB9CC013EB9 C74E00C200FFD1109FD112B9C78000D10CD09D9DD0879DCF01002EFFB93BA0DDB88D8C84 0081257F0001CA2EB6017A01010088C200FFCC1220204B76697474657261206D65642043 45209DCF010072FFB54B0194C71500C200FFD110C716009CD21FB93B88D081CF01004300 B602FF9A1700C202FFC71800D10C8EB888D081CF01002B00B602FF9BE6FF94C71500DDD2 1FB9D093CF0100B1FEB9C75000C77F00D213B9A0DDB88D8CC500322EC00001A22EB6037A 020100392C192C88C1F100DE9CD115B504FFC1F100D115B506FFCF0000BEF5B54B01C124 80DD8ABE1B94C200FFB9C70078C104FFC75000A19CC106FF9CD115D10CB93B94DDC73D00 D21FB9D086CF010044FEB9D029B99A1B00E2D119DD8AB894DDC73D00D21FB9D086CF0100 28FEB9D029B99BE2FF860AC602FFBC88C10400AFBE22C202FFD10BC78200C12A8088C7D7 00C12A80AF8886A78ABD09CF00006B04B54B018602C1F100B82CC106FFB82CC104FFB8A0 C202FFB98D8C5500212F500001512E9A4700DEA9B8850F008605C24480B9BBC100FFB8A0 DDB888CC26536B7269766172656E20656A20707D736C6167656E2C206B6F6E74726F6C6C 65726120212020CF01006EFEB54B019BB6FF8D8CD403922ACF0307CA2E392C192C592F89 2FA12FA22EB60AC22F6400D92F09302930790151300A0D0100120D01001A0D0A00410F88 C200FFB60EFFC106FFB512FFC108FFEC88B514FFE6CF01008E03B54B019A4803DEA9B894 C102FFC104FFD21FB9C20CFFCF01001DFDB9C20EFFB9C10AFFC20EFFD1109FC72000C73F 00C12480DD8DA7A19FD213B9C78B00D10CB9CC0120B93B88C112FFC10AFF96BE07C10AFF B512FFC20EFFD110B510FF94C102FFC104FFC112FF9CDE9FD21FB93B88C20CFFC78A00D1 0C9DCF010020FED10BB516FFDEE0E1C71B00C7C000C78100D4D50CC116FFD10CD311BE08 A0C71B00D10CB988DEC78000C7A100C7A300C7B100C7B300C7AC00C7A400C77F00D4D80C C116FFD10CD311B54B01C14B01BE22C7C100C7C400C7C600C7D400C7D600E5E6C7C200D4 D80CC14B01D20ED10BB516FFC116FFC718008ABE0ACC00B60EFFDEB512FFC108FFEC96C1 16FFEA8A86BE3BDEC7C000C7C100C7C400C7C500C7C600C7C700C7D400C7D600C7F000C7 D000EAD4DB0CC116FFD10CD311BE0FE6CF01004F02B54B01A0C20EFFB988C116FFE58ABE 27C112FFDE96BE0BC112FFDE9FB512FF8A16C108FFEC96BE0FE6CF01002102B54B01A0C2 0EFFB988C116FFE68ABE29C112FFC10AFF90BE0BC112FFDE9CB512FF8A16C108FFEC96BE 0FE6CF0100F101B54B01A0C20EFFB99A6D00C116FFC7C2008AB888C112FFC110FF99BE1D C20EFFCC01209DC112FFDE9FD20DC20EFFC112FFDE9CD20E9DB60EFFC110FFC112FF90C1 10FFDD9688BE2BC112FFC110FF9FDE8ABE18C20EFFC110FFDE9FD20DB60EFFC112FFDE9F B512FF8A09C110FFDE9CB512FFDDB516FF9B90FFC116FFC784008ABE1BC118FFDD8AA7B5 18FFE6C78000C118FFA19FCF01005801B54B01C114FFE08ABE0BC116FFC7DF0088B516FF C116FFC7C3008AC112FFC110FF9988BE35C20EFFCC01209DC112FFDE9FD20DCC01209DC2 0EFFC112FFD20E9DB60EFFC20EFFD110C10AFF96BE0CC20EFFC10AFFD20DB60EFF83BE00 9A2600C120FFC114FF99B89CB706C61AFFBCB706C61CFFBCB706C61EFFBC88C120FFDE9C B520FF9BD7FF9A8C00C116FFC21AFFD10B93C116FFC21CFFD10B9988A7DEC21EFFC116FF D10CD311DD9686A7C112FFC10AFF9988B888C110FFC112FF90BE11C20EFFC112FFC110FF 9FD1129DB60EFFC20EFFC112FFDE9FD20DC116FFD10C9DC20EFFC112FFC118FFAFA79FD2 0E9DB60EFFC20EFFD110C10AFF96BE0CC20EFFC10AFFD20DB60EFFC112FFDE9CB512FFDD B516FF9B71FF9BB5FC8EBB0233302C392C2720272C302C392C27202E2D272C2720272C7E 2C2720272C412C5D2C2720272C4A2C4A2C4A6A4E6E2C412C5D2C418D8C1E007130190001 790B88C12A80BE0C8603C72200B82CC100FFB8A0DDB88D8C78004124730000B6023A2C00 00790988E5CF0100A7FBB54B019423E5B82CE7E7E7D30CB988C70078B502FF9A4100C102 FFC7807F90B88602C600FFD12CB82CC75000B82CDDB82CC102FFB82CC102FFD114B82CC7 5000B82CDDB89423E5B8C200FFB988C102FFC750009CB502FF9BBCFF8606E5B8A0DDB88D 8C9200C1278D0000B602322E0100312E860AC600FFBC88C200FFD10BB502FFC102FFC7C0 008DC102FFC7C7008D88BE04A0DDB89494D081CF0100DEF8B9CC105C766572667C72696E 67656E20617620B93B88C102FFC7C0008ABE1D94CC15616B7475656C6C2066696C206176 62727974657321B9A0DEB894CC14616C6C612066696C657220617662727974657321B9A0 DFB88D8C6400A1305F0002E9301A268510008606C100FFB886A1C202FFB9A0DDB894EAE7 D20CB9D081CF01005CF8B9CC2F4B616E20656A20746120626F727420696E6B6F6D6D616E 64652066696C20707D206772756E642061762066656C3A20B9D018B8A0DDB88D8C560001 31510002E9301A26850A008606C100FFB8A0DDB894EAE7D20CB9D081CF0100FDF7B9CC0E 4B616E20656A2073747B6E676120B9C202FFB9CC1220707D206772756E64206176206665 6C3A20B9D018B8A0DDB88D8C3D00313138000271319931B60179048602E7D119C7FF019F B82CC100FFB888C76660C102FFD217B504FFE7D119C7EB019FD115BE05A0DEA9B8A0DDB8 8D8CBD00BA31B80000B60179098352009A3400C100FFE190B89CB705C5C301BBB706C6C9 01BC88E7D119C7EB019FD115C1C30188A7BE06A0C2C901B988C100FFDE9CB500FF9BC9FF A0CC156F6B7B6E6420747970206176206469736B66656C21B98E150013382C2027636865 636B73756D6D6166656C218E13001131362C2027647D6C6967206469736B218E1C001A36 342C2027736B6976616E20736B726976736B7964646164218E0000133132382C276C7563 6B616E207C7070656E218D8CB300C92AAE00015232B6038132D2200400C13288E7D119C7 7B009CD12DB502FFC200FFCC008BBE0AA0C76B60D12DD115B89A7900C102FFDD8DB888C1 02FFDF9CD115C102FFE09CD115C102FFE19CD115C73A00D4D40CB604FFC204FFCC04434F 4E3A8BC204FFCC044E554C3A8B86C204FFCC0350523A8B86C204FFCC045632343A8B86BE 06CC00B604FFC102FFE49CD115B506FFC204FFC200FF8BBE06A0C106FFB888C102FFD12D B502FF9B84FFA0DEA9B88D8CA300512B9E00010133B6031933D2200400C92488C100FFCA 019900CC00B388DEC100FFCA016B0080CC013AD311B502FFC102FFDD8ABE04A0DDB888C1 00FFCA016B0080C102FFD20DB604FFC204FFCF010000FFB506FFC106FFDEA98AC106FFC7 1E008AC7F7FFD12DDD8A8886BE05A0DEA9B888C100FFCA019900C204FFB388C100FFCA01 6B00C100FFCA016B0080C102FFDE9CD20EB388C106FFB53E80A0C106FFB88D8C3D000133 3800014933B601791088C740FFD12DB502FF9A1D00C102FFDF9CD115C100FF8DC102FFDD 8D88B888C102FFD12DB502FF9BE0FFA0C102FFB88D8CA000E1249B000261334933B60101 3388C11E80BE04A0DDB888C102FFCF0100A8FFB504FFC104FFDD8ABE1E94CC1753746F70 702C2066696C656E20656A207C70706E616421B9860888C100FFBE288602C104FFC71200 9CD12DE79CB82CC104FFC712009CD12DE79CD115DE9FA7E186A7DE9CB88A288602C104FF C712009CD12DE79CB82CC104FFC712009CD12DE79CD115DE9FA7C7FB0088A7DE9CB8A0DD B88D8C2A00712325000094E9D10CB9DEDDD21FB9D093CF01007FF4B9C75000C77F00D213 B9C2E700B9A0DDB88D8C0B0AC925060A0692336925A933D13301343134B6177A1401007A 1301004A34640049346234650061347A34000179349134B934E1340135293551357935A1 35C935790EF13511367A0628007904790688DDB51CFFDDB51EFFEAB520FFE5B522FFC108 FFB524FFC77E00B52AFFC76400D112B610FFC610FFD12BB512FFC618FFD12BB51AFFC614 FFD12BB516FF8602C614FFD12CB82CC76400B82CDDB82CC116FFDE9CB82CC116FFDE9CD1 14B888CC0153B60EFFDEB538FFDDB52EFFDEC200FFCC012AD311DEC200FFCC013FD31186 BE08DEA9B532FF8A05DDB532FFC200FFB634FF9ADF00C132FFB888DECA01990080CF0100 221EB5E801C1E801DD90BE0480A2089AB900DEA9B89AAD00DEA9B888CF00005A1FB634FF C14C00C14C00C726008D88BE04807D08C234FFCC008BBE048048089A4800C234FFEBDED3 0FCC01448BC200FFC234FFE9D20DCF0100A61CCF0200EF1BDD8A86B888CF0000111FB634 FFC14C00C14C00C726008D88BE04803408C234FFCC008BBE0480FF079BB5FFC234FFE9D2 0DCF01006B1CB634FF9494D086CF0100D8F2B9CC07537B6E6465723AB93B88DECA019900 80C234FFC1DB00DECF0400A31FBE049B50FFDDBE049B44FFDDBE049B1EFF9A9F00C132FF AFB89494D086CF010097F2B9CC07537B6E6465723AB93B88C138FFCA01990080C138FFCA 016B0080C1DB00DECF04005B1FB54C00C138FFCA016B0080B634FFDDB50A02C14C00BE4F A0CC0145CC0746656C206E7220C14C0082D11C9DCC1420756E646572207C70706E69676E 656E206176209DC234FF9DCC01219DDEC124FFC104FFC11CFFC11EFFC120FFC15200CF09 008919DF9FB888DDBE049B5EFF9A0D07DEA9B89A7E01C20EFFCC01538BB888C75E00CF01 00041AC122FFCF0100FC19C11CFFCF0100F419C11EFFCF0100DA19C120FFCF0100E419C1 06FFD4D60CC16C80D10C9DC108FF82D11C9DC12AFFD10C9DB614FFC12EFFCC0153C214FF C112FFC104FFC11CFFC11EFFC120FFC10AFFC122FFDEC15200CF0C005711B60CFF9ADD00 C20CFFCC01598BB888C112FFDF9CD115CF01009819B52CFFC112FFE09CD115CF01008919 B522FFC112FFE19CD115CF01007A19B51CFFC112FFE29CD115CF01004719B51EFFC112FF E39CD115CF01005C19B520FFC112FFE49CD115B526FFC112FFE59CD115B528FFC128FFC7 59008ABE14C16C80B528FFC128FFC759008ABE05DDB528FFC128FFC7210090C128FFC73E 0096C128FFC76000908886C128FFC77E009686BE05DDB528FFC108FFC112FFE69CD115C7 30009FA78DBE07DEB524FF8A07C108FFB524FFC112FFE79CD115C12AFF8DBE05DDB52AFF DDBE049B20FFC12EFFDE9CA7C73F0088B52EFFC20CFFCC01598BBE09CC0146B60EFF8A07 C20CFFB60EFF9B7FFE9A5E00C20EFFCC01468BB888C12EFFCC0146C234FFC112FFC104FF C11CFFC11EFFC120FFC10AFFC122FFC124FFC15200CF0C001710B60CFFDECC024E59C20C FFD311BE09CC0144B60EFF8A07C20CFFB60EFFC12EFFDE9CA7C73F0088B52EFF9B9FFF9A 7801C20EFFCC01448BB888C11AFFC102FFC1DB00CF03006112B530FF9A4501C130FFDD8A B88602C116FFB82CDEB89A3600C116FFC12CFFC124FF9FC11AFFC106FFC128FFC12AFFCF 0600B412C130FFDD8A88B888C11AFFC102FFC1DB00CF03001812B530FF9BC7FFC14102DE 9CB5410294C1F100DE9CD115C72600D21FB93B94B8CC052323232323B9C14102B83B8602 C614FFD12CE19CB82CC116FFD115DE9FB82CDDB888C12EFFCC0144C214FFC112FFC104FF C11CFFC11EFFC120FFC10AFFC122FFC124FFC15200CF0C001B0FB60CFFC12EFFDE9CA7C7 3F0088B52EFFC112FFDE9CD115DFC124FF9C96C112FFDF9CD115C758008A88BE05DEB530 FFC112FFDE9CD115DFC124FF9C96C112FFDF9CD115C75A008A88BE11DEB530FFDDB532FF C14600DE9CB538FFE2D119BE2DCF0000D6F5B536FFC136FFDE8ABE07DEB530FF8A18C136 FFDF8ABE11DEB530FFDDB532FFC14600DE9CB538FFC20CFFCC01598BBE049BB8FEC130FF BE09CC015AB60EFF8A07C20CFFB60EFF9B85FE9AEA00C20EFFCC015A8BB888C130FFC726 008AC130FFC722008A86BE08CC00B614FF8A07CC0144B614FFC1DB00C234FFCF020050F6 B50A00C12EFFCC015AC214FFC112FFC104FFC11CFFC11EFFC120FFC10AFFC122FFC124FF C15200CF0C000D0EB60CFFC20CFFCC01598BBE09CC0142B60EFF8A07C20CFFB60EFFC12E FFDE9CA7C73F0088B52EFFC130FFC722008DC130FFC726008D88C130FFDE8D88BE4DA0CC 0145CC0746656C206E7220C130FF82D11C9DCC1020766964206C7B736E696E6720617620 9DC234FF9DCC01219DC12EFFC124FFC104FFC11CFFC11EFFC120FFC15200CF09003115DF 9FB89B13FF9A2202C20EFFCC01428BB89AE300C132FFB888CF00009A19B634FFC14C00C1 4C00C726008D88BE0480E6029AA100C234FFCC008EB89A4500C234FFEBDED30FCC01448B C200FFC234FFE9D20DCF0100E716CF02003016DD8A86B888CF00005219B634FFC14C00C1 4C00C726008D88BE04809E02C234FFCC008EBE049BB8FF9A4600C234FFCC008EB888C234 FFE9D20DCF0100A416B634FF9494D086CF010011EDB9CC07537B6E6465723AB93B88DECA 01990080C234FFC1DB00DECF0400DC19B536FFDDBE049BB7FFC14C00BE049B5CFFC234FF CC008EC14C00DD8A88BE09CC0146B60EFF8A07CC0143B60EFFDDBE049B1AFFC138FFDE9C B538FF9AAC00C132FFAFC138FFC146009988B89494D086CF01009EECB9CC07537B6E6465 723AB93B88C138FFCA01990080C138FFCA016B0080C1DB00DECF04006219B54C00C138FF CA016B0080B634FFCC0146B60EFFC14C00BE52A0CC0145CC0746656C206E7220C14C0082 D11C9DCC1520756E646572207C70706E696E676E656E206176209DC234FF9DCC01219DC1 2EFFC124FFC104FFC11CFFC11EFFC120FFC15200CF09008B13DF9FB888DDBE049B51FFC1 32FFAFC138FFC146009688BE06CC00B634FF9A6200C234FFCC008BCF0000721286B888C1 2EFFCC0142CC00C112FFC104FFC11CFFC11EFFC120FFC10AFFC122FFC124FFC15200CF0C 008A0BB60CFFC12EFFDE9CA7C73F0088B52EFFC20CFFCC01598BBE09CC0143B60EFF8A07 C20CFFB60EFFDDBE049B9BFF9BDBFDC20EFFCC01658BBE05A0DFA9B888C20EFFCC01458B BE1DA0C210FFE0C112FFDE9CD115DF9FC124FF9FD30FCF01003BECDF9FB888C20EFFCC01 438BBE08DDB54C00A0DDB888DECC065346445A4243C20EFFD311DD8ABE3EA0CC0145CC10 4F4B5B4E442070616B65747479703A20C20EFF9DCC032121219DC12EFFC124FFC104FFC1 1CFFC11EFFC120FFC15200CF09007412DF9FB89BF0F8A0C200FFCC1B2067657220656A20 74727B666620707D206E7D676F6E2066696C219DCF0100ADEBDF9FB8A0CC0C4B616E2065 6A206C7B736120DECA019900809DCC022C209DCF000025F39DCF010084EBDF9FB8A0CC01 45CC0C4B616E20656A206C7B736120DECA019900809DCC022C209DCF0000F9F29DDEC124 FFC104FFC11CFFC11EFFC120FFC15200CF0900DF11DF9FB88D8CAA085125A508036925A9 333134B617790E7A1301007A1401004A346400493462343200422DFE00412DC935013591 34B934E134513579352935A135DA391400F2390C00093A79063A3A0400790488C75E00B5 16FFC72800B518FFDDB51AFFDDB51CFFEAB51EFFDDB520FFDEB524FFDDB526FFDDB52CFF C60CFFD12BB50EFF8602C60CFFD12CE19CB82CC76400B82CDDB888C612FFD12BB514FFDD B506FFDDB52EFFCC0120B60AFF9AFE07DEA9B888C10EFFC106FFC102FFC118FFC104FFC1 24FFC11AFFC11CFFC11EFFC15200CF0A00E107B608FF9A7600C12CFFB888C1E100C230FF C22AFF9DCF0200F6F0B50A00A0CC0145CC1B46656C2076696420736B7269766E696E6720 707D2066696C656E20C230FF9DC22AFF9DCC092E2046656C206E72209DC12CFF82D11C9D CC012E9DC106FFC124FFC102FFC11AFFC11CFFC11EFFC15200CF09009210DF9FB89B87FF 9A1602C208FFCC01538BB888C10EFFD115C106FF8DC10EFFD115C106FFDE9FA7C73F0088 A78D88A7DECC022053C20AFFD311DD8A86BE31A0CC0145CC0D53656E642D696E6974203F 3F3FC10EFFD115DEC102FFC11AFFC11CFFC11EFFC15200CF09002810DF9FB89AA901C208 FFCC01538BB888C10EFFDF9CD115CF0100BE10B516FFC10EFFE09CD115CF0100AF10B518 FFC10EFFE19CD115CF0100A010B51AFFC10EFFE29CD115CF01006D10B51CFFC10EFFE39C D115CF01008210B51EFFC10EFFE49CD115B520FFC10EFFDE9CD115E590BE07DDB522FF8A 1AC10EFFE59CD115B522FFC122FFC759008ABE07C16C80B522FFC122FFC7210090C122FF C73E0096C122FFC76000908886C122FFC77E009686BD05DDB522FFC10EFFDE9CD115E690 BE07DEB524FF8A1AC10EFFE69CD115C730009FB524FFC124FFDF8DBE05DEB524FFC10EFF DE9CD115E790BE07DDB526FF8A30C10EFFE79CD115B526FFC126FFC7210090C126FFC73E 0096C126FFC76000908886C126FFC77E009686BE05DDB526FFC74B00CF0100A20FE5CF01 009C0FDDCF0100960FDDCF01007E0FEACF01008A0FC120FFC122FFC74E00C122FFDD8A88 86D4D70CC124FF82D11C9DB610FFC126FFBD0FC210FFC126FFD10C9DB610FF8A0BC210FF CC01209DB610FFCC0159C210FFC10EFFD115DEC102FFC11AFFC11CFFC11EFFC15200CF09 00910EB532FFC10EFFD115DE9CA7C73F0088A7B506FFDDBE049B54FEDDBE049BE7FD9A95 02C208FFCC01468BB888DECC03535A46C20AFFD311DD8ABE31A0CC0145CC0D46696C2D68 75767564203F3F3FC106FFC124FFC102FFC11AFFC11CFFC11EFFC15200CF09002A0EDF9F B888C20AFFCC01468BC228FFC20CFFE0C10EFFDE9CD115DF9FC124FF9FD30FCF01003E14 8E88BE37A0CC0145CC1354767D2066696C2D6875767564656E203F3F3FC106FFC124FFC1 02FFC11AFFC11CFFC11EFFC15200CF0900CD0DDF9FB89ADD01C208FFCC01468BB888C20C FFE0C10EFFDE9CD115DF9FC124FF9FD30FCF0100E013B628FFCC00B62AFFDEB532FF9AA8 00C132FFC228FFD11099B89A7700C22AFFD110E590DEC22AFFCC012ED311DD8A88A7C22A FFD110DEC22AFFCC012ED3119FA7E09086B888DECC273031323334353637383941424344 45464748494A4B4C4D4E4F505152535455565758595A5D5B5CC228FFC132FFDED30FD311 DD8DBE11C22AFFC228FFC132FFDED30F9DB62AFFDDBE049B86FFC228FFC132FFDED30FCC 012E8BBE0BC22AFFCC012E9DB62AFFC132FFDE9CB532FF9B55FFCC00B630FFC12EFFDE9C B52EFFC12EFFC7140099BE2CC12EFFC1460099C12EFFCA016B0080CC008E88BE17C12EFF CA016B0080B62AFFC12EFFCA01990080B630FF9494D086CF01002AE5B9CC074D6F747461 723AB93B88DDB5B702DDB50A02C230FFC22AFFC1E100DFCF0400F011B54C00C14C00BE50 A0CC0145CC0D4B616E20656A20736B61706120C230FF9DC22AFF9DCC092C2066656C206E 72209DC14C0082D11C9DCC01219DC106FFC124FFC102FFC11AFFC11CFFC11EFFC15200CF 09002C0CDF9FB888C208FFCC01468BBE31CC0159CC00C106FFC124FFC102FFC11AFFC11C FFC11EFFC15200CF0900000CB532FFC106FFDE9CA7C73F0088A7B506FFDDBE049B20FE86 02C114FFB82CDEB888DDBE049B68FD9AF100C208FFCC01448BB888CC0159C2A900C106FF C124FFC102FFC11AFFC11CFFC11EFFC15200CF0900AD0BB532FFC106FFDE9CA7C73F0088 A7B506FF8602C10EFFB82CDFB888C2A900CC008BBE27C14102DE9CB5410294C1F100DE9C D115C72600D21FB93B94B8CC052323232323B9C14102B83B9A4800C10EFFC10EFFDE9CD1 15DE9FC124FF9FC114FFC7FD00C120FFC122FFC126FFCF0700D205DD99B888C114FFC100 FFC1E100CF03003705B54C00C14C00BE09C14C00B52CFF8A049BB5FFCC00B6A900E2D119 BE25CF00007DEAB50A00C10A00DE8ABE09CC0158B6A9008A0EC10A00DF8ABE07CC015AB6 A900DDBE049B0CFF9AD900C208FFCC015A8BB888C114FFD115DE96BE1DC114FFC100FFC1 E100CF0300CD04B54C00C14C00BE07C14C00B52CFF9AA200C208FFCC015A8BC12CFFDD8A 88B888C10EFFDE9CD115E0C124FF9C93C20CFFE0C10EFFDE9CD115DF9FC124FF9FD30FCC 01448B88A7C2A900CC01588B86C2A900CC015A8B86BE15C1E100C230FFC22AFF9DCF0200 61EAB532FF8A13C1E100C230FFC22AFF9DCF0200B2EAB532FFCC0159CC00C106FFC124FF C102FFC11AFFC11CFFC11EFFC15200CF0900240AB532FFC106FFDE9CA7C73F0088A7B506 FFDDBE049B5BFFDDBE049B24FF9A4600C208FFCC01428BB888CC0159CC00C106FFC124FF C102FFC11AFFC11CFFC11EFFC15200CF0900DC09B532FFC106FFDE9CA7C73F0088A7B506 FFDDB54C00A0DDB888DDBE049BB7FFC208FFCC01658BBE05A0DFA9B888C208FFCC01458B BE1DA0C20CFFE0C10EFFDE9CD115DF9FC124FF9FD30FCF0100F3E2DF9FB888DECC055346 445A42C208FFD311DD8ABE3EA0CC0145CC104F4B5B4E442070616B65747479703A20C208 FF9DCC032121219DC106FFC124FFC102FFC11AFFC11CFFC11EFFC15200CF09003E09DF9F B888C208FFB60AFF9BFFF78D8C7C01523A77010A412D790EA9330135493B793B9134B934 E134E930B603A93B7A140100790488C108FFB514FF9A0101C114FFB888C100FFC104FFC1 06FFC10AFFC112FFCF05000405B616FFC216FFCC01458BBE06A0CC0145B988DECC022054 C216FFD311DD8AC100FFD115C102FF8AA788BE06A0C216FFB988C100FFD115C102FFDE9C A7C73F0088A78ABE48CC0145CC204A6167206861722074617070617420626F7274206574 742070616B6574212121C102FFC10AFFC104FFC10CFFC10EFFC110FFC112FFCF09006408 B518FFA0CC0165B988C216FFCC01448BBE27C10A02DE9CB50A0294C1F100DE9CD115C732 00D21FB93B94B8CC052323232323B9C10A02B83B88C114FFDE9FB514FFCC014ECC00C102 FFC10AFFC104FFC10CFFC10EFFC110FFC112FFCF09000408B518FF9BFCFECC0145CC2341 766272797465722120467C72206D7D6E6761206F6D737B6E646E696E676172212121C102 FFC10AFFC104FFC10CFFC10EFFC110FFC112FFCF0900BC07B518FFA0CC0165B98D8CB601 7A38B1010C790E2A3C422D413CA9339134B934E13431340135793BE930B603793C79047A 13010088C110FFB518FF9A3701C118FFB888C116FFCF01002F03B51AFFC202FFC204FFC1 00FFC114FFC108FFC10AFFC10CFFC10EFFC116FFCF09004F07B51AFFC106FFC108FFC112 FFC114FFC116FFCF05005503B61CFFC21CFFCC01458BBE06A0CC0145B988C202FFCC0144 8BC118FFC110FF8D88BE27C10A02DE9CB50A0294C1F100DE9CD115C73200D21FB93B94B8 CC052323232323B9C10A02B83B88C21CFFCC014E8BC100FF88BE19C106FFD115DE9FA7C7 3F0088A7C100FF8ABE06A0CC0159B988C21CFFCC01598BBE11C106FFD115C100FF8ABE06 A0CC0159B988DECC0420544E59C21CFFD311DD8ABE4CCC0145CC1A417662727974657221 204F4B5B4E442070616B65747479703A20C21CFF9DCC032121219DC100FFC114FFC108FF C10AFFC10CFFC10EFFC116FFCF09005B06B51AFFA0CC0165B988C118FFDE9FB518FF9BC6 FECC0145CC2341766272797465722120467C72206D7D6E6761206F6D737B6E646E696E67 6172212121C100FFC114FFC108FFC10AFFC10CFFC10EFFC116FFCF09000506B51AFFA0CC 0165B98D8C8800F93A830003412D6925E930B6027A020000B13C8602C606FFD12CB82CC7 FD00B82CDDB82CC100FFDE9CB82CC100FFDE9CD114B82CC7FD00B82CDDB888C100FFD115 DE9FB508FF853900C102FFBE13860E23C104FFB8C206FFC108FFD20DB98A169423C104FF B8C206FFC108FFD20DCF0100ED07B93B8602C100FFB82CDEB8A0DDB8A0D018B88D8C5000 B93A4B0007413C193D593D913D51357935A135B6017A01090088C100FFC100FFD114C102 FFC104FFC104FFD114C106FFC108FFC10AFFC10CFFD4D90CB60EFFA0C67280D12BC60EFF D12BD217B88D8C8500F938800003412D6925E930B6017A0200008602C606FFD12CB82CC7 FD00B82CDDB82CC100FFDF9CB82CC100FFDF9CD114B82CC7FD00B82CDDB8853700C102FF BE13860A23C104FFB8C606FFBCB9C7FD00B88A0B9723C104FFB8C606FFBC8602C100FFB8 2CDFB82CC206FFD110DF9CB8A0DDB88602C100FFB82CDFB82CDDB8A0D018B88D8C500041 394B0006412DD13D013E51357935A135B6017A01090088C100FFC100FFD114C102FFC104 FFC104FFD114DDC106FFC108FFC10AFFD4D90CB60CFFA0C67280D12BC7A3009CC60CFFD1 2BD217B88D8C5100913C4C0001E930B60279047A04320088CF00004200B502FF9A2F00C1 02FFB888C102FFC7320096BE07C73200B502FF860A23C100FFB8C604FFBCB9C102FFB888 CF00001200B502FF9BCEFFA0DDB88D8C0D00293E080000C1FD00D12DB88C1F02EA3B1A02 05412DA9330135793BE930B60579047A0200007A140100791079018602C60CFFD12CB82C C76400B82CDDB82CC100FFB82CC100FFD114B82CC76400B82CDDB888CF0000AEFFDD8ABE 10C104FFCF01004702BE06A0CC0154B988DEC108FFCF0200BF01D10BB50AFFDEE0E1C71A 00D30CC10AFFD10CD311BE06A0CC0154B99A4800C10AFFC102FF8DB888CF000065FFDD8A BE10C104FFCF0100FE01BE06A0CC0154B988DEC108FFCF02007601D10BB50AFFDEE0E1C7 1A00D30CC10AFFD10CD311BE06A0CC0154B99BB5FFCF000025FFDD8ABE10C104FFCF0100 BE01BE06A0CC0154B988DEC108FFCF02003601D10BCF0100A303B512FFDEB510FF9A7500 C110FFDF9FC112FF90B888CF0000E7FEB50AFFC10AFFDD8ABE1AC104FFCF01007A01BE08 A0CC0154B98A09CF0000C7FEB50AFFC10AFFC112FFC110FF9FDF9C96BE0DC112FFC110FF 9FDF9CB50AFFA2C20CFFC110FFC10AFFD328B93DC10AFFC108FFCF0200BE00B988C110FF C10AFF9CB510FF9B88FFC20CFFDFDED30FCC01538EBE39C20CFFC112FFC106FF9FDE9CC1 06FFD30FC112FFCF0100EB02D10CC20CFFC112FFC106FF9FD20D9DC106FFCF0200F8028E BE06A0CC0120B988C20CFFDFDED30FCC01538BBE2DC20CFFC112FFDED30FC112FFCF0100 AD02D10CC20CFFC112FFDE9FD20D9DDECF0200BE028EBE06A0CC0120B988C20CFFDFDED3 0FB60EFF8602C100FFB82CC100FFD115CF01008802B82CC112FFB8A0C20EFFB98D8C7600 DA3E7100027901E930B6027A0264007909860A23C102FFB8C604FFBCB9C100FFB888C16C 80C726008DC11E80DD8A86BD06A0C204FFB988C100FFB506FF9A2D00C106FFB8A2C204FF C106FFDED328B93DC204FFC106FFDED30FD10BC77F0088D10CB988C106FFDE9FB506FF9B D0FFA0C204FFB98D8C4F00993E4A00017914B601780488C100FF82D68846A0B402FF9A29 00C002FFD5008CCF00003BFDDD8A88B888C002FFD5819EB402FFCF00002B00BE08D500B4 02FF8A049BD4FFA0C002FFD50089B88D8C0D00013F080000C10301D12DB88C1D00B93918 00008603C74100B82CEDB8A0C74100D116E588A7DD8AB88D8CCF00713FCA0004422D9134 B934E930B6027910790488C102FFB508FFCF0000BAFFB50AFF9A4100C108FFCF0000BAFF DD8A88B888C10AFFC108FF96BE07C108FFB50AFF860E23C106FFB8C10AFFC104FFD213B9 88C108FFC10AFF9FB508FFCF000078FFB50AFF9BBCFFDEB508FF9A5A00C108FFC200FFD1 1099CF00006BFFDD8A88B888C10AFFC200FFD110C108FF9FDE9C96BE0FC200FFD110C108 FF9FDE9CB50AFF860E23C106FFB8C200FFC108FFC10AFFD30FB988C108FFC10AFF9CB508 FFCF000016FFB50AFF9BA3FFA0DDB88D8C8C00E9378700097A14422D790E793BA9339134 B934E134E930B60279047A02640088C108FFC202FFD110C106FF9CDF9CCF01007100C104 FFCF01006900D30CC200FF9DC202FF9DB614FFC214FFC214FFDFD20EC106FFCF02006F00 9DC10EFFD10C9DC10AFFC10CFFC110FFCF0400C7FEB512FFC200FFCC01458BBE0DA0C202 FFCF0100E8D8B88A04A0DDB88D8C110059380C00017914C100FFC7400087B88C11003138 0C00017914C100FFC720009CB88C1100C1380C00017914C100FFC720009FB88C9700CA21 9200027A027903B601B13F88C102FFDE8DC102FFDF8D88BD2994CC22456A20696D706C65 6D656E74657261642074797020617620636865636B73756D6D61B9860888C6F481D12BC7 18FFD12DD12DD217B504FFC102FFDE8ABE1BA0C104FFC104FFC7000388D1149CC73F0088 CF01006EFFD10CB9A0C104FFD114C73F0088CF01005CFFC104FFC73F0088CF010050FFD2 0CB98D8CB100E136AC000292338A2E88C202FFD110DD8ABE1BC200FFD110DD8AC200FFCC 012A8B86BD07A0DEA9B88A04A0DDB888C200FFD110DD8ABD04A0DDB888C200FFD10BC202 FFD10B8ABE14A0C200FFDFD20EC202FFDFD20ECF0200ABFFB888C200FFD10BC73F008ABD 14A0C200FFDFD20EC202FFDFD20ECF02008CFFB888C200FFD10BC72A008DBD04A0DDB888 C200FFDFD20EC202FFCF02006DFFBE05A0DEA9B8A0C200FFC202FFDFD20ECF020058FFB8 8D8C59000A37540001F239B6027A060C00791088C200FFB602FFDEC202FFCC0120D311B5 04FF9A2B00C104FFB888C202FFC104FFDE9FD20DC202FFC104FFDE9CD20E9DB602FFDEC2 02FFCC0120D311B504FF9BD2FFA0C202FFB98D8CC800CA3CC30001CA2EB6027909712E85 AC00C200FFB6D100DDB502FF9A9800C102FFC2D100D11090B888C102FFDE9CB502FFC1B7 02DE9CB5B702C2D100C102FFDED30FD10BE78ABE05DDB5B7029A6400C2D100C102FFDED3 0FD10BE68AB888C1B702E5D22EB504FFE5C104FF9FB504FFC104FFE58ABE05DDB504FFC2 D100C102FFDE9FD20DDEC104FF9CD1129DC2D100C102FFDE9CD20E9DB6D100C1B702C104 FF9CB5B702C102FFC104FF9CB502FFDDBE049B99FF9B65FFA0C2D100B988D018B54C00A0 CC00B98D8C560161365101013A3AB606D23F0400014021404240100082401000790988C2 00FFB602FFC202FFCC008BBE07C23080B602FFC13E80DD93C13E80E09988BE0FC76B60D1 2DD115C13E809CB53E80C13E80E993C13E80EC9988BE07E3B504FF8A05EBB504FFC13E80 C71E008ABE18C7F9FFD115B53E80DEA9B506FFC7F7FFD12DDE9FB504FFC13E80C104FFCF 02000BDDB54C00C14C00BE05A0DEA9B888C2C700C7F000EDD30FB608FFC104FFDE9CB504 FFEDD112B68500C106FFBE0AEDDDD213B60AFF8A18C13E80C104FFCF0200CBDCB54C00C1 4C00BE05A0DEA9B888C106FFAFBE15C2C700C7F000EDD30FB60AFFC104FFDE9CB504FF9A 3700C10CFFED90B888C10CFFDE9CB50CFFA2C28500C10CFFDED328B93DC208FFC10CFFDE D30FD10BC20AFFC10CFFDED30FD10B9FD10CB99BC6FFCC00B68F00C13E80E993C13E80EC 9988C106FFAF88BE09C104FFE59CB504FFA0C104FFB88D8CE800A236E30000B6027A0E0E 00790185CC009A8A00C28500D110B89A4200C28F00D110B888C28F00E2E5D30FCB012E9D C28F00EAE0D30F9DB600FFC28F00C71100D20EB68F00C200FFD10BC7300093C200FFD10B C75F009088BE04804D009BBBFFC28500D10BB502FFC28500DFD20EB68500C102FFBE18C1 3E80C1E801CF0200C1DBB54C00C14C00BE05A0DEA9B888C2C700B68F00C1E801DE9CB5E8 019B73FFC72600B54C00A0CC00B988C200FFE7E0D30FCC035566648BBE13C200FFE5D20D CC062020202020449DB600FFA0C200FFC72700C200FFD1109FD1129DB988D018B54C00A0 CC00B98D8CC9006937C40004D23F1A26C140D940B6013A3A040088DDB54102DDB50A0285 4600C200FFCC008BBE09C23080B608FF8A07C200FFB608FF8604C208FFC202FF9DB9BBC1 04FFB894E6D11DB9C208FFC202FF9DB9C71E00D11DB9CC0650616B65743AB93BA0DDB888 C106FFDF8DBE0BD018B54C00A0C14C00B888D018C715008DBE0BD018B54C00A0C14C00B8 8530008605C208FFC202FF9DB9BBC104FFB894E6D11DB9C208FFC202FF9DB9C71E00D11D B9CC0650616B65743AB93BA0DDB888D018B54C00A0C14C00B88D8C0000222A7D0001CA2E B603C22F6400F940314188C200FFCC008BBE05A0CC00B988DEB504FF9A5300C104FFC200 FFD11099B888C200FFC104FFDED30FD10BB506FFC106FFC75F0096C106FFC77F009088BE 0BC106FFC75F0088B506FFC106FFC7800090BE0DC202FFC106FFD10C9DB602FFC104FFDE 9CB504FF9BAAFFA0C202FFB98D870100000000FFFBFF048002001E800100248001002A80 0100308002003E800100448002005E8002006C80010072800200F4810200040001000A00 0100100001001600010023000100300002003A00010040000100460001004C0001005200 010058000100650001006B0006007B000200850002008F00020099000600A9000200B300 0200BD000200C7000200D1000200DB000100E1000100E7000200F1000100F7000100FD00 0100030101001E01010032010100380101003E0101004B010100660101006C010200C301 0100C9010200E80101000A02010041020100B702010002FFC106FFD10C9DB602FFC104FF DE9CB504FF9BAAFFA0C202FFB98D870100000000FFFBFF048002001E800100248001002A 800100308002003E800100448002005E8002006C80010072800200F4810200040001000A 000100100001001600010023000100300002003A00010040000100460001004C000100