From d3173931f17f676f757830f76b0f7133eaf4185f Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Thu, 1 Aug 2019 12:31:08 +0200 Subject: [PATCH] reios: handle gdrom hle state properly better documentation, clean up parallelize gradle builds + tv banner --- core/reios/gdrom_hle.cpp | 297 ++++++++++++------ core/reios/gdrom_hle.h | 1 - core/reios/reios.cpp | 118 ++++--- shell/android-studio/reicast/build.gradle | 9 +- .../src/main/res/drawable-xhdpi/ic_banner.png | Bin 26830 -> 24286 bytes 5 files changed, 260 insertions(+), 165 deletions(-) diff --git a/core/reios/gdrom_hle.cpp b/core/reios/gdrom_hle.cpp index 3906909b9..e3e232979 100644 --- a/core/reios/gdrom_hle.cpp +++ b/core/reios/gdrom_hle.cpp @@ -18,24 +18,33 @@ #define debugf(...) DEBUG_LOG(REIOS, __VA_ARGS__) // FIXME Serialize -u32 LastCommandId = 0xFFFFFFFF; -u32 NextCommandId = 1; -u32 bios_result[4]; // BIOS result vector -u32 cur_sector; - -void GDROM_HLE_ReadSES(u32 addr) +typedef enum { BIOS_ERROR = -1, BIOS_INACTIVE, BIOS_ACTIVE, BIOS_COMPLETED } gd_bios_status; +struct gdrom_hle_state_t { - u32 s = ReadMem32(addr + 0); - u32 b = ReadMem32(addr + 4); - u32 ba = ReadMem32(addr + 8); - u32 bb = ReadMem32(addr + 12); + u32 last_request_id; + u32 next_request_id; + gd_bios_status status; + u32 command; + u32 params[4]; + u32 result[4]; + u32 cur_sector; +}; +gdrom_hle_state_t gd_hle_state = { 0xffffffff, 1, BIOS_INACTIVE }; + +static void GDROM_HLE_ReadSES() +{ + u32 s = gd_hle_state.params[0]; + u32 b = gd_hle_state.params[1]; + u32 ba = gd_hle_state.params[2]; + u32 bb = gd_hle_state.params[3]; WARN_LOG(REIOS, "GDROM_HLE_ReadSES: doing nothing w/ %d, %d, %d, %d", s, b, ba, bb); } -void GDROM_HLE_ReadTOC(u32 Addr) + +static void GDROM_HLE_ReadTOC() { - u32 area = ReadMem32(Addr + 0); - u32 dest = ReadMem32(Addr + 4); + u32 area = gd_hle_state.params[0]; + u32 dest = gd_hle_state.params[1]; u32* pDst = (u32*)GetMemPtr(dest, 0); @@ -43,7 +52,7 @@ void GDROM_HLE_ReadTOC(u32 Addr) if (area == DoubleDensity && libGDR_GetDiscType() != GdRom) { // Only GD-ROM has a high-density area but no error is reported - LastCommandId = 0xFFFFFFFF; + gd_hle_state.status = BIOS_INACTIVE; return; } @@ -55,12 +64,12 @@ void GDROM_HLE_ReadTOC(u32 Addr) } } -void read_sectors_to(u32 addr, u32 sector, u32 count) { +static void read_sectors_to(u32 addr, u32 sector, u32 count) { u8 * pDst = GetMemPtr(addr, 0); if (pDst) { libGDR_ReadSector(pDst, sector, count, 2048); - cur_sector = sector + count - 1; + gd_hle_state.cur_sector = sector + count - 1; } else { u8 temp[2048]; @@ -76,117 +85,119 @@ void read_sectors_to(u32 addr, u32 sector, u32 count) { sector++; count--; } - cur_sector = sector - 1; + gd_hle_state.cur_sector = sector - 1; } } -void GDROM_HLE_ReadDMA(u32 addr) +static void GDROM_HLE_ReadDMA() { - u32 s = ReadMem32(addr + 0x00); - u32 n = ReadMem32(addr + 0x04); - u32 b = ReadMem32(addr + 0x08); - u32 u = ReadMem32(addr + 0x0C); + u32 s = gd_hle_state.params[0]; + u32 n = gd_hle_state.params[1]; + u32 b = gd_hle_state.params[2]; + u32 u = gd_hle_state.params[3]; debugf("GDROM: DMA READ Sector=%d, Num=%d, Buffer=0x%08X, Unk01=0x%08X", s, n, b, u); read_sectors_to(b, s, n); - bios_result[2] = n * 2048; - bios_result[3] = -n * 2048; + gd_hle_state.result[2] = n * 2048; + gd_hle_state.result[3] = -n * 2048; } -void GDROM_HLE_ReadPIO(u32 addr) +static void GDROM_HLE_ReadPIO() { - u32 s = ReadMem32(addr + 0x00); - u32 n = ReadMem32(addr + 0x04); - u32 b = ReadMem32(addr + 0x08); - u32 u = ReadMem32(addr + 0x0C); + u32 s = gd_hle_state.params[0]; + u32 n = gd_hle_state.params[1]; + u32 b = gd_hle_state.params[2]; + u32 u = gd_hle_state.params[3]; debugf("GDROM: PIO READ Sector=%d, Num=%d, Buffer=0x%08X, Unk01=0x%08X", s, n, b, u); read_sectors_to(b, s, n); - bios_result[2] = n * 2048; - bios_result[3] = -n * 2048; + gd_hle_state.result[2] = n * 2048; + gd_hle_state.result[3] = -n * 2048; } -void GDCC_HLE_GETSCD(u32 addr) { - u32 format = ReadMem32(addr + 0x00); - u32 size = ReadMem32(addr + 0x04); - u32 dest = ReadMem32(addr + 0x08); +static void GDCC_HLE_GETSCD() { + u32 format = gd_hle_state.params[0]; + u32 size = gd_hle_state.params[1]; + u32 dest = gd_hle_state.params[2]; INFO_LOG(REIOS, "GDROM: GETSCD format %x size %x dest %08x", format, size, dest); + if (cdda.playing) + gd_hle_state.cur_sector = cdda.CurrAddr.FAD; u8 scd[100]; - gd_get_subcode(format, cur_sector, scd); + gd_get_subcode(format, gd_hle_state.cur_sector, scd); verify(scd[3] == size); memcpy(GetMemPtr(dest, size), scd, size); // record size of pio transfer to gdrom - bios_result[2] = size; + gd_hle_state.result[2] = size; } u32 SecMode[4]; -void GD_HLE_Command(u32 cc, u32 prm) +static void GD_HLE_Command(u32 cc) { + gd_hle_state.status = BIOS_COMPLETED; switch(cc) { case GDCC_GETTOC: - WARN_LOG(REIOS, "GDROM: *FIXME* CMD GETTOC PRM:%X", prm); + WARN_LOG(REIOS, "GDROM: *FIXME* CMD GETTOC"); break; case GDCC_GETTOC2: - GDROM_HLE_ReadTOC(prm); + GDROM_HLE_ReadTOC(); break; case GDCC_GETSES: - GDROM_HLE_ReadSES(prm); + GDROM_HLE_ReadSES(); break; case GDCC_INIT: - INFO_LOG(REIOS, "GDROM: CMD INIT PRM:%X", prm); + INFO_LOG(REIOS, "GDROM: CMD INIT"); break; case GDCC_PIOREAD: - GDROM_HLE_ReadPIO(prm); + GDROM_HLE_ReadPIO(); break; case GDCC_DMAREAD: - GDROM_HLE_ReadDMA(prm); + GDROM_HLE_ReadDMA(); break; case GDCC_PLAY_SECTOR: - WARN_LOG(REIOS, "GDROM: CMD PLAYSEC? PRM:%X", prm); + WARN_LOG(REIOS, "GDROM: CMD PLAYSEC?"); break; case GDCC_RELEASE: - WARN_LOG(REIOS, "GDROM: CMD RELEASE? PRM:%X", prm); + WARN_LOG(REIOS, "GDROM: CMD RELEASE?"); break; case GDCC_STOP: - INFO_LOG(REIOS, "GDROM: CMD STOP PRM:%X", prm); + INFO_LOG(REIOS, "GDROM: CMD STOP"); cdda.playing = false; SecNumber.Status = GD_STANDBY; break; case GDCC_SEEK: - INFO_LOG(REIOS, "GDROM: CMD SEEK PRM:%X", prm); + INFO_LOG(REIOS, "GDROM: CMD SEEK"); cdda.playing = false; SecNumber.Status = GD_PAUSE; break; case GDCC_PLAY: { - - u32 first_track = ReadMem32(prm); - u32 last_track = ReadMem32(prm + 4); - u32 repeats = ReadMem32(prm + 8); + u32 first_track = gd_hle_state.params[0]; + u32 last_track = gd_hle_state.params[1]; + u32 repeats = gd_hle_state.params[2]; u32 start_fad, end_fad, dummy; libGDR_GetTrack(first_track, start_fad, dummy); libGDR_GetTrack(last_track, dummy, end_fad); INFO_LOG(REIOS, "GDROM: CMD PLAY first_track %x last_track %x repeats %x start_fad %x end_fad %x param4 %x", first_track, last_track, repeats, - start_fad, end_fad, ReadMem32(prm + 12)); + start_fad, end_fad, gd_hle_state.params[3]); cdda.playing = true; cdda.StartAddr.FAD = start_fad; cdda.EndAddr.FAD = end_fad; @@ -205,23 +216,23 @@ void GD_HLE_Command(u32 cc, u32 prm) case GDCC_READ: { - u32 s = ReadMem32(prm + 0x00); - u32 n = ReadMem32(prm + 0x04); - u32 b = ReadMem32(prm + 0x08); - u32 u = ReadMem32(prm + 0x0C); + u32 s = gd_hle_state.params[0]; + u32 n = gd_hle_state.params[1]; + u32 b = gd_hle_state.params[2]; + u32 u = gd_hle_state.params[3]; - WARN_LOG(REIOS, "GDROM: CMD READ PRM:%X Sector=%d, Num=%d, Buffer=0x%08X, Unk01=%08x", prm, s, n, b, u); + WARN_LOG(REIOS, "GDROM: CMD READ Sector=%d, Num=%d, Buffer=0x%08X, Unk01=%08x", s, n, b, u); } break; case GDCC_GETSCD: - GDCC_HLE_GETSCD(prm); + GDCC_HLE_GETSCD(); break; case GDCC_REQ_MODE: { - debugf("GDROM: REQ_MODE PRM:%X", prm); - u32 dest = ReadMem32(prm); + u32 dest = gd_hle_state.params[0]; + debugf("GDROM: REQ_MODE dest:%x", dest); u32 *out = (u32 *)GetMemPtr(dest, 16); out[0] = GD_HardwareInfo.speed; out[1] = (GD_HardwareInfo.standby_hi << 8) | GD_HardwareInfo.standby_lo; @@ -229,18 +240,18 @@ void GD_HLE_Command(u32 cc, u32 prm) out[3] = GD_HardwareInfo.read_retry; // record size of pio transfer to gdrom - bios_result[2] = 0xa; + gd_hle_state.result[2] = 0xa; } break; case GDCC_SET_MODE: { - u32 speed = ReadMem32(prm); - u32 standby = ReadMem32(prm + 4); - u32 read_flags = ReadMem32(prm + 8); - u32 read_retry = ReadMem32(prm + 12); + u32 speed = gd_hle_state.params[0]; + u32 standby = gd_hle_state.params[1]; + u32 read_flags = gd_hle_state.params[2]; + u32 read_retry = gd_hle_state.params[3]; - debugf("GDROM: SET_MODE PRM:%X speed %x standby %x read_flags %x read_retry %x", prm, speed, standby, read_flags, read_retry); + debugf("GDROM: SET_MODE speed %x standby %x read_flags %x read_retry %x", speed, standby, read_flags, read_retry); GD_HardwareInfo.speed = speed; GD_HardwareInfo.standby_hi = (standby & 0xff00) >> 8; @@ -249,13 +260,13 @@ void GD_HLE_Command(u32 cc, u32 prm) GD_HardwareInfo.read_retry = read_retry; // record size of pio transfer to gdrom - bios_result[2] = 0xa; + gd_hle_state.result[2] = 0xa; } break; case GDCC_GET_VER: { - u32 dest = ReadMem32(prm); + u32 dest = gd_hle_state.params[0]; debugf("GDROM: GDCC_GET_VER dest %x", dest); @@ -274,10 +285,10 @@ void GD_HLE_Command(u32 cc, u32 prm) case GDCC_REQ_STAT: { // odd, but this function seems to get passed 4 unique pointers - u32 dst0 = ReadMem32(prm); - u32 dst1 = ReadMem32(prm + 4); - u32 dst2 = ReadMem32(prm + 8); - u32 dst3 = ReadMem32(prm + 12); + u32 dst0 = gd_hle_state.params[0]; + u32 dst1 = gd_hle_state.params[1]; + u32 dst2 = gd_hle_state.params[2]; + u32 dst3 = gd_hle_state.params[3]; debugf("GDROM: GDCC_REQ_STAT dst0=%08x dst1=%08x dst2=%08x dst3=%08x", dst0, dst1, dst2, dst3); @@ -298,7 +309,7 @@ void GD_HLE_Command(u32 cc, u32 prm) // ------------------------------------------------------ // 1-3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 u32 elapsed; - u32 tracknum = libGDR_GetTrackNumber(cur_sector, elapsed); + u32 tracknum = libGDR_GetTrackNumber(gd_hle_state.cur_sector, elapsed); WriteMem32(dst1, tracknum); // bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 @@ -308,7 +319,7 @@ void GD_HLE_Command(u32 cc, u32 prm) // ------------------------------------------------------ // 3 | address | control // FIXME address/control - u32 out = ((0x4) << 28) | ((0x1) << 24) | (cur_sector & 0x00ffffff); + u32 out = ((0x4) << 28) | ((0x1) << 24) | (gd_hle_state.cur_sector & 0x00ffffff); WriteMem32(dst2, out); // bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 @@ -320,11 +331,11 @@ void GD_HLE_Command(u32 cc, u32 prm) WriteMem32(dst3, 1); // record pio transfer size - bios_result[2] = 0xa; + gd_hle_state.result[2] = 0xa; } break; default: - WARN_LOG(REIOS, "GDROM: Unknown GDROM CC:%X PRM:%X", cc, prm); + WARN_LOG(REIOS, "GDROM: Unknown GDROM CC:%X", cc); break; } } @@ -337,70 +348,142 @@ void gdrom_hle_op() { switch(r[7]) // COMMAND CODE { - case GDROM_SEND_COMMAND: // SEND GDROM COMMAND RET: - if failed + req id - //debugf("GDROM: HLE SEND COMMAND CC:%X param ptr: %X", r[4], r[5]); - memset(bios_result, 0, sizeof(bios_result)); - LastCommandId = r[0] = NextCommandId++; // Request Id - GD_HLE_Command(r[4], r[5]); - break; - - case GDROM_CHECK_COMMAND: - if (r[4] != LastCommandId) + case GDROM_SEND_COMMAND: + // Enqueue a command for the GDROM subsystem to execute. + // + // Args: + // r4 = command code + // r5 = pointer to parameter block for the command, can be NULL if the command does not take parameters + // + // Returns: a request id (>=0) if successful, negative error code if failed + debugf("GDROM: HLE SEND COMMAND CC:%X param ptr: %X", r[4], r[5]); + if (gd_hle_state.status != BIOS_INACTIVE) { - r[0] = -1; // Error (examine extended status information for cause of failure) - bios_result[0] = 5; // Invalid command id - bios_result[1] = 0; - bios_result[2] = 0; - bios_result[3] = 0; + r[0] = 0; } else { - r[0] = 2; // Finished + memset(gd_hle_state.result, 0, sizeof(gd_hle_state.result)); + gd_hle_state.last_request_id = r[0] = gd_hle_state.next_request_id++; + gd_hle_state.status = BIOS_ACTIVE; + gd_hle_state.command = r[4]; + for (int i = 0; i < 4; i++) + gd_hle_state.params[i] = ReadMem32(r[5] + i * 4); + } + break; + + case GDROM_CHECK_COMMAND: + // Check if an enqueued command has completed. + // + // Args: + // r4 = request id + // r5 = pointer to four 32 bit integers to receive extended status information. The first is a generic error code. + // + // Returns: + // 0 - no such request active + // 1 - request is still being processed + // 2 - request has completed (if queried again, you will get a 0) + // 3 - request was aborted(?) + // -1 - request has failed (examine extended status information for cause of failure) + if (gd_hle_state.status != BIOS_COMPLETED && gd_hle_state.status != BIOS_ERROR) + { + r[0] = gd_hle_state.status; // no such request active or still being processed + } + else if (r[4] != gd_hle_state.last_request_id) + { + r[0] = 0; // no such request active + } + else + { + r[0] = gd_hle_state.status; // completed or error + + //debugf("GDROM: HLE CHECK COMMAND REQID:%X param ptr: %X -> %X", r[4], r[5], r[0]); + gd_hle_state.last_request_id = 0xFFFFFFFF; + WriteMem32(r[5], gd_hle_state.result[0]); + WriteMem32(r[5] + 4, gd_hle_state.result[1]); + WriteMem32(r[5] + 8, gd_hle_state.result[2]); + WriteMem32(r[5] + 12, gd_hle_state.result[3]); + gd_hle_state.status = BIOS_INACTIVE; } - //debugf("GDROM: HLE CHECK COMMAND REQID:%X param ptr: %X -> %X", r[4], r[5], r[0]); - LastCommandId = 0xFFFFFFFF; // INVALIDATE CHECK CMD - WriteMem32(r[5], bios_result[0]); - WriteMem32(r[5] + 4, bios_result[1]); - WriteMem32(r[5] + 8, bios_result[2]); - WriteMem32(r[5] + 12, bios_result[3]); break; case GDROM_MAIN: + // In order for enqueued commands to get processed, this function must be called a few times. //debugf("GDROM: HLE GDROM_MAIN"); + if (gd_hle_state.status == BIOS_ACTIVE) + { + GD_HLE_Command(gd_hle_state.command); + } break; case GDROM_INIT: + // Initialize the GDROM subsystem. Should be called before any requests are enqueued. INFO_LOG(REIOS, "GDROM: HLE GDROM_INIT"); - LastCommandId = 0xFFFFFFFF; + gd_hle_state.last_request_id = 0xFFFFFFFF; + gd_hle_state.status = BIOS_INACTIVE; break; case GDROM_RESET: + // Resets the drive. INFO_LOG(REIOS, "GDROM: HLE GDROM_RESET"); + gd_hle_state.last_request_id = 0xFFFFFFFF; + gd_hle_state.status = BIOS_INACTIVE; break; case GDROM_CHECK_DRIVE: + // Checks the general condition of the drive. + // + // Args: + // r4 = pointer to two 32 bit integers, to receive the drive status. The first is the current drive status, the second is the type of disc inserted (if any). + // 0 Drive is busy + // 1 Drive is paused + // 2 Drive is in standby + // 3 Drive is playing + // 4 Drive is seeking + // 5 Drive is scanning + // 6 Drive lid is open + // 7 Lid is closed, but there is no disc + // + // Returns: zero if successful, nonzero if failure //debugf("GDROM: HLE GDROM_CHECK_DRIVE r4:%X", r[4]); WriteMem32(r[4] + 0, 0x02); // STANDBY if (strstr(reios_device_info, "GD-ROM") != NULL) WriteMem32(r[4] + 4, GdRom); else WriteMem32(r[4] + 4, libGDR_GetDiscType()); - r[0] = 0; // Success + r[0] = 0; break; case GDROM_ABORT_COMMAND: + // Tries to abort a previously enqueued command. + // + // Args: + // r4 = request id + // + // Returns: zero if successful, nonzero if failure INFO_LOG(REIOS, "GDROM: HLE GDROM_ABORT_COMMAND r4:%X",r[4]); - r[0] = -1; // Failure + r[0] = -1; break; case GDROM_SECTOR_MODE: + // Sets/gets the sector format for read commands. + // + // Args: + // r4 = pointer to a struct of four 32 bit integers containing new values, or to receive the old values + // Field Function + // 0 Get/Set, if 0 the mode will be set, if 1 it will be queried. + // 1 ? (always 8192) + // 2 1024 = mode 1, 2048 = mode 2, 0 = auto detect + // 3 Sector size in bytes (normally 2048) + // + // Returns: zero if successful, -1 if failure WARN_LOG(REIOS, "GDROM: HLE GDROM_SECTOR_MODE PTR_r4:%X",r[4]); for(int i=0; i<4; i++) { SecMode[i] = ReadMem32(r[4]+(i<<2)); INFO_LOG(REIOS, "%08X", SecMode[i]); } - r[0] = 0; // Success + r[0] = 0; break; default: @@ -413,10 +496,20 @@ void gdrom_hle_op() switch(r[7]) { case MISC_INIT: + // Initializes all the syscall vectors to their default values. + // Returns: zero WARN_LOG(REIOS, "GDROM: MISC_INIT not implemented"); + r[0] = 0; break; case MISC_SETVECTOR: + // Sets/clears the handler for one of the eight superfunctions for this vector. Setting a handler is only allowed if it not currently set. + // + // Args: + // r4 = superfunction number (0-7) + // r5 = pointer to handler function, or NULL to clear + // + // Returns: zero if successful, -1 if setting/clearing the handler fails WARN_LOG(REIOS, "GDROM: MISC_SETVECTOR not implemented"); break; diff --git a/core/reios/gdrom_hle.h b/core/reios/gdrom_hle.h index c6e533ec9..f5beb5f71 100644 --- a/core/reios/gdrom_hle.h +++ b/core/reios/gdrom_hle.h @@ -40,4 +40,3 @@ #define CTOC_TRACK(n) (n<<16) void gdrom_hle_op(); -void GD_HLE_Command(u32 cc, u32 prm); diff --git a/core/reios/reios.cpp b/core/reios/reios.cpp index 21222d272..f9d4fa6a8 100644 --- a/core/reios/reios.cpp +++ b/core/reios/reios.cpp @@ -174,8 +174,9 @@ char* reios_disk_id() { static void reios_sys_system() { u32 cmd = Sh4cntx.r[7]; - switch (cmd) { - case 0: //SYSINFO_INIT + switch (cmd) + { + case 0: //SYSINFO_INIT { debugf("reios_sys_system: SYSINFO_INIT"); // 0x00-0x07: system_id @@ -198,30 +199,21 @@ static void reios_sys_system() { } break; - case 2: //SYSINFO_ICON - { - debugf("reios_sys_system: SYSINFO_ICON"); - // r4 = icon number (0-9, but only 5-9 seems to really be icons) - // r5 = destination buffer (704 bytes in size) - Sh4cntx.r[0] = 704; - } + case 2: //SYSINFO_ICON + debugf("reios_sys_system: SYSINFO_ICON"); + // r4 = icon number (0-9, but only 5-9 seems to really be icons) + // r5 = destination buffer (704 bytes in size) + Sh4cntx.r[0] = 704; break; - case 3: //SYSINFO_ID - { - debugf("reios_sys_system: SYSINFO_ID"); -// WriteMem32(SYSINFO_ID_ADDR + 0, 0xe1e2e3e4); -// WriteMem32(SYSINFO_ID_ADDR + 4, 0xe5e6e7e8); -// -// Sh4cntx.r[0] = SYSINFO_ID_ADDR; - // TODO or this? - Sh4cntx.r[0] = 0x8c000068; - } + case 3: //SYSINFO_ID + debugf("reios_sys_system: SYSINFO_ID"); + Sh4cntx.r[0] = 0x8c000068; break; - default: - WARN_LOG(REIOS, "reios_sys_system: unhandled cmd %d", cmd); - break; + default: + WARN_LOG(REIOS, "reios_sys_system: unhandled cmd %d", cmd); + break; } } @@ -263,8 +255,8 @@ static void reios_sys_flashrom() { r5 = pointer to two 32 bit integers to receive the result. The first will be the offset of the partition start, in bytes from the start of the flashrom. The second will be the size of the partition, in bytes. - returns: - r0 = 0 if partition found, -1 if error or not found + Returns: + r0 = 0 if successful, -1 if no such partition exists */ u32 part = Sh4cntx.r[4]; @@ -290,8 +282,8 @@ static void reios_sys_flashrom() { r4 = read start position, in bytes from the start of the flashrom r5 = pointer to destination buffer r6 = number of bytes to read - returns: - r0 = number of bytes read + Returns: + r0 = number of read bytes if successful, -1 if read failed */ u32 offset = Sh4cntx.r[4]; u32 dest = Sh4cntx.r[5]; @@ -312,8 +304,8 @@ static void reios_sys_flashrom() { r4 = write start position, in bytes from the start of the flashrom r5 = pointer to source buffer r6 = number of bytes to write - returns: - r0 = number of bytes written + Returns: + r0 = number of written bytes if successful, -1 if write failed */ u32 offs = Sh4cntx.r[4]; @@ -332,7 +324,11 @@ static void reios_sys_flashrom() { case 3: //FLASHROM_DELETE { - // offset of partition to delete + /* + r4 = offset of the start of the partition you want to delete, in bytes from the start of the flashrom + Returns: + r0 = zero if successful, -1 if delete failed + */ u32 offset = Sh4cntx.r[4]; debugf("reios_sys_flashrom: FLASHROM_DELETE offs %x", offset); @@ -382,38 +378,38 @@ static void gd_do_bioscall() int func1, func2, arg1, arg2; */ - switch (Sh4cntx.r[7]) { - case 0: //gdGdcReqCmd, wth is r6 ? - GD_HLE_Command(Sh4cntx.r[4], Sh4cntx.r[5]); - Sh4cntx.r[0] = 0xf344312e; - break; - - case 1: //gdGdcGetCmdStat, r4 -> id as returned by gdGdcReqCmd, r5 -> buffer to get status in ram, r6 ? - Sh4cntx.r[0] = 0; //All good, no status info - break; - - case 2: //gdGdcExecServer - //nop? returns something, though. - //Bios seems to be based on a cooperative threading model - //this is the "context" switch entry point - break; - - case 3: //gdGdcInitSystem - //nop? returns something, though. - break; - case 4: //gdGdcGetDrvStat - /* - Looks to same as GDROM_CHECK_DRIVE - */ - WriteMem32(Sh4cntx.r[4] + 0, 0x02); // STANDBY - WriteMem32(Sh4cntx.r[4] + 4, 0x80); // CDROM | 0x80 for GDROM - Sh4cntx.r[0] = 0; // RET SUCCESS - break; - - default: - INFO_LOG(REIOS, "gd_do_bioscall: (%d) %d, %d, %d", Sh4cntx.r[4], Sh4cntx.r[5], Sh4cntx.r[6], Sh4cntx.r[7]); - break; - } +// switch (Sh4cntx.r[7]) { +// case 0: //gdGdcReqCmd, wth is r6 ? +// GD_HLE_Command(Sh4cntx.r[4], Sh4cntx.r[5]); +// Sh4cntx.r[0] = 0xf344312e; +// break; +// +// case 1: //gdGdcGetCmdStat, r4 -> id as returned by gdGdcReqCmd, r5 -> buffer to get status in ram, r6 ? +// Sh4cntx.r[0] = 0; //All good, no status info +// break; +// +// case 2: //gdGdcExecServer +// //nop? returns something, though. +// //Bios seems to be based on a cooperative threading model +// //this is the "context" switch entry point +// break; +// +// case 3: //gdGdcInitSystem +// //nop? returns something, though. +// break; +// case 4: //gdGdcGetDrvStat +// /* +// Looks to same as GDROM_CHECK_DRIVE +// */ +// WriteMem32(Sh4cntx.r[4] + 0, 0x02); // STANDBY +// WriteMem32(Sh4cntx.r[4] + 4, 0x80); // CDROM | 0x80 for GDROM +// Sh4cntx.r[0] = 0; // RET SUCCESS +// break; +// +// default: +// INFO_LOG(REIOS, "gd_do_bioscall: (%d) %d, %d, %d", Sh4cntx.r[4], Sh4cntx.r[5], Sh4cntx.r[6], Sh4cntx.r[7]); +// break; +// } //gdGdcInitSystem } diff --git a/shell/android-studio/reicast/build.gradle b/shell/android-studio/reicast/build.gradle index f097fd3ea..8c4640f1e 100644 --- a/shell/android-studio/reicast/build.gradle +++ b/shell/android-studio/reicast/build.gradle @@ -38,7 +38,7 @@ android { ndk { moduleName "dc" - abiFilters 'armeabi-v7a', 'arm64-v8a' + abiFilters 'armeabi-v7a', 'arm64-v8a'//, 'x86' } } @@ -70,6 +70,7 @@ android { flavorDimensions "systemtype" productFlavors { dreamcast { + externalNativeBuild { ndkBuild { arguments ("-j" + Runtime.runtime.availableProcessors()) } } } } @@ -82,6 +83,12 @@ android { lintOptions { abortOnError false } + + //packagingOptions{ + // doNotStrip "*/armeabi/*.so" + // doNotStrip "*/armeabi-v7a/*.so" + // doNotStrip "*/arm64-v8a/*.so" + //} } afterEvaluate { diff --git a/shell/android-studio/reicast/src/main/res/drawable-xhdpi/ic_banner.png b/shell/android-studio/reicast/src/main/res/drawable-xhdpi/ic_banner.png index 5578218042ec367df3ebc9b8e404cc144d998d31..0caf63d408cffda5b0b242dd7dc607ef6201284f 100644 GIT binary patch literal 24286 zcmd3MV{m0%v~6tLwr$(CZQDl2>e%SmcG6+Twr$(@e6Q;LzJKpd?bNAtYS&qN&AG-L zW6Tw$q#y|og98Hu1OzWFC8h!d1S|yj+zbT)_Xkl$< zPUPn8WKLx6Wo-cjmi}f@P+d`6)k&WSm&z6=ldwn7mv^S`(kIs^!Cj^@aMkGa_?kiYciix z+(3q}w2tuN%?B=YWg>xd_2iW)Fkox#J*UiH;qh&_4V6Nl`~J{X?<0q5xNc?e#BxRO z2KNoI?cq&ujd%DZH1LZXcX%}%Q`PORB$03DX(U5S_}u!|$}fRhqNnKOol`~n>7~W> z+Ys$$Lng2$moT4ne&&x;ZvaAh-{R?m4^>~?R@E$_CR#6loZyei^X(OVVC7a%*OqVZ zwZoyzpURKT-#mq|TtF1LLkfW2AO+FzMaf{ioc!b&X#F4E@4yfy6zE>u<-tNpDKld9o^ z&Ay~3TeDQjWuw(-H(Z&?e!-z*(~+u?-LmY1%l`}(o@&t5vF&qX>NNMa0`i6ck9j1P zb&7AIdch*wKOWpq!@zvWysD;mB%arPByh#vp>6AhYY*s8iX!*Zs&!eu^WSxO&K;MF zmJNr#1K$+^{jUz&z4Ym?kJ@m>mBoh7_$EUA1M?=wGN_`IqP)3=3{ZSdcOW6jr^&WN zSGAKx)*Vt&WfFZ@@u@Xo{Nm8JFfE7I?JmOHk2Zf-@*he6n4d~lg_;jTx9JM^{OPX_ z$G)?50!8I{+r&~O_NOxuJ3Ka%1HsqVI>FALXRy9JD-p6*7woggToK%K<=k>_2Fqr5 zqpXWjo~^ViRG;jFSnOT&CM`&I8Gi?)vLdJV6p4-+SF3~BMohAsFK$}Z89m4BaN=9a zL#^F;s~(p|KTr3Z$pq(_tiSV(W70BIY|J~$bP4*1u?R%I{{{zemOf=7A#T<^r*L;` z*t>n(pvlt`V@h7@1Uh%VKxTbcZLB-_DpQ~PO%^+-iiz10x8wh8`gs|tyOtfz<5Z+` zWRAi2<6@cgE}s{NY_Dqk8AgQM4da_vWXQ=cpm+d(Mf zl@TpKH3{^6ace5if1K++zUfeo<|{X{A2ytFT&n&r`-}!oAk+yvandn!qeshNyWu+T z8Ukb4Y6kB^Ou|lbI$(LMYCd=GbXz7A0ewVYXrJvXZJTO7Tu3LY%HW+}bk_`@vj{n#GG(Y}-4-Eg=Sf^WY3O1EEiE5)jIno<1TpjM};HpDp85?weHx8qfx* zH|b$357K}uy=+4W;9F-{h5Qdl5+6~jbNt(*x<7O{r#DxQAXpvqcWc2{F^|hEspFkB zY~5KHr|JWPycoUKTUFL4iKDRkwa_p4-ja@?8d2UF!=fVFIBg(BFyre z=PKmDX$X@A=_~nN#@YUf)vRh`kzy~Pi%UJun%+xGH z7B<2;fyJ>^1`rN#s)0{C=q_&n=5|%6|4jZgnsDo*)q*B1`#2>MU;9*CCh`$ zEq>M3Bhz*)GUWP)!#`Yz(g2jJ;a%6xNnvukyQjO9g$V~bZ0#*j@4J^AhWQfaKr4^MN1dVd~v$4yTM?=-Hf|g^)AJE|D-FQ z!QTh6Vn02||Fv;jIW;0)oo8gyG^b&KJRtZfjGx$tk}>r(Y^|4rAWaf3R|dll-Z8~M z85l+=S?2C`I#F9gADC3)QJSp1`C^@Ki>0dd+_H4*?kFF@_w zn2|*8u(+2=_1%5-V*=RumyAdRc!h@~u|FFB5D zADU!zD^40$&Wu9e?ri-AK6a#5PyNalX6jW!SKj8Xjx$bA@kTlp#!pA1sduiK5FtN3v^kqL$2`WLD8<>skNI;>)!G&>QB8j*&2a)n$PcxZfTOtbWWFs>4n8c=a zs=k0I!EO+{MHX$xD9u4Q+-dJPo?>ywg3#u0W50TM5d&0HxJo(3Z3V;G6iJ5L=pZ!J;8PJ{R*Mymt>Hy7&|5Qv zWWgTekvq~|2gEC_1|bU$1r)*lQy1S<(c?s9J{6HoD0rPP=HsxC>4Q{!S8+E~O3^zO z2`q*}IWpKIP&;t$Bs1_dZ8o_UhxmB)B-i@VrD6wdULILum1#&cGSWc$Nve0$j4!9o zPdM$UhS(s^i7b->Jkm2<7y1n?zS2zJUeU0bAjQqBnM9#{xTF>hNa^H zd-?0V`dr*4??Y4a$yf{HQ?uP_bVmVOQQk+n%q%IE)(b+)Qx@utuviyEQCKj|0*f9- z&P#}m)X~4$RD-QSj74BTgNhe=2H&}7EOVY5{ndPw(H8ZKng><4fcI0it5hQko2VLz z_x%GaoP`iW#5dZ_p#F>s*ln)E0&5I>wmN zrnJO=ts6Ir+jp=+nDw&{_aHd@QV3l(_V0kYCc+SFavjgpq#3@c zITw~zTiyVcuyDPu$Qh)J;EuHZU>$M7?&2(OzxQt~El!NL#jalgS~JLsT~0LHQQeV4 zd)%a?JgJnNIFV+izmoOX#EPbXV+-u}_GDn9=HVCGqhcj%gQC#ol{^bXriUrWqov7Q z$dg5m;gksl&^BR?(Z@9m9wu`Hd!&H)G~+m#R?C^ryi*W39a`P&iC9z+M&%{`eiVVZ ztry^1^!`J1VMpF4d0@s7%0;!007`AJC$m*NEGG9#vWf?z=r?JJX7FN4j|;=%I7jOD zq0beI8aIx18tOrL9f-4*1FOCe(dWwCJvB*%x;&Mjc~!rX6jF=rij-V5j=4%22mKR? z63hezpDJYGRTVvN0U54*qK+ZqZ%v!v23mfn$rl>K*qqSfs9sO^`V}UsP0FVfq9{s( z)c_%iBI5+grT81p5QTX*2YAU8!}+`ZiJoe9o&tp!*E3jl(8DMJQKRbM`Ly}~ZJik} zYC#E;2*Q{Z7n;TFmlP}&TYnqhyV;mqv-3*PFL89{E?WY)DAEKR&R*$d3sKgI8k=m{ z>~(z!1D27j0{dzHX8UoakfE%N!+}9Gw@y(vC#I*dE!i+FQn1uppjrgC9X_;`!_N%Y zRq+i$so_HLO^dR{)NCfn$$s3@b{T{$a)vxs71sS*)1iSpoKwMR1VPrB_{PvQAzJ7Fd7=Q3|Z7V0ZC zjG5n$)yNm>SY<+VMxNB}=L#lXkMI?eF^gI(@j+;bTg~%t4*B;!4M|uUw&GB@nqn%+ zdo_M#>>GFZ*-4uRGIOScYA=#Mjg?UftaQSVL?fl@K77WTeNj54^#uo6GnF;Q=>8C< zIIdmEQ0O-(ZAoT^oCLY=o{_?SmmUqM9oA1yoI`veJ7q~|uvhIjp^@RO?sFa%av+NW^%Sh8()rr{s9>2z0JRb? zfDrnz@qn}i>s0H9wV^K)-X@CJ5vzJRSI!hBXEkKn(wyn<{n4C68HyN|MnYKxaZWi9 zvuS@&?`<6G4Ps+o}80p;T~bxOX5a8%KZFwuS|>w=FiTcftFg!K|aWX zk8uM&gqnP@u}YP^zpI{BdV7Sw+(?Ab&NaD69j0gy8Ao~?r55Zd*$Hhg$Cp%KK%wDE zD${>h)%ROEAKzP>w;;Q!e3+3_L8uYtv%Ct zs~GsW^(uS=LQ?uAelL?sIdLu>oJFXVJjTD;bendSgLRw^~My7zBFCb0;@p@ z3}KlqzA74-LoE$XGlly!nekoZst)kWun9>d8RiinC%|TH9P{)--I^N#%^PrSC|(ie{oZyd?2*9U z+-*zJ4ct)IT8%ZZY25Sn51Bh^F?J_>{bKU#rjMd4rX;%v1yz!<$HSMZ3sTngZ}0v6 z2u*Aj*>k!+Li%x7LSH(0*i+;xvi3mhZ*t$UleGCU1a4^bv>(dkGGt+A2>-|WdTe_M zk&JJKhJ*yKfJ4Qu8j7>M+#vF%ogEH+niRr$?gJLl1kN+aP(e4_QUHPkAJ19IYJl0* zalNO=9Og%juwcXG*`&P|e7OUosk)nvU1Z}Frs~i-S(uu|TZV4jkyW0~(XV?<2fvBb zHQ`mE6eJ8+q`BGE$s62r3XGOz*HCJEeNJ6Dn{F6Wjh~}%ZDLrHA0%57-kuIMH93KS&bS^5mFj7Rp)3cJ&~hmjgl) zXUQ4Mx3j>E0CRCpoYmv;gvU_b2?0O(5zSnK;pB29q7U23Qlw zpWQHRSxuKgb3C&cs4Rq5bH;cfi`GjX%`nJJ7jszrNSoVJwA(0sFkD94g0ElN`A}W*E$6Z!kW!Q3os7c=_x16rRPyrNZ zPA2Q~8@%PbR-T^Aq3`{PR^;1`6ns$vZrAI?3k1wVlJC@;W6PB3u?By(-^Ea}BS>h> zh1(xh$JX$KMF@oy%X294z*LOhz=XxCb zcurYuvu00$*umD2<|JO*=7U@PP{(gutN1Iysb0(aU_q=viOCD#%KEr&-!EX03bsTb zMn-b)qmb~NMUH*Te_o%Ww-cV8jIH915(uq3f2J&p`f{j(lqHn12Aobo#qT($OXR-j zWyS7bY_`oNp=w$bkKN7>{?MEVw$w#5%nPt%RPreUZL8-C$72+Ii|h}fcm!g`;3++( zhaM#)T(4k$pCA0pMO_+%ZFdENY;!R%zuCKp0DN8u6In?ypr8N#3VO;?03*;&QrfOS zK(MI)-M~OuIaq)}NH=MDamWKm3`AmX(ZnfeARre zj=?}{#2>wr0-oLhfpSn`av~@oCcZn}$LPnISJSz^f-gA_IVX71P{d5k%*=0$VjP~q zQBhIUK@@N`OZ3qb`N<9*_Gh<`g8J;t7C z(P88u;A&KP!vo$N{FV%ZeGut1qJI`V%b~y;M4oll9bSE*>!u1Ul;%4~fvN-*F5(ta z4MZ3;pYhiUVgJF>=_Sm;lMj|4N790&0ud)~+~T4Zp2sj>mYiI#k(3D3o%q`7FLnr| zx2g*eb=2}o1+69MNcaKcI3+4MrV>;bYp_t@&tN8jJ_RbY>wrljq{Z70(AO^^S;~+9xDXi5RlrjYc%jF7FYN~%`mlr(7ck?I45Ov36&aM;MU3QN#oa7aOJ z?Of18JePH1GsW{pVs!fiy!I&E2PV`xY!PcsE@NXdWFzK-Cd^x=sHmzy2}!LUf{ZOUTwTloQ8tw6zb9N|JKWLbohn z3jdp*=rWqHYE!=F_Rch|Bl^LeY-sbOz)B4SoSsMc0*nN+?=creE=x2scGRkU^cg`m zAo;x9;6#;lcc!D&H@t2JX}X2)z>)g4F$(*MMhcmn{qVw7Su@#Lv!M@AoI32Z&{U!1 z<>Y{4LrSsL)LI(c)-0>HbR?xdLKHP%gO^Ma^A3%Cgefd1$0!(i!(Y8HIauRHhKA7k zL&FAmx;$2H_p5YQH8w*WJ|X|4Ljfl%RRM zf(u5LuOPji|Fm4z+>(y{R9HuY7-J1_p;H`@DRG&zHCY@o1?Z6|M1l{yCCJNtcY)1b zz&0E=u^9Nc!=k$jlb!VuH*h6On6?d^vQe_ajJk|m;<+>?JB{*8ssr}l4?M`~9QI*x z;LYBjl{S?f6C&xKILcn3BsY{z4-0wRsmp~C7nyA=7Kx6jOjFd9A2DDyu;%7huaBPG z?ze9O9bWkF3s7SbqA=lD)&0$mgZA%AMrI4Q9Be{1<~KzYA$`n6b}y~oeO7^2H^JTl zyXYNc5v!JSJ#S}$6+Q0A-(-;;igI!i88hZ-!V6&L=u>q5?yUI^l@gqEqwYx~m=E)0 zg_SV0+dGmr(b=+$bVEmtSs%kgW?v3ISJgNB1r4<(MsYibZw^)SMLDI5PV(JC zYSg4j(2~9F)seGX)e9>-y@#?g{FLeYm9$JJTEFQ0&0)p=;8X4%{Bh_>_KAu{TiU!d zP^BB&s^fjclWrxFX6Yo5fC7cXADmT4gcx7ssG{?=XO+GdqfnF=Nt#+SMonS-4fO73 zyzE$MbXJv3RfRyJ6hRF&UZ?}P72@u+%!M+2iC_&gr#e#kF$QHUmPaZnHa#nH>hmkq zSc(2p6#iq@o!z7+!oR$*R`f-bz+@AY@AzOT^}?AlFv__& zg_$x!Ual7igbK{fE#h@$RJ{BCnBiP!$+)yb>R&Xtu@#i45l{p{|EzkVnNUH6up9j% zsh`biB+j!57LP~}#<>W*@0>e2F__M349@*?w}d9>sSc9p%CE!Ivmob;f6!*b()}wU z7SGyTrmCcM=p)WQg>cgQ#qup=Jn1DPu@+vbjUgp4@a!cHEXl+CC>UcLkUdCmc11)YJo{?RCus9c%Su#ArnjkI*s z(D3k{$0#!DK~Z~qM&OSxK7rz`Q|73NA`z=4fhmO_b{8$OJ}iM}x)v5hii_T6z{47v z9KLDVG7B@eHki@^-1BA4$q_p4tDP=w7V{^z?68UCO2{SSThMv(3-hB;!fVGC!~Vh6 zs+|TN0xvT&10DjVMisbtQiB#9pvahMQ&5bE`}y%XwBfe#BD8G)01A#F9X5R;YT;~X z&uQO@tA68(3l9PCaCA`tRnkjUo#XCNdU}K1nhOn$4I-*>FrBUxzAuld>kK)A^Cz@( zRCpot$s*fz`w<;Qtn4|vt-XoKJvWpQQ+Y#Ac^0PO*3fnGv?+?9c7yRL&C(HJ;&pAQ z(YaZU0$^U~U0VuzIoYeLT7aS+73GYAnI5*aH*(~Hf_gA?ot9|! zHv9A6ha@uU^O|(^s*A;yl_r-X8UwFA@a5VqpD(WL#ps*|IbI3_wnwDynr22OcIkoC~Byf9>g#HJXS*g=RG-V5MkH?GM9d za=TI}l%ZBFg)G?&n>3g-Pz8lm!pKZyQ&BsLq>)u?U<1AyHW61oMds7S(5hjy zCJCjJ)k1^TPEtmrZKNxvQaPlMG$^BjX`~~aK!WpGYj)tcUk&&YW99z->_IA26Oy_UU8+Y~2tnQj* zPMb`ps@W3n_2<{eweBQ&x}Kb!ot;}1Ye|#4B>zlbcRW9O?iMvO(byI$>He)f`YJsN zLL`2d{D=d(7Cj0_RoIfvUyCN=mVc|&fQgGq(MN|ZS==D2dRFJ2g=>3t(Rjc8!Sw!q z`@_cWPS7ivh)!Efku$cM<2^KDS!5l2y?S(a8xC$ghSIjp71=b+HGHXPXW~)>rUWG{ zs~hC0d1LlAPQueOy4)<4hHf@2qk5%rTXT?ivpt=vIZY`bz;OQX70h(OsnKM%1~FdM zBXyrd8Th--qkhJ*Id_f~)z9j1)>XW11G+3f>u-zZ^k4G}li}#2?)!0CyRFW$bXhv- zkg!LPk)vEim36YPS<*A^QE^asm(dMvuZcCeY#t18W=+8I!9g6I2>!gyMA8Pdxa)Vn zJtL&`X@|XFRdxJp3?b9CuHA@l+vC4Bc(kwWeWyV|MJ?*u+(sg-TN_MH=TuQAj3o(} zwUxiwv-SPhSAp?9sUMIV2Cc#hl~EscV&PjgkHe`rybf^@@1DJ~}$pAK~1S>O^#%h=Z$+$KOr zSx$o|%Z(|mqD04`gX^(p?UgX>xiiqR!azh$-Z2wJ2j;~`tP!X-Iltnev{4-|1iVz} z&?To|oF4IRF=7$FFI$G0n4KMmgyZhM^y*ib_p&r#z>_6A8^=_;ie?ud=75ZM)?OfI z8iUD?M?`6h#>~vo)R_@ACIwqi3;UeL@o+i+RK2DqtHrBvm!e#)u%0b@S{azX(d$pY zVi?F@ED;w?6JU=ouP`H~J;5}NUOL&@4&KEmkl(r@YLbgRze2Ta z*J<_i)T*$dp=IwX@g(CBW8 zL|~M3?nvl+Bb7$EB1nxMhfqm5$YkM;v0i|Yl9w-RY6`EcJQuBP1L|uFu6?$l)4*iD z!~PeIZX8<;RoN-__D#W}q92Q&5;kly0xB;jAqUjOM{J<4E@o@x;@ya$ytB?#o|}V^2_UB4`cVP8G@Xrb3pCdk%U9T z*yLJEftx%58kJ)A!CggHSC*^#iBA*WeRf+VUT6?KJ7S7}vyq{J3>gkK3zs*8!yOJ9 z+JbL($V?2dm8`7p@3;G+&+g9#1slkqV}_&Zs^Uv4UoryM)4OZ} zA!XA7M||_uiV&;-`?WNk>PJw3p^k?kAvxKF!S!d|pG7^^Yg#;@n=;5h4lQK8| z8EUr@(Q2T@@Vls9{u`Z*F?JlfcR0wXU~px?dj!gPMwg3V+$bzx-YaLX+P zy`WnAMv-^l5K2}?`}p-$ucKAm!2ZiP1MhIu8`yG2`ea$RZ|ZO?r6_vmx(B|y-4663CQAs;LsdK>Ln=9z zY$8ddJR*V#PR!F-O;i&(B0iDij$0J5SnG22vSC!|K(S~Gc7|a?LW{lqla}@0Kdh;z z6+=mh5v%XFnZWzIQClC41SsM?>n+K#XAKe5Y-z#|ayt*sEF3P2^i?LZN?V=TIKAo& zXCc%SQ% zGO3+cE+=QI%?yNlGFwjP2vCO2)HQn8lPl6|&umu`nLwqWC7IbkUeW*gjou@nIbpD9 z1Zh)_N`HCf;Y}W(S`>p>qCQC%Q85@1CiKQhEdv zZhrp!=oQoY3LtI0BWY{fLmUG?HZFJicKC|rd%Z9UO3#{`n@O}&63r(P$N8wE(TU+~ zXusvV%^6>|UPz|}KIC$yMdNzIff6`}`UI#=-l{&zt#R$5<%gnE$gqb^%6hyB&BbYN zTQ%_tul#BGyS5l|6mU7R*WB6!SVqy{2Coh|rVt4Ds zCNDItZLWoWDd&GwCZ6O6=8ccbq|xh+oX!N6xgAv1->={F2Q@?W^5ihqgVBuBZgXeuuUO-xr7Fnvd9A-WO-DsISDn@Gsx( zqMnN1vCvJ@`23(%OX$`K++pVoS%tUTl#sJ*?a!49nM@4985vl|liaz7hh!271XCAv zeZtPp-ZPfAdkUTFm9ryL5^3hK#%d{Nk1#kmyt8bb7L4f6WiO{1@>P?bT_=;;&QMV0 z-POT91->o+(%n;96i~rnV;8rdSJICC`$r`34K46_tIC%LR4Bx|R{)vL>%S`K^@+h7t7un{T2C7;;Ck(%2)XJ-%pnz$pJO_}DR zv~Bs|Kb#mUxVX6det|eJ+SnqF+SyCnq3QLRV*|X10t^gHy-rOiiXbsbmE3?aexIQ@ zRJf`_=1^PjlYGESS7gWC$VDcXvz}uECX28le`=RuvDv6B+mf9S7DV(g^Xb)!Tjorw zWVH0;*n$==4! zw@3b+B%wcA-HI(BER=oVR#*@K5Din~O(Ra#TY0;`yqnAqIRn3B6CPQ_;}TlTuPdH8d~) zPaOPKRWKg^OAUr%A zP=_ViWgyaI4h*Q23S^9oi0Kng z!$?BJU~zGA7R;M_b#i{_hoIn#0VXUOB{TGtZPfRKXyBSCa4L2_ybTO^^ zu)E2%9nc5L;IP*rykms}D80mI1i{=~0Ue!AE9-}a`Qze-F-duU%qe?exWeKy2ob1p zn(X%L@yr|!(wMu0QRl0c6(uF5{)#e%gE-D@vy0^|JOSNm2;PdiSFFCW%um(2QS|H( zfm3Xk%qw4Bz;R>L7{>%lJqx^Kw1%wt`S}cvnxN!l7C>2d(;qZxA$2n?e~%okTUb99 zRfo50MeQRIQ%0NSdzcgeIemDGASc;qb3B=oBs3pOCRfgHay^+gc)_I8>VN5d;kTH{ z<1Y!jyuWt=V3BX!(#i^}&0;yRqpPwq^8W+b{V2*JfwH2aqM6lP&+V}(&K*2<&1a{q z?Cdo_i+>`W@np?1|LVn?oSfW$gdp(KxwiA11~AD8`g2@Phr_~10+XZhRONhCRn-Mc zI(qsz!tdKiJ?CNc!^1~?_2)^}ncEsi|EirC{8%T)&GsZfUd6=%EiWz>;4qMBW4o!; zpJEV`MvIe$6;xN}l;wXz-u!f>mP|H5QetE9ZrAeIOl%+LFj_VM%0#I=ZLG~3dmDt; z^)NdC?y=-!K75l-?4#K7zO z?Sz_&3Txh0UHwQg@E!GK%X24Du&tsZ%J-%x{lB}lwY7Y7R2mf&Py*C6SBU7G|24YL z;!i`|x3bBb?)3WeeO$)8hCoEhEF*r#H=YOvnK-qGoKVJ?*AM=#mLndrmFjAv=L zSqpZJca}Rsqb{Es;8s7v_&b+vihw|Fad-e z3XFCBhVb(C_O|8Zo)g^r6Foisru&M%C`RAl+nHkE`2KKABwhF5pWfa)UB@1Gt$k0D zwGLNGz>fE)J1M?9Oi@IT{Z!zHrwP*6Cs^n0*0L9kS;3>>Ab*d;WovW8f4(e+twO?K zEiI{c+RM%HSf4E4hXiPWOBw;8^qF5!$z+HsW~9s`r3kr}2J8Kmo*uKCctTM18}^6C z$4-Orh9|+01V(!U8)K7l7uyclijwkVnvTDMIrO32rcR%pauq1Cv9STPtstWF_G6uE zb;gWKWB2=90p#!PiA#`m)(9ZpvzB}U0s%^Oh+rUeI?d$?6TZipmW_66EC7@em6U|s zbHb8exb@=u{rmUr04yVu^Zt-Qo%eY~+3SVjkI&}A2Oj}q+m;9JL>hgJjeCtj4}b*W z0LHRPkzvA5FE2{~@VHc^`A|&wW%Vzg+jInu!2eNM;O!7qMn=ZU)^_mbrTBtp&naVi zS^+TP^|YkP{j%x$(H(HNKkVk_26x`{e7!X>5DxnhD|r8p^uP2Q8IcJ2OVn9gTuCF4 zpAZoN(dw`@-e^A2ew<~ifCJ1|3A?$ytpEsU)e?INkzdKb=rFeOC6D<6GWHST*JF82 zCfDPVfMLXfieW`>bJR*=Pur1Mn;+?9xiZ7s`-`sIcM-k2B@l@}BWC!*)&xwr2!P9od$-j2o*?u&6jG9D-AxnZ z8FnUtF5#bco^l(pvaqxtCdY7pTsAp%>4$;VymnS5pW#73I63Fm3yZaKL}dq&Ad*c&g>{1@G2=>Jv8q9TA@(OjN8 z4@IUXUshPrB-yVB7SNY3__5k@r zAe+u`<^BVxkNW_*jz90gm8)>w_w#LF3V02{qUmS?S`nx`@8e8?gFt|`!4?eolt%wZ zCX32;=#1iaJ${Tu$HZ*1U8yZLSQPkrTre;N(DbjFSl|c|W1Q@)yQ&5%jEzKqkO(Hz zmZ&8R4|?T-T?WqjEU%Qg%X6{Of#BC<<&u?1e|tIR`F@_HwA)e^rSg*kb9Hf%QdE?L zf_L=Ax0#J0Lo_Id1Gf47m>FA&s2SNfny0*D@fh7tJdpCuBz+Jx(WRG@Xu>A8HQnDWleYwSXx^0r{H(!z8f*N*9Gvrmu+9ix(0sV zXFN>LA3)aI)-@P@-=|OJa6gpry_uSrv;%U%HxB=50BOqQo1`w2;8qSE?6bMW-N=)| zV`UDv=!PB5oi`enE{LnmwcpILPq6=8Uj1LRtJW|mgoN>EFGF5{1H5_a6;^~$nmG&W zD4vUYPYu{-4b}MWg1nd@MnRDlKr9lIlVgh_qTI5(r(Y7jgNs8&eL=3@LdM%uyaJHI z^>^ugQueS3F$G1$<)s}%-{-wRI1)mq0zeoI7YJNP$sUg2I+_6}?%?)w(=<=j%GcAy zO2X?{v+v8bF@UFIN-Ch)uQi(YpKM%t98c$N*xCUU>rW=g>C1<;gU#P-xgjhGBjJLA4GR}eEzpMXy`k+Tpsi`-ZZCr{QNd& zsoF~75`wnQ6+}{50MwyiVn#BByz)<-cJfq58A&If-M?Djz}0 zx~+CfcY`T$z@%jcbqVKL5SQ_GaQ;}!p=1&cZ>dP_IWm3z4)B9Umde<``~gr^%n^Tv ztc+VE4Qn)LRZHba1OyNq^;KWSzGx z&>wUP#+EtjFYZes+jHTrr#hRl9BY7ry6B8peT*+49$J{XyLDo7UO;E9()sc12k)e;7B6&9kux_=O9 zP(*kO$%d27gOsysQUaiQgt#1byDxn|Uj-(CK!1(u70+Ww53rSHBSfjta2isHgN1@h zOG|;bCJw@DF94H|_^(P~8v5O3Y)>5AA;E-0$f?atO&twm8Xo>fD(db4-k!^becMwf z&}24e0zgdN-`@k2&)0r?e^%+-{CqSc9`C0|+-P#R3z$NeT=j%R-~@M7<#SV+7iwzP z4)LMwsEMG%m!7oh>i{ptA!k>*=L^5Kp{io5oxdA53dNkq$j=| zhiw}yIVyq|!0g=$CyfXIz6%Fyd9t@Uzg-Z-pw|gQDw?_41(R}jXTRzFaLCVGKblB) z-Ev=1*3{&*0_H=GHKUPhwkL3Ch%B64ULFDP->Gizhj{Hz1kA<1?SBDP2FHndTb8kB z=&EgJdb7h-T2}U;b;IEx6j6Z7xXL+R8c1FJPelcEB<-KFq}ko6-f#N6J)EEh1=t4W z)^hn?(LyGGim}^lk6MpLq}pf!Q5*#Z^huJ1j5QBXetWWgBMaBJb(kam}ncWcU zUs={4I6uudKLx4De?+TV8gF+#aN@zY+EW1OUA|TdV-ri!9Y8{Nx>p8h8;C`ajM|GyC!d0oeeux@Z-pvq}ij!&FkB zmkh|W8s1Wn+--ehgNkNdTve4)zMwpW8n7rKO zp?LvRjaILpH-IpFol16pTz6e=b)^HCrk?;|p%Rq-%Ex7B@zgs(-0$CL4xMKd|1~!N zlHU94Y31!MA&}3g-4p<%IRGt1X{Nnj56*;#plqNVwUx?sNwG&t!4p)3bhc#sxNR%~ zb$)*C{qyyLh^uDhNKXLQg5ky8xOR5Sj&Pj5|_EmocVEkql@rCtHEKtynmS+05 zMi!y&2L(XU&_Se z5ZZn$oIa9woCNB?(Oy(^n08`Dsa+zfTirDg`huJ)bkpf71l6tLcfi zo*Jr+U*rJCo(K*;n;&7=|rw>@d4t`L7u8UP~z;#u-9ct=~7YnA&ws0&JIpndo4(;e?J3r9BJ-suc7S-h_E+!^M2mU{a zx)5~NW(DHKr{NGwrcls4>T^6*>XJ}pfHgqRj12A_;sZwrU{Q~2)&q2}ErtnI3S8laE(q9tuQ z8h_Nf(L3nb*Oj5&RQl`!IT)-l9;2bua>Ku_D?{QhLk1c%6}5CN(ZCgd+T+`NLxT)= zY9&dgLrF>Lnf(=#*oU287J!6`0WydbHZVso1e89pv>?H9XiJP{brU}(^O$QM-3*mV z2Cm&|(!kZAWh$i*Yr36-=g{#jtLGI!tWf4Mzyl6&Qo0hrZvlM1$^BwEz_6GKX6Ix3 z<$WkY;h2wAJFVj=P1h%`2hhB?TEC+f^)Q>>Qw+FIF>b+)(};cYO3ch0`+C{gDXZFj zf4Wdy<$xOl0UT!#`WKa?ayghskGr-YXJq^pkCEs1jQZWvik83`i&Q|xQY@Kp44@!J zcl%ucRmWOT1{E4s`_5f|WAEYkO*yQaR`2+sLKD4HQ0oFPY>&c1wjEjoI!$D$%59LI zeu46GaHIhmvx&L<9E}X^O|4zm1#XM}#BisMm;k~ekuYs^f5_)H6}q#5<_w?(w$d7j z=(=Rf6R8%o#hpS4{LiaF zO>vSO@-{X$(Vg@AW+njP+jEVHiAl&wd;5=RphP+);*%i4SWLgcwL6h43LF;W5xcIY z2A}CSihY+Po!Y`qd__$SdHMLz_$W!xe1Dcpy-)?)>mmZN*|P@3>qb-l-2C}ox3{Xa zw8!(%1c0Tn>>nIB^W=6vE!!YG-y=l`*H^_GX|n61NF}37w-!<xL zl!wDrmKH|DH|v-IG7*c@fesy=-HX>oX)wU-%%~5Q`usb|40;RdMYlpc%^YBE0cc}s zdplTP8S=0RBpDoiSZ(CoBalsdOi&woej9Y)|I~6;aZz<)-xidR76lO`26zZzhDK^Y zQW~XOX-O%EkQV7iX&AbtyGFXZyFnUh$#3y~r|;=|FbAA4`!{>-weI`+U-#C4E({3x z+!EmR%jw8*st0?w-u^r3h!b+*1XV9vxX_XG;1t-)d%;1qV99a2ETQx9ZcIf9z}vp3 z30?4K>DI>}91&iVW&Re5Ml~?pV=8HMzCRCYX9`9~YRO)VmtFYbytUlQcD)`z&|{L9 zl*9n{HZt{!y?i|!5r-o#iF-xV@K12a@lX~-K zQBL}k1(~~7mLCX5;HSrK$vn<81?Ha@-in_}<)1b6Hd)I}S1vOLy%v^~9Ofj?pIEUj zeuG0B(azB(ylhCFP0D$9v71Y+zx!(lsbzzuM^pa4fI_JNJ`2_`U zPs$bHr(^o(NN{S3YB-XLl^AzN8LShktE-m*CCGr0>tL!hV{qyX<)N~Q%9T9qmsa`4 z#p9)B5*n)T=X$5_HER9dl~_uXC=#ShM>#rD;yGI|&!6HbRL(vy>Dqdg4>>Nb92Yw6 z6R5KKwVmf|SUw#m@C7HB6uOe;@6l}(4sRLsICF10{dKq8$7L2B6EkE@NscYv%q}6q zvKjW0TRNnA6)}5B7Q&nO6BLsGPm?8|{`V~SAxA(yw_meYyR06JakVp?k&BB`oN(Ek z1@b5F?WEZJ`;e|e;Mx7&LvXs-!zT4!BS9Ol4+;pXwPvilSkOq~B*cy?(HwJM(f<$Saesq&WZs^8i2O8Tr-8sM5cg z$)=8Mg+xsF6(EfRfXa*%PkC<1ec1luxjB%0eL0B|wy1`q76%qB&>`rZ z7Uc9VauU{aD{Rw%G0{M4i{n5A4ib(RMma{|gKg}XW+s39KBk7nma%eqTsw1eO1)PZ zopYb(l$MjDhd@#?GbI4JiU->gKR-Vxe;`mO2@oNz3Mu?sg)?I!I)fV;gzm#GkH5hm zPC|Zx&Ys6|LSjz^B17ynXNLvE0U>}M8ma1c%X;ro@c#rO;NJmDs%6X3uv8Np^V`LZ z$M((+GZeZG>hM1*IS0;=Ue5bk>E`kjY|lFIRh?=Z6L2E1>efX3JKnsPE5yXmfpw@i z`E`Q$U=f7`cfN$tBoigEK3#5hzEyn<0=Ag+blUyeO)8L9$|@@plLmi(L-WSLflJV7 ze+_hudc{83N+LHWC2h8#N`zyOdH{&x(DB0Tr11QUK=RZcf?FY@pdc8K)O%1$%BDZJ z>FxniW$G{OeHy6CapC7b=_Vo6-6gYz+jV|}n|n>KC_0EF-qARuLi!ewi*L*{ zB5((jqX>eZ8d+KI)1cWQ1PIjAu%1DLalYK8yIS+;brJjdY?T+7d4bHmnRnXFKq zKmUQLX_(2;Sgk6r)=*{h<5YtHv;rQvs5TJ(gCfs#e=a^VD=RW3MG8b>U_%X|cpWx2 zrV6_2$HnRer;s-XAXUNZKeK{_)ouc~u zC{M3%rj@2^>;0AttY6TNf}k0$HYBpi#WB8ZJV`j(J(Xcw-|m(Xapv1V9)FEGHb9?hPEU>wx{} z{AKkZ9{{QTdJmRCaJH5n47;2Q`*t4zfsgGw)VFk|dv}4(ewi;HBbO;M%=q3pK)M}$ z4hm*rKOw@$;*E-P#VMNlu|GBXQCILgz9h5)ahChI}P&<=uDY_mm!Jh>dQmnkdSC8!^pj{6lNhmER4|2+~qnl5~_@6x-3-uPqy>BPJ zjJvUt_R1t;a%$StEMt0Hjv~+aA;6Z|^_Yhw_IH5Tx*5p0E%#W~Ow5D^@V|e6e0KfY zL=H0NB-yt#nE~$_Jk;#>MrFA0<)4T)i{+N@_sjDcDJj8411Nq{3JY01&dQPaJ>*RQ z1paF#^k6S+5Dn-X&`?z^F=)lq2gqJ{{vZr+^S}6DALd(gWQgr;zo$2V8&B1JVF3g# zD>pY_d)wkZXi-q;FKG&=zYL_|<>5K*qC;&~qi!Ci(#S;ctjl(6eh5e_5Z@&Pvna;P zb;SysbLDiTKj-t#Z4CvxD^O1WmWg9GK*zwqkWb=^oSU0_ z0(E15iPw71w00L76ZdATL9{9^BlB2IP3`~dXsu&;DnM(X1>EgLNuTOT@aH%H{7S#< zsPlea=xcJn$}KKtWMd0gQG!=)-k)brSkNhk0~vaHdVt??pC-9qoxN961H|Ad$SVL? zK4*` z9gJJEw!)m5)d7)D;)j#;pr_As__iNoU26qg9u2P*x{sOCX1c{Sm>TnlU zb;cK^>vK-$CSWBXN9vu1E{>RTm`pQIBku~^$FZQ~DTV+~aUXi8;Y+J|3 zx7Du3K#@6gZg4vp&hZM#c6o2bL7yof!YxeQb5c(KMEO72p2S0!hRhrWqUW1!7L^e( zF|r5*Zvv_5-L0%!lk|Tk5J$J<@lRCRDOt9m9z7ii~U!kk2EcqGa{;VF}sFdX2~;n5RUA@9)h# zNqm<;J2QzMhZi%Cr}-ldF)>H&>uQ#FVk0AnsK?#Tom(63mTiO=G;v3U7-;bD%B0#k z&QDaNWy=!ZW(Ib5(|SeGN5;iT8yV5nJ3U`M{yx;I$5f@c5?uyNH+BmQS>PR44Zk&! zd?+JB0IsEE7D~^+5EUEiPcN#_?=dqAhcm=sO+(2*dpXYIDjAF@x)Fe%LvrHp-^V~# zkI&EVl9wBr6m_#F7?>Ip{pA=CCNK9k;;2kOSCJ)SWYw0>>i!~-qe$k_;f1PtLuoLyemnigB6S>@ zf8QhuLH<0+2}d!fU5H#kUXd3q#E~&rQcVpk|CgocJZxnvG|YQHq|+X8G+1y%dQ@Uw z$?iOn3K)LDT$7|uOuW)PFwnAYuUv@=nV3){=s5JbH3cGoZs}Hy;Yb~H2=ZemmSCbU z*sY0`1qk$pUnIzxzi8xe;Dt7vxHfsrOM)jxs&W@kyrj`tq!>2)ol&S_3JJmniX7Yi z@lk1oz*XFoX)qgtWcI@P^&12$Abtf;Fh9+c!|JDr5i(ZSaRzPZU-M|ZOHwlnKo*udD5Bw{*KEeFkR(TI1#AbzLQHT?0$T=xm}gB_tHo zBi3x1Rjh{eZoq1Kj3MyXabjp%TgLK6QG46TaQMuAbaHS#glpqucD6EuuFtaA+CWFr zczP+-`a`>4+V_C+{pD*1(-qX5`(9J}`cV3!Q~HYQbMtr& zsrgdT^G@_sYRt7XxR@E1OR^25?)c1qwVY}wAP|qmvTl|n=aw0xoccYN_u{4r6&Tnp zL+eGP_0<^^ezpVrW~Ij6EM5|CNA+hYoT7#IPi$BYr&jFhO3F+f=%@x!wP!tAeM!PG z6&0!*gUE1j)sb&K7Udq@Bx5l_UGWugpCGx>cy`~afH!wgwKN9|egBs1iyn!x$fXp= zm8_dPZ6hSKDW7wHDxb)kTu@XOl$p8aQC(R%KbW)A^T|pr5_9?sOu2Dd*0Pm%Bjr`; z(sn^QgBlp8Ofp8tj`+#reLNr%j!(h+UfKQubWX--o?u0V(a@<4-!*XV4fZp{562aE z5B$Bo9Q%zqx2UM-n%%Nu!%A(Jli|1ZPs`~fpZTN+^aQCdg(!&Py9~DoJC1*27n?t( zbH6e@q1u^$59Q(t1@U1dP?!x$nchQ1fCSSypgm!oM=8c*`B<`acvxH3v<0onZj@3! zp0oDD`Al2e8vWBZ;85p39$3yG6v@ua#ECGsoD%&i14>}=y(y3qk0Xu%=q3CUs zF&&tUfC+tmmDm0Fo;m{k?iy$u8>33EPqE|4KZ)XVQ$rkOpG6945~%^$j7I$8g?R|I zNX&2sm$afHgvAnlGs!^_`KmJCVrb#X(i;VeS;W}kLT8razY}RzJ9fbti_QaUsUz#9 z4M9|Y62F7|`DEK#FufO6K~x`71gRvVCoU;T=|`GsbEi$Ld~D0N;;-8Id1)}p{P^*0 zt(71prD&6DH+M&9=zW3LvE{g8dmTAmAhL(hA=Gxn`VLcO83ZFi<-F=T=40_o-5`Ag9mqRUz1)2_?pWlqV5^~D~;n;Z23l(?;k=b z(H`}rPF}qt#afOC-?+J3`HG9`0o8Kw=oWjpFc^i5dO%fy4s_{(tXPllU^qwSO?E-n zkBu4Y5Tr9&U0T>jn-pJDO_$XhC@oeby^ONNT5$dr=%#lx{`w;4W!>h)Se}}KQI#egVHriw4v@3XBG+GofMg6`N`IT zge69kXtFHzhmS(`xyg4@pHDCc;frgS7wC23Pxh?@^%m1WAPYiAU}!o3Y~tj%vAXsg z_k}59pH-CXRVa@Rm@R7~N#rc-fj&$l=R{grWo9@~PU^vfTbSeflD}fYVxvK`8kv+d zM`sTNkG77EGgZ+TdN8;4^_D<_Js0R|S%qcsgS_e`4o(jh_C!?`w)a22uJ}nFRp>=O ztd06vzS(x~%CWmTc06xN`We{miF2d=ji3DV6kq75>%e6#vh%?Utx`^dk#%{#by_?< zN~vL==BaO(t6aOfPUBV^DJkMsAsDSgUmxwKCJH~p6JI*bQ=P0TGgG2Vtfu}rn<6D< z;Qhz0*nhP}PO}h}uoK*+P`q+W?Gd{*nv)n!#lY~v5toPt3jG<())Y`_Ia%g$Lx2aD zH`*fwYfDVDd=Ui-L1yxH3hM)IFJN;DQ)Y&%bJEctpL5{_s!Tz(&8$#l91& z^YV1Iejd~iRV%hR(Y&UZ%o*9s_BjTX0vvcZWEvqSRanrd-v;HhTA4OG#nnI0?`G@k zk-0~LVXFsR;dp$Ut-sk<{%q5fc=3L+PB=*)7c751pJ`WaUN>ElEu)~~G@HOZdxM(r zm$p@Vwe$n=9CrdEhACjc%j@{sb|6U~k8l-7M{k<+^jNlrh6vVmxRG?6xOnbwZ7@q3 z(^w_dz>8mZ*|;9$ZS8rk<(+tEbof!rglbTKc@lN~gxcex8CU6?B$CntqXt1TH9p=A zZu(>~db77)X_rX+y1qqNn^n@gHTE=V!uoF<4GZ&{>ZO+SEcLQ=UhJ0R&ef5aArMU)5gFQ~1UXoqqY&+x%TG8cg_|Pvmx`}rv~-it zu5sXRZLhkrsh44RM>*lbOP~SKA$Ug;Imzzz&fQX`RMXhNz?-d!ECYo?4iBTacoF`N z0(YUa1KT9X)~#%atylKpEcaX2!`JP$OKtf-3Lq6uXKHDq>+P&&GJ_vBc0VsJ-<&Hw z#eQ_sL+mn&u1O&_%B`iXZD_U2OGj5-<9hn)?}f zGqkhqtH)0I*p!N|r+6JyVlT$o>iEB&IZ4p|a#ag#=tgtfHk~Zf)Yms~bxl}aHh}3j zv|U_KZfry)`VL{XcI@GgyyTa6n0h=XZ*MeA%p%ao*RS`KF58X{k^R?j;LrV?P-St*r&mwOWG{4_%~^0q zlk)v%GDX$`UlUUHUJTiG?tk(=R@+au#va;l`Tsa#nfggwW$l9xhx=cgjG~VA>qR_G zo$~{jyas=%zACM#XlrXjZ5IXiPaax7jXPh7jYNkIc;ki#QU+&T7C9 zG7PQpL~|RH+tH-HRQt6qcT`#TtaE>#BW|C=sg;k?WsniBe*;TS)z!>29GCiH%^9M= zH`n#=*b^|RMPPW26i7>;xw&MUN6BWz#nrR|>6eU(YU6kiOD4xbs6MN|gZ=j`5oBmY z^f-m?QDS{QODDp_J!4i155Lde18zGl@8iZG3M-dpzI#+~ZTtm!WJ*_(FGBZ{U}Su} z8I)IiK*I-~`lyx26Aat0YOhF?^SHsFSV&kHC%f&>w6sX5Mi_o;$MVrrt3BG6a7Ck0 z(IiDSQ~v79YnZ61Nto3(q}GwRJSmSVL6u{g55I^PL2`ZT>eeJ+So-bc^u|lGFc~!I zPeS+C0SBn4+#3!m4nV)S@ncWyKU!)Q`sX%RJdIras_v}ti zgdROo=3|U9PeDgzPK))+m}kL~kH04zUfnn%5cU_gY^9nZ;NTt^d!|cSebBo4_fNi( z1lsjtsdb`QnlxuTz+1i`$9Wpw8Q9r5<+kp;XH;ISCYkZe(aC9KVnT|ZI1R`PXJ_Kz zsvs|I(u#@*Vtc>$u8;go2|%ym68n_E5Gdg@TYcBwpZL1gc9}LhnoGx~@*xEZ<=r7A z(%3kEa&l6**dvwkzGay`?OlMMpX*D4PLYJ~R zUOWCzTO0imI-0h&_Me@djPmm6>V+94dSVC>c8R6NDPm#|u|qCW(Aa z=S54)24>%B(;ozZHA_p2lNu0!&h&ry=l}i%M>7|MKGQ!@56ZW%!HbF>$Ve(m6p4NG F`G4!@i5ma_ literal 26830 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