From 95e63856902fea3d82c3e871cd5782ae98a07fd9 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Wed, 3 Jul 2024 02:03:49 +1000 Subject: [PATCH] beta 3 --- src/bios/exp/EXP.asm | 2 +- src/bios/exp/EXTENDED/FDD_DRIVER_2.asm | 265 +++++++++----------- src/bios/exp/EXTENDED/IDE/CD_DRV.ASM | 5 +- src/bios/exp/EXTENDED/IDE/HDD_DRV.ASM | 10 +- src/bios/exp/EXTENDED/IDE/shared.asm | 6 +- src/bios/exp/EXTENDED/RAM_DISK_DRIVER_1.asm | 2 +- src/bios/exp/FUNC_RAM_ROM_DRV.ASM | 16 +- src/bios/shared/DEFINES.INC | 3 + src/bios/shared/RECOVERY.IMG | Bin 98304 -> 98304 bytes 9 files changed, 147 insertions(+), 162 deletions(-) diff --git a/src/bios/exp/EXP.asm b/src/bios/exp/EXP.asm index 245bc47..ef22a44 100644 --- a/src/bios/exp/EXP.asm +++ b/src/bios/exp/EXP.asm @@ -216,7 +216,7 @@ ID_Version: DW BIOS_ver_hex ID_SPRINTER: DB 'Firmware v' .BIOS_ver: DB BIOS_ver_string,' ' IF BETA_BUILD - DB 'BETA 2' + DB BETA_str_ver ELSE DB '[',BUILD_DATE,']' ENDIF diff --git a/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm b/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm index d5d72d5..2be27bf 100644 --- a/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm +++ b/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm @@ -26,40 +26,39 @@ FDD_5x_GETMED: ;!TEST FDD 720/1440 IF FDD_NormalCount - LD IY,FDD_INI_TABLE.FDD_0 - DEC A - JR C,.getParams - LD IY,FDD_INI_TABLE.FDD_1 + LD IY,FDD_INI_TABLE.FDD_0 + DEC A + JR C,.getParams + LD IY,FDD_INI_TABLE.FDD_1 .getParams: ENDIF - - IN A,(SLOT3) - EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A + IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A ;!TEST FDD 720/1440 IF FDD_NormalCount - LD L,(IY+1) ;SECTORS - LD H,(IY+2) ;HEADS - LD E,(IY+3) ;CYLINDL - LD D,(IY+4) ;CYLINDH - LD A,(IY+5) ;B_P_S low - LD XL,A - LD A,(IY+6) ;B_P_S High - LD XH,A - LD A,(IY+0) ;F144/720 + LD L,(IY+1) ;SECTORS + LD H,(IY+2) ;HEADS + LD E,(IY+3) ;CYLINDL + LD D,(IY+4) ;CYLINDH + LD A,(IY+5) ;B_P_S low + LD XL,A + LD A,(IY+6) ;B_P_S High + LD XH,A + LD A,(IY+0) ;F144/720 ELSE - LD HL,(FDD_INI_TABLE.FDD_0.SECTORS) - LD DE,(FDD_INI_TABLE.FDD_0.CYLINDL) - LD IX,(FDD_INI_TABLE.FDD_0.BytesPerSector) - LD A,(FDD_INI_TABLE.FDD_0.F144) + LD HL,(FDD_INI_TABLE.FDD_0.SECTORS) + LD DE,(FDD_INI_TABLE.FDD_0.CYLINDL) + LD IX,(FDD_INI_TABLE.FDD_0.BytesPerSector) + LD A,(FDD_INI_TABLE.FDD_0.F144) ENDIF - LD B,A - EX AF,AF' - OUT (SLOT3),A - EX AF,AF' - AND A - RET + LD B,A + EX AF,AF' + OUT (SLOT3),A + ;EX AF,AF' + AND A + RET ;[]===========================================================[] ;Function: Set Current Media Parameters @@ -149,9 +148,9 @@ FDD_5x_RESET: CALL SAVE_INTERRUPTS.switch_off XOR A OUT (FDC_93.Track),A IN A,(FDC_93.Command) - LD C,A + ;LD C,A CALL SET_DOS_OFF - LD A,C + ;LD A,C AND A JP SAVE_INTERRUPTS.restore ;RET @@ -164,7 +163,7 @@ FDD_5x_RESET: CALL SAVE_INTERRUPTS.switch_off OUT (FDC_93.DrvCTRL),A CALL SET_DOS_OFF ; CF=1 - LD A,4 ;NOT READY /NO DISK/ + LD A,BIOS.Error.NotReady ;POP AF JP SAVE_INTERRUPTS.restore @@ -208,7 +207,7 @@ FDD_5x_LONG_READ: PUSH BC CALL SET_DOS_ON CALL S_FDD - CALL SPEED + CALL SET_SPEED CALL NTRACK POP BC EX DE,HL @@ -233,7 +232,7 @@ FDD_5x_LONG_READ: PUSH BC PUSH HL CALL READ_SECTOR - JP C,ERRDOS + JR C,ERRDOS LD D,YH LD E,YL POP HL @@ -256,7 +255,7 @@ FDD_5x_LONG_READ: LD A,C INC E CP E - JP NZ,.NINC_T + JR NZ,.NINC_T LD E,0 INC D .NINC_T: DJNZ .DSK_LP @@ -353,7 +352,7 @@ FDD_5x_LONG_WRITE: PUSH BC CALL SET_DOS_ON CALL S_FDD - CALL SPEED + CALL SET_SPEED CALL NTRACK POP BC EX DE,HL @@ -378,7 +377,7 @@ FDD_5x_LONG_WRITE: PUSH BC PUSH HL CALL WR_SEC - JP C,ERRDOS + JR C,ERRDOS LD D,YH LD E,YL POP HL @@ -401,7 +400,7 @@ FDD_5x_LONG_WRITE: LD A,C INC E CP E - JP NZ,.NINC_T2 + JR NZ,.NINC_T2 LD E,0 INC D .NINC_T2: DJNZ .DSK_LP2 @@ -441,9 +440,10 @@ READ_SECTOR: LD D,5 ;RETRY COUNT EX AF,AF' LD A,XH OUT (SLOT3),A - LD B,4 + ; + LD B,4 ; счётчик LD C,FDC_93.Data - LD A,#80 ;COMMAND READ + LD A,#80 ;!HARDCODE COMMAND READ OUT (FDC_93.Command),A .FDR001: IN A,(FDC_93.DrvCTRL) ;WAIT INTRQ or DRQ AND #C0 @@ -472,7 +472,7 @@ READ_SECTOR: LD D,5 ;RETRY COUNT ;R01 ; JP C,ERRRD ;READ ERROR ; !TEST 29/06/2024 ;JP C,.ERR_XRD - JP NC,.NO_ERR_XRD + JR NC,.NO_ERR_XRD DEC D JR Z,.RSTOP JR .RRETRY @@ -482,7 +482,7 @@ READ_SECTOR: LD D,5 ;RETRY COUNT RET Z BIT 2,C JR NZ,.ERDATA - LD A,5 ;SEEK ERROR + LD A,BIOS.Error.Seek DEC D JR Z,.RSTOP PUSH DE @@ -494,7 +494,7 @@ READ_SECTOR: LD D,5 ;RETRY COUNT ; .ERDATA: DEC D ; POTERIA DANNYH JR NZ,.RRETRY -.ERRRD: LD A,9 ;READ ERROR +.ERRRD: LD A,BIOS.Error.Read .RSTOP: EX AF,AF' LD A,#D0 OUT (FDC_93.Command),A ;STOP OPERATION @@ -502,7 +502,7 @@ READ_SECTOR: LD D,5 ;RETRY COUNT BIT 0,C SCF RET Z - LD A,6 ;SECTOR NOT FOUND /NO DISK/ + LD A,BIOS.Error.SectorNotFound RET ; ; ; @@ -554,18 +554,17 @@ WR_SEC: LD D,5 ;RETRY COUNT IN A,(FDC_93.Command) LD C,A ;R01 - JP C,.ERR_XWR -; JP C,ERRWR ;WRITE ERROR + JR C,.ERR_XWR AND #7F RET Z BIT 6,C - LD A,8 ;WRITE PROTECT + LD A,BIOS.Error.WriteProtect JR NZ,.WSTOP BIT 2,C JR NZ,.EWDATA - LD A,5 ;SEEK ERROR + LD A,BIOS.Error.Seek DEC D - JP Z,.WSTOP + JR Z,.WSTOP .ERR_XWR: PUSH DE CALL RESWG ; RESET_WG @@ -576,7 +575,7 @@ WR_SEC: LD D,5 ;RETRY COUNT .EWDATA: DEC D ; POTERIA DANNYH JR NZ,.WRETRY -.ERRWR: LD A,10 ;WRITE ERROR +.ERRWR: LD A,BIOS.Error.Write .WSTOP: EX AF,AF' LD A,#D0 OUT (FDC_93.Command),A ;STOP OPERATION @@ -584,7 +583,7 @@ WR_SEC: LD D,5 ;RETRY COUNT BIT 0,C SCF RET Z - LD A,6 ;SECTOR NOT FOUND /NO DISK/ + LD A,BIOS.Error.SectorNotFound RET @@ -605,21 +604,6 @@ SET_DOS_OFF: OUT (SYS_PORT.ROM),A ; - CLOSE EX AF,AF' RET -; - -; -FDD.SET720: - LD A,FDD_Density.SET_720 - OUT (FDD_Density),A - RET -; - -; -FDD.SET1440: - LD A,FDD_Density.SET_1440 - OUT (FDD_Density),A - RET -; ; S_FDD: PUSH BC @@ -656,85 +640,81 @@ S_FDD: PUSH BC ; ; -TURNSPD: - IN A,(SLOT3) - EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,(FDD_INI_TABLE.FDD_0.F144) - XOR #80 - LD (FDD_INI_TABLE.FDD_0.F144),A - AND #80 - EX AF,AF' - OUT (SLOT3),A - EX AF,AF' - JP Z,FDD.SET720 - JP FDD.SET1440 ;NZ +CHANGE_SPEED: IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,(FDD_INI_TABLE.FDD_0.F144) + XOR #80 + LD (FDD_INI_TABLE.FDD_0.F144),A + AND #80 + EX AF,AF' + OUT (SLOT3),A + EX AF,AF' + JR Z,FDD.SET720 + ;JP FDD.SET1440 ;ZF=0 +FDD.SET1440: LD A,FDD_Density.SET_1440 + OUT (FDD_Density),A + RET ; - -; -SPEED: IN A,(SLOT3) - EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,(FDD_INI_TABLE.FDD_0.F144) - AND #80 - EX AF,AF' - OUT (SLOT3),A - EX AF,AF' - JP Z,FDD.SET720 - JP FDD.SET1440 ;NZ ; +SET_SPEED: IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,(FDD_INI_TABLE.FDD_0.F144) + AND #80 + EX AF,AF' + OUT (SLOT3),A + EX AF,AF' + JR NZ,FDD.SET1440 + ;JR FDD.SET720 ;ZF=1 +FDD.SET720: LD A,FDD_Density.SET_720 + OUT (FDD_Density),A + RET ; прерывания должны быть отключены -DISK_ID: - ;DI - EXX - CALL SPEED - IN A,(FDC_93.Track) - OUT (FDC_93.Data),A - LD A,#18 ;!TODO выписать комманды ВГ ;SEARCH ; !HARDCODE - CALL EXECOM - LD C,4 -.ID_LP0: - LD A,#C0 - OUT (FDC_93.Command),A - LD HL,#F000 -.ID_LP1: - IN A,(FDC_93.DrvCTRL) - AND #C0 - JR Z,.ID_LP4 -.ID_LP2: - IN A,(FDC_93.Data) -.ID_LP3: - IN A,(FDC_93.DrvCTRL) - AND #C0 - JR Z,.ID_LP3 - JP P,.ID_LP2 - EXX - IN A,(SLOT3) - EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,(FDD_INI_TABLE.FDD_0.F144) - EX AF,AF' - OUT (SLOT3),A - EX AF,AF' - AND #80 - ;EI - RET -.ID_LP4: - DEC HL - LD A,H - OR L - JP NZ,.ID_LP1 - CALL TURNSPD - DEC C - JP NZ,.ID_LP0 - EXX - SCF - ;EI - RET +DISK_ID: EXX + CALL SET_SPEED + IN A,(FDC_93.Track) + OUT (FDC_93.Data),A + LD A,#18 ;!TODO выписать комманды ВГ ;SEARCH ; !HARDCODE + CALL EXECOM + LD C,4 ; счётчик +.loop_reg_C: LD A,#C0 + OUT (FDC_93.Command),A + LD HL,#F000 ; счётчик +.loop_reg_HL: IN A,(FDC_93.DrvCTRL) + AND #C0 + JR Z,.ID_LP4 + ; +.ID_LP2: IN A,(FDC_93.Data) +.ID_LP3: IN A,(FDC_93.DrvCTRL) + AND #C0 + JR Z,.ID_LP3 + JP P,.ID_LP2 + EXX + IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,(FDD_INI_TABLE.FDD_0.F144) + EX AF,AF' + OUT (SLOT3),A + EX AF,AF' + AND #80 + RET + ; +.ID_LP4: DEC HL + LD A,H + OR L + JR NZ,.loop_reg_HL + CALL CHANGE_SPEED + DEC C + JR NZ,.loop_reg_C + EXX + SCF + RET ; ; @@ -793,16 +773,17 @@ P50ms: LD A,12 ; RESWG: LD A,8 EXECOM: OUT (FDC_93.Command),A - LD HL,#0000 + LD HL,#0000 ; счётчик .WREST: DEC HL LD A,H OR L SCF RET Z + ; IN A,(FDC_93.DrvCTRL) AND #80 JR Z,.WREST - AND A + ;AND A RET ; diff --git a/src/bios/exp/EXTENDED/IDE/CD_DRV.ASM b/src/bios/exp/EXTENDED/IDE/CD_DRV.ASM index 95301d1..cf5edb6 100644 --- a/src/bios/exp/EXTENDED/IDE/CD_DRV.ASM +++ b/src/bios/exp/EXTENDED/IDE/CD_DRV.ASM @@ -1,5 +1,5 @@ ;[ ] 18/12/2023. добавление/допиливание API CD-ROM (ATAPI) - +;██████████████████████████████████████████████████████████████████████████ ;CD ROM DRIVE DRIVER ;--------------------------------------------------------------- ;Rev Date Name Description @@ -156,6 +156,7 @@ TRAY_FN: ;----------------------------------------------------------------------; ; INPUT: HL - AP paket (12bytes) ; RETURN: CF - ERROR +; !TODO CD ERRORS to INCLUDES ; #01 - RECOVERED ERROR ; #02 - NOT READY ; #03 - MEDIUM ERROR @@ -284,7 +285,7 @@ AP_COM: EXX IN A,(C) AND #02 ;CP #02 - JP NZ,.FROM_CD + JR NZ,.FROM_CD ;.TO_CD: LD BC,IDE.Read.Data .WR_T_CD: diff --git a/src/bios/exp/EXTENDED/IDE/HDD_DRV.ASM b/src/bios/exp/EXTENDED/IDE/HDD_DRV.ASM index 43ddb30..47d1c9f 100644 --- a/src/bios/exp/EXTENDED/IDE/HDD_DRV.ASM +++ b/src/bios/exp/EXTENDED/IDE/HDD_DRV.ASM @@ -112,10 +112,10 @@ HDD_5x_GETMED: LD E,(IY+IDE.HDD_INIT_TABLE.CylinderNumberLow) LD D,(IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh) LD B,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) - LD IX,512 + LD IX,512 ;!HARDCODE sector size EX AF,AF' OUT (SLOT3),A - EX AF,AF' + ;EX AF,AF' AND A RET ;[]================================================================[#58] @@ -144,7 +144,7 @@ HDD_5x_SETMED: LD (IY+IDE.HDD_INIT_TABLE.DRV_Flags),B EX AF,AF' OUT (SLOT3),A - EX AF,AF' + ;EX AF,AF' AND A RET ;[]================================================================[#59] @@ -184,7 +184,7 @@ HDD_5x_LONG_READ: PUSH HL CALL RDS000 EX DE,HL - JP C,HERRRD0 + JR C,HERRRD0 LD A,XH EX AF,AF' POP HL @@ -645,7 +645,7 @@ WAITPRT: DEC L JR NZ,.loop ; -.error: LD A,BIOS.Error.WaitPort +.error: LD A,BIOS.Error.NotReady SCF RET .ok: POP HL diff --git a/src/bios/exp/EXTENDED/IDE/shared.asm b/src/bios/exp/EXTENDED/IDE/shared.asm index 5cbcabc..9715cc6 100644 --- a/src/bios/exp/EXTENDED/IDE/shared.asm +++ b/src/bios/exp/EXTENDED/IDE/shared.asm @@ -18,7 +18,7 @@ SELECT_DRIVE: LD IY,IDE.INIT_TBL_IDE3 ; JR Z,.channel - LD A,BIOS.Error.BadDrvNumber + LD A,BIOS.Error.BadNumber SCF RET ; @@ -46,7 +46,7 @@ SELECT_DRIVE: CP C EXX SCF - LD A,BIOS.Error.BadDrvNumber + LD A,BIOS.Error.BadNumber RET NZ ; LD A,B @@ -96,5 +96,5 @@ DRV_DETECT: OUT (C),B RET Z SCF -.error: LD A,BIOS.Error.BadDrvNumber +.error: LD A,BIOS.Error.BadNumber RET \ No newline at end of file diff --git a/src/bios/exp/EXTENDED/RAM_DISK_DRIVER_1.asm b/src/bios/exp/EXTENDED/RAM_DISK_DRIVER_1.asm index deb1421..6c3afe0 100644 --- a/src/bios/exp/EXTENDED/RAM_DISK_DRIVER_1.asm +++ b/src/bios/exp/EXTENDED/RAM_DISK_DRIVER_1.asm @@ -53,7 +53,7 @@ RMD_5x_GETMED: JR NC,.loop ; CF==1, A==0 - ошибка, A==#FF - ok INC A - RET NZ ; если выходит, то с фдагами CF==1, ZF==1 + RET NZ ; если выходит, то с флагами CF==1, ZF==1 LD E,B LD B,C diff --git a/src/bios/exp/FUNC_RAM_ROM_DRV.ASM b/src/bios/exp/FUNC_RAM_ROM_DRV.ASM index d85fb65..a5c09fc 100644 --- a/src/bios/exp/FUNC_RAM_ROM_DRV.ASM +++ b/src/bios/exp/FUNC_RAM_ROM_DRV.ASM @@ -19,7 +19,7 @@ EMM.GetMemSize: JR NZ,.loop INC C JR .loop -.exit: LD HL,#100 +.exit: LD HL,#100 ;!HARDCODE max mem pages LD A,B LD B,0 OUT (SLOT1),A @@ -31,7 +31,7 @@ EMM.GetMemSize: ; стеком, там может быть SP в режиме спектрума ; -;----------------------------------------------------------------------; !FIXIT SAFE_RGADR + +;----------------------------------------------------------------------; ; Инициализация распределения памяти. EMM.InitMem: PUSH BC @@ -116,7 +116,7 @@ RESERVED_PAGES: ; -;----------------------------------------------------------------------; !FIXIT SAFE_RGADR + +;----------------------------------------------------------------------; ; Получить блок памяти N bytes, ; Вход: B - число необходимых блоков ; Выход: L,A - КЛЮЧ RAM-Disk/код ошибки @@ -262,7 +262,7 @@ EMM_F3M_L1: EMM_FN3M_ERR: EX AF,AF' OUT (SLOT3),A - LD A,2 ;!HARDCODE error code + LD A,BIOS.Error.BadNumber SCF RET ;----------------------------------------------------------------------; @@ -956,7 +956,7 @@ GET_RAMD_ST: ; -;----------------------------------------------------------------------; !FIXIT SAFE_RGADR + +;----------------------------------------------------------------------; ; RAM-Disk A, BLK - B BLK_TO_RAMD: CP SYS_PAGE.RAMD_KEYS.NUM @@ -1000,7 +1000,7 @@ BLK_BUSY: ; -;----------------------------------------------------------------------; !FIXIT SAFE_RGADR + +;----------------------------------------------------------------------; ; RAM-Disk A RAMD_CLEAR: CP SYS_PAGE.RAMD_KEYS.NUM @@ -1035,7 +1035,7 @@ RAMD_CLEAR: ; -;----------------------------------------------------------------------; !FIXIT SAFE_RGADR + +;----------------------------------------------------------------------; ; разделить блок памяти на два блока ; A - блок, B - длина первого блока после разделения ; выход: A - блок 1, B - блок 2 @@ -1073,7 +1073,7 @@ EMM.DivMemBlocks: ; -;----------------------------------------------------------------------; !FIXIT SAFE_RGADR + +;----------------------------------------------------------------------; ; слить два блока памяти в один ; А - блок 1, B - блок 2 ; выход: А - блок diff --git a/src/bios/shared/DEFINES.INC b/src/bios/shared/DEFINES.INC index 150ba86..6c248da 100644 --- a/src/bios/shared/DEFINES.INC +++ b/src/bios/shared/DEFINES.INC @@ -1,6 +1,9 @@ ; ;---------[All shared defines]---------- DEFINE BETA_BUILD 1 ; добавляет строку и сообщение о тестовой сборке на стартовом экране + IF BETA_BUILD + DEFINE BETA_str_ver 'BETA 3' + ENDIF DEFINE PACKED_MAIN 0 ; паковать MAIN или влезает без этого? DEFINE SP2000_Loader_Flag #0107 DEFINE IDE_Optimization 1 ; слегка оптимизирует некоторые процедуры работы с HDD diff --git a/src/bios/shared/RECOVERY.IMG b/src/bios/shared/RECOVERY.IMG index acdef4c1ec381a2d079106e0e12ba89d4b403ff8..bcb37708e64d36ba85acfd1c5e198f793c705804 100755 GIT binary patch delta 10137 zcmeHtdt4J|*6<9MkdTmMKqHp|GZWD;C?=U2Vk%Jtq)Gt`R#CKGdO_<}tF?;7f?7dM zYq5Ro+6#y_Ds8vBQE7{9_qE29T}GU0>asAnsT;fTwVRGx-oCV}Ht?PaUe^Bg{(j%@ z`@Vlx$;@*(&w0){&$&G3BwMz~wrr8@apJqsr{}Y$I2@lX`Qp6>0y~w&1%kB0!9U#~ zR=w;<3i$lYD-LnCSmk#3lEkXd9pXZOx_EieK78S_Z5N`vM$+LB%VD*DWci&r$B@pN zMB4aQ&|0r9VoL)`nLjq-+Xj?3KcoF5{s~_1cF>p!g(ih(W6!r)+ z(*Q8GUpEd>U$NWxgvOu{6aer~%7!0Y7pB^^c&J|7WXEOc;wBr8iuq~u;_U>9`I3yd z-iv>;wKEX#Ol)9w>?9s}Uo6i#)#;;(&@kgK2KWF>Lckr{8~(d9P6{{!L?Nz$I3_=9tffw=T*x#AF7=r-It+ zGR(HmQKm5B31acSM(N!)qu3i1%fAt4cmZ!&u7PkCZPIj4?N05MC3mN2z6zqebLsPr zH4bgDj+L|u@aiyuc^O)J99J|3c~O`l?R5}^03u~RY80zF8u?}0eZV0I*lsrOf`iBS z_Zr$bAs~1=@u6Xb6;HA4N6TcRroIu@(YHWH-5m3}!^a?pSnLM$pF4aCaiMLOW5^6t zlaWB*pf3=BBP4e1l#Yr&kB-Tb@Rf)>Kap*9;3OsgONsY)B|oMK;OK0L*I*aqgaoTX-> zce5+;nFyaW3h!vwOdF&4~P*^^?o7$Q^bY`m9hLT^vCE|);52UhjJ(41o|p>JpL29kvn0s zf4n`C3zT*8b(GuRw~1e??c?8}jWdTLb52p?OoYsYE8(Prc5I^_$70v&wLkNPsLHON z{FAZI(@EN6rf~sS?C<0K>3uv5@||QKe~Ieiv&RCaK97HVpoiZ}dHsC>{wLIK&sO24 zBK75qm&H6eH4ce(CSiYe-zK>?^sFJYE;BSYw3w2a5HoE`#&R~ak)alv9@WnaJv%P6 zZalSgq&+sYE<@hNna>maZnSfn0pE>|O{1cBXWMWS>YYa7d(l6qrH=>tF)U2K9g9x@ zmGvon^lR}{ya^u#OxXxie1f!>eflJP99lhH7Xix~r;krKY_nj4{CT~*uZANI+Y%#* z!|2rX`zFYYgE~1cGkTZw=%U~~sEfGO!@@n8`p0w9oC11Co|jdxFs>Pgl@$1vW@aif z3reJC(3j-)d)qi7CXxc`aLh+tjcMb2fliRqhDibS;5lplfKI0V>D<7eE{0Drx;Me5 zDMsi;jr1aQj4Ja2UB?(DwMqq@+%F`?4L z(99&ha8esL$fryi=;;LM{Vi`Sei$ic(D#RxWPrQp9ABr6f}{%kEJL4U=Pv#^1HU_y zFJ(rQ11*`6SYMd!_V#o>t6v8i5*5~vcgIprizOQ;WA$sbKkEs?6vRhMYGldQOT&ur zFdWt`MHnQMr)=1%p=^WJWhPB#%4AM9nNv)677kpv9Gts2!GhtR0w6rr>I}>a!V&)r~8;>lfaNB@Nbgq3S%njlu%XDGA-pq zPv%cnT{lRf(fC`R-{VJZ`Q#W7Bj2ujzWvN%T~DZv0ki5qrsLgF%!^_`4bbJ zKgw_j?iaURxXi~)aH~PZ0R|90P>`PdhitDM>)_y&ebl{xXng^LJ5g)F{DLRhjxS1? z0gkqepY-{tfPoEv*?(DW2s6Y?IV(|Qa zWGl>=bMFpeQV6Gov5ax|U)7060l(LOFCG37g8KjltVS#k1bxeWt0atn$mT=HRYP-h$5%xx40h#;ORu@!9vO9_CIKpUaDEy(rfChu}tJ0?coom7!@w@Sj{m* z1emqc(qTxToNS$VU?`Wo4)S-*q5#tevyvGn>xwsnw&;g)4P!bCD&9XSK0*6^O?*NQ zXU~mKaK$HZ(vxta?`PFig^_fSH~6XP_Q*cwcWH?qm_JAZ+=LFZeUQeV8r`3j3UXut zF;Q44mfMM((^;u@+;=k49uIS3)o<9^8sdL^jeCPr%#J)Z+W1+gZSb78lP-vMwH++rC$?ZN*hxB6<|CGfPVE7Wr<_x4 zN7xQBl3z~oHxhh)4j?nY((qyI8L-z3Sd}!Q2u{R4^a4on*h4lrF&x9;OvPiT0-afH zgwraPzrdF!y8WK-(?XOM&Z)#Cozt`uN$|@`(!s}UE&1Z99UXF24U_~L;CYW!#M^@f+#0#IyE%@0*&SD zAM(u3DFYk~eVX${IY}KO)6&4T8~^61My}FiaO!7Dmw+ZQWm9I|f`(Y=`6NCZ8KrQ4 z*ycGIUpKUfRPjAjS9sWyPwMN2Y+WD%7&9m(8A*#zk}1@YDZ~-VkNm7^RL%)cKg*EQQ^N;W9ii zcBF&h(YM_W5DJ=GJ!hH}$=;olo;J?po9kOFQwEcVrWqnnlF9l6?SD%{aP|=S0(0~d zWbDIfAgj!WGvJuY9ya4g(6)#3>zA5d_>fs>`sl+T7oujG>N?17}L+ zz0d@i3%%ULzc6-CP9}v#Mvi5wS(s&3!s|8wg`Fa>=`Jugu|ksp!GL2nfu?U{ZMCe7 zJYmF(B*w8*>gY?-B-oVX3X8zd?#7rlIl#buB2{wJwOTO;sV=Q^KQ zZsj_h1#+DY;0yj}5i8cSwswp8Sr*bARc;bsfQ*M;%ic|THnIX;C*3d|>@Sm^4=s@N z#6r$h;@7rr3nWbp1LCXN zz)DHeDrl`|?@5}%VixG9S&$O-cZLe>I!UDf7N1sjHS1+Vnq|2&#SCJAU1rtv_;&BL{jRN#DHpqRR^LFj?uFX6X{Yz z7ToUPX7A$ohiPVqRjk@&#n-J9XOPw)k+)1NCyiq9OEA3K%6~fE7%dxqa89L|-wL}O zWX0kpt5{t1sx)O)h!v#g)*E;a9K&2RVZ{19AqjoU6H_DT4b^PI_N= zVs}#aech=Ze!M*nV%(^(%3pZIz+N{9J%d27(8EtONQCdp^a}%i;VY#9?suMnv34A8 zdqHqR5H^Gv#X+VNWzS2gzit?c&FK=JZx@cYli$MT0&Ff!1!_2Xpa<>%;J!8=7QmGq zIy_Y{Bnk2kL$V%f6_J8o2xl%J3ISx{^$T7?NG@a!{$uVb?ef>-eNNw+Vc zC=e9j53ZboHwb@l|1391zV(`!j1z)kW`lw~w(nF>;=Vj+kLCD_hQ7N;5*U<@Vx-RU zyDZ2gsDBK@`9LW2k60JSb0~R!2EH9lpFg?iN%lifR8Fkg26j`mofUfEKVS^gB-}+S z1lk6BMlciPB>s0K|ie(bvp|NLiGtEOVFk=Q1wP zW0UTAOBrtv?1GmuV$~{kB+5$qJ3GuC9<3!KWF$B>a9fxB+}*7Q`K6MEalA+|;pOyx z21+y%F|ZAx#h_NB%C~J`&AS0}{d%@-lUV*WW{vAOJtiwiY2j{Xtt|xq=nGrRDz=kP z&2op^YgsU7Qpv0VqX7FUH&leNlDRhUG7$y~1D@%Yc}XDa*<2w21sx&K8D#b|5*oiW z3PlQl@^jFiTv%T(3sO*Fl zf3W7&B1ktR482+2Fjry~U|!DVLD;fZxtXESVikDmyd-T1w)8@Yq@$~ddYP^Hby2BN zCc_%bI=X@*`V;4g2ogCFkm|?TwwQ(@jQ3M6j=o{$zeV$wOvK+t+m|dgmYOeI-bCR8>dtdiwCUou zjpjd^ZBZt(8IwX%)SWOznayAexDt(8YKL-A#nL5(gd7Ui9u~tWIZit;{$0%WCf3He z%x_|pQcd5F!_zWMsML5IIi|-M97i_AN7PbL@h)e z%f_mbwTil_IbBq;mQbSqTxQ9Jb2!C>}hzeczia# zu)Y29PjTq1ev-t;qoyYp%+SQZp>sj}{YS27#2JPtyE2CxR9Bv}GJ&4WNRq?;!7+={(L+6qkKv5Aqa8Vi90hFK5OCA5Jv3c z?88t90?!P8GQ5+Il)KfBc;w()q*nQz*1S8d3TWY9V#EziXHCyJZ-+sd5TD|PY&OC3 zUW_}+u026sp>Ak`An5Mg7uvY)8d4DzedcV8eGG7No0~Rq#v0(|l>7xg5)D@ymfg_o z*ji@Cb{56{xRmSOL{3x186J)^Y>qqgu{`d~m+3^dTLh&!_xKK~7)ufY2O zMVvtyXMkQa^!6#FO}al(#hv*GK2HInsJJs{(9RXM`oF8hs_#@k@b*}jxleU-Kn^7d zzY8j1fgbtb4{%fHQ}G8CcgC3!c-!|Xsah83p`l;#oeDtt-n*+irL^`1b7b6Rb5vZh z3={Kjs%A^CkV>#c#zAr478M8bRpi!_KL>Ce2j-^*x?u8 zzl2T&=pcXt(lvmxS}eY)S|ApOR1ZTmaNXqS0U+-O6&UFtG=7pA!_dIvpm7~~Osw>@ zW8L*!R{yQa{Eni#{`Bft`X6xN`!B`CUB2pzmwjvOb9r^F zSUjvc@ZQD=bz(6dci_FmUk_~~qofe$qm*$YOp5t2abo_LiU-B~=r|zH%qf6%F<%iU zky!ic65|-LV96bUAfF-0N%T7)fyShd@w=B5?6? z^~GIlzOgU5aJg1~ku(2ZaRmpb0ymK9?va=-7AxX>%j9Blbeuvgj)}XlODJdpRW4S6 zbjyu0WFp8{FAi!JiMUC-Cp^f${Hh9!EwOMpo)%$DdsvV|J79d zTh#O`L&atV@JB$}-=J`DQnNmSzh~^?<)Vwb;3Ckg;?JqvHQ;P7?Bbx=#_?9=dH!Q1 zm{i9pP}*C%%G*)w)BpL}>M^>?7GgmQlmIMHe53Mg^wk#okXeZ)uAWS3Tlp0`60fP* zUTV>{nk%QyuGqmlxAJ?p@*B26!=^zmt{#`6ajNrs2ZNNxspnU19WcU;uzFkfPv+`v zAxhaA;N1;gN{PN)y-=mxuTJY#NAyB*8W&kxrb;Tc%BHd)y^ zQ@?TK|A{XBM(xiW5T9I@01KXZ)~e7Ppi>(;4AY=v&(6-&9Oy8}N>z$n@`0Tay6m zPy7Z7!8u(;b@A{88T$QmqiKz^sDu12hl6!caI;O@p-$+ng)ek5SkLkOJ1H&t;W-nn zX{{^LcfuLE;gI%pSz~gG?4)|zxv-YBLZL~6W^TyTYg$W-^oot*3<7wI*d?(9%nV~t z4~^;|uSeIIHR!bsj_G5X3ucvLu3s1CKUjt}G)u2+>}>O#ytxlze{C))z^u*Xg{9c4 z=7Pe9u!YU#1=y_SS*0_}u)?=13g==pTC|bMAJbe?ETIX*=9Lrzcwu>7MWM8yM4Fh@ z{9xfjbFe=(&nqmim{nGaUD{h%IcqLd#jIy%1SSdQS@iAPB#@3YKDzv_)5RUQF znhM3$mOtmIaZpjD+q49)Y~QeHdR)v^#W$7t*w^j<(YP)d;EV^?MQIKaUFgWcg8SZW z;ZJULnNPHE{(zS_(GpJ1UGdbBy~Mjn_RhMv$`=0Ty%ZjSx8uYL)bLIwU~s+jNKDwa zK!udf8F(csbxy!npjv17o$)_8=fHTzAreCO%tP#oFuYCU>@ZZqiQ$DC zWlIOCpx%6oXhQx&qobM*0cAH1jguRleES~z)M+mSF~p@ zzoEzF7;pknGoDz{A|8YB)5+x+)dQ!COBly=5CUV>oh8BpA~InvyD0JE$x$%{{54afB)p<-#VAAWUb(O2etcH4 z#!2-z<1_JaltyHuM6+x+>jcaT9 zu=XOW6ZR&|_JnoYnkJQE944ij@+RJl(oaZ^ubI$p( zkj!^`zxR7@-}`>=H`%^jwtc&7UkhG~%EQtpZ?}KA?4v{V1a>}-^ZMxRcK)e)v9!(} z=XHCSop$jFv9#UpjuT5y+r>oyb?wH0b?EX9OD$632J?2iXoK0F;pvaY?1M4pIMTxJ ztY4~|NBzf8|K%GF(dH4#%I7Z=IDT_I8aF=~zuxvbejTrEx6`NX_yzpB(Ncf8jz3XH zeZ9Sp-?5WY?C4|K?A519rC55xPGM6;n<2Sl!@@jXFYni<$j$V% zBY?shWF+eW#`5ciLF!Ysj#o7J1fKwaf5q$XIxbJKYH@$9SY^d!Nn(`+M+JN~UA&VZ zF?XB+*SYX7cXWEa9lCmE+iqg+??hYX`A#>Lg^uyoDIkgU;qIrEZV!-b!L}2%4ftIA zdcU*0ilZ=$-f5@z*d4~*b`ak17yw=Gqo`fPQ>Z6|u07CD-mh7B{YTW6riQ^geT=;U z$Tc?EnY|5kogK$8v2=gK){~@4EO@7(3J{8=Ee&FEgWd8q(`rEeDb9sQDB z%-v@f3+xS*t=+`P;ZLCq^D+Axs!!|XX^ts<;xxnezQS4=X54F6&@bDi6`Sn0alI@l zHR;oa7wJYj)7StDSD(Ic_(kSWgIMr(L#NjvmhQICX9DZyXX(RIed1c5_B$D7*=sLU z81N{uU~hv|woWT>`9#~7;xrfFEzHsrE%{Xu-BY>~y5qY?MSSXcv2t3056!t0Kd-f6 zaJxBKvMs)EewJBlPn8I6+(_Xuks)2p~-6_YGp{9~$`iJKew}h}LQ})`H40 z{!o1@CwK){Cq6i&Fyo^vP3Zik5mR0cSSrY3k&|Qg*xd|>rl1|rpSHUd;v!3}eb5M$ zlfgjafZOW@!v;jYQ1C#W1gx148 z`XBGY5NQ{ll*h=z>PNU21YzkYK@%6K)7ZbaWoZgXa#99i%D|U~ZxN4E3oLZwWb0yM z(_~|l1-4TWOHD%Wr7yrIA$-CJ{N1*g3BL*s`r6R8!+28;CHmE4h&`v5b@J~; zI{O^Q#e$bvK`hwE3Lhm#EdLe#GV2qd*arpkJewvkTUZ001`t)OWh>jtfgNw~MTy5b zD{kD&QbCvl+(>?*kYCs-bPD_}G%0HmUWe9Y(Ie*>j0GBtv?QNPQcaWjh!KWRstFy< z8joY>)2y-hP4s=%xJf-@t-+kPu#>N$oSwcaeuK7;KSCR33>f+Or0aIT`&sc9S z-$c1QeO~@1YO|)R?ilhlH?G|fbL3Ps60Jyks@#9j6DQjjdo}2@oID;n+mN?x7;zHE7>IeBKkHv zX)Mr>VFCKBSY#9!vRmP%8zU(^10MlQS+I=AC}}P0)CqVrT0b==2&Oko9UIkTF<}FI zkIvaw$q`MK*kA%S)zs1B1||%|$oYW@u4TP3Ay5v)1U+bBftE~j?~*j8fEJSHq}6^q zp?nNBYr1=RYN{f2`Yh?`bH_P7u2znaC4isAam-EK3Tx%u-cFFy>Iq)Wz$J5Te~e7? z&87ZhwPU(is1|k^b4S{uy!n#0jn303SY~zqb>l_f<|Z-h>p>=!pR%>F0i?$NjWHkW7I$ z>-(hL@8DPI`RY_Yiy1Z!v}{^z?ZkAatG9Ebt^zD1Bw!)$B~y(iQ#wwD>o#cb>j*5v zheu0hWJ=db-HJdrDC>bC3=qom7VP|Bx?bxrMr0VZ8Ae5hF&xzQU?N0KU&)dv6NdjQ zE*=L5!hf6wTVlZL_VUUnX;`hMT^~*$gy*JA4KTv5rGCN71Do7W_c4kLfr-cfuO~UQ z0H*v-3Dp8xrllIu)47vWxAan|H2lHs>F7bNx#UO?Bi|PDLfge9F}?m82Da7J6ES=q z`XVBA`h`zM zIy<|~ddk}iu^Hk)53=N?%=!5W0aA!Y6Jr|bym~7}JP!C>o}bgvGcEwt2QaW}M4Q*= zUg=&ZVLYAA{~bB9}M~>XW)0TZRYGb2B~$QDo--0q;Rxcs3&Rc%I~PuRd;&3f0VXshBb| znfdyW_3&?xGAJD4iOLiDAlTN8rgnW4)yUR}hX>(M0P?rbqyW>gnej{`>xeXhwde-3 z^dsB#D!ykzWR&(!Wn@$)XU&R?azsXP(vxUJcV z+(Zm!IhM$ukG`6g0CHpjF_E`Gv{{MF3uy^f+6`4?Kqi8wImV=D578-egsV^7#(_q1x#p3 z!HigB;_DKv+xGz%8I667`!xk-#SI%mBVwQ2 z22wonqy;pFV>swkJaOLJnbt})nnl|-es-+W({U%!PYr>dW@Siv%AO?&e#NXL@G(1P zeYCcSJxhjlYJ#sj^|4h08vMHR>Uz>r#Ln-ngy73(rnt;12&JvuU{Ge4bp$s6V;|^~ zUKkw8)Ke0KjkLsQpz=9Xir9~HjE$4~Iq3Qz^CKHcogfnv!L=K{>X?Tdv*W?3U!1)R zEQu+cJo5oG#KMlVk%7o4h5IH;$GOOw!NsJC@1?o|-5t54u4d5E1tNexy;72qH2EAk zirPP!*pH4ClC_PKJ3L9}x?;sgqa1idh&9%1@q|^I$ywkSU_5Wx%eHrccOsApeAf{8 zF3M)38%@-T9J%GgH$6n37#raEA| ziNz5q5DYkG4OsfqtYs}LBhMJ{e2H=Fye9OzGzfc2a)tS@(SD3Et#W{Y^Mt=9-v9n6 z|NA5S??=ly>A>)N8yy6)xMUkuTh1!zh?Lf0f}(~AihoGZFg-vC=HUBdeo4hXL(ukz zWXJ+!@HzBVek>$T%sz9gXuH6TwX~WB?_A}^GR-C$&UA-N#;q)K*hDX4>7}eAzpz%! zUCfHP%i+6*HLiv||DI_$^*Ljz3bfxhiN#N`mLn$PN*1yoRaP9#gyct>^e_o}8m2$X zN~gwOCP6JGNP@y43A)IQg*50}AEZXcwZQW_mXXewwd}(*=ynQS&NA4;FPJ;3!Hp9dW^DT^cWn&I=!NeKQ&fIKhJJEMM`9Bkvtk*%o^vi%xbpG#{{VT zdBU`oeULC6HvK$dlDQzL^A=Q7l2E&mrNIyuu+*PS0%RGm`iG|2b<|LVH8S=K%LgXN zoEQeARl1s$GN(mQdy4&8<`j^sKrd$LIxP>QAJL52%h{$iS&ewwA%u*?M$ zUCmmJfScaPt`$FS&p&M_GChtndu1z(I;2PJp+wcAVX!cQ1-l0wYT(x;h9~+3vI&5Hu7(~C@{^`_y54aot4C3eO0Av6Bm|7bv3%zaB2g^bng{d!T?-z33UW;_BD`Z?g z*cbdjs#v;+9S*9J{XP+34-eInK{6727_Hl zC#7~rbw?(BdNs}GUgusZ`7!D04*Viqh`8y&XxJ~1_F4?y&R+gcBHiVzLWO6{_~VtY=0gG@A^14W6(C$J9b6R+ z8q9%6WG;0wgVACsxZ#{Qtsjjm<&FOamq6cI;8J$o8gE|xki`E6pN3Fa(46V~FPIJB zihGFbr|fP*mrA$d;izEoxI*dr25Z%a`s1?5A6)+TG0tHP<@jaknO)#)1BHJJ#>v7p zL()MMfcG^@V6<;BGsd>00`Le-2KgTZOqCrhx5tk>=GTGjND7I@ko@gbSgd#EnP~- zd}zQmO$4Rpj~FP72y%8Jb0q=KF}uAV}WTmhz0jAj3q; z!O?#+@_ndm*?8QJ_Ags*$TD8OQAORkqv^av{ljprZj14Kqvfu_XvCzbbN5jsq9`M5 zBwUSBmRs>Cv}*Y>eUu!or#n~-qvSYk$N2X!%NtlL=PDp-m^67b+POkUjSBxZ1fLN^j0@|r4B%OS zlhcw`30fm{FA9FxO)1g*m5a5?NM0@%bB_ewj3|_8iTkKy<@m65T7R4y@PD)N1-PiI zcxoQL7;#VKz*D*ES$I~hdIDeE_R*>jaA?#%P2#EO@Y4&Y6JelW&WHbQ?#&2snm)v; z%;W|%3oe<*d3&qJV5wQ;{pqvH%H?v!U$9Z~7uv{s@?{W&JpJ-Y88+*gbyt##kkE^N3A2s_ zULNw(Do!g0ZqCcM@u5hwM!({I#I7BMR%~~E_`T&^cNLkfQtOM<`fByXGjjFC9{7GP zSL;*MdKzd~s4v#Q_a5}_gEC8@)+^O|X#ECSZz!Ziy3eZA7u(_c3?K?oU;G3eSYxUE zyGks*t-8xk4R;u?s($E~!n-8e2d~yKQjz(`C292c6obgXcymB z0Vps0IJ;9yOSc(A)zwCsx7Mvby zs5y*KtM7`(9UhnS2Uy`3;J<`U0B9e81JZIpStb_vRSU&}AypChe#Z|SeHX|ZP{Ee` z1}fi461oBfYcJkG!mq~TZWOkb!L`V^HoMlRG9FcQ*IsxoobHDc z+&>i8UUHXRyWuXkmhjqeu>e;e{_U1=HDW<9RAOHntRq9D7X)rftsZ7l%vGqx+#bc_ zVs4lk$TM~;fORofsg_9G`sy;nNOAhIM*=}^MFROl;qbU$RSH5e#7v(Ba)KHS7(&(i z%V~uqIQo4c=&Ztf?MB(Pm&(7iF1~zYtNa>gJg2ycgA0Kp#Z>2TkQNJ+YWE7cSP-UG zhy@Du<(K4QaS|$6HyJmg`gIFxzgF=RKsI+&nOs1*cOb%dZzW^mK(#(*Km}H7&_M~! zjsfLXAQ*a}VU~-fAYGe5#@v+#ncHAV{lk-^;^^Bj`8#QH4;0Yi9?rb2GKYz!pbi-M zMn#9h5c30C@yrz5hko;nzPLsK{1K40?@~CVmrz7)5dX8jYd7+*y#zs1Q1LF6vl3kE z<(D|9wsO2h*~6bv!j@`34@UdIR{5zY?%97wT4hAz`jIgu&BWYhNaIa#fkx$6=&zcs zgT^p4e*Gj$b%r~6 zY|-)ScJv$Im{(TU{f)7#&QFCM^777l7Zry7vVM^&>^GXkE1IAyaKZ5vnpoZ+680P7 zCQ5xSHT|n*O~WOt6|ciDiKSC^X>3=dseX^YCb+)bfG2}D*6A#d?JCUgbP!6k{keCe z!wylqUW6MjTt9Iz=wic8&f@_0`q+j9T!|KLpz$zNyK^=Qf%Z%ENR*1BYQsbYkNZ zsmjCcdf9B1B8&Xq#}Udy{GS`T#DatdO8GWeXZ(~xM?RQq3Q(K8X&TT}w#ky9e0#Ra z0hhAkahKD}Bs73E0PL*k9uU0}o!gWbrhJ>{c0fJ+dA4>>i&Ve3ivT@9WlswcAE>Af z;Zw0I4z74%aY^2+^t=Umx@cX<54Ai#QJzl6)&%&z>JNO<*y{`h<}t!&9}C;y(w!92J$vt;km zL|xemFKIED&+%7xQz~@#`3zcls3u?62|9FwlJ<3(!?NrXU?8ch~>RioL7P+qQzUN+^B=I z3M4cE*qm8;0G?;dDbAB7%#sH34nCgu6*!8Bo1v5*q<4v}_X@!L) z*c0gdmZxwPO0F!#>iRUHlWB6EpXc@o`7U(NOGssXIU5f#Itbk zr6Yivb6|umnuIG?ckiLVL+m*UJ(iN@c2YsT@g}hcd5%Vh>^TaQeSdU}d|V6P_PQH% ztbb==1Wb#+^6AC{{mha#-P9(u@15weCC&KlA>O%zSp{7?n|V#0W$l~Hnl}aJ={Na> zuMu@;+oIvD^Bvv(xho%2WiOAK*Dq=S^cbwbd zo*nC+5l6lBCjaUiCJahqC;E?LF?ds(><^#gv%Yytv-k=KtGC%<{H)n{2!ZFy(G00N ztBhOU0vGnzX5+VSQNvIe{{}J}saKi^;0`49Q|>6#3@_RyIAU`(2Zx6#sGJJ0B|Aub zBvqW9RmAV+0>#%2N(wrgq|Vq2QnJ?_-94h9di7diMLHJSj9zvmE(mB@(%?BVJn-%b zw3e0z+WLI=o{pv+J|X}hDR7k3#r>pX^e;O!Kj}Dm{NHdz`(C(sz20Z}1pVzq(xgA{ z1%HsGk1_svFVneKEa3Ml=+3=qL@?Nlt&e)^*Tlk?@zHPtY{`5PVv}@CB-&BdNdx{4 zT7S|q;zxk~ABX>VlEORD7bod>SZpqSi8=iW+$RFUOio9%?}cyzIO5xqiS}2hGp~T+ zIZOL1(uO;O3fpFe8qMhjQ(JS}gt&kHwB(;ZE&1n9Oa2dk;Duht$AnjuR}87c=TxlT z*!G2M&T`~bWWV~X>Hopc&w#o$sw;%@2zV6mhJ^Bfb|O9%FF8;&5uZ6i*+PAG5TAhu zV%%p3!P!&F1OGA+PnrgyaRw&MfIc|Ez)PNc++EF~OSnJi(%sGfOTV3Ke|-|Z=869V DZVnZ?