From 634baaed02de0dcd11921de34a20ed9d7c4a9414 Mon Sep 17 00:00:00 2001 From: RocketRobz Date: Thu, 12 Oct 2023 16:50:43 -0600 Subject: [PATCH] Add more changes by @nibbles27 --- Makefile | 2 +- README.TXT | 17 ++++- arm9/source/arm9main.c | 2 +- arm9/source/cart.s | 8 +- arm9/source/mappers/map159.s | 67 +++++++++++++++++ arm9/source/mappers/map4.s | 5 +- arm9/source/mappers/map42.s | 59 +++++++++++++++ arm9/source/mappers/map67.s | 1 + arm9/source/mappers/map910.s | 141 +++++++++++++++++------------------ arm9/source/ppu.s | 72 +----------------- icon.bmp | Bin 630 -> 2102 bytes 11 files changed, 226 insertions(+), 148 deletions(-) create mode 100644 arm9/source/mappers/map159.s create mode 100644 arm9/source/mappers/map42.s diff --git a/Makefile b/Makefile index ac612b5..b011228 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ export LIBFAT := $(DEVKITARM)/libfat export LIBFILESYSTEM := $(DEVKITARM)/libfilesystem export GAME_TITLE := nesDS -export GAME_SUBTITLE1 := Version 1.3c+ +export GAME_SUBTITLE1 := Version 1.3d+ export GAME_SUBTITLE2 := Enjoy yourself! export GAME_ICON := $(CURDIR)/icon.bmp export TARGET := nesDS diff --git a/README.TXT b/README.TXT index cd96d40..a2da08a 100644 --- a/README.TXT +++ b/README.TXT @@ -1,11 +1,24 @@ -nesDS1.3c [NTR], using toolchain devkitARM r43 (/release folder NesDS.nds binary was compiled with it). -master branch is the one and only branch that uses fully libnds sources. (for TGDS support I won't add support as of now, too busy right now) +nesDS1.3d+ [NTR], using toolchain devkitARM latest. We spent a few weeks to port the original nesDS project to the GCC toolchain. Then we made a new EX Edition, and made it possible to emulate the the NES/FC games that the origianl nesDS didn't work well. Since the 0.40 version, I ported the code of EX Edtion to the original nesDS, now it is the best nes-emulator~! If you found any bug on nesDS, just tell me. Maybe I could fix it. +09-30-2023 +nibbles27: + + - Also updated to include map 159 for DBZ 2 and 3 translations, please set from 16 to 159 for these two titles with iNES Header Editor - https://www.romhacking.net/utilities/1352/ + +09-15-2023 +nibbles27: + - Restored Debug menu so as to not break Mapper 4 games to a crash (like Dragon Warrior 1) + - Restored bad Punch Out hack from PNES-9.98 + +08-01-2023 +nibbles27: + - Added Screen selection presets, 14 different Palettes, and Restored Gamma selection (5 levels) + 08-14-2018 coto: - nifi, sound, touchscreen works in NTR mode as of devkitARM r43. diff --git a/arm9/source/arm9main.c b/arm9/source/arm9main.c index e9e4198..aa14c6f 100644 --- a/arm9/source/arm9main.c +++ b/arm9/source/arm9main.c @@ -25,7 +25,7 @@ void do_romebd() void showversion() { memset((void *)(SUB_BG),0,64*3); - consoletext(64*2-32," nesDS 1.3c ________________________________",0); + consoletext(64*2-32," nesDS 1.3d+________________________________",0); } /***************************** diff --git a/arm9/source/cart.s b/arm9/source/cart.s index b161f0f..6159de2 100644 --- a/arm9/source/cart.s +++ b/arm9/source/cart.s @@ -45,6 +45,7 @@ mappertbl: .word 33,mapper33init .word 34,mapper34init .word 40,mapper40init + .word 42,mapper42init .word 64,mapper64init .word 65,mapper65init .word 66,mapper66init @@ -74,10 +75,14 @@ mappertbl: .word 99,mapper99init .word 105,mapper105init .word 118,mapper118init - .word 119,mapper4init + .word 119,mapper119init + .word 140,mapper66init .word 151,mapper151init .word 152,mapper152init + .word 153,mapper16init + .word 157,mapper16init .word 158,mapper64init + .word 159,mapper159init .word 163,mapper163init .word 180,mapper180init .word 184,mapper184init @@ -95,6 +100,7 @@ mappertbl: .word 240,mapper240init .word 245,mapper245init .word 246,mapper246init + .word 249,mapper249init .word 252,mapper252init .word 253,mapper253init .word 255,mapper255init diff --git a/arm9/source/mappers/map159.s b/arm9/source/mappers/map159.s new file mode 100644 index 0000000..f27d9bc --- /dev/null +++ b/arm9/source/mappers/map159.s @@ -0,0 +1,67 @@ +@--------------------------------------------------------------------------------- +.section .text,"ax" +@--------------------------------------------------------------------------------- + #include "equates.h" + #include "6502mac.h" +@--------------------------------------------------------------------------------- + .global mapper159init + + counter = mapperdata+0 + latch = mapperdata+4 + enable = mapperdata+8 +@---------------------------------------------------------------------------- +mapper159init:@ Bandai +@---------------------------------------------------------------------------- + .word write0,write0,write0,write0 + + ldrb_ r1,cartflags @get cartflags + bic r1,r1,#SRAM @don't use SRAM on this mapper + strb_ r1,cartflags @set cartflags + ldr r1,mapper159init + str_ r1,writemem_tbl+12 + + ldr r0,=hook + str_ r0,scanlinehook + + mov pc,lr +@------------------------------------------------------- +write0: +@------------------------------------------------------- + and addy,addy,#0x0f + tst addy,#0x08 + ldreq r1,=writeCHRTBL + adrne r1,tbl-8*4 + ldr pc,[r1,addy,lsl#2] +wA: @--------------------------- + and r0,r0,#1 + strb_ r0,enable + ldr_ r0,latch + str_ r0,counter + mov pc,lr +wB: @--------------------------- + strb_ r0,latch +asdf: mov r1,#0 + strb_ r1,latch+2 + strb_ r1,latch+3 + mov pc,lr +wC: @--------------------------- + strb_ r0,latch+1 + b asdf + +tbl: .word map89AB_,mirrorKonami_,wA,wB,wC,void,void,void +@------------------------------------------------------- +hook: +@------------------------------------------------------ + ldrb_ r0,enable + cmp r0,#0 + beq h1 + + ldr_ r0,counter + subs r0,r0,#113 + str_ r0,counter +@ bcc irq6502 + bcc CheckI +h1: + fetch 0 +@------------------------------------------------------- + @.end diff --git a/arm9/source/mappers/map4.s b/arm9/source/mappers/map4.s index 0915a44..62157f5 100644 --- a/arm9/source/mappers/map4.s +++ b/arm9/source/mappers/map4.s @@ -10,7 +10,8 @@ #define MMC3_IRQ_ROCKMAN3 5 @--------------------------------------------------------------------------------- .global mapper4init - + .global mapper119init + .global mapper249init reg0 = mapperdata reg1 = mapperdata+1 reg2 = mapperdata+2 @@ -44,6 +45,8 @@ @--------------------------------------------------------------------------------- mapper4init: +mapper119init: +mapper249init: @--------------------------------------------------------------------------------- .word write0, write1, write2, write3 stmfd sp!, {lr} diff --git a/arm9/source/mappers/map42.s b/arm9/source/mappers/map42.s new file mode 100644 index 0000000..19816c3 --- /dev/null +++ b/arm9/source/mappers/map42.s @@ -0,0 +1,59 @@ +@--------------------------------------------------------------------------------- +.section .text,"ax" +@--------------------------------------------------------------------------------- + #include "equates.h" + #include "6502mac.h" + + .global mapper42init + + countdown = mapperdata+0 + rombank = mapperdata+1 + +@---------------------------------------------------------------------------- +mapper42init: +@---------------------------------------------------------------------------- + .word chr01234567_,void,void,write3 + mov addy,lr + + ldr r1,=rom_R60 @Swap in ROM at $6000-$7FFF. + str_ r1,readmem_tbl+12 + ldr r1,=empty_W @ROM. + str_ r1,writemem_tbl+12 + + mov r0,#-1 + bl map89ABCDEF_ + +@ ldr r0,=MMC3_IRQ_Hook +@ str r0,scanlinehook + + mov r0,#0 + bl map67_IRQ_Hook + + mov pc,addy + +@---------------------------------------------------------------------------- +write0: @$8000-8001 +@---------------------------------------------------------------------------- +@ tst addy,#3 +@ movne pc,lr + b chr01234567_ +@---------------------------------------------------------------------------- +write3: @E000-E003 +@---------------------------------------------------------------------------- + and r1,addy,#3 + ldr pc,[pc,r1,lsl#2] +nothing: + mov pc,lr +@---------------------------------------------------------------------------- +commandlist: .word map67_,cmd1,nothing,nothing +cmd0: +@ strb r1,rombank +@ and r0,r0,#0xF + b map67_IRQ_Hook +cmd1: + tst r0,#0x08 + beq mirror2H_ + b mirror2V_ +cmd2: +cmd3: + @.end diff --git a/arm9/source/mappers/map67.s b/arm9/source/mappers/map67.s index 6c3250b..ec105f9 100644 --- a/arm9/source/mappers/map67.s +++ b/arm9/source/mappers/map67.s @@ -5,6 +5,7 @@ #include "6502mac.h" @--------------------------------------------------------------------------------- .global mapper67init + .global map67_IRQ_Hook countdown = mapperdata+0 irqen = mapperdata+4 suntoggle = mapperdata+5 diff --git a/arm9/source/mappers/map910.s b/arm9/source/mappers/map910.s index 4839f2c..c65a90b 100644 --- a/arm9/source/mappers/map910.s +++ b/arm9/source/mappers/map910.s @@ -4,8 +4,11 @@ #include "equates.h" #include "6502mac.h" @--------------------------------------------------------------------------------- - .global mapper10init .global mapper9init + .global mapper10init + .global mapper9BGcheck + .global mapper_9_hook + reg = mapperdata reg0 = mapperdata + 0 reg1 = mapperdata + 1 @@ -15,73 +18,30 @@ latch_b = mapperdata + 5 chrc = mapperdata + 6 +@---------------------------------------------------------------------------- +mapper9init: @really bad Punchout hack @--------------------------------------------------------------------------------- -mapper10init: -@--------------------------------------------------------------------------------- - .word empty_W, write, write, write - stmfd sp!, {lr} - - mov r0, #0 - str_ r0, reg - mov r0, #4 - strb_ r0, reg1 - mov r0, #0xFE - strb_ r0, latch_a - strb_ r0, latch_b - - mov r0, #4 - bl chr0123_ - mov r0, #0 - bl chr4567_ - - mov r0, #-1 - mov r2, #32 / 4 - adr r1, bgchrdata - bl filler + .word empty_W,writeAB,write,write +map10start: - @adr r0, framehook - @str_ r0, newframehook + ldrb_ r0,cartflags + bic r0,r0,#SCREEN4 @(many punchout roms have bad headers) + strb_ r0,cartflags + ldr r0,=mapper_9_hook + str_ r0,scanlinehook + adr r0, chrlatch2 str_ r0, ppuchrlatch - ldmfd sp!, {pc} + mov r0,#-1 + b map89ABCDEF_ @everything to last bank @--------------------------------------------------------------------------------- -mapper9init: +mapper10init: @--------------------------------------------------------------------------------- - .word empty_W, writeAB, write, write - stmfd sp!, {lr} - - mov r0, #0 - str_ r0, reg - mov r0, #4 - strb_ r0, reg1 - mov r0, #0xFE - strb_ r0, latch_a - strb_ r0, latch_b - - mov r0, #4 - bl chr0123_ - mov r0, #0 - bl chr4567_ - - mov r0, #-1 - mov r2, #32 / 4 - adr r1, bgchrdata - bl filler - - @adr r0, framehook - @str_ r0, newframehook - - adr r0, chrlatch2 - str_ r0, ppuchrlatch - - mov r0, #-1 - bl map89ABCDEF_ - - ldmfd sp!, {pc} - + .word empty_W,write,write,write + b map10start @--------------------------------------------------------------------------------- writeAB: and r1, addy, #0xF000 @@ -99,44 +59,81 @@ write: cmp r1, #0xA000 beq map89AB_ cmp r1, #0xB000 - bne c + bne c000 strb_ r0, reg0 ldrb_ r2, latch_a cmp r2, #0xFD beq chr0123_ mov pc, lr -c: +b000: @------------------------- + strb_ r0,reg0 + mov pc,lr +c000: @------------------------- cmp r1, #0xC000 - bne d - strb_ r0, reg1 + bne d000 + + strb_ r0,reg1 + b chr0123_ ldrb_ r2, latch_a cmp r2, #0xFE beq chr0123_ mov pc, lr - -d: +d000: @------------------------- cmp r1, #0xD000 - bne e + bne e000 strb_ r0, reg2 ldrb_ r2, latch_b cmp r2, #0xFD beq chr4567_ mov pc, lr - -e: +e000: @------------------------- cmp r1, #0xE000 - bne f + bne f000 + tst addy,#0x1000 + bne f000 strb_ r0, reg3 ldrb_ r2, latch_b cmp r2, #0xFE beq chr4567_ mov pc, lr - -f: - tst r0, #1 +f000: @------------------------- + tst r0,#1 b mirror2V_ +@------------------------------ +mapper_9_hook: +@--------------------------------------------------------------------------------- + ldr_ r0,scanline + sub r0,r0,#1 + tst r0,#7 + ble h9 + cmp r0,#239 + bhi h9 + + ldr r2,=latchtbl + ldrb r0,[r2,r0,lsr#3] + + cmp r0,#0xfd + ldreqb_ r0,reg2 + ldrneb_ r0,reg3 + bl chr4567_ +h9: + fetch 0 +@--------------------------------------------------------------------------------- +mapper9BGcheck: @called from PPU.s, r0=FD-FF +@--------------------------------------------------------------------------------- + cmp r0,#0xff + moveq pc,lr + + ldr r1,=latchtbl + and r2,addy,#0x3f + cmp r2,#0x10 + strlob r0,[r1,addy,lsr#6] + + mov pc,lr +latchtbl: +.skip 32 @--------------------------------------------------------------------------------- framehook: diff --git a/arm9/source/ppu.s b/arm9/source/ppu.s index 63bde63..8f9d35a 100644 --- a/arm9/source/ppu.s +++ b/arm9/source/ppu.s @@ -81,76 +81,6 @@ .byte 255,255,255, 171,231,255, 199,215,255, 215,203,255, 255,199,255, 255,199,219,255, 191,179,255, 219,171 .byte 255,231,163, 227,255,163, 171,243,191, 179,255,207, 159,255,243, 209,209,209, 17,17,17, 17,17,17 -@nes_rgb_1: @AspiringSquire Real palette - .byte 108,108,108, 0,38,142, 0,0,168, 64,0,148, 112,0,112, 120,0,64, 112,0,0, 98,22,0 - .byte 68,36,0, 52,52,0, 0,80,0, 0,68,68, 0,64,96, 0,0,0, 16,16,16, 16,16,16 - .byte 186,186,186, 32,92,220, 56,56,255, 128,32,240, 192,0,192, 208,20,116, 208,32,32, 172,64,20 - .byte 124,84,0, 88,100,0, 0,136,0, 0,116,104, 0,116,156, 32,32,32, 16,16,16, 16,16,16 - .byte 255,255,255, 76,160,255, 136,136,255, 192,108,255, 255,80,255, 255,100,184, 255,120,120, 255,150,56 - .byte 219,171,0, 162,202,32, 74,220,74, 44,204,164, 28,194,234, 88,88,88, 16,16,16, 16,16,16 - .byte 255,255,255, 176,212,255, 196,196,255, 232,184,255, 255,176,255, 255,184,232, 255,196,196, 255,212,168 - .byte 255,232,144, 240,244,164, 192,255,192, 172,244,240, 160,232,255, 194,194,194, 32,32,32, 16,16,16 - -@nes_rgb_2: @Chris Covell palette - .byte 128,128,128, 0,61,166, 0,18,176, 68,0,150, 161,0,94, 199,0,40, 186,6,0, 140,23,0 - .byte 92,47,0, 16,69,0, 5,74,0, 0,71,46, 0,65,102, 0,0,0, 5,5,5, 5,5,5 - .byte 199,199,199, 0,119,255, 33,85,255, 130,55,250, 235,47,181, 255,41,80, 255,34,0, 214,50,0 - .byte 196,98,0, 53,128,0, 5,143,0, 0,138,85, 0,153,204, 33,33,33, 9,9,9, 9,9,9 - .byte 255,255,255, 15,215,255, 105,162,255, 212,128,255, 255,69,243, 255,97,139, 255,136,51, 255,156,18 - .byte 250,188,32, 159,227,14, 43,240,53, 12,240,164, 5,251,255, 94,94,94, 13,13,13, 13,13,13 - .byte 255,255,255, 166,252,255, 179,236,255, 218,171,235, 255,168,249, 255,171,179, 255,210,176, 255,239,166 - .byte 255,247,156, 215,232,149, 166,237,175, 162,242,218, 153,255,252, 221,221,221, 17,17,17, 17,17,17 - -@nes_rgb_3: @ CrashMan palette - .byte 88,88,88, 0,17,115, 0,0,98, 71,43,191, 151,0,135, 145,0,9, 111,17,0, 76,16,8 - .byte 55,30,0, 0,47,0, 0,85,0, 0,77,21, 0,40,64, 0,0,0, 0,0,0, 0,0,0 - .byte 160,160,160, 0,68,153, 44,44,200, 89,13,170, 174,0,106, 176,0,64, 184,52,24, 152,48,16 - .byte 112,64,0, 48,128,0, 32,120,8, 0,123,51, 28,104,136, 0,0,0, 0,0,0, 0,0,0 - .byte 248,248,248, 38,123,225, 88,112,240, 152,120,248, 255,115,200, 240,96,168, 208,123,55, 224,144,64 - .byte 248,179,0, 140,188,0, 64,168,88, 88,248,152, 0,183,191, 120,120,120, 0,0,0, 0,0,0 - .byte 255,255,255, 167,231,255, 184,184,248, 216,184,248, 230,166,255, 242,157,196, 240,192,176, 252,228,176 - .byte 224,224,30, 216,248,120, 192,232,144, 149,247,200, 152,224,232, 248,216,248, 0,0,0, 0,0,0 - -@nes_rgb_4: @ Matthew Conte palette - .byte 128,128,128, 0,0,187, 55,0,191, 132,0,166, 187,0,106, 183,0,30, 179,0,0, 145,38,0 - .byte 123,43,0, 0,62,0, 0,72,13, 0,60,34, 0,47,102, 0,0,0, 5,5,5, 5,5,5 - .byte 200,200,200, 0,89,255, 68,60,255, 183,51,204, 255,51,170, 255,55,94, 255,55,26, 213,75,0 - .byte 196,98,0, 60,123,0, 30,132,21, 0,149,102, 0,132,196, 17,17,17, 9,9,9, 9,9,9 - .byte 255,255,255, 0,149,255, 111,132,255, 213,111,255, 255,119,204, 255,111,153, 255,123,89, 255,145,95 - .byte 255,162,51, 166,191,0, 81,217,106, 77,213,174, 0,217,255, 102,102,102, 13,13,13, 13,13,13 - .byte 255,255,255, 132,191,255, 187,187,255, 208,187,255, 255,191,234, 255,191,204, 255,196,183, 255,204,174 - .byte 255,217,162, 204,225,153, 174,238,183, 170,247,238, 179,238,255, 221,221,221, 17,17,17, 17,17,17 - -@nes_rgb_5: @ MESS palette - .byte 116,116,116, 36,24,140, 0,0,168, 68,0,156, 140,0,116, 168,0,16, 164,0,0, 124,8,0 - .byte 64,44,0, 0,68,0, 0,80,0, 0,60,20, 24,60,92, 0,0,0, 0,0,0, 0,0,0 - .byte 188,188,188, 0,112,236, 32,56,236, 128,0,240, 188,0,188, 228,0,88, 216,40,0, 200,76,12 - .byte 136,112,0, 0,148,0, 0,168,0, 0,144,56, 0,128,136, 0,0,0, 0,0,0, 0,0,0 - .byte 252,252,252, 60,188,252, 92,148,252, 64,136,252, 244,120,252, 252,116,180, 252,116,96, 252,152,56 - .byte 240,188,60, 128,208,16, 76,220,72, 88,248,152, 0,232,216, 0,0,0, 0,0,0, 0,0,0 - .byte 252,252,252, 168,228,252, 196,212,252, 212,200,252, 252,196,252, 252,196,216, 252,188,176, 252,216,168 - .byte 252,228,160, 224,252,160, 168,240,188, 176,252,204, 156,252,240, 0,0,0, 0,0,0, 0,0,0 - -@nes_rgb_6: @PasoFami99 palette - .byte 127,127,127, 0,0,255, 0,0,191, 71,43,191, 151,0,135, 171,0,35, 171,19,0, 139,23,0 - .byte 83,48,0, 0,120,0, 0,107,0, 0,91,0, 0,67,88, 0,0,0, 0,0,0, 0,0,0 - .byte 191,191,191, 0,120,248, 0,88,248, 107,71,255, 219,0,205, 231,0,91, 248,56,0, 231,95,19 - .byte 175,127,0, 0,184,0, 0,171,0, 0,171,71, 0,139,139, 0,0,0, 0,0,0, 0,0,0 - .byte 248,248,248, 63,191,255, 107,136,255, 152,120,248, 248,120,248, 248,88,152, 248,120,88, 255,163,71 - .byte 248,184,0, 184,248,24, 91,219,87, 88,248,152, 0,235,219, 120,120,120, 0,0,0, 0,0,0 - .byte 255,255,255, 167,231,255, 184,184,248, 216,184,248, 248,184,248, 251,167,195, 240,208,176, 255,227,171 - .byte 251,219,123, 216,248,120, 184,248,184, 184,248,216, 0,255,255, 248,216,248, 0,0,0, 0,0,0 - -@nes_rgb_7: @Quors palette - .byte 63,63,63, 0,31,63, 0,0,63, 31,0,63, 63,0,63, 63,0,32, 63,0,0, 63,32,0 - .byte 63,63,0, 32,63,0, 0,63,0, 0,63,32, 0,63,63, 0,0,0, 0,0,0, 0,0,0 - .byte 127,127,127, 64,95,127, 64,64,127, 95,64,127, 127,64,127, 127,64,96, 127,64,64, 127,96,64 - .byte 127,127,64, 96,127,64, 64,127,64, 64,127,96, 64,127,127, 0,0,0, 0,0,0, 0,0,0 - .byte 191,191,191, 128,159,191, 128,128,191, 159,128,191, 191,128,191, 191,128,160, 191,128,128, 191,160,128 - .byte 191,191,128, 160,191,128, 128,191,128, 128,191,160, 128,191,191, 0,0,0, 0,0,0, 0,0,0 - .byte 255,255,255, 192,223,255, 192,192,255, 223,192,255, 255,192,255, 255,192,224, 255,192,192, 255,224,192 - .byte 255,255,192, 224,255,192, 192,255,192, 192,255,224, 192,255,255, 0,0,0, 0,0,0, 0,0,0 - DISPCNT_INIT = 0x38810010 @1D OBJ @--------------------------------------------------------------------------------- @@ -975,6 +905,8 @@ writeBG: @loadcart jumps here and r1,r1,#0xf000 orr r1,r0,r1 strh r1,[r2,addy] @write tile# + cmp r0,#0xfd @mapper 9 shit.. + bhs mapper9BGcheck mov pc,lr writeattrib: stmfd sp!,{r3,r4,lr} diff --git a/icon.bmp b/icon.bmp index ccd6761d9789d4a7c1c9f0b68ccddb17b6b55d77..4c506a913fe8728be8f3769b29b13166d4fb8112 100644 GIT binary patch literal 2102 zcmeH`!4-lq5JVT^!7@Br0cW0fd$1Hr@kAY-t-=y4!3@K&$paJblJ`hL{?24~(aW_v z+BCX@**We`^V8T2;`uTf?%vPQ`rE_$VX)!;TJXNvJFs`)A3D&ssIr;Iy5c%-H=EgW?K>P!8x4DJOo7K_w$YVG7r;W{d5TdYRu68!kHgu&x4smU*f7xF}xL-P+#Y1 zgsa&(c+@$g%vh`D)PWHqTyu{6#Z^lhQRnQFytOJfxVwk$@*Bvd!pbai{dcY|QOVy7 h9Hg&v|MJ?w%k?_-HRt{xyxdVYk+A@elW54Uzx= literal 630 zcma)(Jr2S!424s|#zNE!pib;rnAv-so`qv@fF7*_&wfUUtw`{s{Cs|~Yqd11 zKVaU{e8;%=XMH`<@|n>X9iYUJ^(b3XKd?B6>l4HuFhUSoHs7%%h~!0DpZMkYJtNy` OF4{*IL1SL=e}4d|A4lK-