From 2b21f4081c70256d309a91690e1952da8befbe67 Mon Sep 17 00:00:00 2001 From: meetpatty Date: Tue, 7 Jan 2025 20:15:07 +1300 Subject: [PATCH 1/2] 5.00 completed! --- tm_common/flashemu.c | 116 ++- tm_common/include/flashemu.h | 6 + tm_firmware/500/CMakeLists.txt | 3 + tm_firmware/500/common/CMakeLists.txt | 5 + .../500/common/include/rebootPatches.h | 132 +++ .../500/common/include/rebootex_config.h | 29 + tm_firmware/500/common/rebootPatches.cpp | 106 ++ tm_firmware/500/ipl_payload/CMakeLists.txt | 49 +- .../500/ipl_payload/dax_payload_01g.bin | Bin 12288 -> 0 bytes .../500/ipl_payload/dax_payload_02g.bin | Bin 12288 -> 0 bytes tm_firmware/500/ipl_payload/main.cpp | 93 ++ .../500/ipl_payload/payloadex/CMakeLists.txt | 36 + .../500/ipl_payload/payloadex/main.cpp | 122 +++ .../payloadex/pspbtcnf_recovery_01g.bin | Bin 0 -> 3052 bytes .../payloadex/pspbtcnf_recovery_02g.bin | Bin 0 -> 3077 bytes .../payloadex_loader/CMakeLists.txt | 37 + .../500/ipl_payload/payloadex_loader/main.cpp | 49 + tm_firmware/500/tmctrl/CMakeLists.txt | 6 +- tm_firmware/500/tmctrl/exports.exp | 6 +- tm_firmware/500/tmctrl/main.c | 985 +----------------- .../500/tmctrl/rebootex/CMakeLists.txt | 56 +- tm_firmware/500/tmctrl/rebootex/btcnf.h | 172 +++ tm_firmware/500/tmctrl/rebootex/crt0.s | 19 - .../tmctrl/rebootex/include/rebootex_01g.h | 335 ------ .../tmctrl/rebootex/include/rebootex_02g.h | 335 ------ tm_firmware/500/tmctrl/rebootex/main.cpp | 189 ++-- tm_firmware/661/tmctrl/main.c | 106 +- 27 files changed, 1090 insertions(+), 1902 deletions(-) create mode 100644 tm_firmware/500/common/CMakeLists.txt create mode 100644 tm_firmware/500/common/include/rebootPatches.h create mode 100644 tm_firmware/500/common/include/rebootex_config.h create mode 100644 tm_firmware/500/common/rebootPatches.cpp delete mode 100755 tm_firmware/500/ipl_payload/dax_payload_01g.bin delete mode 100755 tm_firmware/500/ipl_payload/dax_payload_02g.bin create mode 100644 tm_firmware/500/ipl_payload/main.cpp create mode 100644 tm_firmware/500/ipl_payload/payloadex/CMakeLists.txt create mode 100644 tm_firmware/500/ipl_payload/payloadex/main.cpp create mode 100644 tm_firmware/500/ipl_payload/payloadex/pspbtcnf_recovery_01g.bin create mode 100644 tm_firmware/500/ipl_payload/payloadex/pspbtcnf_recovery_02g.bin create mode 100644 tm_firmware/500/ipl_payload/payloadex_loader/CMakeLists.txt create mode 100644 tm_firmware/500/ipl_payload/payloadex_loader/main.cpp create mode 100644 tm_firmware/500/tmctrl/rebootex/btcnf.h delete mode 100644 tm_firmware/500/tmctrl/rebootex/crt0.s delete mode 100755 tm_firmware/500/tmctrl/rebootex/include/rebootex_01g.h delete mode 100755 tm_firmware/500/tmctrl/rebootex/include/rebootex_02g.h diff --git a/tm_common/flashemu.c b/tm_common/flashemu.c index 9570fa6..9234c5b 100644 --- a/tm_common/flashemu.c +++ b/tm_common/flashemu.c @@ -23,7 +23,7 @@ char path[260]; FileHandler file_handler[MAX_FILES]; #endif -#if defined FLASH_EMU_TOO_MANY_FILES_FIX && PSP_FW_VERSION < 660 +#if defined FLASH_EMU_TOO_MANY_FILES_FIX && PSP_FW_VERSION < 500 int (* df_open)(s32 a0, char* path, s32 a2, s32 a3); int (* df_dopen)(s32 a0, char* path, s32 a2); int (* df_devctl)(s32 a0, s32 a1, s32 a2, s32 a3); @@ -35,7 +35,17 @@ SceUID flashemuThid; int msNotReady = 1; int installed = 0; +#if PSP_FW_VERSION < 500 extern PspSysEventHandler sysEventHandler; +#else +int SysEventHandler(int eventId, char *eventName, void *param, int *result); +PspSysEventHandler sysEventHandler = + { + .size = sizeof(PspSysEventHandler), + .name = "", + .type_mask = 0x00FFFF00, + .handler = SysEventHandler}; +#endif #define Lock() sceKernelWaitSema(flashemu_sema, 1, NULL) #define UnLock() sceKernelSignalSema(flashemu_sema, 1) @@ -152,6 +162,19 @@ int InstallFlashEmu() int UninstallFlashEmu() { +#if PSP_FW_VERSION >= 500 + SceUInt timeout = 500000; + sceKernelWaitSema(flashemu_sema, 1, &timeout); + sceKernelDeleteSema(flashemu_sema); + + sceIoUnassign("flash0:"); + sceIoUnassign("flash1:"); + sceIoUnassign("flash2:"); + sceIoUnassign("flash3:"); + + sceKernelUnregisterSysEventHandler(&sysEventHandler); +#endif + return 0; } @@ -965,7 +988,7 @@ int CloseOpenFile(int *argv) return 0x80010018; } -#if PSP_FW_VERSION < 660 +#if PSP_FW_VERSION < 500 int df_dopenPatched(s32 a0, char* path, s32 a2) { while(1) { @@ -1021,6 +1044,69 @@ int df_devctlPatched(s32 a0, s32 a1, s32 a2, s32 a3) return res; } +#else +int df_dopenPatched(int type, void * cb, void *arg) +{ + int res; + + while(1) { + res = sceKernelExtendKernelStack(type, cb, arg); + if (res != 0x80010018) + return res; + + if (*(int *)(arg + 4) == 0) + continue; + + if (memcmp((void *)(*(int *)(arg + 4) + 4), TM_PATH_W, sizeof(TM_PATH_W)) == 0) + continue; + + res = sceKernelExtendKernelStack(0x4000, (void *)CloseOpenFile, 0); + if (res < 0) + break; + } + return res; +} + +int df_openPatched(int type, void * cb, void *arg) +{ + int res; + + while(1) { + res = sceKernelExtendKernelStack(type, cb, arg); + if (res != 0x80010018) + return res; + + if (*(int *)(arg + 4) == 0) + continue; + + if (memcmp((void *)(*(int *)(arg + 4) + 4), TM_PATH_W, sizeof(TM_PATH_W)) == 0) + continue; + + res = sceKernelExtendKernelStack(0x4000, (void *)CloseOpenFile, 0); + if (res < 0) + break; + } + return res; +} + +int df_devctlPatched(int type, void *cb, void *arg) +{ + int res; + + while(1) + { + res = sceKernelExtendKernelStack(type, cb, arg); + if (res != 0x80010018) + break; + + res = sceKernelExtendKernelStack(0x4000, (void *)CloseOpenFile, 0); + + if (res < 0) + break; + } + + return res; +} #endif #endif @@ -1092,4 +1178,28 @@ int SceLfatfsAssign() int sceLfatfsStop() { return 0; -} \ No newline at end of file +} + +#if PSP_FW_VERSION >= 500 +int SysEventHandler(int eventId, char *eventName, void *param, int *result) +{ + if (eventId == 0x4000) //suspend + { +#ifdef FLASH_EMU_TOO_MANY_FILES_FIX + int i; + for(i = 0; i < MAX_FILES; i++) + { + if(file_handler[i].opened && file_handler[i].unk_8 == 0 && file_handler[i].flags != DIR_FLAG) + { + file_handler[i].offset = sceIoLseek(file_handler[i].fd, 0, PSP_SEEK_CUR); + file_handler[i].unk_8 = 1; + sceIoClose(file_handler[i].fd); + } + } +#endif + } + else if (eventId == 0x10009) // resume + msNotReady = 1; + return 0; +} +#endif \ No newline at end of file diff --git a/tm_common/include/flashemu.h b/tm_common/include/flashemu.h index 11d60c8..812a160 100644 --- a/tm_common/include/flashemu.h +++ b/tm_common/include/flashemu.h @@ -22,4 +22,10 @@ typedef struct #endif +#if PSP_FW_VERSION >= 500 +int df_dopenPatched(int type, void * cb, void *arg); +int df_openPatched(int type, void * cb, void *arg); +int df_devctlPatched(int type, void *cb, void *arg); +#endif + #endif \ No newline at end of file diff --git a/tm_firmware/500/CMakeLists.txt b/tm_firmware/500/CMakeLists.txt index 80db5a4..6df2f5f 100644 --- a/tm_firmware/500/CMakeLists.txt +++ b/tm_firmware/500/CMakeLists.txt @@ -1,4 +1,7 @@ project(tm_500 VERSION 1.0 LANGUAGES C CXX ASM) +add_compile_definitions(PSP_FW_VERSION=500 TM_PATH="/TM/DC8" TM_PATH_W=L"\\\\TM\\\\DC8\\\\") + +add_subdirectory(common) add_subdirectory(ipl_payload) add_subdirectory(tmctrl) diff --git a/tm_firmware/500/common/CMakeLists.txt b/tm_firmware/500/common/CMakeLists.txt new file mode 100644 index 0000000..1015a02 --- /dev/null +++ b/tm_firmware/500/common/CMakeLists.txt @@ -0,0 +1,5 @@ +add_library(500rebootpatches INTERFACE) +add_library(tm500_common::rebootpatches ALIAS 500rebootpatches) + +target_include_directories(500rebootpatches INTERFACE include) +target_sources(500rebootpatches INTERFACE rebootPatches.cpp) \ No newline at end of file diff --git a/tm_firmware/500/common/include/rebootPatches.h b/tm_firmware/500/common/include/rebootPatches.h new file mode 100644 index 0000000..771d0d2 --- /dev/null +++ b/tm_firmware/500/common/include/rebootPatches.h @@ -0,0 +1,132 @@ +/* + * Based on payloadex_patch_addr.h/rebootex_patch_addr.h from minimum edition - https://github.com/PSP-Archive/minimum_edition +*/ + +#pragma once + +#include + +struct RebootPatches { + u32 BootLfatMountPatch; + u32 BootLfatOpenPatch; + u32 BootLfatReadPatch; + u32 BootLfatClosePatch; + u32 CheckPspConfigPatch; + u32 KdebugPatchAddr; + u32 BtHeaderPatchAddr; + u32 LfatMountPatchAddr; + u32 LfatSeekPatchAddr1; + u32 LfatSeekPatchAddr2; + u32 LoadCorePatchAddr; + u32 HashCheckPatchAddr; + u32 SigcheckPatchAddr; +}; + +struct LoadCorePatches { + u32 ModuleOffsetAddr; + u32 SigcheckPatchAddr1; + u32 SigcheckPatchAddr2; + u32 SigcheckPatchAddr3; + u32 SigcheckFuncAddr; + u32 DecryptPatchAddr; + u32 DecryptPatchAddr2; + u32 DecryptFuncAddr; +}; + +struct Patches { + struct RebootPatches rebootPatches; + struct LoadCorePatches loadCorePatches; +}; + +struct MsLfatFuncs { + void *msMount; + void *msOpen; + void *msRead; + void *msClose; +}; + +static const struct Patches patches = { +#if PSP_MODEL == 0 +#if defined PAYLOADEX + .rebootPatches = { + .BootLfatMountPatch = 0x88603394, + .BootLfatOpenPatch = 0x886033a4, + .BootLfatReadPatch = 0x8860340c, + .BootLfatClosePatch = 0x8860342c, + .CheckPspConfigPatch = 0x8860a308, + .KdebugPatchAddr = 0x8860c1a0, + .LfatMountPatchAddr = 0x8860339c, + .LfatSeekPatchAddr1 = 0x886033ec, + .LfatSeekPatchAddr2 = 0x886033fc, + .LoadCorePatchAddr = 0x88602908, + .HashCheckPatchAddr = 0x88602e68, + .SigcheckPatchAddr = 0x886009c4, + }, +#elif defined REBOOTEX + .rebootPatches = { + .BootLfatMountPatch = 0x88601f44, + .BootLfatOpenPatch = 0x88601f58, + .BootLfatReadPatch = 0x88601fc8, + .BootLfatClosePatch = 0x88601ff4, + .CheckPspConfigPatch = 0x88604f68, + .KdebugPatchAddr = 0x88603018, + .LfatMountPatchAddr = 0x88601f50, + .LfatSeekPatchAddr1 = 0x88601fa4, + .LfatSeekPatchAddr2 = 0x88601fbc, + .LoadCorePatchAddr = 0x88604e20, + .HashCheckPatchAddr = 0x88606c68, + .SigcheckPatchAddr = 0x8860133c, + }, +#endif + +#elif (PSP_MODEL == 1) +#if defined PAYLOADEX + .rebootPatches = { + .BootLfatMountPatch = 0x88603468, + .BootLfatOpenPatch = 0x88603478, + .BootLfatReadPatch = 0x886034e0, + .BootLfatClosePatch = 0x88603500, + .CheckPspConfigPatch = 0x8860a3dc, + .KdebugPatchAddr = 0x8860c274, + .LfatMountPatchAddr = 0x88603470, + .LfatSeekPatchAddr1 = 0x886034c0, + .LfatSeekPatchAddr2 = 0x886034d0, + .LoadCorePatchAddr = 0x886029d0, + .HashCheckPatchAddr = 0x88602f3c, + .SigcheckPatchAddr = 0x88600a54, + }, +#elif defined REBOOTEX + .rebootPatches = { + .BootLfatMountPatch = 0x8860200c, + .BootLfatOpenPatch = 0x88602020, + .BootLfatReadPatch = 0x88602090, + .BootLfatClosePatch = 0x886020bc, + .CheckPspConfigPatch = 0x88605030, + .KdebugPatchAddr = 0x886030e0, + .LfatMountPatchAddr = 0x88602018, + .LfatSeekPatchAddr1 = 0x8860206c, + .LfatSeekPatchAddr2 = 0x88602084, + .LoadCorePatchAddr = 0x88604ee8, + .HashCheckPatchAddr = 0x88606d38, + .SigcheckPatchAddr = 0x886013cc, + }, +#endif + +#endif + .loadCorePatches = { + .ModuleOffsetAddr = 0x00000c74, + .SigcheckPatchAddr1 = 0x0000691c, + .SigcheckPatchAddr2 = 0x0000694c, + .SigcheckPatchAddr3 = 0x000069e4, + .SigcheckFuncAddr = 0x000081b4, + .DecryptPatchAddr = 0x000041d0, + .DecryptPatchAddr2 = 0x000068f8, + .DecryptFuncAddr = 0x000081d4, + }, +}; + +#ifdef PAYLOADEX +void patchIplPayload(MsLfatFuncs *funcs); +#elif defined REBOOTEX +void patchRebootBin(MsLfatFuncs *funcs); +#endif diff --git a/tm_firmware/500/common/include/rebootex_config.h b/tm_firmware/500/common/include/rebootex_config.h new file mode 100644 index 0000000..5b029a7 --- /dev/null +++ b/tm_firmware/500/common/include/rebootex_config.h @@ -0,0 +1,29 @@ +/* + * Based on rebootex_config.h from minimum edition - https://github.com/PSP-Archive/minimum_edition +*/ + +#ifndef __REBOOTEX_CONFIG_H__ +#define __REBOOTEX_CONFIG_H__ + +#include + +#define REBOOTEX_FILELEN_MAX 0x50 +#define REBOOTEX_PARAM_OFFSET 0x88FB0000 + +typedef struct RebootexParam { + char file[REBOOTEX_FILELEN_MAX];//0 + u32 config[0x70/4];//0x50 + int reboot_index;//0xc0 + int mem2; + int mem8; + int k150_flag; + void* on_reboot_after; + void* on_reboot_buf; + int on_reboot_size; + int on_reboot_flag; +} RebootexParam; + +// *(u32 *)0x88FB00F0 = size_systemctrl;// + +#endif + diff --git a/tm_firmware/500/common/rebootPatches.cpp b/tm_firmware/500/common/rebootPatches.cpp new file mode 100644 index 0000000..2a79bfa --- /dev/null +++ b/tm_firmware/500/common/rebootPatches.cpp @@ -0,0 +1,106 @@ +/* + * Based on code from minimum edition - https://github.com/PSP-Archive/minimum_edition +*/ + +#include +#include + +#include +#include + +#include "rebootPatches.h" + +#if PSP_MODEL == 0 +#define OE_TAG 0xa030db35 +#else +#define OE_TAG 0xb301aeba +#endif + + +namespace { + + using nand_dec_function_t = std::add_pointer_t; + using decrypt_function_t = std::add_pointer_t; + using module_start_function_t = std::add_pointer_t; + + nand_dec_function_t nandDecryptPtr; + decrypt_function_t decryptPtr; + u32 loadCoreTextAddr; + + void clearCaches() { + iplKernelDcacheWritebackInvalidateAll(); + iplKernelIcacheInvalidateAll(); + } + + int decryptPatched(u8 *buf, u32 size, s32 *s) { + + u32 tag = *reinterpret_cast(buf + 0x130); + s32 compSize = *reinterpret_cast(buf + 0xb0); + u32 *data = reinterpret_cast(buf + 0x150); + + if (tag == OE_TAG) + { + *s = compSize; + + if (compSize > 0) { + memcpy(buf, data, compSize); + } + + return 0; + } + + return decryptPtr(buf, size, s); + } + + int loadCoreModuleStartPatched(SceSize args, void *argp, module_start_function_t module_start) { + + loadCoreTextAddr = reinterpret_cast(module_start) - patches.loadCorePatches.ModuleOffsetAddr; + + _sw(ADDIU(GPREG_V0, GPREG_ZR, 0), loadCoreTextAddr + patches.loadCorePatches.SigcheckPatchAddr1); + _sw(ADDIU(GPREG_V0, GPREG_ZR, 0), loadCoreTextAddr + patches.loadCorePatches.SigcheckPatchAddr2); + _sw(ADDIU(GPREG_V0, GPREG_ZR, 0), loadCoreTextAddr + patches.loadCorePatches.SigcheckPatchAddr3); + + MAKE_CALL(loadCoreTextAddr + patches.loadCorePatches.DecryptPatchAddr, decryptPatched); + MAKE_CALL(loadCoreTextAddr + patches.loadCorePatches.DecryptPatchAddr2, decryptPatched); + + nandDecryptPtr = reinterpret_cast(loadCoreTextAddr + patches.loadCorePatches.SigcheckFuncAddr); + decryptPtr = reinterpret_cast(loadCoreTextAddr + patches.loadCorePatches.DecryptFuncAddr); + + clearCaches(); + + return module_start(8, argp); + } +} + +#if defined PAYLOADEX +void patchIplPayload(MsLfatFuncs *funcs) { + + _sw(ADDIU(GPREG_A2, GPREG_T7, 0x0), patches.rebootPatches.LoadCorePatchAddr); + +#elif defined REBOOTEX +void patchRebootBin(MsLfatFuncs *funcs) { + + _sw(ADDIU(GPREG_A2, GPREG_S1, 0x0), patches.rebootPatches.LoadCorePatchAddr); +#endif + + MAKE_JUMP(patches.rebootPatches.LoadCorePatchAddr + 0x8, loadCoreModuleStartPatched); + + _sw(SW(GPREG_A1, GPREG_SP, 0x0), patches.rebootPatches.CheckPspConfigPatch); + _sw(ADDI(GPREG_V1, GPREG_A1, 0x0), patches.rebootPatches.CheckPspConfigPatch + 0x4); + + MAKE_FUNCTION_RETURN0(patches.rebootPatches.SigcheckPatchAddr); + + _sw(0, patches.rebootPatches.LfatMountPatchAddr); + _sw(0, patches.rebootPatches.LfatSeekPatchAddr1); + _sw(0, patches.rebootPatches.LfatSeekPatchAddr2); + _sw(0, patches.rebootPatches.HashCheckPatchAddr); + + MAKE_FUNCTION_RETURN(patches.rebootPatches.KdebugPatchAddr, 1); + + MAKE_CALL(patches.rebootPatches.BootLfatMountPatch, funcs->msMount); + MAKE_CALL(patches.rebootPatches.BootLfatOpenPatch, funcs->msOpen); + MAKE_CALL(patches.rebootPatches.BootLfatReadPatch, funcs->msRead); + MAKE_CALL(patches.rebootPatches.BootLfatClosePatch, funcs->msClose); + + clearCaches(); +} diff --git a/tm_firmware/500/ipl_payload/CMakeLists.txt b/tm_firmware/500/ipl_payload/CMakeLists.txt index 3429f9a..55877ca 100644 --- a/tm_firmware/500/ipl_payload/CMakeLists.txt +++ b/tm_firmware/500/ipl_payload/CMakeLists.txt @@ -1,13 +1,44 @@ -add_custom_target(${PROJECT_NAME}_ipl_payload_01g ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/payload_01g.bin") +add_subdirectory(payloadex) +add_subdirectory(payloadex_loader) -add_custom_command( - OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/payload_01g.bin" - COMMAND $ --payload_addr 0x040E0000 --ipl_addr 0x040F0000 --input_payload ${CMAKE_CURRENT_SOURCE_DIR}/dax_payload_01g.bin --output payload_01g.bin -) +get_target_property(LINKER_SCRIPT tm_common::linker_script INTERFACE_SOURCES) -add_custom_target(${PROJECT_NAME}_ipl_payload_02g ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/payload_02g.bin") +set(LOAD_ADDR 0x040E0000) -add_custom_command( - OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/payload_02g.bin" - COMMAND $ --payload_addr 0x040E0000 --ipl_addr 0x040F0000 --input_payload ${CMAKE_CURRENT_SOURCE_DIR}/dax_payload_02g.bin --output payload_02g.bin +configure_file( + "${LINKER_SCRIPT}" + "${CMAKE_CURRENT_BINARY_DIR}/linker.x" ) + +foreach(GEN 1 2) + math(EXPR MODEL "${GEN}-1") + set(EXEC_NAME payload_500_0${GEN}g) + add_executable(${EXEC_NAME}) + target_sources(${EXEC_NAME} PRIVATE main.cpp) + target_link_libraries(${EXEC_NAME} PRIVATE tm_common::crt c utils iplsdk::cache iplsdk::lowio iplsdk::syscon tm_common::common) + target_link_options(${EXEC_NAME} PRIVATE -nostdlib -T${CMAKE_CURRENT_BINARY_DIR}/linker.x) + target_compile_definitions(${EXEC_NAME} PRIVATE PSP_MODEL=${MODEL}) + + add_custom_command( + OUTPUT payloadex_loader_0${GEN}g.h + DEPENDS payloadex_loader_500_0${GEN}g + COMMAND $ + --c_style + payloadex="$".bin + payloadex_loader_0${GEN}g.h + ) + + target_include_directories(${EXEC_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + target_sources(${EXEC_NAME} PRIVATE payloadex_loader_0${GEN}g.h) + + add_custom_command( + TARGET ${EXEC_NAME} + POST_BUILD + COMMAND psp-objcopy -O binary ${EXEC_NAME} ${EXEC_NAME}.bin + COMMAND $ + --input_payload ${EXEC_NAME}.bin + --payload_addr 0x040E0000 + --ipl_addr 0x040F0000 + --output payload_0${GEN}g.bin + ) +endforeach() diff --git a/tm_firmware/500/ipl_payload/dax_payload_01g.bin b/tm_firmware/500/ipl_payload/dax_payload_01g.bin deleted file mode 100755 index a783e9782eac4e56d2ea382757a490e718ae9c61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 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 O{N#b3Jn( diff --git a/tm_firmware/500/ipl_payload/main.cpp b/tm_firmware/500/ipl_payload/main.cpp new file mode 100644 index 0000000..0b92bc0 --- /dev/null +++ b/tm_firmware/500/ipl_payload/main.cpp @@ -0,0 +1,93 @@ +#include +#include + +#include +#include +#include +#include + +#include + +#if PSP_MODEL == 0 +#include +#define LD_PAYLOADEX_ADDR 0x0400c534 +#elif PSP_MODEL == 1 +#include +#define LD_PAYLOADEX_ADDR 0x0400d534 +#endif + +namespace { + using v_v_function_t = std::add_pointer_t; + + inline auto const mainEntryPtr = reinterpret_cast(0x04000000); + + [[noreturn]] inline void mainEntry() { + + asm("li $sp, 0x040fff00"); + mainEntryPtr(); + + __builtin_unreachable(); + } + + void clearCaches() { + iplKernelDcacheWritebackInvalidateAll(); + iplKernelIcacheInvalidateAll(); + } + +#if PSP_MODEL == 1 + u32 key[] = + { + 0x802a43ad, 0xa570d79a, 0x890e5087, 0xc6055fe5, + 0xb7558656, 0x89d4608b, 0x83d431ea, 0x469dc537, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0 + }; + + int setkey() { + + for (int i = 0; i < sizeof(key)/sizeof(*key); i++) + reinterpret_cast(0xbfc00200)[i] = key[i]; + + return 0; + } + +#endif + + void *my_memcpy(void *m1, const void *m2, size_t size) + { + int i; + u8 *p1 = (u8 *)m1; + u8 *p2 = (u8 *)m2; + + for (i = 0; i < size; i++) + { + p1[i] = p2[i]; + } + + return m1; + } + +} + +int main() { + + my_memcpy(reinterpret_cast(0x010000), payloadex, sizeof(payloadex)); + + MAKE_CALL(0x0400035c, 0x10000); + + //Change payload entry point to payloadex + _sw(LUI(GPREG_T9, 0x88fc), LD_PAYLOADEX_ADDR); + +#if PSP_MODEL == 0 + _sw(0, 0x04001100); +#else + _sw(0, 0x04000360); + _sw(0, 0x040011e4); + MAKE_JUMP(0x04001144, setkey); + _sw(0, 0x04001148); +#endif + + clearCaches(); + + mainEntry(); +} \ No newline at end of file diff --git a/tm_firmware/500/ipl_payload/payloadex/CMakeLists.txt b/tm_firmware/500/ipl_payload/payloadex/CMakeLists.txt new file mode 100644 index 0000000..eb51931 --- /dev/null +++ b/tm_firmware/500/ipl_payload/payloadex/CMakeLists.txt @@ -0,0 +1,36 @@ +get_target_property(LINKER_SCRIPT tm_common::linker_script INTERFACE_SOURCES) + +set(LOAD_ADDR 0x88fc0000) + +configure_file( + "${LINKER_SCRIPT}" + "${CMAKE_CURRENT_BINARY_DIR}/linker.x" +) + +foreach(GEN 1 2) + math(EXPR MODEL "${GEN}-1") + set(EXEC_NAME payloadex_500_0${GEN}g) + add_executable(${EXEC_NAME}) + target_sources(${EXEC_NAME} PRIVATE main.cpp) + target_link_libraries(${EXEC_NAME} PRIVATE tm_common::crt c utils iplsdk::cache iplsdk::ff_ro iplsdk::lowio iplsdk::ms iplsdk::syscon tm_common::common tm500_common::rebootpatches) + target_link_options(${EXEC_NAME} PRIVATE -nostdlib -T${CMAKE_CURRENT_BINARY_DIR}/linker.x) + target_compile_definitions(${EXEC_NAME} PRIVATE PSP_MODEL=${MODEL} PAYLOADEX) + + add_custom_command( + OUTPUT pspbtcnf_recovery_0${GEN}g.h + COMMAND $ + --c_style + pspbtcnf_recovery=${CMAKE_CURRENT_SOURCE_DIR}/pspbtcnf_recovery_0${GEN}g.bin + pspbtcnf_recovery_0${GEN}g.h + ) + + add_custom_command( + TARGET ${EXEC_NAME} + POST_BUILD + COMMAND psp-objcopy -O binary ${EXEC_NAME} ${EXEC_NAME}.bin + ) + + target_include_directories(${EXEC_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + target_sources(${EXEC_NAME} PRIVATE pspbtcnf_recovery_0${GEN}g.h) + +endforeach() diff --git a/tm_firmware/500/ipl_payload/payloadex/main.cpp b/tm_firmware/500/ipl_payload/payloadex/main.cpp new file mode 100644 index 0000000..e0ef8b0 --- /dev/null +++ b/tm_firmware/500/ipl_payload/payloadex/main.cpp @@ -0,0 +1,122 @@ +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include "rebootPatches.h" +#include "rebootex_config.h" + +#if PSP_MODEL == 0 +#include "pspbtcnf_recovery_01g.h" +#define BTCNF_PATH "/kd/pspbtcnf.bin" +#elif PSP_MODEL == 1 +#include "pspbtcnf_recovery_02g.h" +#define BTCNF_PATH "/kd/pspbtcnf_02g.bin" +#endif + +namespace { + using v_iiiiiii_function_t = std::add_pointer_t; + inline auto const payloadEntryPtr = reinterpret_cast(0x88600000); + + int recovery; + int recovery_btcnf_open = 0; + + char path[260]; + + void clearCaches() { + iplKernelDcacheWritebackInvalidateAll(); + iplKernelIcacheInvalidateAll(); + } + + [[noreturn]] inline void payloadEntry(s32 const a0, s32 const a1, s32 const a2, s32 const a3, s32 const t0, s32 const t1, s32 const t2) { + payloadEntryPtr(a0, a1, a2, a3, t0, t1, t2); + + __builtin_unreachable(); + } + + FATFS fs; + FIL fp; + + int sceBootLfatMountPatched() { + + if (f_mount(&fs, "ms0:", 1) != FR_OK) { + return -1; + } + + return 0; + } + + int sceBootLfatOpenPatched(char *filename) { + + if(strcmp(filename, BTCNF_PATH) == 0) { + if (recovery == 1) { + recovery_btcnf_open = 1; + return 1; + } + + filename[9] = 'd'; + } + else if(strcmp(filename, "/kd/lfatfs.prx") == 0) { + strcpy(filename, "/tmctrl500.prx"); + } + + strcpy(path, TM_PATH); + strcat(path, filename); + + if (f_open(&fp, path, FA_OPEN_EXISTING | FA_READ) == FR_OK) { + return 1; + } + + return -1; + } + + int sceBootLfatReadPatched(void *buffer, int buffer_size) { + + if (recovery_btcnf_open) { + memcpy(buffer, pspbtcnf_recovery, sizeof(pspbtcnf_recovery)); + return sizeof(pspbtcnf_recovery); + } + + u32 bytes_read; + if (f_read(&fp, buffer, buffer_size, &bytes_read) == FR_OK) + return bytes_read; + + return 0; + } + + int sceBootLfatClosePatched() { + + if (recovery_btcnf_open) + recovery_btcnf_open = 0; + + f_close(&fp); + return 0; + } +} + +int main(s32 const a0, s32 const a1, s32 const a2, s32 const a3, s32 const t0, s32 const t1, s32 const t2) { + + u32 ctrl = _lw(REBOOTEX_PARAM_OFFSET); + recovery = (ctrl & 0x400) == 0; + + MsLfatFuncs funcs = { + .msMount = reinterpret_cast(sceBootLfatMountPatched), + .msOpen = reinterpret_cast(sceBootLfatOpenPatched), + .msRead = reinterpret_cast(sceBootLfatReadPatched), + .msClose = reinterpret_cast(sceBootLfatClosePatched), + }; + + patchIplPayload(&funcs); + + memset(reinterpret_cast(REBOOTEX_PARAM_OFFSET), 0, 0x100); + + _sw(ctrl & 0xffffff00, REBOOTEX_PARAM_OFFSET); + + payloadEntry(a0, a1, a2, a3, t0, t1, t2); +} \ No newline at end of file diff --git a/tm_firmware/500/ipl_payload/payloadex/pspbtcnf_recovery_01g.bin b/tm_firmware/500/ipl_payload/payloadex/pspbtcnf_recovery_01g.bin new file mode 100644 index 0000000000000000000000000000000000000000..b0640799b0ac477bf7d7825942b3a9f76ab1795f GIT binary patch literal 3052 zcmZvc2~gBl7{`}OQM~X%TW>@KlvA)OR1pM(QL7??g_(DJOacg~fC#849u+TS zz>7hvw1D7&h%ks!L78erbiKd>DT-o|!>fs8lik;5CX>AP`@Z*m@BjXZo?ZOlArgs^ zVqt1{m3gege2GM&$KL1x7nt^T3=3i3XR-G(_3zBrphctS_mxOmO(YVZz0Fpw0V_i} z#>MNi_y1iS)1r;tcRZMMI8GbNsG2z0Sz)$ZW@2Uw}8?%wHB*@KiQ` zg4B(1I&wM~;A4-L8do1pOmp_^y5rlt;VBOAq~hbTn{SuD{eTXwL6o!4Yy`Li?slQn zo+ehu>(wMKi0G^00kVsB;oC#PQ^{BjIWXmytA6ngZ`QG{~(_|?RcL%hkWFIu_ z4bbQV9UK0!&(D5->TIK~yD{%;i-7zm0m=UB`qf|B7vkje%QL--3V`3RjGJUtKVgjD zx%3?y+L9;N1AJyshT@d{f{w07Rxke<_C@*};ICe+qDT3rgm3Pdc-qQlY}Q+Vr^uRb zEKhK#EE{U#?KNg;p+0W_P5-It4ex&-|Gw9CYp372m9gEX0MD(j-n(i>jsE13MJ@9i z{SS-<_}0qOC1xu&E+4eIc~EQi-TdhQm)GB#utZ7}B-@NKz&smTTmjx+@~5Bm0JoNw zjv|Y);+P6wo_q2B+-_%CX%TJVn{#*)ntte+Gr+m8{N~dGCOTjGQh{%4D7#uz_2#P+qo&!$VD#$ z;9rg>6cjZ=1KRU$K2Ei`U3Ze_zI^{57X=qI#dt)2SUfd4th&VaBG27O*@ZX)XezGt_=;1KWF?8o|^meaZoQkwu? zv}^I0(I;(dw$F7eaO-ikZU=au8@X)(DT`g(yxW7!9%LTY=YJfU`l;&hpt`FgiS*Jl znSIVW#0}xO#y`+dpOSIiXeezU*+u792TTa)SfCw7skK>pT>IybMvdA@xM_GNwA zyZK=@&-M8HgP!}++;^H(4Nn+WHp8Q3%6lMR>4E?160WYeb~?*=T*LG@1B2cVNV7l6 zu(8VC)5^K$2!l=|Ypl1NXUYx;jzov`A0&V{uXJ3ac}~lsh#6`){>hQ-XP@m2J_;v&8N^zc~PJbIE&fCH1Al#~(4Lnf5XM z-}C=BP5tz_9d2iXXV>N>Pkm}?3`t!99`C>5*~Ja-b?TL#2+-c2gsW05;r>Tt~} zSI9T~#(x|ecC6aF!y#jN`l;jZYsN`z!(m%Gn#K{_hNRYg8)5_m%Lxh*CXjV+t>MMaQ|_9UaE5D3N%yemlx!3hS@i6)6CEvX0+QIRw%=0wn; zLOzbbD5R}4#6SX!z;zCV9nN-kwi7T)6Iy%3X-*#jvI5|u08yBh2iW>tsOIn_-|Ryn z3Y2E3Xkh^j=B$R(x)RBi;cUDZiqHxftBQ^YG=f7>qCFv8M?)0}QzAq)Zj!+&NbH(# zRHzfdpcu+%waAG_N2|n>#1UB(1(Bqd{E@n?qc};>qN|`tT`NS=%1{c0wOkfKBNS(U z*50UiZtOe6P>|e_#3J~H*;LzJ$J>%nSZ~u>a}**cA`xC-R&y;RCvcol$++$PCyfom zAyjlO7KTBzQpWik@BNgxABcEy$E7)7QAv^@X>FJB5upU3vxat4>>hCTa}~v>Lt!Km VmG^3=Dae&mkvg{Q6-zkne*vOnrrrPm literal 0 HcmV?d00001 diff --git a/tm_firmware/500/ipl_payload/payloadex/pspbtcnf_recovery_02g.bin b/tm_firmware/500/ipl_payload/payloadex/pspbtcnf_recovery_02g.bin new file mode 100644 index 0000000000000000000000000000000000000000..205d5e1fa3489e6a3ef993f91a3df195d56e3e45 GIT binary patch literal 3077 zcmZvc2~^Zp6o!WZTyeqOR#0nk0b~^{Ra&SNkU4I+fd?5vl9`E9Bil9_Pl#0u7Llid<9jUE~B4~>?kxVl4+MJV(iGDwvx$$cIfS&hAfTb z86Pj_?*F@Z#$O9$W^4IpcxqKkxDu(!U$rak?c_s6TWzC;HXzOV050@4lwcfBS#{cuM(!g!NZXJ%5c2Yd|$#g=+xrM)+2o zaAnJXpR(!e-0=AK+WW2uApzj}=)zkp|Jd+=@W}RG7 zcsRib-@g2e`r~HzrL9YjE=_o24e)}-`W?%sH^@I7Ro3p) zvTU~vz&F*Nm_K^)n&81J^n;(~-6(bhINW$?!u)WuWP{TfbKJkF-5cNoWLK6rSoyZM zcb3^zm&eyA1RfyxGu>rctzDd*BLC!|VyA=6MWH}`+o#*--gS82uR4BAjYHwmTLi#^ zULQ0wXHuvh4Vl#uPGIo>zuu5*8@6V&%y;bD{r}fsN7;E=Mke)` zWdZ!%fuxeM7Raij=;FOJyQ`NE30xuc|M%RLC9Uy(aj)l1iBr{ADvk?$j=(iZU48o5 z`~B6Nwd38jznhcl1m0KRghg%Bo#ocKa|Zlnz484zsuAGZzcU{a5txv7Pwqc$>KpU4 zR)Cjnn>TLkA?JqlS?(piZ@nEl0N&?(!LyLmdEUG-?0W9SfXj294|J3t+(xAV`RhN9I8DonG7GL0 zw>h4iRFo%hGa*0I|A&k@TL;#SNE%)}-LHM}OCVq4NBlHf+gx+@NNzvdCdWi`^WG20 zus_yxt6ZI*BPadVaR@%ynU0LLHD zdZ=V~+lc)UJ~M7_?Y06q;qdfvqIb>RgFYE`4_x!gG@?H8wfsq>w_7E4-AFmL-L7D4 zxZ7F#0#P4}5Bv)o)&BaxPPeS!ore#+Y_OF%YY}HAjv-LOiK1ga3~>@dV3J0~2{aZ) zDHbDj1f&xuF&&H2bQHxJPqG>sg%INzZU7sPxmqknptQ6OslsrSP)jphFF1iHUEI`S z5J4hQra_nvV@1q&jK-p{Ne)iNV5AtLmbQZ-3`^3G(G1rVOiEj$Sy;@&RS>IU#3786 zuvU#qu`r3CQZy8W7}Z2DhQgsZldfQv#>Lfe6cOJw6pa!ji<(4JWQ>tiB!%iI29t84 zm`E|7KoJZwRvKa<5k?Uvhr$iLJUv}Rj4`Cq9tnomM}(XJgd{)=ZsY;3J|Aj0JlO~P z(5Mgat8_m%uOh%)Ez?|kr2qp=F)G7Jx{U?nJ zBOpw2E@uK5f;Faw!&NxMXq3F^iQeyv|EowBe};xrm*k~LiZQmH5D`g|CTkdX%599` fzG3M^m`DVT#^7E-4F&mfI?BYWy$bRc5KZzg4v4X` literal 0 HcmV?d00001 diff --git a/tm_firmware/500/ipl_payload/payloadex_loader/CMakeLists.txt b/tm_firmware/500/ipl_payload/payloadex_loader/CMakeLists.txt new file mode 100644 index 0000000..a09b8ce --- /dev/null +++ b/tm_firmware/500/ipl_payload/payloadex_loader/CMakeLists.txt @@ -0,0 +1,37 @@ +get_target_property(LINKER_SCRIPT tm_common::linker_script INTERFACE_SOURCES) + +set(LOAD_ADDR 0x10000) + +configure_file( + "${LINKER_SCRIPT}" + "${CMAKE_CURRENT_BINARY_DIR}/linker.x" +) + +foreach(GEN 1 2) + math(EXPR MODEL "${GEN}-1") + set(EXEC_NAME payloadex_loader_500_0${GEN}g) + add_executable(${EXEC_NAME}) + target_sources(${EXEC_NAME} PRIVATE main.cpp) + target_link_libraries(${EXEC_NAME} PRIVATE tm_common::crt c utils iplsdk::cache iplsdk::lowio iplsdk::syscon tm_common::common) + target_link_options(${EXEC_NAME} PRIVATE -nostdlib -T${CMAKE_CURRENT_BINARY_DIR}/linker.x) + target_compile_definitions(${EXEC_NAME} PRIVATE PSP_MODEL=${MODEL}) + + add_custom_command( + OUTPUT payloadex_0${GEN}g.h + DEPENDS payloadex_500_0${GEN}g + COMMAND $ + --c_style + payloadex="$".bin + payloadex_0${GEN}g.h + ) + + add_custom_command( + TARGET ${EXEC_NAME} + POST_BUILD + COMMAND psp-objcopy -O binary ${EXEC_NAME} ${EXEC_NAME}.bin + ) + + target_include_directories(${EXEC_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + target_sources(${EXEC_NAME} PRIVATE payloadex_0${GEN}g.h) + +endforeach() diff --git a/tm_firmware/500/ipl_payload/payloadex_loader/main.cpp b/tm_firmware/500/ipl_payload/payloadex_loader/main.cpp new file mode 100644 index 0000000..25531a9 --- /dev/null +++ b/tm_firmware/500/ipl_payload/payloadex_loader/main.cpp @@ -0,0 +1,49 @@ +#include +#include + +#include +#include +#include +#include + +#include + +#if PSP_MODEL == 0 +#include +#elif PSP_MODEL == 1 +#include +#endif + +namespace { + using v_uiucuc_function_t = std::add_pointer_t; + using v_ipuc_function_t = std::add_pointer_t; + +#if PSP_MODEL == 0 + inline auto const sceSysconCommonWrite = reinterpret_cast(0x04005bc4); + inline auto const sceSysconCommonRead = reinterpret_cast(0x04005ac0); +#elif PSP_MODEL == 1 + inline auto const sceSysconCommonWrite = reinterpret_cast(0x04006b98); + inline auto const sceSysconCommonRead = reinterpret_cast(0x04006a54); +#endif + + void clearCaches() { + iplKernelDcacheWritebackInvalidateAll(); + iplKernelIcacheInvalidateAll(); + } +} + +int main(void) { + + memcpy(reinterpret_cast(0x08fc0000), payloadex, sizeof(payloadex)); + + //Enable ms + sceSysconCommonWrite(1, 0x4c, 3); + + //pspSysconGetCtrl1 + _sw(-1, 0x08fb0000); + sceSysconCommonRead(reinterpret_cast(0x08fb0000), 7); + + clearCaches(); + + return 0; +} diff --git a/tm_firmware/500/tmctrl/CMakeLists.txt b/tm_firmware/500/tmctrl/CMakeLists.txt index 1ec1773..e3b8df0 100644 --- a/tm_firmware/500/tmctrl/CMakeLists.txt +++ b/tm_firmware/500/tmctrl/CMakeLists.txt @@ -5,15 +5,15 @@ build_prx(tmctrl500 EXPORTS exports.exp) target_sources(tmctrl500 PRIVATE main.c) target_compile_options(tmctrl500 PRIVATE -fshort-wchar) -target_link_libraries(tmctrl500 PRIVATE m33sdk pspkernel pspsystemctrl_kernel) +target_link_libraries(tmctrl500 PRIVATE utils tm_common::moduleutils tm_common::flash_emu m33sdk pspsystemctrl_kernel pspkernel) +add_compile_definitions(FLASH_EMU_TOO_MANY_FILES_FIX M33_SDK) add_custom_command(OUTPUT rebootex.h - DEPENDS tmctrl::rebootex500_01g tmctrl::rebootex500_02g tmctrl::rebootex500_03g + DEPENDS tmctrl::rebootex500_01g tmctrl::rebootex500_02g COMMAND $ --gzip --c_style rebootex_01g="$".bin rebootex_02g="$".bin - rebootex_03g="$".bin rebootex.h ) diff --git a/tm_firmware/500/tmctrl/exports.exp b/tm_firmware/500/tmctrl/exports.exp index 823f2ee..9f76981 100755 --- a/tm_firmware/500/tmctrl/exports.exp +++ b/tm_firmware/500/tmctrl/exports.exp @@ -8,14 +8,14 @@ PSP_EXPORT_END PSP_EXPORT_START(sceLFatFs_driver, 0x11, 0x0001) PSP_EXPORT_FUNC_HASH(sceLfatfsStop) -PSP_EXPORT_FUNC_NID(sceLFatFs_driver_51C7F7AE, 0x51C7F7AE) +PSP_EXPORT_FUNC_NID(sceLFatFsDevkitVersion, 0x51C7F7AE) PSP_EXPORT_FUNC_NID(sceLFatFs_driver_F1FBA85F, 0xF1FBA85F) PSP_EXPORT_FUNC_HASH(sceLfatfsWaitReady) PSP_EXPORT_END PSP_EXPORT_START(FlashEmu, 0, 0x0001) -PSP_EXPORT_FUNC_NID(FlashEmuInit, 0xD780E25C) -PSP_EXPORT_FUNC_NID(FlashEmuExit, 0xDE3E3022) +PSP_EXPORT_FUNC_HASH(InstallFlashEmu) +PSP_EXPORT_FUNC_HASH(UninstallFlashEmu) PSP_EXPORT_END PSP_END_EXPORTS diff --git a/tm_firmware/500/tmctrl/main.c b/tm_firmware/500/tmctrl/main.c index 3e40a45..01630b9 100755 --- a/tm_firmware/500/tmctrl/main.c +++ b/tm_firmware/500/tmctrl/main.c @@ -4,981 +4,26 @@ #include #include #include +#include #include #include #include "main.h" - +#include #include -// #include "rebootex_01g.h" // 0x229C -// #include "rebootex_02g.h" // 0x3700 - PSP_MODULE_INFO("TimeMachine_Control", 0x1007, 1, 0); PSP_MAIN_THREAD_ATTR(0); -#define JAL_OPCODE 0x0C000000 -#define J_OPCODE 0x08000000 -#define SC_OPCODE 0x0000000C -#define JR_RA 0x03e00008 - -#define NOP 0x00000000 - -#define MAKE_CALL(a, f) _sw(JAL_OPCODE | (((u32)(f) & 0x3FFFFFFF) >> 2), a); -#define MAKE_JUMP(a, f) _sw(J_OPCODE | (((u32)(f) & 0x3FFFFFFF) >> 2), a); -#define MAKE_SYSCALL(a, n) _sw(SC_OPCODE | (n << 6), a); -#define JUMP_TARGET(x) ((x & 0x3FFFFFFF) << 2) -#define REDIRECT_FUNCTION(a, f) _sw(J_OPCODE | (((u32)(f) >> 2) & 0x03ffffff), a); _sw(NOP, a+4); -#define MAKE_DUMMY_FUNCTION0(a) _sw(0x03e00008, a); _sw(0x00001021, a+4); -#define MAKE_DUMMY_FUNCTION1(a) _sw(0x03e00008, a); _sw(0x24020001, a+4); - -#define MAX_FILES 32 -#define DIR_FLAG 0xD0D0 - -int ms_unavailable = 1; //0x4B68 - -//wchar_t buf_4B6C[] = L"\\TM\\DC6\\"; - -u8 buf_4B6C[0x10] = -{ - 0x5C, 0x00, 0x54, 0x00, 0x4D, 0x00, 0x5C, 0x00, - 0x44, 0x00, 0x43, 0x00, 0x36, 0x00, 0x5C, 0x00 -}; - -SceUID thid = -1; //0x4B7C - -static struct PspSysEventHandler event_handler = //0x4B80 -{ - sizeof(PspSysEventHandler), - "", - 0x00FFFF00, - SysEventHandler, -}; - -static PspIoDrvFuncs lflash_funcs = //0x4BE8 -{ - .IoInit = (void *)dummy_ok, - .IoExit = (void *)dummy_ok, - .IoOpen = (void *)dummy_ok, - .IoClose = (void *)dummy_ok, - .IoRead = (void *)dummy_ok, - .IoWrite = (void *)dummy_ok, - .IoLseek = (void *)dummy_ok, - .IoIoctl = (void *)dummy_ok, - .IoRemove = (void *)dummy_error, - .IoMkdir = (void *)dummy_error, - .IoRmdir = (void *)dummy_error, - .IoDopen = (void *)dummy_error, - .IoDclose = (void *)dummy_error, - .IoDread = (void *)dummy_error, - .IoGetstat = (void *)dummy_error, - .IoChstat = (void *)dummy_error, - .IoRename = (void *)dummy_error, - .IoChdir = (void *)dummy_error, - .IoMount = (void *)dummy_error, - .IoUmount = (void *)dummy_error, - .IoDevctl = (void *)dummy_ok, - .IoUnk21 = (void *)dummy_ok, -}; - -static PspIoDrv lflash_driver = //0x4BC0 -{ - "lflash", 0x4, 0x200, NULL, &lflash_funcs -}; - -static PspIoDrvFuncs flashfat_funcs = //0x4C40 -{ - .IoInit = (void *)Common_IoInit, - .IoExit = (void *)Common_IoExit, - .IoOpen = (void *)Common_IoOpen, - .IoClose = (void *)Common_IoClose, - .IoRead = (void *)Common_IoRead, - .IoWrite = (void *)Common_IoWrite, - .IoLseek = (void *)Common_IoLseek, - .IoIoctl = (void *)Common_IoIoctl, - .IoRemove = (void *)Common_IoRemove, - .IoMkdir = (void *)Common_IoMkdir, - .IoRmdir = (void *)Common_IoRmdir, - .IoDopen = (void *)Common_IoDopen, - .IoDclose = (void *)Common_IoDclose, - .IoDread = (void *)Common_IoDread, - .IoGetstat = (void *)Common_IoGetstat, - .IoChstat = (void *)Common_IoChstat, - .IoRename = (void *)Common_IoRename, - .IoChdir = (void *)Common_IoChdir, - .IoMount = (void *)Common_IoMount, - .IoUmount = (void *)Common_IoUmount, - .IoDevctl = (void *)Common_IoDevctl, - .IoUnk21 = (void *)Common_IoUnk21, -}; - -static PspIoDrv flashfat_driver = //0x4BD4 -{ - "flashfat", 0x001E0010, 0x1, "FAT over Flash", &flashfat_funcs -}; - -STMOD_HANDLER previous; //0x4C9C - -char cur_filepath[0xC0]; //0x4CA0 - -typedef struct -{ - int opened; //0x00 - SceUID fd; //0x04 - int unk_8; //0x08 - char path[0xC0]; //0x0C - SceMode mode; //0xD0 - int flags; //0xD4 - SceOff offset; //0xD8 -} FileHandler; //0xE0 - -FileHandler file_handler[MAX_FILES]; - -SceUID sema_id; //0x69B0 +STMOD_HANDLER previous; -//0x00000050 void ClearCaches() { sceKernelDcacheWritebackAll(); sceKernelIcacheInvalidateAll(); } -//0x0000097C -void WriteFile(char *path, void *buf, int size) -{ - SceUID fd = sceIoOpen(path, PSP_O_WRONLY | PSP_O_CREAT | PSP_O_TRUNC, 0777); - sceIoWrite(fd, buf, size); - sceIoClose(fd); -} - -//0x00000764 -int SysEventHandler(int ev_id, char *ev_name, void *param, int *result) -{ - if(ev_id == 0x4000) //suspend - { - int i; - for(i = 0; i < MAX_FILES; i++) - { - if(file_handler[i].opened && file_handler[i].unk_8 == 0 && file_handler[i].flags != DIR_FLAG) - { - file_handler[i].offset = sceIoLseek(file_handler[i].fd, 0, PSP_SEEK_CUR); - file_handler[i].unk_8 = 1; - sceIoClose(file_handler[i].fd); - } - } - } - else if(ev_id == 0x10009) //resume - { - ms_unavailable = 1; - } - - return 0; -} - -//0x00000D68 -void WaitMsAvailable() -{ - if(ms_unavailable) - { - SceUID fd; - while((fd = sceIoOpen("ms0:/TM/DC8/ipl.bin", PSP_O_RDONLY, 0)) < 0) - { - sceKernelDelayThread(20000); - } - - sceIoClose(fd); - ms_unavailable = 0; - } -} - -//0x00000DD0 -int WaitFileAvailable(int index, char *path, int flags, SceMode mode) -{ - WaitMsAvailable(); - - SceUID fd; - - while(1) - { - if(flags == DIR_FLAG) fd = sceIoDopen(path); - else fd = sceIoOpen(path, flags, mode); - - if(fd != 0x80010018) break; - - int i; - for(i = 0; i < MAX_FILES; i++) - { - if(file_handler[i].opened && file_handler[i].unk_8 == 0 && file_handler[i].flags == PSP_O_RDONLY) - { - file_handler[i].offset = sceIoLseek(file_handler[i].fd, 0, PSP_SEEK_CUR); - sceIoClose(file_handler[i].fd); - - file_handler[i].unk_8 = 1; - } - } - } - - if(fd >= 0) - { - file_handler[index].unk_8 = 0; - file_handler[index].opened = 1; - file_handler[index].fd = fd; - file_handler[index].mode = mode; - file_handler[index].flags = flags; - - if(file_handler[index].path != path) strncpy(file_handler[index].path, path, sizeof(file_handler[index].path)); - } - - return fd; -} - -//0x00000FC4 -SceUID GetFileIdByIndex(int index) -{ - if(file_handler[index].opened == 0) return -1; - - if(file_handler[index].unk_8) - { - SceUID fd = WaitFileAvailable(index, file_handler[index].path, file_handler[index].flags, file_handler[index].mode); - if(fd >= 0) - { - sceIoLseek(fd, file_handler[index].offset, PSP_SEEK_SET); - file_handler[index].fd = fd; - file_handler[index].unk_8 = 0; - - goto RETURN; - } - - return fd; - } - -RETURN: - return file_handler[index].fd; -} - -//0x000015DC -void BuildFilePath(char *filename) -{ - strcpy(cur_filepath, "ms0:/TM/DC8"); - strcat(cur_filepath, filename); -} - -//0x00001A7C -int _Common_IoOpen(u32 *arg) -{ - PspIoDrvFileArg *drv_arg = (PspIoDrvFileArg *)arg[0]; - char *filename = (char *)arg[1]; - int flags = (int)arg[2]; - SceMode mode = (SceMode)arg[3]; - - sceKernelWaitSema(sema_id, 1, NULL); - - BuildFilePath(filename); - - int i; - for(i = 0; i < MAX_FILES; i++) - { - if(file_handler[i].opened == 0) - { - SceUID fd = WaitFileAvailable(i, cur_filepath, flags, mode); - if(fd >= 0) - { - drv_arg->arg = (void *)i; - sceKernelSignalSema(sema_id, 1); - return 0; - } - - sceKernelSignalSema(sema_id, 1); - return fd; - } - } - - sceKernelSignalSema(sema_id, 1); - return 0x80010018; -} - -//0x0000142C -int _Common_IoClose(PspIoDrvFileArg *file_arg) -{ - int index = (int)file_arg->arg; - - SceUID fd = GetFileIdByIndex(index); - if(fd < 0) return fd; - - int ret = sceIoClose(fd); - if(ret < 0) return ret; - - file_handler[index].opened = 0; - - return 0; -} - -//0x00001374 -int _Common_IoRead(u32 *arg) -{ - PspIoDrvFileArg *file_arg = (PspIoDrvFileArg *)arg[0]; - char *data = (char *)arg[1]; - int len = arg[2]; - - sceKernelWaitSema(sema_id, 1, NULL); - - SceUID fd = GetFileIdByIndex((int)file_arg->arg); - if(fd >= 0) - { - int read = sceIoRead(fd, data, len); - sceKernelSignalSema(sema_id, 1); - return read; - } - - sceKernelSignalSema(sema_id, 1); - return fd; -} - -//0x000012A8 -int _Common_IoWrite(u32 *arg) -{ - PspIoDrvFileArg *file_arg = (PspIoDrvFileArg *)arg[0]; - int len = arg[2]; - char *data = (char *)arg[1]; - - sceKernelWaitSema(sema_id, 1, NULL); - - SceUID fd = GetFileIdByIndex((int)file_arg->arg); - if(fd >= 0) - { - if(!data && len == 0) - { - sceKernelSignalSema(sema_id, 1); - return 0; - } - - int written = sceIoWrite(fd, data, len); - sceKernelSignalSema(sema_id, 1); - return written; - } - - sceKernelSignalSema(sema_id, 1); - return fd; -} - -//0x00001218 -SceOff _Common_IoLseek(u32 *arg) -{ - PspIoDrvFileArg *file_arg = (PspIoDrvFileArg *)arg[0]; - SceOff ofs = (SceOff)arg[1]; - int whence = (int)arg[2]; - - sceKernelWaitSema(sema_id, 1, NULL); - - SceUID fd = GetFileIdByIndex((int)file_arg->arg); - if(fd >= 0) - { - int ret = sceIoLseek(fd, ofs, whence); - sceKernelSignalSema(sema_id, 1); - return ret; - } - - sceKernelSignalSema(sema_id, 1); - return fd; -} - -//0x00001A10 -int _Common_IoRemove(u32 *arg) -{ - char *name = (char *)arg[1]; - - sceKernelWaitSema(sema_id, 1, NULL); - - BuildFilePath(name); - WaitMsAvailable(); - - int ret = sceIoRemove(cur_filepath); - sceKernelSignalSema(sema_id, 1); - return ret; -} - -//0x00001990 -int _Common_IoMkdir(u32 *arg) -{ - char *name = (char *)arg[1]; - SceMode mode = (SceMode)arg[2]; - - sceKernelWaitSema(sema_id, 1, NULL); - - BuildFilePath(name); - WaitMsAvailable(); - - int ret = sceIoMkdir(cur_filepath, mode); - sceKernelSignalSema(sema_id, 1); - return ret; -} - -//0x00001924 -int _Common_IoRmdir(u32 *arg) -{ - char *name = (char *)arg[1]; - - sceKernelWaitSema(sema_id, 1, NULL); - - BuildFilePath(name); - WaitMsAvailable(); - - int ret = sceIoRmdir(cur_filepath); - sceKernelSignalSema(sema_id, 1); - return ret; -} - -//0x00001808 -int _Common_IoDopen(u32 *arg) -{ - PspIoDrvFileArg *drv_arg = (PspIoDrvFileArg *)arg[0]; - char *dirname = (char *)arg[1]; - - sceKernelWaitSema(sema_id, 1, NULL); - - BuildFilePath(dirname); - - int i; - for(i = 0; i < MAX_FILES; i++) - { - if(file_handler[i].opened == 0) - { - SceUID fd = WaitFileAvailable(i, cur_filepath, DIR_FLAG, 0); - if(fd >= 0) - { - drv_arg->arg = (void *)i; - sceKernelSignalSema(sema_id, 1); - return 0; - } - - sceKernelSignalSema(sema_id, 1); - return fd; - } - } - - sceKernelSignalSema(sema_id, 1); - return 0x80010018; -} - -//0x00001160 -int _Common_IoDclose(PspIoDrvFileArg *file_arg) -{ - sceKernelWaitSema(sema_id, 1, NULL); - - int index = (int)file_arg->arg; - - SceUID fd = GetFileIdByIndex(index); - if(fd >= 0) - { - int ret = sceIoDclose(fd); - file_handler[index].opened = 0; - sceKernelSignalSema(sema_id, 1); - return ret; - } - - sceKernelSignalSema(sema_id, 1); - return fd; -} - -//0x000010BC -int _Common_IoDread(u32 *arg) -{ - PspIoDrvFileArg *file_arg = (PspIoDrvFileArg *)arg[0]; - SceIoDirent *dir = (SceIoDirent *)arg[1]; - - sceKernelWaitSema(sema_id, 1, NULL); - - SceUID fd = GetFileIdByIndex((int)file_arg->arg); - if(fd >= 0) - { - int ret = sceIoDread(fd, dir); - sceKernelSignalSema(sema_id, 1); - return ret; - } - - sceKernelSignalSema(sema_id, 1); - return fd; -} - -//0x00001788 -int _Common_IoGetstat(u32 *arg) -{ - char *file = (char *)arg[1]; - SceIoStat *stat = (SceIoStat *)arg[2]; - - sceKernelWaitSema(sema_id, 1, NULL); - - BuildFilePath(file); - WaitMsAvailable(); - - int ret = sceIoGetstat(cur_filepath, stat); - sceKernelSignalSema(sema_id, 1); - return ret; -} - -//0x000016F8 -int _Common_IoChstat(u32 *arg) -{ - char *file = (char *)arg[1]; - SceIoStat *stat = (SceIoStat *)arg[2]; - int bits = (int)arg[3]; - - sceKernelWaitSema(sema_id, 1, NULL); - - BuildFilePath(file); - WaitMsAvailable(); - - int ret = sceIoChstat(cur_filepath, stat, bits); - sceKernelSignalSema(sema_id, 1); - return ret; -} - -//0x0000167C -int _Common_IoRename(u32 *arg) -{ - char *oldname = (char *)arg[1]; - char *newname = (char *)arg[2]; - - sceKernelWaitSema(sema_id, 1, NULL); - - BuildFilePath(oldname); - WaitMsAvailable(); - - int ret = sceIoRename(oldname, newname); - sceKernelSignalSema(sema_id, 1); - return ret; -} - -//0x00001610 -int _Common_IoChdir(u32 *arg) -{ - char *dir = (char *)arg[1]; - - sceKernelWaitSema(sema_id, 1, NULL); - - BuildFilePath(dir); - WaitMsAvailable(); - - int ret = sceIoChdir(cur_filepath); - sceKernelSignalSema(sema_id, 1); - return ret; -} - -//0x00000B68 -int Common_IoInit(PspIoDrvArg *arg) -{ - sema_id = sceKernelCreateSema("FlashSema", 0, 1, 1, NULL); - memset(file_handler, 0, sizeof(file_handler)); - - return 0; -} - -//0x00000268 -int Common_IoExit(PspIoDrvArg *arg) -{ - return 0; -} - -//0x00000640 -int Common_IoOpen(PspIoDrvFileArg *arg, char *filename, int flags, SceMode mode) -{ - u32 args[4]; - args[0] = (u32)arg; - args[1] = (u32)filename; - args[2] = (u32)flags; - args[3] = (u32)mode; - - return sceKernelExtendKernelStack(0x4000, (void *)_Common_IoOpen, args); -} - -//0x00000700 -int Common_IoClose(PspIoDrvFileArg *arg) -{ - sceKernelWaitSema(sema_id, 1, NULL); - int ret = sceKernelExtendKernelStack(0x4000, (void *)_Common_IoClose, arg); - sceKernelSignalSema(sema_id, 1); - - return ret; -} - -//0x0000060C -int Common_IoRead(PspIoDrvFileArg *arg, char *data, int len) -{ - u32 args[3]; - args[0] = (u32)arg; - args[1] = (u32)data; - args[2] = (u32)len; - - return sceKernelExtendKernelStack(0x4000, (void *)_Common_IoRead, args); -} - -//0x000005D8 -int Common_IoWrite(PspIoDrvFileArg *arg, const char *data, int len) -{ - u32 args[3]; - args[0] = (u32)arg; - args[1] = (u32)data; - args[2] = (u32)len; - - return sceKernelExtendKernelStack(0x4000, (void *)_Common_IoWrite, args); -} - -//0x000005A0 -SceOff Common_IoLseek(PspIoDrvFileArg *arg, SceOff ofs, int whence) -{ - u32 args[3]; - args[0] = (u32)arg; - args[1] = (u32)ofs; - args[2] = (u32)whence; - - return sceKernelExtendKernelStack(0x4000, (void *)_Common_IoLseek, args); -} - -//0x00000A48 -int Common_IoIoctl(PspIoDrvFileArg *arg, unsigned int cmd, void *indata, int inlen, void *outdata, int outlen) -{ - sceKernelWaitSema(sema_id, 1, NULL); - - if(cmd < 0x00208008) - { - if(cmd < 0x00208006) - { - if(cmd != 0x00008003) - { - if(cmd < 0x00008004) - { - if(cmd != 0x00005001) goto UNKNOWN; - } - else - { - if(cmd != 0x0000B804) - { - if(cmd != 0x00208003) goto UNKNOWN; - } - } - } - } - } - else if(cmd != 0x00208081) - { - if(cmd == 0x00208082) - { - sceKernelSignalSema(sema_id, 1); - return 0x80010016; - } - else - { - if(cmd != 0x00208013) - { -UNKNOWN: - WriteFile("fatms0:/unk_ioctl.bin", &cmd, sizeof(u32)); - while(1); - } - - if(arg->fs_num != 3 || sceKernelGetModel() == 0) - { - sceKernelSignalSema(sema_id, 1); - return 0x80010016; - } - } - } - - sceKernelSignalSema(sema_id, 1); - return 0; -} - -//0x00000570 -int Common_IoRemove(PspIoDrvFileArg *arg, const char *name) -{ - u32 args[2]; - args[0] = (u32)arg; - args[1] = (u32)name; - - return sceKernelExtendKernelStack(0x4000, (void *)_Common_IoRemove, args); -} - -//0x0000053C -int Common_IoMkdir(PspIoDrvFileArg *arg, const char *name, SceMode mode) -{ - u32 args[3]; - args[0] = (u32)arg; - args[1] = (u32)name; - args[2] = (u32)mode; - - return sceKernelExtendKernelStack(0x4000, (void *)_Common_IoMkdir, args); -} - -//0x0000050C -int Common_IoRmdir(PspIoDrvFileArg *arg, const char *name) -{ - u32 args[2]; - args[0] = (u32)arg; - args[1] = (u32)name; - - return sceKernelExtendKernelStack(0x4000, (void *)_Common_IoRmdir, args); -} - -//0x000004DC -int Common_IoDopen(PspIoDrvFileArg *arg, const char *dirname) -{ - u32 args[2]; - args[0] = (u32)arg; - args[1] = (u32)dirname; - - return sceKernelExtendKernelStack(0x4000, (void *)_Common_IoDopen, args); -} - -//0x000004C8 -int Common_IoDclose(PspIoDrvFileArg *arg) -{ - return sceKernelExtendKernelStack(0x4000, (void *)_Common_IoDclose, arg); -} - -//0x00000498 -int Common_IoDread(PspIoDrvFileArg *arg, SceIoDirent *dir) -{ - u32 args[2]; - args[0] = (u32)arg; - args[1] = (u32)dir; - - return sceKernelExtendKernelStack(0x4000, (void *)_Common_IoDread, args); -} - -//0x00000464 -int Common_IoGetstat(PspIoDrvFileArg *arg, const char *file, SceIoStat *stat) -{ - u32 args[3]; - args[0] = (u32)arg; - args[1] = (u32)file; - args[2] = (u32)stat; - - return sceKernelExtendKernelStack(0x4000, (void *)_Common_IoGetstat, args); -} - -//0x0000042C -int Common_IoChstat(PspIoDrvFileArg *arg, const char *file, SceIoStat *stat, int bits) -{ - u32 args[4]; - args[0] = (u32)arg; - args[1] = (u32)file; - args[2] = (u32)stat; - args[3] = (u32)bits; - - return sceKernelExtendKernelStack(0x4000, (void *)_Common_IoChstat, args); -} - -//0x000003F8 -int Common_IoRename(PspIoDrvFileArg *arg, const char *oldname, const char *newname) -{ - u32 args[3]; - args[0] = (u32)arg; - args[1] = (u32)oldname; - args[2] = (u32)newname; - - return sceKernelExtendKernelStack(0x4000, (void *)_Common_IoRename, args); -} - -//0x000003C8 -int Common_IoChdir(PspIoDrvFileArg *arg, const char *dir) -{ - u32 args[2]; - args[0] = (u32)arg; - args[1] = (u32)dir; - - return sceKernelExtendKernelStack(0x4000, (void *)_Common_IoChdir, args); -} - -//0x00000270 -int Common_IoMount(PspIoDrvFileArg *arg) -{ - return 0; -} - -//0x00000278 -int Common_IoUmount(PspIoDrvFileArg *arg) -{ - return 0; -} - -//0x000009D4 -int Common_IoDevctl(PspIoDrvFileArg *arg, const char *devname, unsigned int cmd, void *indata, int inlen, void *outdata, int outlen) -{ - if(cmd == 0x00005802) - { - return 0; - } - else if(cmd == 0x00208813) - { - if(arg->fs_num != 3 || sceKernelGetModel() == 0) return 0x80010016; - } - else - { - WriteFile("fatms0:/unk_devctl.bin", &cmd, sizeof(u32)); - while(1); - } - - return 0; -} - -//0x00000280 -int Common_IoUnk21(PspIoDrvFileArg *arg) -{ - return 0x80010086; -} - -//0x0000028C -int dummy_ok() -{ - return 0; -} - -//0x00000294 -int dummy_error() -{ - return 0x80010086; -} - -//0x000002A0 -int sceLfatfsStop() -{ - return 0; -} - -//0x000002A8 -int sceLFatFs_driver_51C7F7AE() -{ - return 0x05000010; -} - -//0x000002B4 -int sceLFatFs_driver_F1FBA85F() -{ - return 0; -} - -//0x00000BB8 -int sceLfatfsWaitReady() -{ - if(thid >= 0) sceKernelWaitThreadEnd(thid, 0); - return 0; -} - -//0x000014A4 -int SceLfatfsAssign(SceSize args, void *argp) -{ - WaitMsAvailable(); - - sceIoAssign("flash0:", "lflash0:0,0", "flashfat0:", IOASSIGN_RDONLY, NULL, 0); - sceIoAssign("flash1:", "lflash0:0,1", "flashfat1:", IOASSIGN_RDWR, NULL, 0); - - if(sceKernelInitKeyConfig() == PSP_INIT_KEYCONFIG_VSH) sceIoAssign("flash2:", "lflash0:0,2", "flashfat2:", IOASSIGN_RDWR, NULL, 0); - - if(sceKernelGetModel() == 1) - { - int type = sceKernelInitKeyConfig(); - if(type == PSP_INIT_KEYCONFIG_VSH || (type == 0x400 && sceKernelBootFrom() == 0x80)) - { - sceIoAssign("flash3:", "lflash0:0,3", "flashfat3:", IOASSIGN_RDWR, NULL, 0); - } - } - - thid = -1; - sceKernelExitDeleteThread(0); - return 0; -} - -//0x00000330 -void FlashEmuInit() -{ - sceIoDelDrv("lflash"); - sceIoAddDrv(&lflash_driver); - - sceIoDelDrv("flashfat"); - sceIoAddDrv(&flashfat_driver); - - sceKernelRegisterSysEventHandler(&event_handler); - - thid = sceKernelCreateThread("SceLfatfsAssign", SceLfatfsAssign, 0x64, 0x1000, 0x100000, NULL); - if(thid >= 0) sceKernelStartThread(thid, 0, NULL); -} - -//0x000002BC -int FlashEmuExit() -{ - return 0; -} - -//0x00000854 -int sceKernelExtendKernelStack_Patch_Callback(u32 *arg) -{ - sceKernelWaitSema(sema_id, 1, NULL); - - int i; - for(i = 0; i < MAX_FILES; i++) - { - if(file_handler[i].opened && file_handler[i].unk_8 == 0 && file_handler[i].flags == PSP_O_RDONLY) - { - file_handler[i].offset = sceIoLseek(file_handler[i].fd, 0, PSP_SEEK_CUR); - sceIoClose(file_handler[i].fd); - - file_handler[i].unk_8 = 1; - - sceKernelSignalSema(sema_id, 1); - return 0; - } - } - - sceKernelSignalSema(sema_id, 1); - return 0x80010018; -} - -//0x00000CA0 -int sceKernelExtendKernelStackPatched1(int type, void (* cb)(void *), u32 *arg) -{ - int ret; - - do - { - ret = sceKernelExtendKernelStack(type, cb, arg); - if(ret != 0x80010018 || arg[1] == 0 || memcmp((void *)(arg[1] + 4), buf_4B6C, sizeof(buf_4B6C)) == 0) break; - ret = sceKernelExtendKernelStack(0x4000, (void *)sceKernelExtendKernelStack_Patch_Callback, NULL); - } while(ret >= 0); - - return ret; -} - -//0x00000BD8 -int sceKernelExtendKernelStackPatched2(int type, void (* cb)(void *), u32 *arg) -{ - int ret; - - do - { - ret = sceKernelExtendKernelStack(type, cb, arg); - if(ret != 0x80010018 || arg[1] == 0 || memcmp((void *)(arg[1] + 4), buf_4B6C, sizeof(buf_4B6C)) == 0) break; - ret = sceKernelExtendKernelStack(0x4000, (void *)sceKernelExtendKernelStack_Patch_Callback, NULL); - } while(ret >= 0); - - return ret; -} - -//0x00000678 -int sceKernelExtendKernelStackPatched3(int type, void (* cb)(void *), void *arg) -{ - int ret; - - do - { - ret = sceKernelExtendKernelStack(type, cb, arg); - if(ret != 0x80010018) break; - ret = sceKernelExtendKernelStack(0x4000, (void *)sceKernelExtendKernelStack_Patch_Callback, NULL); - } while(ret >= 0); - - return ret; -} - -//0x00000000 int sceKernelGzipDecompressPatched(u8 *dest, int destSize, u8 *src, u32 unknown) { switch(sceKernelGetModel()) { @@ -988,15 +33,11 @@ int sceKernelGzipDecompressPatched(u8 *dest, int destSize, u8 *src, u32 unknown) case 1: src = rebootex_02g; break; - default: - src = rebootex_03g; - break; } return sceKernelGzipDecompress(dest, destSize, src, 0); } -//0x0000006C void PatchSystemControl() { SceModule2 *mod = (SceModule2 *)sceKernelFindModuleByName("SystemControl"); @@ -1013,7 +54,6 @@ void PatchSystemControl() ClearCaches(); } -//0x00000120 int OnModuleStart(SceModule2 *mod) { char *modname = mod->modname; @@ -1022,9 +62,9 @@ int OnModuleStart(SceModule2 *mod) { SceModule2 *msfat_drv = (SceModule2 *)sceKernelFindModuleByName("sceMSFAT_Driver"); - MAKE_CALL(msfat_drv->text_addr + 0x48D4, sceKernelExtendKernelStackPatched1); - MAKE_CALL(msfat_drv->text_addr + 0x5338, sceKernelExtendKernelStackPatched2); - MAKE_CALL(msfat_drv->text_addr + 0x5B90, sceKernelExtendKernelStackPatched3); + MAKE_CALL(msfat_drv->text_addr + 0x48D4, df_openPatched); + MAKE_CALL(msfat_drv->text_addr + 0x5338, df_dopenPatched); + MAKE_CALL(msfat_drv->text_addr + 0x5B90, df_devctlPatched); ClearCaches(); } @@ -1033,7 +73,7 @@ int OnModuleStart(SceModule2 *mod) u32 sceLflashFatfmtStartFatfmt = FindProc("sceLflashFatfmt", "LflashFatfmt", 0xB7A424A4); if(sceLflashFatfmtStartFatfmt) { - MAKE_DUMMY_FUNCTION0(sceLflashFatfmtStartFatfmt); + MAKE_FUNCTION_RETURN0(sceLflashFatfmtStartFatfmt); ClearCaches(); } } @@ -1048,7 +88,7 @@ int OnModuleStart(SceModule2 *mod) int module_start(SceSize args, void *argp) { PatchSystemControl(); - FlashEmuInit(); + InstallFlashEmu(); previous = sctrlHENSetStartModuleHandler(OnModuleStart); @@ -1060,14 +100,7 @@ int module_start(SceSize args, void *argp) //0x000002C4 int module_reboot_before(SceSize args, void *argp) { - SceUInt timeout = 500000; - sceKernelWaitSema(sema_id, 1, &timeout); - sceKernelDeleteSema(sema_id); - - sceIoUnassign("flash0:"); - sceIoUnassign("flash1:"); - - sceKernelUnregisterSysEventHandler(&event_handler); + UninstallFlashEmu(); return 0; } \ No newline at end of file diff --git a/tm_firmware/500/tmctrl/rebootex/CMakeLists.txt b/tm_firmware/500/tmctrl/rebootex/CMakeLists.txt index a26229b..40d0c72 100644 --- a/tm_firmware/500/tmctrl/rebootex/CMakeLists.txt +++ b/tm_firmware/500/tmctrl/rebootex/CMakeLists.txt @@ -1,7 +1,4 @@ -get_target_property(LINKER_SCRIPT iplsdk::linker_script INTERFACE_SOURCES) - -# No need to set stack pointer in rebootex -set(STACK_SIZE 0x0) +get_target_property(LINKER_SCRIPT tm_common::linker_script INTERFACE_SOURCES) set(LOAD_ADDR 0x88FC0000) @@ -10,38 +7,19 @@ configure_file( "${CMAKE_CURRENT_BINARY_DIR}/linker.x" ) -add_executable(rebootex500_01g) -add_executable(tmctrl::rebootex500_01g ALIAS rebootex500_01g) -target_sources(rebootex500_01g PRIVATE crt0.s main.cpp) -target_link_libraries(rebootex500_01g PRIVATE c utils iplsdk::cache iplsdk::ff_ro iplsdk::lowio iplsdk::ms iplsdk::syscon tm_common::common) -target_link_options(rebootex500_01g PRIVATE -nostdlib -T${CMAKE_CURRENT_BINARY_DIR}/linker.x) - -add_custom_command( - TARGET rebootex500_01g - POST_BUILD - COMMAND psp-objcopy -O binary rebootex500_01g rebootex500_01g.bin -) - -add_executable(rebootex500_02g) -add_executable(tmctrl::rebootex500_02g ALIAS rebootex500_02g) -target_sources(rebootex500_02g PRIVATE crt0.s main.cpp) -target_link_libraries(rebootex500_02g PRIVATE c utils iplsdk::cache iplsdk::ff_ro iplsdk::lowio iplsdk::ms iplsdk::syscon tm_common::common) -target_link_options(rebootex500_02g PRIVATE -nostdlib -T${CMAKE_CURRENT_BINARY_DIR}/linker.x) - -add_custom_command( - TARGET rebootex500_02g - POST_BUILD - COMMAND psp-objcopy -O binary rebootex500_02g rebootex500_02g.bin -) - -add_executable(rebootex500_03g) -add_executable(tmctrl::rebootex500_03g ALIAS rebootex500_03g) -target_sources(rebootex500_03g PRIVATE crt0.s main.cpp) -target_link_libraries(rebootex500_03g PRIVATE c utils iplsdk::cache iplsdk::ff_ro iplsdk::lowio iplsdk::ms iplsdk::syscon tm_common::common) -target_link_options(rebootex500_03g PRIVATE -nostdlib -T${CMAKE_CURRENT_BINARY_DIR}/linker.x) - -add_custom_command( - TARGET rebootex500_03g - POST_BUILD - COMMAND psp-objcopy -O binary rebootex500_03g rebootex500_03g.bin -) +foreach(GEN 1 2) + math(EXPR MODEL "${GEN}-1") + set(EXEC_NAME rebootex500_0${GEN}g) + add_executable(${EXEC_NAME}) + add_executable(tmctrl::${EXEC_NAME} ALIAS ${EXEC_NAME}) + target_sources(${EXEC_NAME} PRIVATE main.cpp) + target_link_libraries(${EXEC_NAME} PRIVATE tm_common::crt c utils iplsdk::cache iplsdk::ff_ro iplsdk::lowio iplsdk::ms iplsdk::syscon tm_common::common tm500_common::rebootpatches) + target_link_options(${EXEC_NAME} PRIVATE -nostdlib -T${CMAKE_CURRENT_BINARY_DIR}/linker.x) + target_compile_definitions(${EXEC_NAME} PRIVATE PSP_MODEL=${MODEL} REBOOTEX) + + add_custom_command( + TARGET ${EXEC_NAME} + POST_BUILD + COMMAND psp-objcopy -O binary ${EXEC_NAME} ${EXEC_NAME}.bin + ) +endforeach() \ No newline at end of file diff --git a/tm_firmware/500/tmctrl/rebootex/btcnf.h b/tm_firmware/500/tmctrl/rebootex/btcnf.h new file mode 100644 index 0000000..ca1f847 --- /dev/null +++ b/tm_firmware/500/tmctrl/rebootex/btcnf.h @@ -0,0 +1,172 @@ +/* + * Based on btcnf.h from minimum edition - https://github.com/PSP-Archive/minimum_edition +*/ + + +#include + +enum +{ + PATCH_ADD, + PATCH_OVERWRITE, + PATCH_OVERRIDE +}; + +typedef struct BtcnfHeader +{ + int signature; // 0 + int devkit; // 4 + int unknown[2]; // 8 + int modestart; // 0x10 + int nmodes; // 0x14 + int unknown2[2]; // 0x18 + int modulestart; // 0x20 + int nmodules; // 0x24 + int unknown3[2]; // 0x28 + int modnamestart; // 0x30 + int modnameend; // 0x34 + int unknown4[2]; // 0x38 +} __attribute__((packed)) BtcnfHeader; + +typedef struct ModuleEntry +{ + u32 stroffset; // 0 + int reserved; // 4 + u16 flags; // 8 + u8 loadmode; // 0x0a + u8 loadmode2; // 0x0B + int reserved2; // 0x0C + u8 hash[0x10]; // 0x10 +} __attribute__((packed)) ModuleEntry; + +typedef struct ModeEntry +{ + u16 maxsearch; + u16 searchstart; // + int modeflag; + int mode2; + int reserved[5]; +} __attribute__((packed)) ModeEntry; + +typedef struct ModuleList +{ + int patch_type; + char *before_path; + char *add_path; + u16 flag; + u16 loadmode; +} ModuleList; + +ModuleList module_rtm[] = { + {PATCH_ADD, "", "/rtm.prx", 0, 0x8001}, + {-1, NULL, NULL, 0, 0}}; + +static ModuleList *Get_list(ModuleList module_path[], const char *path) +{ + int i = 0; + + while (module_path[i].before_path) + { + if (strcmp(path, module_path[i].before_path) == 0) + { + module_path[i].before_path = ""; + return module_path + i; + } + i++; + } + + return NULL; +} + +void memcpy_b(void *dst, void *src, int len) +{ + u8 *d = (u8 *)dst; + u8 *s = (u8 *)src; + while(len--) + { + d[len] = s[len]; + } +} + +int btcnf_patch(void *a0, int size, ModuleList patch_list[], int before, int after) +{ + ModuleList *list_stock; + int ret = size; // + int i, j; + int module_cnt; + + BtcnfHeader *header = reinterpret_cast(a0); + + if (header->signature == 0x0F803001) + { + module_cnt = header->nmodules; + // printf("module_cnt:0x%08X\n",module_cnt); + if (module_cnt > 0) + { + + ModuleEntry *module_offset = (ModuleEntry *)((u32)header + (u32)(header->modulestart)); + char *modname_start = (char *)((u32)header + header->modnamestart); + + for (i = 0; i < module_cnt; i++) + { + ModuleEntry *sp = &(module_offset[i]); + + if (before) + { + if (sp->flags & before) + { + sp->flags |= after; + } + else + { + sp->flags &= ~(after); + } + } + + if ((list_stock = Get_list(patch_list, modname_start + sp->stroffset)) != NULL) + { + // printf("Add %s\n", list_stock->add_path ); + + if (list_stock->patch_type == PATCH_OVERWRITE) + { + memcpy(modname_start + sp->stroffset, list_stock->add_path, strlen(list_stock->add_path) + 1); + } + else // if( list_stock->patch_type == PATCH_OVERRIDE || list_stock->patch_type == PATCH_ADD ) + { + + if (list_stock->patch_type == PATCH_ADD) + { + memcpy_b(&(module_offset[i + 1]), sp, ret - header->modulestart - 32 * i); + ret += 32; + header->nmodules++; + header->modnamestart += 0x20; + header->modnameend += 0x20; + + module_cnt++; + + int mode_cnt = header->nmodes; + ModeEntry *mode_entyr = (ModeEntry *)((u32)header + (u32)(header->modestart)); + for (j = 0; j < mode_cnt; j++) + { + mode_entyr[j].maxsearch++; + mode_entyr[j].searchstart = 0; + } + } + ret += strlen(list_stock->add_path) + 1; + sp->stroffset = header->modnameend - header->modnamestart; + + memcpy((char *)((u32)header + (u32)(header->modnameend)), list_stock->add_path, strlen(list_stock->add_path) + 1); + header->modnameend += strlen(list_stock->add_path) + 1; + } + + sp->flags = list_stock->flag; // flag + sp->loadmode = list_stock->loadmode; + + modname_start = (char *)((u32)header + header->modnamestart); + } + } + } + } + + return ret; +} \ No newline at end of file diff --git a/tm_firmware/500/tmctrl/rebootex/crt0.s b/tm_firmware/500/tmctrl/rebootex/crt0.s deleted file mode 100644 index 924d4af..0000000 --- a/tm_firmware/500/tmctrl/rebootex/crt0.s +++ /dev/null @@ -1,19 +0,0 @@ -.set noreorder - -.section .text.vector -.global _start - -.ent _start -_start: -# Clear bss - la $t0, __bss_start - la $t1, __bss_end -clear_bss_loop: - sltu $t2, $t0, $t1 - addiu $t0, $t0, 4 - bnel $t2, $0, clear_bss_loop - sw $0, -4($t0) - j main - nop -.end _start -.set reorder diff --git a/tm_firmware/500/tmctrl/rebootex/include/rebootex_01g.h b/tm_firmware/500/tmctrl/rebootex/include/rebootex_01g.h deleted file mode 100755 index 72f106d..0000000 --- a/tm_firmware/500/tmctrl/rebootex/include/rebootex_01g.h +++ /dev/null @@ -1,335 +0,0 @@ -#ifndef __rebootex_01g__ -#define __rebootex_01g__ - -static unsigned int size_rebootex_01g = 5220; -static unsigned char rebootex_01g[] __attribute__((aligned(16))) = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xa5, 0x5a, 0x0d, 0x70, 0x54, 0xd7, - 0x75, 0x3e, 0xef, 0x67, 0xa5, 0x95, 0x10, 0xe2, 0x21, 0xad, 0xf1, 0x9a, 0x28, 0xd6, 0xbb, 0xbb, - 0x6f, 0x7f, 0x82, 0x15, 0x78, 0xc1, 0xbb, 0x41, 0x9d, 0x6e, 0xcb, 0x76, 0x57, 0x02, 0xb9, 0x25, - 0xb6, 0x6c, 0xcb, 0x2d, 0x99, 0xc1, 0xd3, 0x8d, 0x24, 0x30, 0xae, 0x49, 0x86, 0x01, 0x3a, 0x8d, - 0xa7, 0xee, 0xcc, 0x76, 0x05, 0x46, 0xc3, 0x2c, 0x68, 0x23, 0x48, 0x86, 0x30, 0x6d, 0xba, 0xdd, - 0x15, 0x88, 0xd0, 0x45, 0xc2, 0x06, 0xff, 0x94, 0xb1, 0xb1, 0x46, 0x28, 0x0e, 0x99, 0xa6, 0x0d, - 0x49, 0x33, 0x1e, 0xda, 0x64, 0x52, 0x45, 0x84, 0x86, 0x26, 0x1d, 0xc7, 0x93, 0x98, 0xd8, 0x31, - 0x58, 0xaf, 0xdf, 0xb9, 0x6f, 0x57, 0x40, 0x12, 0x12, 0x4f, 0xaa, 0x99, 0xe5, 0xdd, 0x7b, 0xdf, - 0xbd, 0xe7, 0xdc, 0x73, 0xce, 0x77, 0xcf, 0xcf, 0x7d, 0x3c, 0x4d, 0x6b, 0x1b, 0xa9, 0xfa, 0xb7, - 0x84, 0xa6, 0xfc, 0x6e, 0x6b, 0x6f, 0x96, 0xa8, 0x94, 0x5d, 0x4c, 0x73, 0x3e, 0xe1, 0xe7, 0xf1, - 0xb5, 0x8d, 0x0a, 0x0d, 0x58, 0x44, 0x3f, 0xc4, 0xb8, 0xfa, 0xb7, 0xf5, 0x18, 0xe7, 0xfe, 0x0a, - 0x63, 0x0b, 0x89, 0xce, 0x21, 0xfa, 0x85, 0x93, 0xf4, 0x89, 0x64, 0x99, 0xbc, 0x34, 0xab, 0x09, - 0x83, 0xe4, 0x33, 0x68, 0xac, 0xa7, 0x3a, 0xd0, 0x73, 0xe8, 0xa8, 0x2d, 0xec, 0x67, 0x41, 0x73, - 0x4f, 0x51, 0xa1, 0xdd, 0xd6, 0xbc, 0xf3, 0x6c, 0x1f, 0xb7, 0x79, 0x0e, 0x73, 0x6a, 0xc0, 0x1c, - 0x91, 0xcc, 0x82, 0x0e, 0x91, 0x30, 0xc6, 0x31, 0xd2, 0x55, 0x10, 0xfe, 0x7a, 0x45, 0xa1, 0x1f, - 0x82, 0xfe, 0x7f, 0xd3, 0x7b, 0xa0, 0x4d, 0x34, 0xb8, 0x30, 0xbf, 0x9e, 0xe7, 0x9b, 0xcf, 0x92, - 0xb0, 0x8f, 0x91, 0xe3, 0x4c, 0x17, 0x1c, 0xe7, 0x75, 0xcb, 0x71, 0x72, 0xc5, 0x1b, 0xce, 0x31, - 0x9f, 0xe3, 0xec, 0xb6, 0x6a, 0xf3, 0x6e, 0x0c, 0xab, 0x89, 0xc3, 0x22, 0x9d, 0x7f, 0xd7, 0x79, - 0x35, 0xa2, 0xd3, 0x6b, 0x93, 0x0d, 0xef, 0x66, 0xc8, 0x1d, 0xd7, 0x13, 0x7f, 0x27, 0xbe, 0x98, - 0xc7, 0xd8, 0x88, 0x97, 0x4c, 0xcd, 0x4b, 0xaf, 0x46, 0x6c, 0x65, 0x28, 0x6f, 0x17, 0xd5, 0x44, - 0xfc, 0x3b, 0xa9, 0x58, 0x13, 0xf5, 0xfb, 0x78, 0xed, 0x29, 0xca, 0xe5, 0xeb, 0x29, 0x09, 0xe9, - 0xa7, 0x2b, 0xc2, 0x9f, 0xa3, 0x5e, 0x25, 0x57, 0x20, 0xca, 0x49, 0x19, 0xde, 0x77, 0x86, 0xfa, - 0xb8, 0x5f, 0x93, 0xd7, 0x08, 0x7e, 0x32, 0xcf, 0xb4, 0x5c, 0xfa, 0x5a, 0x42, 0x57, 0x06, 0x2c, - 0x47, 0x53, 0x13, 0x8e, 0x93, 0x8a, 0xe5, 0xfc, 0x1a, 0x59, 0xfe, 0x7e, 0xa2, 0x26, 0x6f, 0x22, - 0xe4, 0xdf, 0x0a, 0x19, 0x55, 0xeb, 0x2a, 0xf6, 0xb4, 0x29, 0x7e, 0xb9, 0xb2, 0x7b, 0xd3, 0xe5, - 0xca, 0xf1, 0x4d, 0x73, 0x95, 0xcc, 0x5f, 0x5e, 0xb6, 0x2e, 0xe1, 0xb9, 0xfd, 0xf1, 0xb9, 0x0a, - 0xf3, 0xf6, 0x61, 0xbf, 0x06, 0x3d, 0x3f, 0xd9, 0x44, 0xcf, 0x4d, 0x7a, 0xe9, 0xd4, 0xa4, 0x28, - 0x40, 0x3f, 0xc3, 0x45, 0x12, 0xd9, 0x29, 0x70, 0x18, 0x9f, 0xfc, 0x38, 0xad, 0x6d, 0x36, 0x82, - 0xe9, 0x0a, 0xd1, 0x3f, 0x8f, 0x08, 0x33, 0xa9, 0x8a, 0xa8, 0xa9, 0x0a, 0x9b, 0x54, 0xac, 0x1b, - 0xc1, 0xba, 0x11, 0xac, 0x83, 0x6c, 0xa7, 0xa4, 0x7c, 0x7e, 0xc8, 0xe7, 0x2c, 0x51, 0x13, 0x37, - 0x86, 0x9b, 0xf1, 0x5b, 0x8c, 0x5f, 0x13, 0x7e, 0x8d, 0xf8, 0x35, 0xe0, 0xb7, 0x28, 0x71, 0x03, - 0x7b, 0xec, 0x55, 0xfe, 0x2d, 0xe4, 0x68, 0x5a, 0x62, 0x6c, 0xc9, 0xc9, 0xd0, 0x25, 0x6f, 0x3e, - 0xb4, 0xd5, 0xf3, 0xc7, 0xa1, 0xa4, 0xe7, 0x23, 0xa1, 0x8c, 0xfe, 0x54, 0xc8, 0x71, 0x06, 0x62, - 0xd6, 0xf6, 0x69, 0x25, 0xb7, 0x75, 0x31, 0xe5, 0x32, 0x4d, 0x94, 0xeb, 0x6d, 0xa4, 0x5c, 0x4f, - 0x03, 0xe5, 0x36, 0x2e, 0xa2, 0xcc, 0xb0, 0x37, 0x61, 0x6d, 0x1c, 0x50, 0xac, 0xad, 0x65, 0xc5, - 0xca, 0x0c, 0x29, 0x56, 0x6f, 0x5a, 0xb1, 0x7a, 0x82, 0x0a, 0x79, 0xd5, 0x04, 0x35, 0x69, 0x89, - 0xdc, 0xf6, 0x66, 0xba, 0x04, 0x59, 0x43, 0x58, 0x1f, 0xc2, 0x9c, 0xae, 0x76, 0x35, 0x4e, 0xf4, - 0x89, 0x4a, 0x13, 0x9d, 0x86, 0x5c, 0xcf, 0x4f, 0xea, 0x90, 0x2f, 0x84, 0xf5, 0x21, 0xac, 0x0d, - 0x61, 0x6d, 0x08, 0x6b, 0x2f, 0xb4, 0x2f, 0x8d, 0x6f, 0x6c, 0xd7, 0xe2, 0x6f, 0xb7, 0xb7, 0xc4, - 0xb7, 0x3e, 0xd4, 0x1a, 0x3f, 0x3a, 0x09, 0x5a, 0xb4, 0x0d, 0xb2, 0x9e, 0x9a, 0x24, 0x5a, 0x31, - 0x31, 0xab, 0x19, 0xe8, 0x3f, 0x30, 0x41, 0xd4, 0x3f, 0xa1, 0x5a, 0x6a, 0xa2, 0x8d, 0x5e, 0x9a, - 0xf4, 0xd3, 0x8b, 0x93, 0x3e, 0x7a, 0x01, 0x3a, 0x3b, 0x03, 0xba, 0xc6, 0xc7, 0xb7, 0x3d, 0xe4, - 0x8b, 0x5f, 0x7c, 0xf2, 0xae, 0xb8, 0xdf, 0x5e, 0x16, 0x6f, 0xb3, 0xef, 0x8e, 0x97, 0x4d, 0x2d, - 0xa1, 0x50, 0x2a, 0x46, 0x34, 0x84, 0x75, 0xff, 0x84, 0xdf, 0x45, 0xfc, 0xe6, 0x26, 0x96, 0x92, - 0x9a, 0xe8, 0x6d, 0xf7, 0xc7, 0xc7, 0xda, 0xef, 0x89, 0x5b, 0xd0, 0xb9, 0x49, 0xe7, 0x26, 0x5f, - 0x69, 0x6f, 0x8f, 0x47, 0x1f, 0xbc, 0x37, 0x2e, 0x3a, 0x79, 0x3e, 0x81, 0xa7, 0x89, 0xdf, 0x2c, - 0x7e, 0xd3, 0x93, 0x19, 0xd8, 0xa6, 0xe3, 0x41, 0x1e, 0x7f, 0xb0, 0x92, 0x81, 0x9d, 0x8b, 0xaa, - 0x9a, 0x10, 0x57, 0x53, 0x31, 0xfb, 0xc1, 0x01, 0x8c, 0xf5, 0x57, 0xf8, 0xfd, 0xd6, 0x6d, 0xa9, - 0x18, 0xbf, 0x23, 0x4a, 0x56, 0xae, 0x0f, 0x2f, 0x49, 0x24, 0x5a, 0xbd, 0x71, 0xb6, 0x79, 0xb2, - 0x95, 0xe7, 0x18, 0x27, 0x79, 0xde, 0x45, 0x9a, 0x8b, 0x7f, 0x9b, 0x2e, 0x43, 0x17, 0x3d, 0xf9, - 0xef, 0xd2, 0x8f, 0xf0, 0x7c, 0x32, 0x7f, 0x89, 0x7e, 0x82, 0xe7, 0x8f, 0xf7, 0x13, 0x6d, 0xd8, - 0xcf, 0x18, 0x60, 0x1c, 0x9d, 0x11, 0x3d, 0x15, 0x6f, 0xf0, 0xc9, 0x4a, 0xad, 0x3f, 0x13, 0xf8, - 0x93, 0x4a, 0x53, 0x70, 0xdb, 0x42, 0x5f, 0x64, 0x5d, 0x5c, 0x14, 0x45, 0xb2, 0x32, 0x26, 0x32, - 0x15, 0x51, 0x98, 0x22, 0xc6, 0x86, 0x38, 0x3c, 0x4b, 0xc6, 0x2b, 0x7a, 0x62, 0x23, 0xed, 0x01, - 0xcf, 0x72, 0xfe, 0x19, 0xda, 0x1d, 0x53, 0x89, 0xf9, 0x97, 0xa1, 0xc7, 0x5c, 0xfe, 0x82, 0xd4, - 0x45, 0xae, 0xb2, 0x04, 0x02, 0xfe, 0x6f, 0xfd, 0xda, 0x66, 0xc6, 0xad, 0x42, 0xba, 0xb5, 0x81, - 0x3c, 0xd6, 0x06, 0xf4, 0x35, 0xaa, 0xb3, 0x98, 0x7e, 0x41, 0x3c, 0x9d, 0x17, 0x26, 0x55, 0xf1, - 0x05, 0x9c, 0x75, 0x66, 0x54, 0xe8, 0x69, 0x04, 0x7a, 0x1a, 0x81, 0xde, 0x47, 0xa0, 0xf7, 0x11, - 0xe8, 0x1d, 0x98, 0x3b, 0x03, 0xcc, 0x9d, 0x06, 0xde, 0x9e, 0x1f, 0x81, 0x4d, 0x47, 0xa8, 0x8a, - 0xbd, 0x28, 0xb0, 0xc7, 0x7b, 0x3d, 0x84, 0x73, 0x38, 0x0b, 0x1c, 0xf8, 0xa5, 0x8d, 0x4e, 0x4f, - 0xb6, 0x41, 0xd7, 0x3e, 0xd8, 0xaa, 0x09, 0x18, 0xf0, 0x02, 0x03, 0x3a, 0x6c, 0xcb, 0xe7, 0x53, - 0x1c, 0xce, 0x52, 0x3b, 0x25, 0x75, 0x71, 0x3c, 0x49, 0x3f, 0x75, 0x1e, 0xb1, 0xda, 0x28, 0xb9, - 0x9c, 0xd7, 0xeb, 0xa2, 0xcf, 0x5a, 0xa9, 0xac, 0x6d, 0x14, 0xf0, 0x3e, 0x7e, 0xca, 0x18, 0x58, - 0x3f, 0x22, 0x86, 0xb7, 0xab, 0xc2, 0xc4, 0xbe, 0xa2, 0x59, 0xf5, 0x73, 0xea, 0xda, 0x66, 0x85, - 0x8c, 0xf0, 0xbb, 0xf0, 0x15, 0x2b, 0xfc, 0x2d, 0x2a, 0x9f, 0x71, 0x9f, 0xc8, 0xe5, 0x7d, 0x62, - 0xb7, 0xa5, 0xd3, 0x10, 0xce, 0xe6, 0x9e, 0xbc, 0x46, 0x81, 0x13, 0x44, 0x81, 0xb3, 0xf5, 0x14, - 0x3c, 0xa1, 0x53, 0xf0, 0xec, 0x22, 0x0a, 0x9d, 0xf0, 0x52, 0xe8, 0x2c, 0x10, 0x5d, 0x68, 0xa2, - 0x40, 0x69, 0x31, 0x0d, 0x15, 0x16, 0x53, 0xb0, 0x24, 0x69, 0x1b, 0x45, 0x15, 0x7b, 0x85, 0x6c, - 0x67, 0x20, 0xdb, 0x69, 0xc8, 0xf6, 0x3c, 0xe4, 0x79, 0x0e, 0xb2, 0xb1, 0x5c, 0xb3, 0x9a, 0x09, - 0xb9, 0x2e, 0x6b, 0xae, 0xdf, 0x64, 0x3d, 0x8d, 0x89, 0x7e, 0xd0, 0x4f, 0x1a, 0x35, 0xdf, 0xc7, - 0xb6, 0xa8, 0xbd, 0xff, 0x9e, 0x5e, 0x9b, 0xa7, 0x62, 0x5e, 0x3a, 0xff, 0x32, 0xf4, 0x60, 0x41, - 0xe6, 0x2e, 0xe8, 0x20, 0x09, 0xbc, 0x25, 0x80, 0xdf, 0x4e, 0xe0, 0x37, 0x06, 0xdd, 0xd8, 0xd0, - 0x49, 0x07, 0xf4, 0x13, 0x85, 0x5e, 0x4c, 0xe8, 0x24, 0x00, 0x59, 0xc5, 0x70, 0x96, 0xf8, 0xac, - 0xce, 0x04, 0x02, 0xc0, 0x85, 0x37, 0xf1, 0xd1, 0xc3, 0x25, 0xf8, 0xcc, 0xcc, 0x72, 0x6f, 0xb0, - 0x6e, 0xbf, 0x88, 0xb2, 0xcf, 0xfc, 0x4a, 0xd5, 0x67, 0x86, 0x54, 0x85, 0x8e, 0xc2, 0x67, 0x9e, - 0xbe, 0xe9, 0x33, 0x83, 0xea, 0xfe, 0x99, 0x40, 0x70, 0xbf, 0x30, 0x1e, 0xa5, 0xa0, 0x7f, 0x27, - 0xa1, 0x7f, 0x12, 0xfd, 0x93, 0x5d, 0x52, 0xc6, 0x8c, 0x0a, 0xfe, 0x23, 0xe0, 0x3f, 0x02, 0xfe, - 0x23, 0xe0, 0x3f, 0x02, 0xfe, 0x23, 0xe0, 0x3f, 0x02, 0xfe, 0x23, 0xd8, 0x23, 0xec, 0xec, 0xca, - 0xdb, 0x03, 0x79, 0x21, 0x47, 0x73, 0x4d, 0x5e, 0x71, 0x38, 0x09, 0xcc, 0xf5, 0xe7, 0xdf, 0x74, - 0x92, 0x06, 0xd3, 0x2a, 0x42, 0xde, 0xfb, 0x29, 0xb0, 0x2f, 0x48, 0xc1, 0x7d, 0x6b, 0xc8, 0xda, - 0x67, 0x53, 0xe0, 0x88, 0x49, 0xc1, 0x23, 0x31, 0xb2, 0x8e, 0x88, 0x53, 0x01, 0x95, 0x65, 0x17, - 0x6f, 0x05, 0xf1, 0x4f, 0xda, 0x92, 0x6d, 0xd3, 0x52, 0xbb, 0x45, 0x37, 0xe2, 0x49, 0x7f, 0xc1, - 0x8d, 0x2b, 0xec, 0xbf, 0xcb, 0x3e, 0xf6, 0xad, 0x6b, 0x40, 0x27, 0x86, 0xf5, 0x0d, 0xf4, 0x67, - 0x68, 0xaf, 0x39, 0x11, 0xa3, 0x35, 0x67, 0x23, 0x14, 0xdb, 0x67, 0x51, 0xec, 0xc8, 0x0e, 0xca, - 0x2e, 0x6f, 0xa0, 0x9d, 0x61, 0xa6, 0x71, 0x46, 0x3c, 0x96, 0x87, 0x3f, 0xd4, 0xce, 0x30, 0x2e, - 0xe0, 0x99, 0x9f, 0xa0, 0xac, 0x21, 0x0a, 0x19, 0xd2, 0x48, 0xdf, 0x27, 0xa2, 0x45, 0x95, 0x48, - 0xc7, 0x1e, 0x8c, 0x30, 0x63, 0x43, 0x98, 0x33, 0xd0, 0x4d, 0x3a, 0xfc, 0x73, 0xc6, 0x87, 0xb9, - 0x0b, 0x3a, 0x2b, 0xc2, 0x86, 0xe5, 0x08, 0xce, 0x28, 0xfc, 0x79, 0x0a, 0x31, 0xa9, 0xbf, 0x8f, - 0xdb, 0x2c, 0x03, 0xcb, 0xd7, 0x14, 0xdc, 0x92, 0x67, 0x19, 0x92, 0xf7, 0xb4, 0x20, 0x2e, 0x9d, - 0x47, 0x2c, 0x9b, 0x53, 0xdf, 0x71, 0x52, 0x96, 0x88, 0xae, 0x01, 0x9d, 0xae, 0xb0, 0x42, 0x9a, - 0x95, 0x14, 0x3a, 0xb4, 0x51, 0x9a, 0x0c, 0x46, 0xc7, 0x29, 0xeb, 0xa8, 0x56, 0x23, 0x95, 0xcb, - 0x5e, 0x3a, 0x36, 0xbe, 0x88, 0x4a, 0x78, 0x16, 0xfd, 0xc2, 0x3f, 0xa3, 0x09, 0xff, 0x66, 0x12, - 0xd1, 0x2b, 0x88, 0x53, 0x25, 0xc4, 0xa9, 0xa3, 0x88, 0x53, 0xfd, 0x90, 0xf3, 0x0a, 0xe2, 0xd4, - 0x80, 0xc5, 0xb6, 0x33, 0x71, 0xce, 0x84, 0x71, 0x54, 0x73, 0xed, 0x77, 0x85, 0xd8, 0x7e, 0xd7, - 0x11, 0xc7, 0xd8, 0x76, 0x11, 0xe8, 0xd2, 0x84, 0xac, 0x16, 0xf4, 0xc8, 0x3a, 0x42, 0xff, 0x04, - 0xda, 0x67, 0x79, 0x8f, 0xae, 0x7e, 0x53, 0x16, 0xda, 0x27, 0xd0, 0x3e, 0xbb, 0x06, 0x73, 0x63, - 0x98, 0x67, 0x62, 0x1e, 0xda, 0xd0, 0x59, 0xf0, 0x6c, 0x2b, 0xe6, 0xdd, 0x8d, 0x71, 0x03, 0x73, - 0x7d, 0x78, 0x97, 0x73, 0x32, 0x7e, 0x61, 0x04, 0x70, 0x66, 0x92, 0xc4, 0xbc, 0x15, 0xe2, 0x78, - 0x36, 0x54, 0x60, 0x9e, 0xd4, 0xa2, 0x52, 0xc8, 0x48, 0x13, 0xeb, 0x02, 0x31, 0xcb, 0x56, 0x97, - 0xab, 0x68, 0x0f, 0x15, 0xd9, 0x2e, 0x4c, 0x83, 0xd7, 0xaf, 0xf0, 0x97, 0x71, 0x26, 0x33, 0x3e, - 0x13, 0x36, 0xfa, 0x5d, 0xf0, 0x33, 0xe0, 0xec, 0x92, 0x58, 0x39, 0xc7, 0xf6, 0x82, 0xfe, 0x39, - 0xaf, 0x78, 0x1c, 0x63, 0x6c, 0xbb, 0xda, 0x18, 0xc7, 0x6a, 0x19, 0x3f, 0x71, 0x36, 0xd8, 0xdf, - 0x5b, 0xa2, 0x1f, 0xe7, 0x77, 0x7d, 0xfe, 0xc6, 0x70, 0x5d, 0x02, 0xed, 0xfc, 0xcb, 0xe2, 0x22, - 0xf4, 0x96, 0x25, 0x9d, 0xea, 0x27, 0xd8, 0x2f, 0x4d, 0xc0, 0xb6, 0x2f, 0x0b, 0xc4, 0x67, 0xb4, - 0x39, 0x9e, 0xb3, 0xdf, 0xb1, 0xea, 0xd6, 0x36, 0x7a, 0xa5, 0xdf, 0x69, 0x48, 0x08, 0x3b, 0x2b, - 0x65, 0xbd, 0x10, 0x88, 0x86, 0x92, 0x54, 0x6f, 0xdd, 0x3c, 0x2b, 0x1e, 0xc5, 0xd5, 0xf5, 0xb8, - 0xd4, 0x35, 0xe3, 0xe9, 0xeb, 0x81, 0x2e, 0xe9, 0xf3, 0xb8, 0xdd, 0x21, 0x36, 0x5b, 0x97, 0x02, - 0xeb, 0x80, 0xcb, 0x21, 0x99, 0x07, 0x31, 0x2e, 0x97, 0x21, 0x2f, 0x70, 0xd7, 0x70, 0xfe, 0x32, - 0x94, 0xbd, 0x8e, 0x79, 0x53, 0xd4, 0xc5, 0x31, 0x25, 0xaf, 0x90, 0x6a, 0xb5, 0x53, 0xbf, 0xf1, - 0x14, 0x9e, 0xdc, 0x57, 0xf1, 0xfc, 0x30, 0xfa, 0x7f, 0x81, 0x67, 0x03, 0xa9, 0xff, 0xe8, 0xe2, - 0x35, 0x0d, 0x1f, 0x91, 0x31, 0x18, 0x3b, 0xdc, 0x2f, 0x8a, 0x74, 0x25, 0xa8, 0xae, 0x6d, 0xbc, - 0x10, 0xb0, 0x42, 0x0b, 0xfe, 0xdc, 0x24, 0x25, 0x81, 0x73, 0xf1, 0xcd, 0xc0, 0x96, 0xdb, 0x78, - 0x5f, 0x73, 0x6e, 0xe7, 0x5d, 0xa3, 0x01, 0x7f, 0x52, 0xa9, 0xe5, 0x20, 0x9f, 0x04, 0x2d, 0xe6, - 0xb5, 0x0d, 0x3c, 0x6b, 0x6d, 0xe4, 0x56, 0x86, 0x48, 0xd2, 0x2d, 0xb9, 0x55, 0x1a, 0xf6, 0xf6, - 0x86, 0x84, 0xb1, 0x97, 0xdb, 0xc5, 0xf7, 0x9c, 0x0b, 0x3e, 0xbc, 0x53, 0x5c, 0x1a, 0x60, 0x47, - 0xe5, 0x6c, 0x03, 0xfb, 0x1c, 0xb4, 0x59, 0x77, 0x44, 0xe7, 0x8b, 0x12, 0x1f, 0x18, 0xbf, 0x01, - 0xdb, 0x2b, 0xf4, 0x7a, 0x35, 0xbf, 0x9a, 0x2a, 0xf2, 0xfb, 0x85, 0xf6, 0x42, 0xfe, 0x56, 0xaf, - 0x10, 0xad, 0xcb, 0x0a, 0x93, 0x79, 0xed, 0xce, 0x3a, 0x74, 0xde, 0xfe, 0x07, 0xa7, 0xdf, 0x72, - 0x28, 0x65, 0x2f, 0xa7, 0x54, 0x07, 0xe7, 0x74, 0x2a, 0xfc, 0xe4, 0x2c, 0xf0, 0x6f, 0xc6, 0xb4, - 0x67, 0x1c, 0x1a, 0xba, 0xed, 0xfd, 0xc2, 0x3b, 0x4b, 0x7b, 0xc6, 0x43, 0x33, 0x3e, 0xf6, 0x37, - 0x3f, 0x76, 0xa6, 0xfa, 0x98, 0xee, 0xed, 0xb9, 0xe5, 0xb3, 0xf4, 0x96, 0xcc, 0xeb, 0x9e, 0x93, - 0x38, 0xf1, 0x02, 0x2f, 0x22, 0x5b, 0xa4, 0xdf, 0xf7, 0xe2, 0xac, 0x0f, 0xf3, 0xbe, 0xf5, 0xdc, - 0x52, 0xf6, 0x07, 0x36, 0xf0, 0xee, 0x9f, 0xaa, 0xe2, 0x9d, 0xe5, 0x18, 0x2c, 0x0a, 0xc3, 0x03, - 0xdf, 0xd0, 0x95, 0xbd, 0xee, 0x64, 0x65, 0x0e, 0xeb, 0x62, 0x22, 0x89, 0xfc, 0x92, 0x31, 0x6d, - 0xaa, 0x8c, 0x21, 0x5d, 0xe6, 0x4f, 0xc8, 0x34, 0x80, 0xa3, 0x9b, 0x3e, 0xf6, 0xce, 0x73, 0xcc, - 0x57, 0xd5, 0x44, 0x27, 0xa5, 0x39, 0x07, 0xc8, 0x93, 0x99, 0xb2, 0xdf, 0x87, 0x5f, 0xe4, 0xbd, - 0xd7, 0x72, 0x51, 0xe3, 0x15, 0x4f, 0xa2, 0x8f, 0xc6, 0x24, 0x56, 0x7a, 0xe9, 0x58, 0xec, 0xb3, - 0x34, 0x1e, 0x23, 0x85, 0xe3, 0xf1, 0x10, 0xe2, 0xf1, 0x74, 0x7e, 0x03, 0x1d, 0x8d, 0x91, 0xce, - 0x31, 0x79, 0x1a, 0xfd, 0xcb, 0x79, 0x99, 0x53, 0xca, 0x78, 0x7d, 0x19, 0xfd, 0xb1, 0xbc, 0x33, - 0xaf, 0x59, 0x96, 0x39, 0x04, 0x4a, 0x63, 0x95, 0x1a, 0xcd, 0xa5, 0xec, 0x63, 0xa0, 0x73, 0xe6, - 0x1d, 0xa3, 0x07, 0x62, 0x9d, 0xd4, 0x83, 0xf9, 0xea, 0x7e, 0x4a, 0xa6, 0x6d, 0x52, 0x52, 0xf6, - 0x22, 0x42, 0x4e, 0x6e, 0xef, 0x45, 0x2c, 0xc8, 0x18, 0x6e, 0x4e, 0x1f, 0xdc, 0xaf, 0xcb, 0x9c, - 0xfa, 0x0a, 0xdb, 0xb5, 0xf2, 0xb6, 0x8c, 0x11, 0x74, 0x5b, 0xce, 0xee, 0xc0, 0x8f, 0xb9, 0xb2, - 0xb8, 0xb8, 0x26, 0xa3, 0xdf, 0x95, 0x45, 0x1b, 0xb0, 0xf9, 0x1d, 0xcf, 0x69, 0x34, 0xb4, 0x2a, - 0x4f, 0xde, 0x6f, 0x17, 0xf6, 0xd7, 0x5d, 0xd1, 0xab, 0xb1, 0x8e, 0xc7, 0x29, 0x59, 0x8e, 0xd9, - 0xf2, 0x5d, 0xba, 0xf2, 0xa6, 0x5a, 0x1b, 0xd7, 0x12, 0x46, 0x1d, 0xaf, 0xd9, 0x1c, 0x93, 0x76, - 0xcb, 0xea, 0x98, 0x03, 0xf9, 0xbc, 0xa9, 0xd8, 0xad, 0x36, 0xbc, 0x31, 0xbc, 0x14, 0x79, 0xd3, - 0x20, 0x68, 0x96, 0xf0, 0x2b, 0x32, 0xdd, 0xe6, 0x8a, 0xb0, 0xc3, 0x7c, 0xbe, 0xbd, 0xc0, 0x86, - 0x17, 0xf9, 0x89, 0xe3, 0xd4, 0x59, 0x6c, 0x87, 0x5a, 0x9e, 0x21, 0x8c, 0x29, 0xaa, 0xd9, 0xa1, - 0x55, 0x73, 0x63, 0x94, 0x4e, 0xda, 0x28, 0x9f, 0x49, 0x3e, 0x37, 0x3c, 0xbf, 0x22, 0xac, 0x03, - 0x38, 0x33, 0xf2, 0x6c, 0xb3, 0x1e, 0x91, 0x2b, 0xd3, 0x29, 0xd1, 0x8d, 0xf8, 0x95, 0x35, 0x98, - 0xd6, 0x4a, 0xec, 0x9f, 0xe7, 0xf1, 0xfe, 0xcd, 0x57, 0x3d, 0x09, 0x65, 0xbb, 0x66, 0xd5, 0x64, - 0xe8, 0x94, 0x76, 0xcb, 0xe5, 0x6b, 0x7a, 0x35, 0xc8, 0xd5, 0x1b, 0xeb, 0x35, 0x46, 0x25, 0xbc, - 0xeb, 0xce, 0x43, 0x0f, 0x79, 0x96, 0xb1, 0x53, 0xda, 0x0c, 0x18, 0x30, 0xba, 0xe4, 0x5c, 0xcf, - 0xc2, 0xdc, 0xac, 0xe1, 0x50, 0xc9, 0xae, 0xd9, 0xae, 0xa6, 0x6b, 0x72, 0x72, 0x36, 0x25, 0xf6, - 0x3e, 0x13, 0xea, 0x9c, 0x23, 0x72, 0xb0, 0x37, 0x3b, 0x07, 0x52, 0x3a, 0x39, 0xc4, 0xf9, 0xaa, - 0x9e, 0xe0, 0xfd, 0xb0, 0x4f, 0xb4, 0x92, 0x9a, 0x02, 0xbf, 0x1b, 0xab, 0x2f, 0x68, 0x55, 0xdd, - 0x9e, 0x9a, 0xd4, 0xab, 0x98, 0x0f, 0x99, 0x33, 0x14, 0x8a, 0x5e, 0xe5, 0xf3, 0x5c, 0x59, 0x5c, - 0x95, 0xbf, 0x8e, 0xfe, 0x88, 0x83, 0x13, 0x31, 0x8f, 0x9a, 0x5f, 0x64, 0x9e, 0xec, 0x17, 0xbf, - 0xa9, 0xba, 0x73, 0xd2, 0xd5, 0xb9, 0x88, 0x89, 0xba, 0x49, 0x69, 0xfb, 0x3a, 0xe4, 0x49, 0xe2, - 0x1c, 0xfe, 0x0c, 0xb8, 0xa8, 0xe1, 0x80, 0x02, 0xae, 0x1e, 0x58, 0xff, 0xa4, 0x7a, 0xac, 0xaa, - 0x4d, 0xe5, 0xba, 0xff, 0xc1, 0x3a, 0x49, 0xbf, 0x4a, 0xe7, 0x4a, 0xb5, 0xff, 0xcb, 0xf4, 0x81, - 0x1f, 0x3d, 0x5b, 0xa5, 0xcf, 0x38, 0x7b, 0x1a, 0xba, 0xe6, 0x3d, 0xb1, 0x5c, 0x24, 0x6d, 0xae, - 0x26, 0xfe, 0x03, 0x6b, 0x8e, 0x0b, 0x57, 0x87, 0x09, 0xd6, 0x61, 0x56, 0x95, 0xf9, 0xb4, 0xd4, - 0x65, 0x56, 0x9e, 0x27, 0xa9, 0xc7, 0x7b, 0x6a, 0xf6, 0xd5, 0xee, 0xcc, 0x83, 0xe4, 0x19, 0x75, - 0x75, 0xcc, 0xf2, 0x7e, 0x49, 0xbb, 0x99, 0x7f, 0xb5, 0x45, 0xd6, 0xe5, 0x39, 0x7e, 0x5c, 0x73, - 0xd4, 0xd8, 0x3c, 0x6a, 0x45, 0xf6, 0xa3, 0x8b, 0xe8, 0xbc, 0x71, 0x9f, 0x91, 0x23, 0xae, 0x91, - 0x1c, 0x27, 0x1d, 0xb3, 0x10, 0xe7, 0xe6, 0x9d, 0x41, 0xf8, 0x29, 0x0d, 0x38, 0x3b, 0x6f, 0x5c, - 0x43, 0x7d, 0x34, 0xef, 0x94, 0x2c, 0x8d, 0xa6, 0x7c, 0xd7, 0x96, 0xa4, 0x3a, 0x6e, 0xb5, 0x61, - 0x8d, 0x0f, 0xaf, 0x5f, 0x84, 0x58, 0xca, 0x3e, 0x91, 0xf9, 0xc0, 0x5f, 0x16, 0xdb, 0xe8, 0x7c, - 0xbe, 0x2d, 0xd2, 0x95, 0x5f, 0x4e, 0x5f, 0x3d, 0xc4, 0xf1, 0x40, 0x47, 0xee, 0xed, 0xa1, 0x9c, - 0xcf, 0x4b, 0xe3, 0x15, 0x1f, 0x4d, 0x1f, 0x22, 0x1f, 0xc7, 0xdc, 0x39, 0xac, 0x2f, 0xc9, 0x33, - 0xdd, 0x04, 0xbc, 0xd7, 0x68, 0x32, 0x8d, 0x64, 0x24, 0x9d, 0xff, 0x73, 0xec, 0x5d, 0x00, 0xaf, - 0x57, 0xa5, 0xae, 0x4e, 0x41, 0x57, 0x46, 0xc2, 0x80, 0xce, 0x6a, 0xf5, 0xd3, 0xcb, 0x90, 0x9f, - 0xcf, 0x0f, 0xec, 0x43, 0x98, 0xdb, 0xdc, 0x66, 0x79, 0xc2, 0x8d, 0xb0, 0x7d, 0x9b, 0xb5, 0x34, - 0xcc, 0x78, 0xc6, 0xdc, 0x5f, 0xc9, 0xcb, 0x6b, 0xe7, 0x85, 0xeb, 0xc2, 0x79, 0x65, 0xf5, 0xe8, - 0x63, 0xf2, 0x9c, 0xa4, 0x96, 0xf1, 0x7c, 0x47, 0xb9, 0x7f, 0xf4, 0x04, 0xfa, 0x3f, 0x75, 0xfa, - 0x97, 0xf1, 0xda, 0xaf, 0x2a, 0xd6, 0xe8, 0x05, 0x25, 0x30, 0xfa, 0x35, 0x25, 0x38, 0xfa, 0xba, - 0x12, 0x1e, 0xa5, 0x00, 0x60, 0x85, 0x7d, 0xd3, 0xbd, 0x1a, 0x85, 0xec, 0x19, 0x99, 0x33, 0x84, - 0xec, 0x69, 0x62, 0xfe, 0x32, 0xaf, 0x43, 0x9d, 0x70, 0x05, 0xfb, 0x48, 0x46, 0xd6, 0x55, 0x66, - 0x25, 0x1e, 0xea, 0xac, 0x79, 0xac, 0xff, 0x9e, 0xf3, 0x88, 0x8f, 0xe9, 0x39, 0x68, 0x7f, 0xd7, - 0x79, 0xb4, 0x8f, 0xf7, 0xc4, 0xf3, 0x57, 0x5b, 0xdd, 0x87, 0x62, 0x54, 0x34, 0xb8, 0xdd, 0x42, - 0x81, 0xd1, 0xa5, 0x14, 0x1c, 0x45, 0x24, 0x5f, 0xc8, 0x47, 0x92, 0x4b, 0x55, 0x72, 0x94, 0x14, - 0x6c, 0x91, 0xf5, 0x2d, 0xa7, 0x2e, 0xfa, 0x57, 0x85, 0xf9, 0xd4, 0x25, 0x84, 0xbf, 0x48, 0x2d, - 0xd0, 0x53, 0x34, 0x32, 0x5d, 0x69, 0xb3, 0xf4, 0xb0, 0x41, 0x7b, 0x0a, 0x4c, 0x63, 0x85, 0xd5, - 0x73, 0xc8, 0x4f, 0x9b, 0x31, 0xfe, 0xb5, 0xbc, 0x0f, 0xf6, 0x68, 0xa5, 0x67, 0x91, 0xd3, 0xef, - 0x2d, 0xd0, 0x72, 0xcd, 0xdd, 0x9f, 0xd9, 0xa0, 0x84, 0xec, 0xf3, 0x64, 0x46, 0x7a, 0x2a, 0xb5, - 0x58, 0xef, 0x0b, 0x3e, 0x51, 0x6c, 0x61, 0x1f, 0x1f, 0x1d, 0xa3, 0x36, 0xc4, 0x4b, 0x2b, 0xd2, - 0x5d, 0x61, 0x1d, 0x05, 0x8d, 0x1e, 0x80, 0x7e, 0xd6, 0xf7, 0x21, 0x5a, 0x2f, 0xf9, 0xb6, 0x40, - 0xc6, 0x6b, 0x4b, 0x86, 0x3a, 0x9a, 0x10, 0x1f, 0xdf, 0x06, 0x7e, 0x5c, 0x3c, 0x25, 0x2b, 0x41, - 0xff, 0x97, 0x5d, 0xda, 0xf0, 0x29, 0xef, 0xc0, 0x5e, 0x1d, 0x91, 0x74, 0x25, 0x69, 0xa5, 0x65, - 0xce, 0x62, 0x23, 0xf7, 0x8f, 0x46, 0xa6, 0x2a, 0xf7, 0x21, 0xf3, 0x81, 0xff, 0x92, 0xf7, 0x0a, - 0xb5, 0xd8, 0xdd, 0x8b, 0x77, 0x6d, 0x98, 0xcb, 0xed, 0x75, 0x68, 0x27, 0xac, 0x54, 0xbe, 0xc7, - 0xea, 0x46, 0xee, 0xa0, 0x5b, 0x0b, 0xf9, 0x00, 0x68, 0x02, 0x43, 0x15, 0xa6, 0xeb, 0xb7, 0x36, - 0x57, 0x6e, 0xe2, 0xa0, 0x76, 0x47, 0x70, 0x66, 0xf2, 0xd6, 0x5a, 0x1a, 0xf4, 0x64, 0x2e, 0xd2, - 0x81, 0xdc, 0x83, 0x6b, 0x43, 0xc6, 0xdd, 0x1f, 0xa0, 0xcd, 0xf3, 0x1b, 0xb1, 0xef, 0x1b, 0xc3, - 0xbe, 0x04, 0xe3, 0xcb, 0xbd, 0x27, 0xf8, 0x75, 0x35, 0x9b, 0x8b, 0x0b, 0x33, 0xb2, 0xfb, 0x40, - 0xca, 0x30, 0xf8, 0xae, 0x42, 0x4d, 0x1d, 0x51, 0x21, 0x5f, 0x0b, 0x74, 0x37, 0xa8, 0xb6, 0x59, - 0xdd, 0x61, 0xb6, 0xaf, 0xa3, 0x3c, 0x6c, 0x43, 0x8e, 0xd5, 0xbf, 0xc7, 0xb5, 0x98, 0x95, 0x0a, - 0xf3, 0xb8, 0x30, 0x43, 0x00, 0x46, 0xae, 0xe0, 0x28, 0x9a, 0xb5, 0x04, 0x7e, 0x24, 0x49, 0xc1, - 0x16, 0xca, 0xa9, 0x32, 0xcf, 0xac, 0xf1, 0x0b, 0x81, 0xde, 0x9d, 0x78, 0xf2, 0x1e, 0x4d, 0xec, - 0x3f, 0x99, 0xd5, 0x89, 0xe3, 0x40, 0x2a, 0x60, 0x50, 0x9b, 0x15, 0x0a, 0x3b, 0x8a, 0xb1, 0xba, - 0xcd, 0xfa, 0x58, 0x58, 0x64, 0x97, 0x4a, 0x6c, 0x09, 0x19, 0x07, 0xd5, 0x2f, 0xfc, 0x76, 0x19, - 0xd2, 0xf9, 0xec, 0x07, 0xa3, 0x75, 0xe0, 0xb7, 0xd1, 0xe2, 0xbc, 0x19, 0x79, 0x7f, 0x81, 0xf3, - 0xa7, 0x3b, 0xcd, 0x55, 0xb9, 0x1e, 0xb8, 0x07, 0xe7, 0xc2, 0x18, 0xa4, 0x5b, 0xf5, 0xc8, 0xf9, - 0x9b, 0xcb, 0x8b, 0xf5, 0x97, 0x1e, 0xfd, 0x1b, 0xd8, 0x3a, 0x64, 0x68, 0x2a, 0xdf, 0x8b, 0xf0, - 0x9d, 0xc5, 0x8d, 0xe1, 0xbb, 0x12, 0x26, 0x6c, 0x59, 0xbb, 0xc7, 0xf8, 0x65, 0x9b, 0xb2, 0xbd, - 0xed, 0x48, 0x29, 0xac, 0xd3, 0xba, 0xfc, 0x03, 0x32, 0x9f, 0x63, 0x1f, 0xb3, 0x0c, 0xf8, 0xb8, - 0x3b, 0xd1, 0x84, 0xdc, 0xd8, 0x17, 0x9c, 0x19, 0xf5, 0x52, 0x2a, 0x9f, 0xc2, 0x39, 0xb2, 0x22, - 0x97, 0x0f, 0xcc, 0xa3, 0x4e, 0xf1, 0xe3, 0xac, 0x08, 0xff, 0x13, 0x10, 0x6d, 0xa6, 0x43, 0x1c, - 0x26, 0x85, 0xcf, 0xca, 0x7a, 0x9c, 0x21, 0x91, 0x4d, 0x93, 0x28, 0x14, 0xa9, 0xde, 0x03, 0xbf, - 0x82, 0xec, 0x9e, 0xe6, 0x1f, 0x09, 0x33, 0xed, 0x08, 0x25, 0x5b, 0x48, 0xdd, 0x09, 0x1e, 0xa9, - 0x3c, 0xa9, 0xa9, 0x8e, 0x3f, 0x94, 0x58, 0x5d, 0xca, 0xf9, 0xa8, 0xab, 0xa7, 0x68, 0x46, 0xb5, - 0x23, 0xcf, 0x85, 0x3f, 0x8c, 0xda, 0x9c, 0xeb, 0x6c, 0xd4, 0xcb, 0x07, 0x50, 0x43, 0x1f, 0x60, - 0xde, 0x5c, 0x33, 0xd0, 0xfc, 0x00, 0xfc, 0x5b, 0x70, 0x02, 0xe3, 0x13, 0x3f, 0x72, 0xba, 0x7c, - 0xa4, 0x1e, 0x0a, 0x7b, 0xc9, 0x3a, 0xf0, 0x14, 0x6a, 0xc6, 0x26, 0x32, 0x27, 0xbc, 0x18, 0xe7, - 0xba, 0xe3, 0x2c, 0xd3, 0xca, 0x26, 0x09, 0xf4, 0x8d, 0x79, 0xc7, 0x08, 0xbb, 0xe7, 0x2f, 0x5d, - 0xb0, 0x22, 0x3f, 0x38, 0xc0, 0x7b, 0xf1, 0x93, 0xa6, 0xf2, 0x7e, 0x78, 0x2f, 0x2d, 0xa8, 0x0f, - 0xbe, 0xe3, 0x24, 0x97, 0x89, 0xec, 0x20, 0x70, 0x98, 0x55, 0xa1, 0xa3, 0x0f, 0x70, 0xe7, 0x30, - 0x2b, 0xef, 0x1c, 0x58, 0xb6, 0xdf, 0x65, 0xcd, 0xad, 0x32, 0x33, 0x5e, 0xbe, 0x0f, 0x1f, 0x66, - 0x47, 0x4e, 0x41, 0x2f, 0x75, 0x07, 0x84, 0x99, 0x51, 0xff, 0x4a, 0x75, 0xc7, 0x91, 0x5f, 0x40, - 0x7e, 0x9a, 0x60, 0xfa, 0xa2, 0x38, 0xa4, 0x32, 0xaf, 0x0f, 0xca, 0x47, 0x87, 0xee, 0xfe, 0xc5, - 0x49, 0xf6, 0xe9, 0xd0, 0xcb, 0x0a, 0xb6, 0x03, 0xd6, 0x5e, 0x00, 0x16, 0x3a, 0x60, 0x7f, 0xf7, - 0xdc, 0xdf, 0x9d, 0x68, 0x83, 0xfd, 0xfd, 0xc1, 0xcb, 0xe1, 0xb6, 0xf0, 0xa3, 0xd2, 0x17, 0xd8, - 0x74, 0x6e, 0x32, 0x0a, 0x6c, 0xf8, 0x81, 0x09, 0x1f, 0x30, 0x11, 0x03, 0x5e, 0x2c, 0x60, 0xc7, - 0x04, 0x56, 0x0c, 0x79, 0x2f, 0x36, 0x36, 0x29, 0xde, 0x2a, 0x22, 0xef, 0x39, 0x06, 0xdc, 0x8c, - 0x4f, 0x8a, 0x53, 0x19, 0xe2, 0xba, 0x6a, 0x99, 0xf5, 0x30, 0x72, 0xeb, 0x4c, 0xf1, 0xac, 0x8c, - 0x93, 0x63, 0x23, 0xc3, 0xd0, 0xbb, 0x4e, 0xa5, 0x91, 0xcf, 0xe3, 0xe9, 0xf2, 0x72, 0xfd, 0x4c, - 0x47, 0xe4, 0xb1, 0x7c, 0x34, 0xb2, 0x2b, 0x7f, 0x84, 0xb2, 0x75, 0xfc, 0xde, 0xf5, 0x95, 0xc5, - 0xaa, 0x1e, 0xba, 0xad, 0x67, 0x88, 0x7d, 0xf9, 0xa1, 0x30, 0xc7, 0xf7, 0x02, 0xe5, 0x5a, 0x5c, - 0x3f, 0xf6, 0x42, 0x78, 0x12, 0xfb, 0x6f, 0xb3, 0x7a, 0x11, 0x47, 0x5b, 0x90, 0x1b, 0xf0, 0xdd, - 0x89, 0x3a, 0xea, 0x38, 0x81, 0x12, 0xec, 0x38, 0x3a, 0xef, 0x04, 0x4b, 0xcb, 0xd0, 0x7f, 0x1f, - 0x7d, 0x1f, 0xfa, 0x37, 0xd0, 0x07, 0xc8, 0x46, 0xaf, 0xa3, 0x8f, 0x84, 0x72, 0xf4, 0x3d, 0xf4, - 0x9b, 0xd1, 0xff, 0x05, 0xfa, 0x0d, 0xe8, 0xbf, 0x8b, 0x7e, 0x3d, 0xfa, 0xef, 0xa0, 0xef, 0x41, - 0xff, 0xe7, 0xe8, 0x6b, 0xe8, 0x5f, 0x43, 0x1f, 0xbe, 0x66, 0xf4, 0x6d, 0xf4, 0x7f, 0xe6, 0x7c, - 0x2c, 0xcc, 0x35, 0xfd, 0x25, 0xa7, 0x55, 0xee, 0x61, 0x11, 0xc6, 0x97, 0xc0, 0xc7, 0xfd, 0x97, - 0xd3, 0xdf, 0x7b, 0x2f, 0xda, 0x84, 0xdf, 0xc3, 0xf0, 0x49, 0x57, 0x30, 0x66, 0xc3, 0xef, 0x79, - 0xf0, 0x5c, 0x8d, 0xe7, 0x15, 0xec, 0xfb, 0x7e, 0x4a, 0x2e, 0x53, 0x28, 0x14, 0xe6, 0x39, 0x30, - 0xb1, 0x15, 0xc5, 0x38, 0x74, 0x5c, 0x62, 0x3a, 0xf7, 0x04, 0x53, 0x90, 0x41, 0x47, 0x5d, 0x8f, - 0x1c, 0x10, 0x75, 0x22, 0xe7, 0x99, 0x5c, 0x1b, 0x7b, 0xe8, 0x09, 0x83, 0xcf, 0x2f, 0xd7, 0x3d, - 0x6e, 0xbd, 0xf4, 0x15, 0x1f, 0xe3, 0xdd, 0x8b, 0x7d, 0xdd, 0x4f, 0xeb, 0x91, 0xcf, 0xbc, 0x01, - 0xff, 0x36, 0x63, 0xad, 0x84, 0x4f, 0xe7, 0xf7, 0xc2, 0xfc, 0x02, 0xce, 0xbe, 0x07, 0xd8, 0x47, - 0xfe, 0x44, 0x5e, 0xe4, 0x16, 0xf5, 0x5c, 0x3b, 0x81, 0xce, 0x56, 0x83, 0xeb, 0x0f, 0x79, 0x56, - 0x50, 0x57, 0xbf, 0xe7, 0xac, 0x97, 0x77, 0x1d, 0xc2, 0xf8, 0x53, 0xe0, 0x74, 0x1d, 0xdf, 0x9f, - 0x63, 0xed, 0x94, 0xc6, 0x77, 0x15, 0xfe, 0xe0, 0x95, 0xf0, 0x62, 0x4a, 0xf6, 0x7a, 0xe9, 0xa8, - 0x6b, 0x07, 0xd8, 0xb1, 0x02, 0x3d, 0xb3, 0x2d, 0x2f, 0x3a, 0x38, 0xa7, 0xa4, 0x96, 0x58, 0x0e, - 0xf7, 0x5e, 0x63, 0x4a, 0xfb, 0x3a, 0xb0, 0xc4, 0x32, 0xf1, 0xfc, 0x6f, 0x49, 0x3f, 0x43, 0x48, - 0x9e, 0x5e, 0x43, 0x2d, 0x7e, 0x0e, 0xb5, 0xf8, 0x4b, 0xa8, 0xc5, 0x5f, 0x44, 0x2d, 0xfe, 0x02, - 0x6a, 0xf1, 0x33, 0x38, 0x0b, 0xa7, 0x81, 0xd1, 0xe7, 0x81, 0xd1, 0xe7, 0x80, 0xd1, 0x53, 0x0b, - 0x79, 0x52, 0x27, 0x70, 0x39, 0xe7, 0xe1, 0x3c, 0x29, 0x59, 0xfc, 0x6b, 0xc7, 0x8d, 0x53, 0x1f, - 0x94, 0x46, 0xad, 0x2e, 0x60, 0x1a, 0xbe, 0x60, 0x37, 0x76, 0x5b, 0xc2, 0x99, 0x28, 0x22, 0x87, - 0x4a, 0x5b, 0x1c, 0x8b, 0x65, 0xce, 0x8d, 0x3c, 0x88, 0xcf, 0xf3, 0x10, 0xe3, 0xfd, 0xf8, 0x20, - 0x31, 0xc6, 0xae, 0x82, 0x0f, 0xf3, 0x78, 0x4a, 0x77, 0xb1, 0xf9, 0xb4, 0xe4, 0x5f, 0x9a, 0x9c, - 0x75, 0xdc, 0x58, 0xe0, 0x97, 0x77, 0x84, 0x2f, 0xfc, 0x5a, 0x7f, 0xc8, 0x71, 0x8e, 0x63, 0xdb, - 0xe3, 0x1c, 0xe7, 0xa2, 0x6e, 0xce, 0xd5, 0x01, 0x1e, 0x6c, 0x3f, 0x59, 0xab, 0xa2, 0xbf, 0x0a, - 0x98, 0xb4, 0x23, 0x8f, 0x59, 0x9c, 0x23, 0x73, 0xdc, 0xdb, 0x44, 0xad, 0xb0, 0xf9, 0x0e, 0xd8, - 0x2c, 0x43, 0x11, 0xda, 0xd9, 0xcb, 0x7e, 0x6c, 0x05, 0xce, 0x41, 0x5b, 0x78, 0x6f, 0x78, 0x15, - 0xec, 0xdd, 0x53, 0xb7, 0xb6, 0x71, 0x13, 0xec, 0xd8, 0x40, 0xe9, 0x5e, 0xa2, 0xd9, 0x62, 0x3d, - 0x6c, 0xc0, 0x4f, 0xa2, 0xb9, 0x22, 0xcf, 0x85, 0xde, 0x73, 0xef, 0x3a, 0xdd, 0x3e, 0xae, 0x61, - 0xdd, 0x71, 0x35, 0x67, 0xd2, 0x23, 0xa0, 0xa3, 0xe6, 0xee, 0xa5, 0x47, 0xe5, 0x93, 0xfd, 0x47, - 0x5b, 0x78, 0x4f, 0xf8, 0x53, 0x9e, 0xb5, 0xcd, 0x76, 0x24, 0x12, 0xfe, 0x10, 0xce, 0x8d, 0x5f, - 0xe6, 0xdf, 0x5a, 0x4e, 0x80, 0xb7, 0x1d, 0x09, 0x8c, 0xb6, 0xd3, 0x4e, 0x59, 0x8f, 0x59, 0xc0, - 0xa9, 0x81, 0x38, 0xe9, 0xa5, 0xb1, 0x03, 0x1c, 0xe7, 0xff, 0xd3, 0xd9, 0xe1, 0xe3, 0xbd, 0xd5, - 0x78, 0xe9, 0xa0, 0xcd, 0x7b, 0x7b, 0xc3, 0x79, 0x54, 0xe6, 0xbe, 0xdc, 0xae, 0xf1, 0xbd, 0x8c, - 0x7c, 0xca, 0xbd, 0xb3, 0xe5, 0xb6, 0xeb, 0xab, 0x99, 0xcf, 0x9d, 0x7c, 0x4f, 0xcd, 0x46, 0x7c, - 0x6f, 0x69, 0x82, 0xe7, 0x35, 0xac, 0xe1, 0xf9, 0xdf, 0x77, 0x32, 0x7d, 0xcc, 0x9f, 0xf7, 0xc5, - 0x7b, 0x79, 0xb3, 0x3a, 0xfe, 0x9b, 0x7c, 0x98, 0x59, 0x8d, 0xd5, 0x7e, 0xab, 0x2b, 0x1f, 0x83, - 0xce, 0x78, 0xef, 0x17, 0x61, 0xb3, 0x8d, 0xe7, 0x9a, 0x13, 0xd6, 0xb9, 0x26, 0xc4, 0xa4, 0x6f, - 0xc4, 0x4d, 0xf8, 0x2a, 0x2f, 0xbd, 0x11, 0x8f, 0xc2, 0x6f, 0x59, 0xf0, 0x6b, 0x6d, 0xb0, 0xa3, - 0x1f, 0x76, 0xf4, 0xc1, 0x8e, 0xb7, 0x7d, 0xd7, 0x78, 0x79, 0x56, 0x11, 0x1b, 0xf9, 0x0e, 0x1b, - 0xcf, 0xc2, 0x14, 0x62, 0xec, 0x61, 0xab, 0x89, 0xbe, 0x18, 0xf7, 0xd2, 0x62, 0x9c, 0x9f, 0x7f, - 0x8f, 0xeb, 0x74, 0x11, 0xed, 0x43, 0xa0, 0xf7, 0xa5, 0xb8, 0x45, 0x9f, 0x8f, 0x13, 0xd5, 0x1f, - 0xfc, 0x7b, 0x9a, 0xf5, 0x33, 0x4f, 0xce, 0x39, 0x85, 0x7f, 0x50, 0x71, 0xef, 0x10, 0xf9, 0x2c, - 0x4d, 0xd3, 0x75, 0xe7, 0x07, 0x3e, 0x87, 0xd6, 0xd9, 0x11, 0xa3, 0x0e, 0x35, 0x54, 0x97, 0x8d, - 0x18, 0xa8, 0xc8, 0x3a, 0x0b, 0x75, 0xbf, 0x42, 0xfd, 0x45, 0xce, 0x47, 0x97, 0xc0, 0xc6, 0x8e, - 0xa3, 0x63, 0x7e, 0x99, 0xf8, 0x1e, 0xee, 0x7d, 0x67, 0x10, 0xba, 0x5c, 0x57, 0xd4, 0x29, 0x07, - 0xfa, 0xe9, 0x3c, 0xc6, 0x40, 0xbd, 0x3c, 0x4e, 0xf4, 0x51, 0x60, 0x6d, 0x0e, 0x35, 0x73, 0xca, - 0x6e, 0x06, 0x4e, 0x9a, 0x68, 0x3a, 0x5e, 0xeb, 0x37, 0x56, 0xfb, 0xc2, 0x9e, 0x52, 0x85, 0x39, - 0xab, 0x72, 0x0d, 0xcf, 0xf7, 0x66, 0xc0, 0xef, 0x38, 0xd7, 0xcd, 0x3a, 0x0d, 0xd8, 0xa8, 0x0f, - 0x7d, 0xee, 0x1a, 0xce, 0xc9, 0xae, 0xa2, 0x7e, 0x50, 0xad, 0x9b, 0xb4, 0xfb, 0x27, 0x5a, 0x91, - 0x2d, 0xd4, 0x61, 0x4c, 0xd8, 0x19, 0x45, 0xde, 0x9d, 0xf4, 0x9a, 0xaa, 0xe8, 0x49, 0x32, 0x2d, - 0xc8, 0x33, 0xc3, 0xb9, 0xc6, 0x7e, 0xce, 0x83, 0x55, 0xe0, 0x2d, 0x84, 0xfc, 0x91, 0xd7, 0xae, - 0x30, 0xb9, 0xce, 0x2b, 0x8f, 0xab, 0xd2, 0x1f, 0x05, 0x4e, 0x5e, 0x73, 0xb2, 0x7d, 0x3c, 0xbf, - 0x4e, 0xde, 0x3b, 0xa9, 0x13, 0xc2, 0x3f, 0x85, 0xda, 0x64, 0x3f, 0x7f, 0x1b, 0xc9, 0xb3, 0x3d, - 0xb9, 0x76, 0x37, 0xe4, 0xbb, 0xd2, 0x04, 0xdb, 0xac, 0x47, 0xb0, 0xff, 0xe9, 0xc9, 0x73, 0x7b, - 0x83, 0x6c, 0x3f, 0x90, 0xe7, 0x5c, 0x5a, 0xf2, 0xb7, 0x19, 0x51, 0xea, 0x82, 0xbc, 0xba, 0x5c, - 0x17, 0xd8, 0xcf, 0x72, 0x99, 0xa8, 0x7d, 0xd4, 0x00, 0xe7, 0x72, 0xfd, 0x45, 0xd6, 0x25, 0xcf, - 0x13, 0x9d, 0x9c, 0x5f, 0x72, 0xdc, 0x77, 0xf1, 0xa4, 0xe2, 0xec, 0xe9, 0xd5, 0x7d, 0xb0, 0xee, - 0xda, 0x69, 0x76, 0x93, 0x42, 0xc7, 0x0b, 0x2a, 0x95, 0x0a, 0x9c, 0xf3, 0x66, 0x91, 0x97, 0xdc, - 0x67, 0xf4, 0xd3, 0x88, 0xc3, 0xe7, 0xaa, 0xfe, 0x20, 0xb0, 0x01, 0x9f, 0xf2, 0x12, 0x7c, 0xca, - 0x8b, 0xf0, 0x29, 0x2f, 0xc0, 0xa7, 0x9c, 0x01, 0xee, 0x4e, 0xdf, 0xf6, 0xfd, 0x4a, 0x18, 0xb3, - 0xd2, 0x3f, 0xd9, 0xc0, 0x1c, 0xcb, 0xcc, 0xfc, 0x0d, 0x9a, 0x8e, 0xf2, 0x1e, 0xbe, 0x2d, 0x79, - 0x0e, 0xdc, 0xc6, 0xf3, 0x8a, 0x33, 0xbb, 0xd1, 0xe5, 0x77, 0xbc, 0x00, 0x7d, 0x7f, 0x04, 0x35, - 0x48, 0xdf, 0xbc, 0x53, 0x6f, 0x21, 0x96, 0x11, 0xdf, 0x37, 0xba, 0x32, 0xe6, 0x0a, 0x8a, 0xa4, - 0xc5, 0x98, 0xe9, 0x07, 0x66, 0xea, 0xee, 0x72, 0x50, 0x3b, 0x0a, 0xe3, 0xb8, 0xbc, 0x1b, 0x8c, - 0xf8, 0x35, 0x60, 0x67, 0xc0, 0xfe, 0x96, 0x33, 0xd4, 0xcb, 0xb4, 0xfc, 0xf5, 0x6b, 0x1b, 0x99, - 0xc6, 0x4b, 0xc0, 0xba, 0x83, 0xdc, 0x9c, 0xf3, 0x36, 0xf7, 0xae, 0xec, 0x68, 0x59, 0x5d, 0x07, - 0xee, 0xcb, 0xf1, 0x4b, 0xe8, 0x64, 0xd0, 0xd1, 0x08, 0xf8, 0x68, 0x9c, 0xcb, 0x29, 0x74, 0xac, - 0xac, 0x51, 0xb9, 0xac, 0xd3, 0x78, 0xd9, 0x43, 0xc7, 0xcb, 0x9f, 0xab, 0x5b, 0xdb, 0x0c, 0x5a, - 0x65, 0x53, 0x7e, 0x73, 0x74, 0xf3, 0x00, 0xa6, 0x63, 0xca, 0xd8, 0x0d, 0x3a, 0x8c, 0x03, 0xe4, - 0xeb, 0x35, 0x1a, 0xfc, 0x2d, 0x8a, 0xd7, 0x28, 0x58, 0xd3, 0xca, 0xdf, 0x43, 0x90, 0x4d, 0x2f, - 0xa5, 0xf2, 0x41, 0x8e, 0x67, 0x3e, 0xf8, 0x3c, 0xb6, 0x77, 0x1b, 0x9e, 0x2c, 0x7b, 0x04, 0x4f, - 0x1f, 0x1d, 0x3d, 0x78, 0x17, 0xde, 0x2f, 0xa3, 0xb1, 0x83, 0xad, 0x54, 0x3a, 0x48, 0x2b, 0x3c, - 0x70, 0x18, 0x80, 0x02, 0x32, 0x95, 0x90, 0xd1, 0x4d, 0x21, 0xff, 0xa0, 0xac, 0xa7, 0x58, 0x4f, - 0xee, 0xf7, 0x9b, 0x9b, 0x75, 0x20, 0xef, 0xc5, 0x87, 0x35, 0xad, 0x58, 0x2f, 0xeb, 0x2e, 0xfe, - 0x56, 0x49, 0xda, 0x6f, 0x9c, 0x77, 0x17, 0xf8, 0x2c, 0xcc, 0x85, 0x05, 0x98, 0xfe, 0x9d, 0xd6, - 0xc8, 0xfd, 0xdc, 0x81, 0xaf, 0x43, 0xbb, 0x6d, 0xf6, 0xdf, 0x8c, 0x9d, 0x0d, 0xf5, 0x5c, 0xeb, - 0x12, 0xf1, 0xbd, 0x80, 0xe3, 0x78, 0x2d, 0xfe, 0x96, 0x4b, 0x54, 0x9c, 0x6c, 0xa6, 0x61, 0xe9, - 0x2f, 0xf9, 0x1e, 0xce, 0x3a, 0x57, 0x8f, 0x3a, 0x86, 0x7d, 0xfc, 0x5c, 0x1e, 0xe7, 0x60, 0x84, - 0x63, 0x6a, 0x58, 0xca, 0x55, 0x9a, 0x7c, 0x4f, 0xde, 0x9b, 0xf3, 0x9d, 0x07, 0xdf, 0x97, 0x0e, - 0xf7, 0xf1, 0x7c, 0x8e, 0x45, 0xb5, 0x7b, 0x80, 0xb7, 0x58, 0xc7, 0xc0, 0x40, 0xa3, 0xbf, 0x5b, - 0xde, 0x6d, 0x72, 0x9d, 0xe4, 0xa1, 0x69, 0xa3, 0x40, 0x83, 0x56, 0x2f, 0x71, 0xbd, 0x3f, 0x65, - 0x04, 0xa3, 0x1e, 0xb2, 0x69, 0xcc, 0x5a, 0xef, 0x7e, 0x07, 0x6b, 0xe4, 0xef, 0x60, 0xec, 0xdb, - 0xf8, 0x7b, 0x0c, 0x7f, 0xb3, 0xe1, 0xdc, 0x99, 0xef, 0x17, 0x6b, 0x76, 0x72, 0xef, 0x08, 0xb8, - 0xde, 0x7a, 0x4d, 0x7e, 0xaf, 0x51, 0x60, 0x73, 0xfe, 0x46, 0xcb, 0xb6, 0x03, 0xef, 0xb2, 0x8f, - 0x8e, 0x49, 0x5d, 0x2d, 0x83, 0x7d, 0x58, 0x6f, 0x77, 0xd3, 0xf8, 0x41, 0x3f, 0x1d, 0x3f, 0x48, - 0xab, 0xeb, 0xa4, 0xde, 0x68, 0xa5, 0x07, 0xba, 0xdb, 0x42, 0x21, 0x73, 0x4f, 0x55, 0x87, 0x41, - 0xe0, 0x78, 0x7d, 0x09, 0x51, 0xb9, 0x04, 0x9a, 0xbf, 0x72, 0x8f, 0xce, 0xe7, 0x80, 0xf5, 0xa3, - 0xc8, 0xfc, 0xe4, 0xb5, 0x49, 0xe1, 0x95, 0xf1, 0x9e, 0x56, 0x55, 0x9f, 0xc6, 0x2b, 0x5a, 0xe2, - 0xb3, 0xf2, 0x0e, 0x6a, 0x4b, 0x9e, 0x14, 0xc4, 0xdd, 0x73, 0x9e, 0xc4, 0xc6, 0x73, 0x7a, 0x82, - 0x6b, 0xf4, 0x6f, 0xc8, 0x73, 0xb2, 0xa5, 0xa2, 0xd3, 0x5e, 0xf9, 0xed, 0xcf, 0x47, 0xc3, 0xb1, - 0x26, 0xfa, 0x72, 0xcc, 0xa2, 0x7d, 0x31, 0xbd, 0x2a, 0x87, 0x7b, 0xdf, 0x48, 0x27, 0x91, 0x07, - 0x9c, 0x64, 0xff, 0xc2, 0xdf, 0x0e, 0x7f, 0x22, 0xef, 0x11, 0xc6, 0x63, 0xde, 0x85, 0xef, 0x87, - 0x63, 0xa8, 0xad, 0x8f, 0xc7, 0xfc, 0xbc, 0xd6, 0x7c, 0x56, 0xde, 0x49, 0xb2, 0x3d, 0x2c, 0x3a, - 0x1a, 0xb3, 0x90, 0xcb, 0xa0, 0x8d, 0xbe, 0xbe, 0x9f, 0x73, 0x0b, 0xf7, 0xbd, 0x7e, 0x92, 0xef, - 0x1e, 0x0d, 0x9c, 0x1d, 0xf7, 0x4e, 0x33, 0x78, 0xd2, 0x5d, 0xf3, 0xda, 0x82, 0x6d, 0x8c, 0x57, - 0xea, 0x12, 0x83, 0xf4, 0x7a, 0x2c, 0x6b, 0xf2, 0xb5, 0xd5, 0x74, 0xbe, 0x1e, 0xfb, 0xd1, 0xfd, - 0x43, 0x14, 0x91, 0xdf, 0xce, 0xd3, 0xa4, 0x47, 0x59, 0x3f, 0x9b, 0x89, 0xef, 0x59, 0xf8, 0xee, - 0xf2, 0xd6, 0x7b, 0xd5, 0x8d, 0x7c, 0x77, 0x4a, 0xc7, 0x64, 0xdd, 0xab, 0xe3, 0x7d, 0xc4, 0xaf, - 0x62, 0xcd, 0x79, 0xcc, 0x4f, 0x93, 0xbb, 0x9f, 0xf2, 0xc2, 0x7c, 0xd4, 0xa2, 0x32, 0xaf, 0x9b, - 0x97, 0x77, 0xd9, 0xee, 0xff, 0x15, 0x08, 0x62, 0xcd, 0xaa, 0xa7, 0x06, 0x57, 0x6d, 0xdb, 0xf2, - 0xa9, 0x5d, 0x5b, 0x76, 0xae, 0xdc, 0xbe, 0xe3, 0xb3, 0xd0, 0xe7, 0xae, 0x4f, 0x0f, 0xec, 0xda, - 0xb1, 0x2d, 0x6e, 0xdb, 0xd5, 0x7e, 0xdf, 0x27, 0x56, 0x75, 0xa5, 0x3b, 0x69, 0xfb, 0xce, 0xed, - 0xfd, 0xbb, 0x06, 0x3e, 0xb3, 0x65, 0x65, 0xff, 0x93, 0x9f, 0x61, 0x7a, 0xab, 0x76, 0xec, 0xfa, - 0xb4, 0x3b, 0x83, 0xa8, 0x89, 0x36, 0x9e, 0xf3, 0xe2, 0x47, 0xff, 0xef, 0xbf, 0xcc, 0x70, 0xec, - 0xa1, 0xcc, 0xf0, 0x54, 0x7d, 0x66, 0xb8, 0x43, 0xcd, 0x0c, 0xff, 0x1f, 0x14, 0xf6, 0x18, 0xa5, - 0xa0, 0x21, 0x00, 0x00, -}; - -#endif diff --git a/tm_firmware/500/tmctrl/rebootex/include/rebootex_02g.h b/tm_firmware/500/tmctrl/rebootex/include/rebootex_02g.h deleted file mode 100755 index 0b58b9a..0000000 --- a/tm_firmware/500/tmctrl/rebootex/include/rebootex_02g.h +++ /dev/null @@ -1,335 +0,0 @@ -#ifndef __rebootex_02g__ -#define __rebootex_02g__ - -static unsigned int size_rebootex_02g = 5224; -static unsigned char rebootex_02g[] __attribute__((aligned(16))) = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xa5, 0x5a, 0x0d, 0x70, 0x54, 0xd7, - 0x75, 0x3e, 0xef, 0x67, 0xa5, 0x95, 0x10, 0xe2, 0x21, 0xad, 0xf1, 0x9a, 0x28, 0xf6, 0xbb, 0xbb, - 0x6f, 0x7f, 0x82, 0x15, 0x78, 0xc1, 0xbb, 0x46, 0x9d, 0x6e, 0xcb, 0x76, 0x57, 0x02, 0xb9, 0x25, - 0xae, 0x6c, 0xcb, 0x2d, 0x99, 0xc1, 0x93, 0x8d, 0x24, 0xb0, 0x1d, 0xe3, 0x0c, 0x03, 0x74, 0x6a, - 0x4f, 0xdd, 0x99, 0xed, 0x8a, 0x1f, 0x0d, 0xb3, 0xa0, 0x8d, 0x20, 0x19, 0xc2, 0xb4, 0xe9, 0x76, - 0x57, 0x20, 0x42, 0x17, 0x49, 0x36, 0xf8, 0xa7, 0x0c, 0xc6, 0x1a, 0x41, 0x1c, 0x32, 0x75, 0x1b, - 0x9a, 0xa6, 0x1e, 0xb7, 0xcd, 0xa4, 0x8a, 0x30, 0x0d, 0x4d, 0x3a, 0x8e, 0x27, 0x31, 0x31, 0x31, - 0x58, 0xaf, 0xdf, 0xb9, 0x6f, 0x57, 0x40, 0x12, 0x12, 0x4f, 0xaa, 0x99, 0x9d, 0x77, 0xef, 0x7d, - 0xf7, 0x9e, 0x73, 0xcf, 0x39, 0xdf, 0x3d, 0x3f, 0xf7, 0xe9, 0x59, 0x5a, 0xdd, 0x48, 0xd5, 0xbf, - 0x45, 0x34, 0xe5, 0x77, 0x5b, 0xbb, 0xb3, 0x44, 0xa5, 0xec, 0x42, 0x9a, 0xf5, 0x09, 0x3f, 0x8f, - 0xaf, 0x6e, 0x54, 0xa8, 0xdf, 0x22, 0xfa, 0x01, 0xc6, 0xd5, 0xbf, 0xaa, 0xc7, 0x38, 0xf7, 0x97, - 0x19, 0x9b, 0x48, 0x74, 0x0c, 0xd2, 0xcf, 0x9d, 0xa4, 0x4f, 0x24, 0xcb, 0xe4, 0xa5, 0x19, 0x4d, - 0x18, 0x24, 0x9f, 0x41, 0x63, 0x2d, 0xd5, 0x81, 0x9e, 0x43, 0x87, 0x6d, 0x61, 0xef, 0x02, 0xcd, - 0x9d, 0x45, 0x85, 0x76, 0x58, 0x73, 0xce, 0xae, 0x5e, 0x6e, 0xf3, 0x1c, 0xe6, 0xd4, 0x80, 0x39, - 0x22, 0x99, 0x05, 0x1d, 0x22, 0x61, 0x8c, 0x61, 0xa4, 0xb3, 0x20, 0xfc, 0xf5, 0x8a, 0x42, 0x3f, - 0x00, 0xfd, 0xff, 0xa6, 0x0f, 0x40, 0x9b, 0x68, 0x60, 0x7e, 0x7e, 0x3d, 0xcf, 0x37, 0x77, 0x91, - 0xb0, 0x8f, 0x90, 0xe3, 0x4c, 0x17, 0x1c, 0xe7, 0x75, 0xcb, 0x71, 0x72, 0xc5, 0xeb, 0xce, 0x11, - 0x9f, 0xe3, 0xec, 0xb0, 0x6a, 0xf3, 0xae, 0x0f, 0xa9, 0x89, 0xbf, 0x16, 0xe9, 0xfc, 0x55, 0xe7, - 0xd5, 0x88, 0x4e, 0xaf, 0x4d, 0x34, 0x5c, 0xcd, 0x90, 0x3b, 0xae, 0x27, 0x8a, 0xe2, 0x2b, 0x79, - 0x8c, 0x0d, 0x7b, 0xc9, 0xd4, 0xbc, 0xf4, 0x6a, 0xc4, 0x56, 0x06, 0xf3, 0xca, 0x09, 0x35, 0x71, - 0x6a, 0x3c, 0x15, 0x6b, 0xa2, 0x3e, 0x1f, 0xaf, 0x9d, 0xa4, 0x5c, 0xbe, 0x9e, 0x92, 0x90, 0x7e, - 0xba, 0x22, 0xfc, 0x39, 0xea, 0x51, 0x72, 0x05, 0xa2, 0x9c, 0x94, 0xe1, 0x43, 0x67, 0xb0, 0x97, - 0xfb, 0x35, 0x79, 0x7d, 0xc1, 0xcf, 0xe4, 0x99, 0x96, 0x4b, 0x5f, 0x4b, 0xe8, 0x4a, 0xbf, 0xe5, - 0x68, 0x6a, 0xc2, 0x71, 0x52, 0xb1, 0x9c, 0x5f, 0x23, 0xcb, 0xdf, 0x47, 0xd4, 0xe4, 0x4d, 0x84, - 0xfc, 0x4f, 0x40, 0x46, 0xd5, 0xba, 0x8c, 0x3d, 0x6d, 0x88, 0x5f, 0xac, 0xec, 0xd8, 0x70, 0xb1, - 0x72, 0x74, 0xc3, 0x6c, 0x25, 0xf3, 0x67, 0x17, 0xad, 0xb7, 0xf0, 0xdc, 0xf2, 0xd8, 0x6c, 0x85, - 0x79, 0xfb, 0xb0, 0x5f, 0x83, 0x5e, 0x98, 0x68, 0xa2, 0xe7, 0x27, 0xbc, 0x34, 0x39, 0x21, 0x0a, - 0xd0, 0xcf, 0x50, 0x91, 0x44, 0x76, 0x0a, 0x1c, 0xc6, 0x26, 0xee, 0xa7, 0xd5, 0xcd, 0xbe, 0x60, - 0xba, 0x42, 0xf4, 0x0f, 0xc3, 0xc2, 0x4c, 0xaa, 0x22, 0x6a, 0xaa, 0xc2, 0x26, 0x15, 0xeb, 0x86, - 0xb1, 0x6e, 0x18, 0xeb, 0x20, 0xdb, 0xa4, 0x94, 0xcf, 0x0f, 0xf9, 0x9c, 0x45, 0x6a, 0xe2, 0xfa, - 0x50, 0x33, 0x7e, 0x0b, 0xf1, 0x6b, 0xc2, 0xaf, 0x11, 0xbf, 0x06, 0xfc, 0x16, 0x24, 0xae, 0x63, - 0x8f, 0x3d, 0xca, 0x3f, 0x87, 0x1c, 0x4d, 0x4b, 0x8c, 0x2e, 0x3a, 0x1e, 0x7a, 0xcb, 0x9b, 0x0f, - 0x3d, 0xe1, 0xf9, 0xc3, 0x50, 0xd2, 0xf3, 0x89, 0x50, 0x46, 0x7f, 0x2a, 0xe4, 0x38, 0xfd, 0x31, - 0x6b, 0xcb, 0xb4, 0x92, 0x7b, 0x62, 0x21, 0xe5, 0x32, 0x4d, 0x94, 0xeb, 0x69, 0xa4, 0x5c, 0x77, - 0x03, 0xe5, 0xd6, 0x2f, 0xa0, 0xcc, 0x90, 0x37, 0x61, 0xad, 0xef, 0x57, 0xac, 0x27, 0xca, 0x8a, - 0x95, 0x19, 0x54, 0xac, 0x9e, 0xb4, 0x62, 0x75, 0x07, 0x15, 0xf2, 0xaa, 0x09, 0x6a, 0xd2, 0x12, - 0xb9, 0x2d, 0xcd, 0xf4, 0x16, 0x64, 0x0d, 0x61, 0x7d, 0x08, 0x73, 0x9a, 0x4c, 0x35, 0x4e, 0xf4, - 0xe9, 0x4a, 0x13, 0x9d, 0x80, 0x5c, 0x2f, 0x4c, 0xe8, 0x90, 0x2f, 0x84, 0xf5, 0x21, 0xac, 0x0d, - 0x61, 0x6d, 0x08, 0x6b, 0x0b, 0xe6, 0xe2, 0xb8, 0x69, 0x6a, 0xf1, 0xd3, 0x66, 0x4b, 0xdc, 0xee, - 0x69, 0x8d, 0x1f, 0x9e, 0x00, 0x2d, 0xda, 0x0c, 0x59, 0x27, 0x27, 0x88, 0x96, 0x8d, 0xcf, 0x68, - 0x06, 0xfa, 0x0f, 0x8c, 0x13, 0xf5, 0x8d, 0xab, 0x96, 0x9a, 0x68, 0xa3, 0x97, 0x27, 0xfc, 0xf4, - 0xd2, 0x84, 0x8f, 0x5e, 0x84, 0xce, 0x4e, 0x82, 0xae, 0x71, 0x7f, 0xac, 0xc7, 0x17, 0x2f, 0x7c, - 0xfe, 0x8e, 0xf8, 0x8c, 0xbd, 0x24, 0xfe, 0xb6, 0x7d, 0x67, 0xbc, 0x6c, 0x6a, 0x09, 0x85, 0x52, - 0x31, 0xa2, 0x41, 0xac, 0xfb, 0x7b, 0xfc, 0x2e, 0xe0, 0x37, 0x3b, 0xbe, 0x98, 0xd4, 0x84, 0xdf, - 0xf4, 0xc7, 0x37, 0x9b, 0x77, 0xc5, 0x2d, 0xe8, 0xdc, 0xa4, 0x33, 0x13, 0x3b, 0xcc, 0x7b, 0xe2, - 0xef, 0x3e, 0x78, 0x77, 0x5c, 0x74, 0xf0, 0x7c, 0x02, 0x4f, 0x13, 0xbf, 0x19, 0xfc, 0xa6, 0x27, - 0x32, 0xb0, 0xcd, 0x7b, 0x0f, 0xf2, 0xf8, 0x83, 0x95, 0x0c, 0xec, 0x5c, 0x54, 0xd5, 0x84, 0xb8, - 0x9c, 0x8a, 0x5d, 0x7d, 0xb0, 0x1f, 0x63, 0x7d, 0x15, 0x7e, 0xdf, 0xf1, 0x74, 0x2a, 0xc6, 0xef, - 0x88, 0x92, 0x95, 0x6b, 0x43, 0x8b, 0x12, 0x6f, 0xb4, 0x7a, 0xe3, 0x6c, 0xf3, 0x0b, 0xad, 0x3c, - 0xc7, 0x38, 0xce, 0xf3, 0x2e, 0xd0, 0x6c, 0xfc, 0x3b, 0x74, 0x11, 0xba, 0xe8, 0xce, 0x7f, 0x97, - 0x7e, 0x88, 0xe7, 0x93, 0xf9, 0xb7, 0xe8, 0xc7, 0x78, 0xfe, 0x68, 0x2f, 0xd1, 0xba, 0xbd, 0x8c, - 0x01, 0xc6, 0xd1, 0x2b, 0xa2, 0xbb, 0xd2, 0x14, 0x7c, 0xb2, 0x52, 0xeb, 0x9f, 0x0f, 0xfc, 0x51, - 0xc5, 0x08, 0x6e, 0x9e, 0xef, 0x8b, 0xac, 0x8b, 0x8b, 0x51, 0x91, 0xac, 0x1c, 0x15, 0x99, 0x8a, - 0x28, 0x4c, 0x11, 0x63, 0x43, 0x1c, 0x9c, 0x21, 0xe3, 0xb4, 0x9e, 0x58, 0x4f, 0x3b, 0xc1, 0xb3, - 0x9c, 0x7f, 0x8e, 0x76, 0xc4, 0x54, 0x62, 0xfe, 0x65, 0xe8, 0x31, 0x97, 0x3f, 0x2f, 0x75, 0x91, - 0xab, 0x2c, 0x82, 0x80, 0xff, 0x5b, 0xbf, 0xba, 0x99, 0x71, 0xab, 0x90, 0x6e, 0xad, 0x23, 0x8f, - 0xb5, 0x0e, 0x7d, 0x8d, 0xea, 0x2c, 0xa6, 0x7f, 0x40, 0x3c, 0x9b, 0x17, 0x26, 0x55, 0xf1, 0x05, - 0x9c, 0x75, 0x64, 0x54, 0xe8, 0x69, 0x18, 0x7a, 0x1a, 0x86, 0xde, 0x87, 0xa1, 0xf7, 0x61, 0xe8, - 0x1d, 0x98, 0x3b, 0x09, 0xcc, 0x9d, 0x00, 0xde, 0x5e, 0x18, 0x86, 0x4d, 0x87, 0xa9, 0x8a, 0xbd, - 0x28, 0xb0, 0xc7, 0x7b, 0x3d, 0x88, 0x73, 0x38, 0x03, 0x1c, 0xf8, 0xa5, 0x8d, 0x4e, 0x4c, 0xb4, - 0x41, 0xd7, 0x3e, 0xd8, 0xaa, 0x09, 0x18, 0xf0, 0x02, 0x03, 0x3a, 0x6c, 0xcb, 0xe7, 0x53, 0x1c, - 0xcc, 0xd2, 0x3d, 0x94, 0xd4, 0xc5, 0xd1, 0x24, 0xfd, 0xc4, 0x79, 0xd8, 0x6a, 0xa3, 0xe4, 0x52, - 0x5e, 0xaf, 0x8b, 0x5e, 0x6b, 0xb9, 0xb2, 0xba, 0x51, 0xc0, 0xfb, 0xf8, 0x29, 0x63, 0x60, 0xfd, - 0xb0, 0x18, 0xda, 0xa2, 0x0a, 0x13, 0xfb, 0x8a, 0x66, 0xd5, 0x2f, 0xaa, 0xab, 0x9b, 0x15, 0x32, - 0xc2, 0x57, 0xe1, 0x2b, 0x96, 0xf9, 0x5b, 0x54, 0x3e, 0xe3, 0x3e, 0x91, 0xcb, 0xfb, 0xc4, 0x0e, - 0x4b, 0xa7, 0x41, 0x9c, 0xcd, 0x9d, 0x79, 0x8d, 0x02, 0xc7, 0x88, 0x02, 0xa7, 0xea, 0x29, 0x78, - 0x4c, 0xa7, 0xe0, 0xa9, 0x05, 0x14, 0x3a, 0xe6, 0xa5, 0xd0, 0x29, 0x20, 0xba, 0xd0, 0x44, 0x81, - 0xd2, 0x42, 0x1a, 0x2c, 0x2c, 0xa4, 0x60, 0x49, 0xd2, 0x36, 0x8a, 0x2a, 0xf6, 0x0a, 0xd9, 0x4e, - 0x42, 0xb6, 0x13, 0x90, 0xed, 0x05, 0xc8, 0xf3, 0x3c, 0x64, 0x63, 0xb9, 0x66, 0x34, 0x13, 0x72, - 0x5d, 0xd4, 0x5c, 0xbf, 0xc9, 0x7a, 0x3a, 0x2a, 0xfa, 0x40, 0x3f, 0x69, 0xd4, 0x7c, 0x1f, 0xdb, - 0xa2, 0xf6, 0xfe, 0x7b, 0x7a, 0x6d, 0x9e, 0x8a, 0x79, 0xe9, 0xfc, 0x2b, 0xd0, 0x83, 0x05, 0x99, - 0x3b, 0xa1, 0x83, 0x24, 0xf0, 0x96, 0x00, 0x7e, 0x3b, 0x80, 0xdf, 0x18, 0x74, 0x63, 0x43, 0x27, - 0xed, 0xd0, 0x4f, 0x14, 0x7a, 0x31, 0xa1, 0x93, 0x00, 0x64, 0x15, 0x43, 0x59, 0xe2, 0xb3, 0x7a, - 0x3e, 0x10, 0x00, 0x2e, 0xbc, 0x89, 0x4f, 0x1e, 0x2c, 0xc1, 0x67, 0x66, 0x96, 0x36, 0x05, 0xeb, - 0xf6, 0x8a, 0x28, 0xfb, 0xcc, 0xaf, 0x57, 0x7d, 0x66, 0x48, 0x55, 0xe8, 0x30, 0x7c, 0xe6, 0x89, - 0x79, 0x9f, 0xd9, 0x14, 0x54, 0xf7, 0x9e, 0x0f, 0x04, 0xf7, 0x0a, 0xe3, 0x11, 0x0a, 0xfa, 0xb7, - 0x11, 0xfa, 0xc7, 0xd1, 0x3f, 0xde, 0x29, 0x65, 0xcc, 0xa8, 0xe0, 0x3f, 0x0c, 0xfe, 0xc3, 0xe0, - 0x3f, 0x0c, 0xfe, 0xc3, 0xe0, 0x3f, 0x0c, 0xfe, 0xc3, 0xe0, 0x3f, 0x8c, 0x3d, 0xc2, 0xce, 0xae, - 0xbc, 0xdd, 0x90, 0x17, 0x72, 0x34, 0xd7, 0xe4, 0x15, 0x07, 0x93, 0xc0, 0x5c, 0x5f, 0xfe, 0x1d, - 0x27, 0x69, 0x30, 0xad, 0x51, 0xc8, 0x7b, 0x1f, 0x05, 0xf6, 0x04, 0x29, 0xb8, 0x67, 0x15, 0x59, - 0x7b, 0x6c, 0x0a, 0x1c, 0x32, 0x29, 0x78, 0x28, 0x46, 0xd6, 0x21, 0x31, 0x19, 0x50, 0x59, 0x76, - 0xf1, 0x6e, 0x50, 0x4d, 0x8a, 0xb4, 0x25, 0xdb, 0xa6, 0xa5, 0x3e, 0x20, 0xba, 0x10, 0x4f, 0xfa, - 0x0a, 0x6e, 0x5c, 0x61, 0xff, 0x5d, 0xf6, 0xb1, 0x6f, 0x5d, 0x05, 0x3a, 0x31, 0xac, 0x6f, 0xa0, - 0x3f, 0x45, 0x7b, 0xd5, 0xb1, 0x18, 0xad, 0x3a, 0x15, 0xa1, 0xd8, 0x1e, 0x8b, 0x62, 0x87, 0xb6, - 0x52, 0x76, 0x69, 0x03, 0x6d, 0x0b, 0x33, 0x8d, 0x57, 0xc4, 0xa3, 0x79, 0xf8, 0x43, 0xed, 0x24, - 0xe3, 0x02, 0x9e, 0xf9, 0x71, 0xca, 0x1a, 0xa2, 0x90, 0x21, 0x8d, 0xf4, 0x3d, 0x22, 0x5a, 0x54, - 0x89, 0x74, 0xec, 0xc1, 0x08, 0x33, 0x36, 0x84, 0x79, 0x0e, 0xba, 0x49, 0x87, 0x7f, 0xc6, 0xf8, - 0x30, 0xb7, 0x43, 0x67, 0x45, 0xd8, 0xb0, 0x1c, 0xc1, 0x19, 0x85, 0x3f, 0x4f, 0x21, 0x26, 0xf5, - 0xf5, 0x72, 0x9b, 0x65, 0x60, 0xf9, 0x8c, 0xe0, 0xa6, 0x3c, 0xcb, 0x90, 0xbc, 0xab, 0x05, 0x71, - 0xe9, 0x2c, 0x62, 0xd9, 0xac, 0xfa, 0xbe, 0x93, 0xb2, 0x44, 0x74, 0x15, 0xe8, 0x74, 0x86, 0x15, - 0xd2, 0xac, 0xa4, 0xd0, 0xa1, 0x8d, 0xd2, 0x44, 0x30, 0x3a, 0x46, 0x59, 0x47, 0xb5, 0x1a, 0xa9, - 0x5c, 0xf6, 0xd2, 0x91, 0xb1, 0x05, 0x54, 0xc2, 0xb3, 0xe8, 0x17, 0xfe, 0x73, 0x9a, 0xf0, 0x6f, - 0x24, 0x11, 0xbd, 0x84, 0x38, 0x55, 0x42, 0x9c, 0x3a, 0x8c, 0x38, 0xd5, 0x07, 0x39, 0x2f, 0x21, - 0x4e, 0xf5, 0x5b, 0x6c, 0x3b, 0x13, 0xe7, 0x4c, 0x18, 0x87, 0x35, 0xd7, 0x7e, 0x97, 0x88, 0xed, - 0x77, 0x0d, 0x71, 0x8c, 0x6d, 0x17, 0x81, 0x2e, 0x4d, 0xc8, 0x6a, 0x41, 0x8f, 0xac, 0x23, 0xf4, - 0x8f, 0xa1, 0x7d, 0x8a, 0xf7, 0xe8, 0xea, 0x37, 0x65, 0xa1, 0x7d, 0x0c, 0xed, 0x53, 0xab, 0x30, - 0x37, 0x86, 0x79, 0x26, 0xe6, 0xa1, 0x0d, 0x9d, 0x05, 0x4f, 0xb5, 0x62, 0xde, 0x9d, 0x18, 0x37, - 0x30, 0xd7, 0x87, 0x77, 0x39, 0x27, 0xe3, 0x17, 0x46, 0x00, 0x67, 0x26, 0x49, 0xcc, 0x5b, 0x21, - 0x8e, 0x67, 0x83, 0x05, 0xe6, 0x49, 0x2d, 0x2a, 0x85, 0x8c, 0x34, 0xb1, 0x2e, 0x10, 0xb3, 0x6c, - 0x75, 0xa9, 0x8a, 0xf6, 0x60, 0x91, 0xed, 0xc2, 0x34, 0x78, 0xfd, 0x32, 0x7f, 0x19, 0x67, 0x32, - 0xe3, 0x33, 0x61, 0xa3, 0xdf, 0x06, 0x3f, 0xfd, 0xce, 0x76, 0x89, 0x95, 0x33, 0x6c, 0x2f, 0xe8, - 0x9f, 0xf3, 0x8a, 0xc7, 0x30, 0xc6, 0xb6, 0xab, 0x8d, 0x71, 0xac, 0x96, 0xf1, 0x13, 0x67, 0x83, - 0xfd, 0xbd, 0x25, 0xfa, 0x70, 0x7e, 0xd7, 0xe6, 0xaf, 0x0f, 0xd5, 0x25, 0xd0, 0xce, 0x9f, 0x16, - 0x17, 0xa0, 0xb7, 0x2c, 0xe9, 0x54, 0x3f, 0xce, 0x7e, 0x69, 0x1c, 0xb6, 0x3d, 0x2d, 0x10, 0x9f, - 0xd1, 0xe6, 0x78, 0xce, 0x7e, 0xc7, 0xaa, 0x5b, 0xdd, 0xe8, 0x95, 0x7e, 0xa7, 0x21, 0x21, 0xec, - 0xac, 0x94, 0xf5, 0x8d, 0x40, 0x34, 0x94, 0xa4, 0x7a, 0xeb, 0xc6, 0x59, 0xf1, 0x28, 0xae, 0xae, - 0xc7, 0xa4, 0xae, 0x19, 0x4f, 0x17, 0x02, 0x9d, 0xd2, 0xe7, 0x71, 0xbb, 0x5d, 0x6c, 0xb4, 0x66, - 0x02, 0x6b, 0x80, 0xcb, 0x41, 0x99, 0x07, 0x31, 0x2e, 0x97, 0x20, 0x2f, 0x70, 0xd7, 0x70, 0xfe, - 0x32, 0x98, 0xbd, 0x86, 0x79, 0x53, 0xd4, 0xc9, 0x31, 0x25, 0xaf, 0x90, 0x6a, 0xdd, 0x43, 0x7d, - 0xc6, 0x53, 0x78, 0x72, 0x5f, 0xc5, 0xf3, 0xe3, 0xe8, 0x7f, 0x1e, 0xcf, 0x06, 0x52, 0xff, 0xce, - 0xc5, 0x6b, 0x1a, 0x3e, 0x22, 0x63, 0x30, 0x76, 0xb8, 0x3f, 0x2a, 0xd2, 0x95, 0xa0, 0xba, 0xba, - 0xf1, 0x8d, 0x80, 0x15, 0x9a, 0xf7, 0xe7, 0x26, 0x29, 0x49, 0x9c, 0x8b, 0x7f, 0x0b, 0x6c, 0xba, - 0x85, 0xf7, 0x15, 0xe7, 0x56, 0xde, 0x35, 0x1a, 0xf0, 0x27, 0x95, 0x5a, 0x0e, 0xf2, 0x19, 0xd0, - 0x62, 0x5e, 0x9b, 0xc1, 0xb3, 0xd6, 0x46, 0x6e, 0x65, 0x88, 0x24, 0xdd, 0x94, 0x5b, 0xa5, 0x61, - 0x6f, 0x6f, 0x48, 0x18, 0xbb, 0xb9, 0x5d, 0xfc, 0xc0, 0x39, 0xef, 0xc3, 0x3b, 0xc5, 0xa5, 0x01, - 0x76, 0x54, 0xce, 0x36, 0xb0, 0xcf, 0x41, 0x9b, 0x75, 0x47, 0x74, 0xb6, 0x28, 0xf1, 0x81, 0xf1, - 0xeb, 0xb0, 0xbd, 0x42, 0xaf, 0x57, 0xf3, 0xab, 0xa9, 0x22, 0xbf, 0x9f, 0x6f, 0xcf, 0xe7, 0x6f, - 0xf5, 0x0a, 0xd1, 0x9a, 0xac, 0x30, 0x99, 0xd7, 0x8e, 0xac, 0x43, 0x67, 0xed, 0xbf, 0x75, 0xfa, - 0x2c, 0x87, 0x52, 0xf6, 0x52, 0x4a, 0xb5, 0x73, 0x4e, 0xa7, 0xc2, 0x4f, 0xce, 0x00, 0xff, 0x66, - 0x4c, 0x7b, 0xce, 0xa1, 0xc1, 0x5b, 0xde, 0xcf, 0xbf, 0xb3, 0xb4, 0xe7, 0x3c, 0x74, 0xce, 0xc7, - 0xfe, 0xe6, 0x47, 0xce, 0x54, 0x2f, 0xd3, 0xbd, 0x35, 0xb7, 0xdc, 0x45, 0xef, 0xca, 0xbc, 0xee, - 0x79, 0x89, 0x13, 0x2f, 0xf0, 0x22, 0xb2, 0x45, 0xfa, 0x5d, 0x2f, 0xce, 0xfa, 0x10, 0xef, 0x5b, - 0xcf, 0x2d, 0x66, 0x7f, 0x60, 0x03, 0xef, 0xfe, 0xa9, 0x2a, 0xde, 0x59, 0x8e, 0x81, 0xa2, 0x30, - 0x3c, 0xf0, 0x0d, 0x9d, 0xd9, 0x6b, 0x4e, 0x56, 0xe6, 0xb0, 0x2e, 0x26, 0x92, 0xc8, 0x2f, 0x19, - 0xd3, 0xa6, 0xca, 0x18, 0xd2, 0x65, 0xfe, 0x84, 0x4c, 0x03, 0x38, 0xba, 0xe1, 0x63, 0x6f, 0x3f, - 0xc7, 0x7c, 0x15, 0x71, 0x9f, 0xd2, 0x9c, 0x03, 0xe4, 0xc9, 0x4c, 0xd9, 0x1f, 0xc2, 0x2f, 0xf2, - 0xde, 0x6b, 0xb9, 0xa8, 0x71, 0xda, 0x93, 0xe8, 0xa5, 0x51, 0x89, 0x95, 0x1e, 0x3a, 0x12, 0x7b, - 0x86, 0xc6, 0x62, 0xa4, 0x70, 0x3c, 0x1e, 0x44, 0x3c, 0x9e, 0xce, 0xaf, 0xa3, 0xc3, 0x31, 0xd2, - 0x39, 0x26, 0x4f, 0xa3, 0x7f, 0x31, 0xcf, 0x72, 0x1a, 0x32, 0x5e, 0x5f, 0x44, 0x7f, 0x34, 0xef, - 0xcc, 0x69, 0x96, 0x65, 0x0e, 0x82, 0xd2, 0x68, 0xa5, 0x46, 0x73, 0x31, 0xfb, 0x18, 0xe8, 0x9c, - 0x79, 0xc7, 0xe8, 0x81, 0x58, 0x07, 0x75, 0x63, 0xbe, 0xba, 0x97, 0x92, 0x69, 0x9b, 0x94, 0x94, - 0xbd, 0x80, 0x90, 0x93, 0xdb, 0xbb, 0x11, 0x0b, 0x32, 0x86, 0x9b, 0xd3, 0x07, 0xf7, 0xea, 0x32, - 0xa7, 0xbe, 0xc4, 0x76, 0xad, 0xbc, 0x27, 0x63, 0x04, 0xdd, 0x92, 0xb3, 0x3b, 0xf0, 0x63, 0xae, - 0x2c, 0x2e, 0xae, 0xc9, 0xe8, 0x73, 0x65, 0xd1, 0xfa, 0x6d, 0x7e, 0xc7, 0x73, 0x1a, 0x0d, 0xad, - 0xca, 0x93, 0xf7, 0xdb, 0x89, 0xfd, 0x75, 0x55, 0xf4, 0x6a, 0xac, 0xe3, 0x71, 0x4a, 0x96, 0x63, - 0xb6, 0x7c, 0x97, 0xae, 0xbc, 0xa3, 0xd6, 0xc6, 0xe1, 0x53, 0xeb, 0x78, 0xcd, 0xc6, 0x98, 0xb4, - 0x5b, 0x56, 0xc7, 0x1c, 0xc8, 0xe7, 0x4d, 0xc5, 0x6e, 0xb6, 0xe1, 0xf5, 0xa1, 0xc5, 0xc8, 0x9b, - 0x06, 0x40, 0xb3, 0x84, 0x5f, 0x91, 0xe9, 0x36, 0x4f, 0x0a, 0x3b, 0xcc, 0xe7, 0xdb, 0x0b, 0x6c, - 0x78, 0x91, 0x9f, 0x38, 0x4e, 0x9d, 0xc5, 0x76, 0xa8, 0xe5, 0x19, 0xc2, 0x98, 0xa2, 0x9a, 0x1d, - 0x5a, 0x35, 0x37, 0x46, 0xe9, 0xa4, 0x8d, 0xf0, 0x99, 0xe4, 0x73, 0xc3, 0xf3, 0x27, 0x85, 0xb5, - 0x0f, 0x67, 0x46, 0x9e, 0x6d, 0xd6, 0x23, 0x72, 0x65, 0x3a, 0x29, 0xba, 0x10, 0xbf, 0xb2, 0x06, - 0xd3, 0x5a, 0x8e, 0xfd, 0xf3, 0x3c, 0xde, 0xbf, 0xf9, 0xaa, 0x27, 0xa1, 0x6c, 0xd1, 0xac, 0x9a, - 0x0c, 0x1d, 0xd2, 0x6e, 0xb9, 0x7c, 0x4d, 0xaf, 0x06, 0xb9, 0x7a, 0x63, 0xbd, 0xc6, 0xa8, 0x84, - 0x77, 0x5d, 0x79, 0xe8, 0x21, 0xcf, 0x32, 0x76, 0x48, 0x9b, 0x01, 0x03, 0x46, 0xa7, 0x9c, 0xeb, - 0x99, 0x9f, 0x9b, 0x35, 0x1c, 0x2a, 0xd9, 0x35, 0xdb, 0xd5, 0x74, 0x4d, 0x4e, 0xce, 0xa6, 0xc4, - 0xee, 0xe7, 0x42, 0x1d, 0xb3, 0x44, 0x0e, 0xf6, 0x66, 0xe7, 0x40, 0x4a, 0x27, 0x87, 0x38, 0x5f, - 0xd5, 0x13, 0xbc, 0x1f, 0xf6, 0x89, 0x56, 0x52, 0x53, 0xe0, 0x77, 0x63, 0xf5, 0x05, 0xad, 0xaa, - 0xdb, 0xc9, 0x09, 0xbd, 0x8a, 0xf9, 0x90, 0x79, 0x8e, 0x42, 0xd1, 0xcb, 0x7c, 0x9e, 0x2b, 0x0b, - 0xab, 0xf2, 0xd7, 0xd1, 0x1f, 0x70, 0x70, 0x22, 0xe6, 0x51, 0xf3, 0x8b, 0xcc, 0x93, 0xfd, 0xe2, - 0xbf, 0xa8, 0xee, 0x9c, 0x74, 0x75, 0x2e, 0x62, 0xa2, 0x6e, 0x52, 0xda, 0xbe, 0x06, 0x79, 0x92, - 0x38, 0x87, 0x3f, 0x05, 0x2e, 0x6a, 0x38, 0xa0, 0x80, 0xab, 0x07, 0xd6, 0x3f, 0xa9, 0x1e, 0xab, - 0x6a, 0x53, 0xb9, 0xee, 0x7f, 0xb0, 0x4e, 0xd2, 0xaf, 0xd2, 0xb9, 0x54, 0xed, 0xff, 0x22, 0x7d, - 0xe0, 0x47, 0xcf, 0x56, 0xe9, 0x33, 0xce, 0x9e, 0x85, 0xae, 0x79, 0x4f, 0x2c, 0x17, 0x49, 0x9b, - 0xab, 0x89, 0x7f, 0xc7, 0x9a, 0x8a, 0x70, 0x75, 0x98, 0x60, 0x1d, 0x66, 0x55, 0x99, 0x4f, 0x4b, - 0x5d, 0x66, 0xe5, 0x79, 0x92, 0x7a, 0xbc, 0xab, 0x66, 0x5f, 0xed, 0xf6, 0x3c, 0x48, 0x9e, 0x51, - 0x57, 0xc7, 0x2c, 0xef, 0x57, 0xb5, 0x1b, 0xf9, 0x97, 0x19, 0x59, 0x93, 0xe7, 0xf8, 0x71, 0xc5, - 0x51, 0x63, 0x73, 0xa8, 0x15, 0xd9, 0x8f, 0x2e, 0xa0, 0xb3, 0xc6, 0xbd, 0x46, 0x8e, 0xb8, 0x46, - 0x72, 0x9c, 0x74, 0xcc, 0x42, 0x9c, 0x9b, 0x73, 0x06, 0xe0, 0xa7, 0x34, 0xe0, 0xec, 0xac, 0x71, - 0x05, 0xf5, 0xd1, 0x9c, 0x53, 0xb2, 0x34, 0x9a, 0xf2, 0x5d, 0x59, 0x94, 0x6a, 0xbf, 0xd9, 0x86, - 0x35, 0x3e, 0xbc, 0x7e, 0x01, 0x62, 0x29, 0xfb, 0x44, 0xe6, 0x03, 0x7f, 0x59, 0x6c, 0xa3, 0xb3, - 0x79, 0x33, 0xd2, 0x99, 0x5f, 0x4a, 0xdf, 0x38, 0xc0, 0xf1, 0x40, 0x47, 0xee, 0xed, 0xa1, 0x9c, - 0xcf, 0x4b, 0x63, 0x15, 0x1f, 0x4d, 0x1f, 0x20, 0x1f, 0xc7, 0xdc, 0x59, 0xac, 0x2f, 0xc9, 0x33, - 0xdd, 0x04, 0xbc, 0xd7, 0x68, 0x32, 0x8d, 0xce, 0x48, 0x3a, 0xff, 0x59, 0xec, 0x5d, 0x00, 0xaf, - 0x97, 0xa5, 0xae, 0x26, 0xa1, 0x2b, 0x23, 0x61, 0x40, 0x67, 0xb5, 0xfa, 0xe9, 0x15, 0xc8, 0xcf, - 0xe7, 0x07, 0xf6, 0x21, 0xcc, 0x6d, 0x36, 0x2d, 0x4f, 0xb8, 0x11, 0xb6, 0x37, 0xad, 0xc5, 0x61, - 0xc6, 0x33, 0xe6, 0xfe, 0x52, 0x5e, 0x5e, 0x3b, 0x2f, 0x5c, 0x17, 0xce, 0x29, 0x2b, 0x47, 0x1e, - 0x95, 0xe7, 0x24, 0xb5, 0x84, 0xe7, 0x3b, 0xca, 0x7d, 0x23, 0xc7, 0xd0, 0xff, 0x89, 0xd3, 0xb7, - 0x84, 0xd7, 0x7e, 0x43, 0xb1, 0x46, 0xce, 0x2b, 0x81, 0x91, 0x6f, 0x2a, 0xc1, 0x91, 0xd7, 0x95, - 0xf0, 0x08, 0x05, 0x00, 0x2b, 0xec, 0x9b, 0xee, 0xd6, 0x28, 0x64, 0x9f, 0x93, 0x39, 0x43, 0xc8, - 0x9e, 0x26, 0xe6, 0x2f, 0xf3, 0x3a, 0xd4, 0x09, 0x97, 0xb0, 0x8f, 0xce, 0xc8, 0x9a, 0xca, 0x8c, - 0xc4, 0x43, 0x9d, 0x35, 0x87, 0xf5, 0xdf, 0x73, 0x1e, 0xf6, 0x31, 0x3d, 0x07, 0xed, 0xef, 0x3a, - 0x8f, 0xf4, 0xf2, 0x9e, 0x78, 0xfe, 0xfd, 0x56, 0xd7, 0x81, 0x18, 0x15, 0x0d, 0x6e, 0xb7, 0x50, - 0x60, 0x64, 0x31, 0x05, 0x47, 0x10, 0xc9, 0xe7, 0xf3, 0x91, 0xe4, 0x62, 0x95, 0x1c, 0x25, 0x05, - 0x5b, 0x64, 0x7d, 0x4b, 0xa9, 0x93, 0xfe, 0x49, 0x61, 0x3e, 0x75, 0x09, 0xe1, 0x2f, 0x52, 0x0b, - 0xf4, 0xd4, 0x1e, 0x99, 0xae, 0x98, 0x96, 0x1e, 0x36, 0x68, 0x67, 0x81, 0x69, 0x2c, 0xb7, 0xba, - 0x0f, 0xf8, 0x69, 0x23, 0xc6, 0xbf, 0x99, 0xf7, 0xc1, 0x1e, 0xad, 0xb4, 0x0b, 0x39, 0xfd, 0xee, - 0x02, 0x2d, 0xd5, 0xdc, 0xfd, 0x99, 0x0d, 0x4a, 0xc8, 0x3e, 0x4b, 0x56, 0xa4, 0xbb, 0x52, 0x8b, - 0xf5, 0xfe, 0xe0, 0xe3, 0xc5, 0x16, 0xf6, 0xf1, 0xd1, 0x51, 0x6a, 0x43, 0xbc, 0x8c, 0x46, 0xba, - 0x2a, 0xac, 0xa3, 0xa0, 0xd1, 0x0d, 0xd0, 0xcf, 0xf8, 0x3e, 0x46, 0x6b, 0x25, 0xdf, 0x16, 0xc8, - 0x78, 0x65, 0xd1, 0x60, 0x7b, 0x13, 0xe2, 0xe3, 0x7b, 0xc0, 0x8f, 0x8b, 0xa7, 0x64, 0x25, 0xe8, - 0xff, 0x9a, 0x4b, 0x1b, 0x3e, 0xe5, 0x7d, 0xd8, 0xcb, 0x8e, 0xa4, 0x2b, 0x9d, 0x56, 0x5a, 0xe6, - 0x2c, 0x36, 0x72, 0xff, 0xf6, 0xc8, 0x54, 0xe5, 0x5e, 0x64, 0x3e, 0xf0, 0x5f, 0xf2, 0x5e, 0xa1, - 0x16, 0xbb, 0x7b, 0xf0, 0xce, 0xc4, 0x5c, 0x6e, 0xaf, 0x41, 0x3b, 0x69, 0xa5, 0xf2, 0xeb, 0xac, - 0x2e, 0xe4, 0x0e, 0xba, 0x35, 0x9f, 0x0f, 0x80, 0x26, 0x30, 0x54, 0x61, 0xba, 0x6d, 0xd6, 0xc6, - 0xca, 0x0d, 0x1c, 0xd4, 0xee, 0x08, 0x4e, 0x4e, 0xdc, 0x5c, 0x4b, 0x83, 0x9e, 0xcc, 0x45, 0xda, - 0x91, 0x7b, 0x70, 0x6d, 0xc8, 0xb8, 0xfb, 0x3d, 0xb4, 0x79, 0x7e, 0x23, 0xf6, 0x7d, 0x7d, 0xc8, - 0x97, 0x90, 0xf7, 0x15, 0xf2, 0x9e, 0xe0, 0x57, 0xd5, 0x6c, 0x2e, 0x2e, 0xac, 0xc8, 0x8e, 0x7d, - 0x29, 0xc3, 0xe0, 0xbb, 0x0a, 0x35, 0x75, 0x48, 0x85, 0x7c, 0x2d, 0xd0, 0xdd, 0x80, 0x6a, 0x5a, - 0x5d, 0x61, 0xb6, 0xaf, 0xa3, 0x3c, 0x64, 0x43, 0x8e, 0x95, 0xbf, 0x03, 0x9a, 0xa6, 0x95, 0x0a, - 0xf3, 0xb8, 0x30, 0x43, 0x00, 0x46, 0xae, 0xe0, 0x28, 0x9a, 0xb5, 0x08, 0x7e, 0x24, 0x49, 0xc1, - 0x16, 0xca, 0xa9, 0x32, 0xcf, 0xac, 0xf1, 0x0b, 0x81, 0xde, 0xed, 0x78, 0x4a, 0xdf, 0x8c, 0xfd, - 0x27, 0xb3, 0x3a, 0x71, 0x1c, 0x48, 0x05, 0x0c, 0x32, 0xad, 0x50, 0xd8, 0x51, 0x8c, 0x95, 0xa6, - 0xf5, 0xa9, 0xb0, 0xc8, 0x2e, 0x96, 0xd8, 0x12, 0x32, 0x0e, 0xaa, 0x5f, 0xfe, 0xcd, 0x32, 0xa4, - 0xf3, 0xd9, 0x8f, 0x46, 0x6b, 0xdf, 0x6f, 0xa2, 0xc5, 0x79, 0x33, 0xf2, 0xfe, 0x02, 0xe7, 0x4f, - 0xb7, 0x9b, 0xab, 0x72, 0x3d, 0x70, 0x17, 0xce, 0x85, 0x31, 0x40, 0x37, 0xeb, 0x91, 0xf3, 0x37, - 0x97, 0x17, 0xeb, 0x2f, 0x3d, 0xf2, 0x97, 0xb0, 0x75, 0xc8, 0xd0, 0x54, 0xbe, 0x17, 0xe1, 0x3b, - 0x8b, 0xeb, 0x43, 0x77, 0x24, 0x4c, 0xd8, 0xb2, 0x76, 0x8f, 0xf1, 0x8b, 0x36, 0x65, 0x7b, 0xc7, - 0x22, 0xa5, 0xb0, 0x4e, 0x6b, 0xf2, 0x0f, 0xc8, 0x7c, 0x8e, 0x7d, 0xcc, 0x12, 0xe0, 0xe3, 0xce, - 0x44, 0x13, 0x72, 0x63, 0x7f, 0xf0, 0xdc, 0x88, 0x97, 0x52, 0xf9, 0x14, 0xce, 0x51, 0x34, 0x72, - 0x71, 0xdf, 0x1c, 0xea, 0x14, 0x3f, 0xce, 0x8a, 0xf0, 0x3f, 0x0e, 0xd1, 0xce, 0xb5, 0x8b, 0x83, - 0xa4, 0xf0, 0x59, 0x59, 0x8b, 0x33, 0x24, 0xb2, 0x69, 0x12, 0x85, 0x22, 0xd5, 0x7b, 0xe0, 0x57, - 0x90, 0xdd, 0xd3, 0xdc, 0xc3, 0x61, 0xa6, 0x1d, 0xa1, 0x64, 0x0b, 0xa9, 0xdb, 0xc0, 0x23, 0x95, - 0x27, 0x35, 0xd5, 0xfe, 0xfb, 0x12, 0xab, 0x8b, 0x39, 0x1f, 0x75, 0xf5, 0x14, 0xcd, 0xa8, 0xb1, - 0xc8, 0xf3, 0xe1, 0x8f, 0xa3, 0x36, 0xe7, 0x3a, 0x1b, 0xf5, 0xf2, 0x3e, 0xd4, 0xd0, 0xfb, 0x98, - 0x37, 0xd7, 0x0c, 0x34, 0xd7, 0x0f, 0xff, 0x16, 0x1c, 0xc7, 0xf8, 0xf8, 0x0f, 0x9d, 0x4e, 0x1f, - 0xa9, 0x07, 0xc2, 0x5e, 0xb2, 0xf6, 0x3d, 0x85, 0x9a, 0xb1, 0x89, 0xcc, 0x71, 0x2f, 0xc6, 0xb9, - 0xee, 0x38, 0xc5, 0xb4, 0xb2, 0x49, 0x02, 0x7d, 0x63, 0xce, 0x31, 0xc2, 0xee, 0xf9, 0x4b, 0x17, - 0xa2, 0x91, 0xb7, 0xf7, 0xf1, 0x5e, 0xfc, 0xa4, 0xa9, 0xbc, 0x1f, 0xde, 0x4b, 0x0b, 0xea, 0x83, - 0xff, 0x74, 0x92, 0x4b, 0x44, 0x76, 0x00, 0x38, 0xcc, 0xaa, 0xd0, 0xd1, 0x47, 0xb8, 0x73, 0x98, - 0x91, 0x77, 0x0e, 0x2c, 0xdb, 0x6f, 0xb3, 0xe6, 0x66, 0x99, 0x19, 0x2f, 0xdf, 0x87, 0x0f, 0x8b, - 0x45, 0x26, 0xa1, 0x97, 0xba, 0x7d, 0xc2, 0xcc, 0xa8, 0x7f, 0xae, 0xba, 0xe3, 0xc8, 0x2f, 0x20, - 0x3f, 0x8d, 0x33, 0x7d, 0x51, 0x1c, 0x54, 0x99, 0xd7, 0x47, 0xe5, 0xa3, 0x43, 0x77, 0xff, 0xe8, - 0x24, 0x7b, 0x75, 0xe8, 0x65, 0x19, 0xdb, 0x01, 0x6b, 0xcf, 0x03, 0x0b, 0xed, 0xb0, 0xbf, 0x7b, - 0xee, 0xef, 0x4c, 0xb4, 0xf1, 0x1d, 0x49, 0xf0, 0x62, 0xd8, 0x0c, 0x3f, 0x22, 0x7d, 0x81, 0x4d, - 0x67, 0x26, 0xa2, 0xc0, 0x86, 0x1f, 0x98, 0xf0, 0x01, 0x13, 0x31, 0xe0, 0xc5, 0x02, 0x76, 0x4c, - 0x60, 0xc5, 0x90, 0xf7, 0x62, 0xa3, 0x13, 0xe2, 0xdd, 0x22, 0xf2, 0x9e, 0x23, 0xc0, 0xcd, 0xd8, - 0x84, 0x98, 0xcc, 0x10, 0xd7, 0x55, 0x4b, 0xad, 0x87, 0x90, 0x5b, 0x67, 0x8a, 0xa7, 0x64, 0x9c, - 0x1c, 0x1d, 0x1e, 0x82, 0xde, 0x75, 0x2a, 0x0d, 0x7f, 0x09, 0x4f, 0x97, 0x97, 0xeb, 0x67, 0xec, - 0xc8, 0xa3, 0xf9, 0xf6, 0xc8, 0xf6, 0xfc, 0x21, 0xca, 0xd6, 0xf1, 0x7b, 0xd7, 0x57, 0x16, 0xab, - 0x7a, 0xe8, 0xb2, 0x9e, 0x23, 0xf6, 0xe5, 0x07, 0xc2, 0x1c, 0xdf, 0x0b, 0x94, 0x6b, 0x71, 0xfd, - 0xd8, 0x8b, 0xe1, 0x09, 0xec, 0xdf, 0xb4, 0x7a, 0x10, 0x47, 0x5b, 0x90, 0x1b, 0xf0, 0xdd, 0x89, - 0x3a, 0xe2, 0x38, 0x81, 0x12, 0xec, 0x38, 0x32, 0xe7, 0x04, 0x4b, 0x4b, 0xd0, 0xff, 0x10, 0x7d, - 0x1f, 0xfa, 0xd7, 0xd1, 0x07, 0xc8, 0x46, 0xae, 0xa1, 0x8f, 0x84, 0x72, 0xe4, 0x03, 0xf4, 0x9b, - 0xd1, 0xff, 0x39, 0xfa, 0x0d, 0xe8, 0x5f, 0x45, 0xbf, 0x1e, 0xfd, 0xf7, 0xd1, 0xf7, 0xa0, 0xff, - 0x33, 0xf4, 0x35, 0xf4, 0xaf, 0xa0, 0x0f, 0x5f, 0x33, 0xf2, 0x1e, 0xfa, 0x3f, 0x75, 0x3e, 0x15, - 0xe6, 0x9a, 0xfe, 0x2d, 0xa7, 0x55, 0xee, 0x61, 0x01, 0xc6, 0x17, 0xc1, 0xc7, 0xfd, 0x97, 0xd3, - 0xd7, 0x73, 0x37, 0xda, 0x84, 0xdf, 0x43, 0xf0, 0x49, 0x97, 0x30, 0x66, 0xc3, 0xef, 0x79, 0xf0, - 0x5c, 0x89, 0xe7, 0x25, 0xec, 0xfb, 0x3e, 0x4a, 0x2e, 0x51, 0x28, 0x14, 0xe6, 0x39, 0x30, 0xb1, - 0x15, 0xc5, 0x38, 0x74, 0x5c, 0x62, 0x3a, 0x1f, 0x0f, 0xa6, 0x20, 0x83, 0x8e, 0xba, 0x1e, 0x39, - 0x20, 0xea, 0x44, 0xce, 0x33, 0xb9, 0x36, 0xf6, 0xd0, 0xe3, 0x06, 0x9f, 0x5f, 0xae, 0x7b, 0xdc, - 0x7a, 0xe9, 0xeb, 0x3e, 0xc6, 0xbb, 0x17, 0xfb, 0xba, 0x8f, 0xd6, 0x22, 0x9f, 0x79, 0x13, 0xfe, - 0xed, 0x9c, 0xb5, 0x1c, 0x3e, 0x9d, 0xdf, 0x0b, 0xf3, 0xcb, 0x38, 0xfb, 0x1e, 0x60, 0x1f, 0xf9, - 0x13, 0x79, 0x91, 0x5b, 0xd4, 0x73, 0xed, 0x04, 0x3a, 0x4f, 0x18, 0x5c, 0x7f, 0xc8, 0xb3, 0x82, - 0xba, 0xfa, 0x03, 0x67, 0xad, 0xbc, 0xeb, 0x10, 0xc6, 0x9f, 0x00, 0xa7, 0x6b, 0xf8, 0xfe, 0x1c, - 0x6b, 0xa7, 0x34, 0xbe, 0xab, 0x68, 0x0b, 0x5e, 0x0a, 0x2f, 0xa4, 0x64, 0x8f, 0x97, 0x0e, 0xbb, - 0x76, 0x80, 0x1d, 0x2b, 0xd0, 0x33, 0xdb, 0xf2, 0x82, 0x83, 0x73, 0x4a, 0x6a, 0x89, 0xe5, 0x70, - 0xef, 0x35, 0xa6, 0xb4, 0x37, 0x80, 0x25, 0x96, 0x89, 0xe7, 0x7f, 0x5b, 0xfa, 0x19, 0x42, 0xf2, - 0xf4, 0x1a, 0x6a, 0xf1, 0x33, 0xa8, 0xc5, 0x5f, 0x46, 0x2d, 0xfe, 0x12, 0x6a, 0xf1, 0x17, 0x51, - 0x8b, 0x9f, 0xc4, 0x59, 0x38, 0x01, 0x8c, 0xbe, 0x00, 0x8c, 0x3e, 0x0f, 0x8c, 0x4e, 0xce, 0xe7, - 0x49, 0x1d, 0xc0, 0xe5, 0xac, 0x87, 0xf3, 0xa4, 0x64, 0xf1, 0x2f, 0x1c, 0x37, 0x4e, 0x7d, 0x54, - 0x1a, 0xb5, 0xba, 0x80, 0x69, 0xf8, 0x83, 0x5d, 0xd8, 0x6d, 0x09, 0x67, 0xa2, 0x88, 0x1c, 0x2a, - 0x6d, 0x71, 0x2c, 0x66, 0x5a, 0x51, 0xe4, 0x41, 0x7c, 0x9e, 0x07, 0x19, 0xef, 0x47, 0x07, 0x88, - 0x31, 0x76, 0x19, 0x7c, 0x98, 0xc7, 0x53, 0xba, 0x8b, 0xcd, 0x67, 0x25, 0xff, 0xd2, 0xc4, 0x8c, - 0xe3, 0xc6, 0x02, 0xbf, 0xbc, 0x23, 0x7c, 0xf1, 0x57, 0xfa, 0x43, 0x8e, 0x73, 0x1c, 0xdb, 0x1e, - 0xe3, 0x38, 0x17, 0x75, 0x73, 0x2e, 0x1b, 0x3c, 0xd8, 0x7e, 0xb2, 0x56, 0x45, 0x7f, 0x05, 0x30, - 0x19, 0x8b, 0x3c, 0x6a, 0x71, 0x8e, 0xcc, 0x71, 0x6f, 0x03, 0xb5, 0xc2, 0xe6, 0x5b, 0x61, 0xb3, - 0x0c, 0x45, 0x68, 0x5b, 0x0f, 0xfb, 0xb1, 0x65, 0x38, 0x07, 0x66, 0x78, 0x77, 0x78, 0x05, 0xec, - 0xdd, 0x5d, 0xb7, 0xba, 0x71, 0x03, 0xec, 0xd8, 0x40, 0xe9, 0x1e, 0xa2, 0x99, 0x62, 0x3d, 0x6c, - 0xc0, 0x4f, 0xa2, 0xd9, 0x22, 0xcf, 0x85, 0xde, 0x73, 0x57, 0x9d, 0x2e, 0x1f, 0xd7, 0xb0, 0xee, - 0xb8, 0x9a, 0x33, 0xe9, 0x61, 0xd0, 0x51, 0x73, 0x77, 0xd3, 0x23, 0xf2, 0xc9, 0xfe, 0xc3, 0x0c, - 0xef, 0x0c, 0x7f, 0xce, 0xb3, 0xba, 0x39, 0x16, 0x89, 0x84, 0x3f, 0x86, 0x73, 0xe3, 0x97, 0xf9, - 0xb7, 0x96, 0x13, 0xe0, 0x1d, 0x8b, 0x04, 0x46, 0xee, 0xa1, 0x6d, 0xb2, 0x1e, 0xb3, 0x80, 0x53, - 0x03, 0x71, 0xd2, 0x4b, 0xa3, 0xfb, 0x38, 0xce, 0xff, 0x87, 0xb3, 0xd5, 0xc7, 0x7b, 0xab, 0xf1, - 0xd2, 0x41, 0x9b, 0xf7, 0xf6, 0xa6, 0xf3, 0x88, 0xcc, 0x7d, 0xb9, 0x5d, 0xe3, 0x7b, 0x11, 0xf9, - 0x94, 0x7b, 0x67, 0xcb, 0x6d, 0xd7, 0x57, 0x33, 0x9f, 0xdb, 0xf9, 0x9e, 0x9a, 0x8d, 0xf8, 0xde, - 0xd2, 0x04, 0xcf, 0x2b, 0x58, 0xc3, 0xf3, 0xbf, 0xef, 0x64, 0x7a, 0x99, 0x3f, 0xef, 0x8b, 0xf7, - 0xf2, 0x4e, 0x75, 0xfc, 0xd7, 0xf9, 0x30, 0xb3, 0x1a, 0xab, 0xdb, 0xac, 0xce, 0x7c, 0x0c, 0x3a, - 0xe3, 0xbd, 0x5f, 0x80, 0xcd, 0xd6, 0x9f, 0x69, 0x4e, 0x58, 0x67, 0x9a, 0x10, 0x93, 0xbe, 0x15, - 0x37, 0xe1, 0xab, 0xbc, 0xf4, 0x66, 0x3c, 0x0a, 0xbf, 0x65, 0xc1, 0xaf, 0xb5, 0xc1, 0x8e, 0x7e, - 0xd8, 0xd1, 0x07, 0x3b, 0xde, 0xf2, 0x5d, 0xe3, 0x95, 0x19, 0x45, 0xac, 0xe7, 0x3b, 0x6c, 0x3c, - 0x0b, 0x53, 0x88, 0xb1, 0x07, 0xad, 0x26, 0xfa, 0x4a, 0xdc, 0x4b, 0x0b, 0x71, 0x7e, 0xfe, 0x35, - 0xae, 0xd3, 0x05, 0xb4, 0x0f, 0x80, 0xde, 0x57, 0xe3, 0x16, 0x7d, 0x29, 0x4e, 0x54, 0xbf, 0xff, - 0x6f, 0x68, 0xc6, 0xcf, 0x3c, 0x39, 0xe7, 0x14, 0xfe, 0x01, 0xc5, 0xbd, 0x43, 0xe4, 0xb3, 0x34, - 0x4d, 0xd7, 0x9c, 0xb7, 0x7d, 0x0e, 0xad, 0xb1, 0x23, 0x46, 0x1d, 0x6a, 0xa8, 0x4e, 0x1b, 0x31, - 0x50, 0x91, 0x75, 0x16, 0xea, 0x7e, 0x85, 0xfa, 0x8a, 0x9c, 0x8f, 0x2e, 0x82, 0x8d, 0x1d, 0x47, - 0xc7, 0xfc, 0x32, 0xf1, 0x3d, 0xdc, 0x87, 0xce, 0x00, 0x74, 0xb9, 0xa6, 0xa8, 0x53, 0x0e, 0xf4, - 0xd3, 0x79, 0x8c, 0x81, 0x7a, 0x79, 0x8c, 0xe8, 0x93, 0xc0, 0xda, 0x2c, 0x6a, 0xe6, 0x94, 0xdd, - 0x0c, 0x9c, 0x34, 0xd1, 0x74, 0xbc, 0xd6, 0x6f, 0xac, 0xf6, 0x85, 0x3d, 0xa5, 0x0a, 0x73, 0x46, - 0xe5, 0x1a, 0x9e, 0xef, 0xcd, 0x80, 0xdf, 0x31, 0xae, 0x9b, 0x75, 0xea, 0xb7, 0x51, 0x1f, 0xfa, - 0xdc, 0x35, 0x9c, 0x93, 0x5d, 0x46, 0xfd, 0xa0, 0x5a, 0x37, 0x68, 0xf7, 0x8d, 0xb7, 0x22, 0x5b, - 0xa8, 0xc3, 0x98, 0xb0, 0x33, 0x8a, 0xbc, 0x3b, 0xe9, 0x31, 0x55, 0xd1, 0x9d, 0x64, 0x5a, 0x90, - 0xe7, 0x1c, 0xe7, 0x1a, 0x7b, 0x39, 0x0f, 0x56, 0x81, 0xb7, 0x10, 0xf2, 0x47, 0x5e, 0xbb, 0xcc, - 0xe4, 0x3a, 0xaf, 0x3c, 0xa6, 0x4a, 0x7f, 0x14, 0x38, 0x7e, 0xc5, 0xc9, 0xf6, 0xf2, 0xfc, 0x3a, - 0x79, 0xef, 0xa4, 0x8e, 0x0b, 0xff, 0x14, 0x6a, 0x93, 0xbd, 0xfc, 0x6d, 0x24, 0xcf, 0xf6, 0xe4, - 0xda, 0xdd, 0x90, 0xef, 0x4a, 0xe3, 0x6c, 0xb3, 0x75, 0x82, 0xfd, 0x4f, 0x77, 0x5e, 0xe6, 0x9f, - 0xb2, 0xfd, 0x40, 0x9e, 0x73, 0x69, 0xc9, 0xdf, 0x66, 0x44, 0xa9, 0xf3, 0xf2, 0xea, 0x72, 0x5d, - 0x60, 0x2f, 0xcb, 0x65, 0xa2, 0xf6, 0x51, 0x03, 0x9c, 0xcb, 0xf5, 0x15, 0x59, 0x97, 0x3c, 0x4f, - 0x74, 0x70, 0x7e, 0xc9, 0x71, 0xdf, 0xc5, 0x93, 0x8a, 0xb3, 0xa7, 0x57, 0xf7, 0xc1, 0xba, 0xbb, - 0x87, 0x66, 0x36, 0x28, 0x74, 0xb4, 0xa0, 0x52, 0xa9, 0xc0, 0x39, 0x6f, 0x16, 0x79, 0xc9, 0xbd, - 0x46, 0x1f, 0x0d, 0x3b, 0x7c, 0xae, 0xea, 0xf7, 0x03, 0x1b, 0xf0, 0x29, 0x2f, 0xc3, 0xa7, 0xbc, - 0x04, 0x9f, 0xf2, 0x22, 0x7c, 0xca, 0x49, 0xe0, 0xee, 0xc4, 0x2d, 0xdf, 0xaf, 0x84, 0x31, 0x23, - 0xfd, 0x93, 0x0d, 0xcc, 0xb1, 0xcc, 0xcc, 0xdf, 0xa0, 0xe9, 0x28, 0xef, 0xe1, 0x3b, 0x92, 0x67, - 0xff, 0x2d, 0x3c, 0x2f, 0x39, 0x33, 0xeb, 0x5d, 0x7e, 0x47, 0x0b, 0xd0, 0xf7, 0x27, 0x50, 0x83, - 0xf4, 0xce, 0x39, 0xf5, 0x16, 0x62, 0x19, 0xf1, 0x7d, 0xa3, 0x2b, 0x63, 0xae, 0xa0, 0x48, 0x5a, - 0x8c, 0x99, 0x3e, 0x60, 0xa6, 0xee, 0x0e, 0x07, 0xb5, 0xa3, 0x30, 0x8e, 0xca, 0xbb, 0xc1, 0x88, - 0x5f, 0x03, 0x76, 0xfa, 0xed, 0x6f, 0x3b, 0x83, 0x3d, 0x4c, 0xcb, 0x5f, 0xbf, 0xba, 0x91, 0x69, - 0xbc, 0x0c, 0xac, 0x3b, 0xc8, 0xcd, 0x39, 0x6f, 0x73, 0xef, 0xca, 0x0e, 0x97, 0xd5, 0x35, 0xe0, - 0xbe, 0x14, 0xbf, 0x84, 0x4e, 0x06, 0x1d, 0x8e, 0x80, 0x8f, 0xc6, 0xb9, 0x9c, 0x42, 0x47, 0xca, - 0x1a, 0x95, 0xcb, 0x3a, 0x8d, 0x95, 0x3d, 0x74, 0xb4, 0xfc, 0xc5, 0xba, 0xd5, 0xcd, 0xa0, 0x55, - 0x36, 0xe5, 0x37, 0x47, 0x37, 0x0f, 0x60, 0x3a, 0xa6, 0x8c, 0xdd, 0xa0, 0xc3, 0x38, 0x40, 0xbe, - 0x5e, 0xa3, 0xc1, 0xdf, 0xa2, 0x78, 0x8d, 0x82, 0x35, 0xad, 0xfc, 0x3d, 0x04, 0xd9, 0xf4, 0x62, - 0x2a, 0xef, 0xe7, 0x78, 0xe6, 0x83, 0xcf, 0x63, 0x7b, 0xb7, 0xe1, 0xc9, 0xb2, 0x47, 0xf0, 0xf4, - 0xd1, 0xe1, 0xfd, 0x77, 0xe0, 0xfd, 0x12, 0x1a, 0xdd, 0xdf, 0x4a, 0xa5, 0xfd, 0xb4, 0xcc, 0x43, - 0xd4, 0x06, 0x28, 0x20, 0x53, 0x09, 0x19, 0x5d, 0x14, 0xf2, 0x0f, 0xc8, 0x7a, 0x8a, 0xf5, 0xe4, - 0x7e, 0xbf, 0xb9, 0x51, 0x07, 0xf2, 0x5e, 0x7c, 0x58, 0xd3, 0x8a, 0xf5, 0xb2, 0xee, 0xe2, 0x6f, - 0x95, 0xa4, 0xfd, 0xda, 0x79, 0x77, 0x80, 0xcf, 0xfc, 0x5c, 0x58, 0x80, 0xe9, 0xdf, 0x6e, 0x8d, - 0xdc, 0xcf, 0x6d, 0xf8, 0x3a, 0xb4, 0xc3, 0x66, 0xff, 0xcd, 0xd8, 0x59, 0x57, 0xcf, 0xb5, 0x2e, - 0x11, 0xdf, 0x0b, 0x38, 0x8e, 0xd7, 0xe2, 0x6f, 0xb9, 0x44, 0xc5, 0x89, 0x66, 0x1a, 0x92, 0xfe, - 0x92, 0xef, 0xe1, 0xac, 0x33, 0xf5, 0xa8, 0x63, 0xd8, 0xc7, 0xcf, 0xe6, 0x71, 0x0e, 0x86, 0x39, - 0xa6, 0x86, 0xa5, 0x5c, 0xa5, 0x89, 0x0f, 0xe4, 0xbd, 0x39, 0xdf, 0x79, 0xf0, 0x7d, 0xe9, 0x50, - 0x2f, 0xcf, 0xe7, 0x58, 0x54, 0xbb, 0x07, 0x78, 0x97, 0x75, 0x0c, 0x0c, 0x34, 0xfa, 0xbb, 0xe4, - 0xdd, 0x26, 0xd7, 0x49, 0x1e, 0x9a, 0x36, 0x0a, 0x34, 0x60, 0xf5, 0x10, 0xd7, 0xfb, 0x53, 0x46, - 0x30, 0xea, 0x21, 0x9b, 0x46, 0xad, 0xb5, 0xee, 0x77, 0xb0, 0x46, 0xfe, 0x0e, 0xc6, 0xbe, 0x8d, - 0xbf, 0xc7, 0xf0, 0x37, 0x1b, 0xce, 0x9d, 0xf9, 0x7e, 0xb1, 0x66, 0x27, 0xf7, 0x8e, 0x80, 0xeb, - 0xad, 0xd7, 0xe4, 0xf7, 0x1a, 0x05, 0x36, 0xe7, 0x6f, 0xb4, 0x6c, 0x3b, 0xf0, 0x2e, 0xfb, 0xe8, - 0x88, 0xd4, 0xd5, 0x12, 0xd8, 0x87, 0xf5, 0x76, 0x27, 0x8d, 0xed, 0xf7, 0xd3, 0xd1, 0xfd, 0xb4, - 0xb2, 0x4e, 0xea, 0x8d, 0x96, 0x7b, 0xa0, 0xbb, 0x4d, 0x14, 0x32, 0x77, 0x56, 0x75, 0x18, 0x04, - 0x8e, 0xd7, 0x96, 0x10, 0x95, 0x4b, 0xa0, 0xf9, 0x4b, 0xf7, 0xe8, 0x7c, 0x0e, 0x58, 0x3f, 0x8a, - 0xcc, 0x4f, 0x5e, 0x9b, 0x10, 0x5e, 0x19, 0xef, 0x69, 0x45, 0xf5, 0x69, 0x9c, 0xd6, 0x12, 0xcf, - 0xc8, 0x3b, 0xa8, 0x4d, 0x79, 0x52, 0x50, 0x4f, 0x9d, 0xf1, 0x24, 0xd6, 0x9f, 0xd1, 0x13, 0x5c, - 0xa3, 0x7f, 0x4b, 0x9e, 0x93, 0x4d, 0x15, 0x9d, 0x76, 0xcb, 0x6f, 0x7f, 0x3e, 0x1a, 0x8a, 0x35, - 0xd1, 0xd7, 0x62, 0x16, 0xed, 0x89, 0xe9, 0x55, 0x39, 0xdc, 0xfb, 0x46, 0x3a, 0x8e, 0x3c, 0xe0, - 0x38, 0xfb, 0x17, 0xfe, 0x76, 0xf8, 0x63, 0x79, 0x8f, 0x30, 0x16, 0xf3, 0xce, 0x7f, 0x3f, 0x1c, - 0x45, 0x6d, 0x7d, 0x34, 0xe6, 0xe7, 0xb5, 0xe6, 0x2e, 0x79, 0x27, 0xc9, 0xf6, 0xb0, 0xe8, 0x70, - 0xcc, 0x42, 0x2e, 0x83, 0x36, 0xfa, 0xfa, 0x5e, 0xce, 0x2d, 0xdc, 0xf7, 0xfa, 0x71, 0xbe, 0x7b, - 0x34, 0x70, 0x76, 0xdc, 0x3b, 0xcd, 0xe0, 0x71, 0x77, 0xcd, 0x6b, 0xf3, 0xb6, 0x31, 0x4e, 0xd7, - 0x25, 0x06, 0xe8, 0xf5, 0x58, 0xd6, 0xe4, 0x6b, 0xab, 0xe9, 0x7c, 0x3d, 0xf6, 0xa3, 0xfb, 0x07, - 0x29, 0x22, 0xbf, 0x9d, 0xa7, 0x49, 0x8f, 0xb2, 0x7e, 0x36, 0x12, 0xdf, 0xb3, 0xf0, 0xdd, 0xe5, - 0xcd, 0xf7, 0xaa, 0xeb, 0xf9, 0xee, 0x94, 0x8e, 0xc8, 0xba, 0x57, 0xc7, 0xfb, 0x88, 0x5f, 0xc5, - 0x9a, 0xb3, 0x98, 0x9f, 0x26, 0x77, 0x3f, 0xe5, 0xf9, 0xf9, 0xa8, 0x45, 0x65, 0x5e, 0x37, 0x27, - 0xef, 0xb2, 0xdd, 0xff, 0x15, 0x08, 0x62, 0xcd, 0x8a, 0xa7, 0x06, 0x56, 0x6c, 0xde, 0xf4, 0xb9, - 0xed, 0x9b, 0xb6, 0x2d, 0xdf, 0xb2, 0xf5, 0x19, 0xe8, 0x73, 0xfb, 0xd3, 0xfd, 0xdb, 0xb7, 0x6e, - 0x8e, 0xdb, 0x76, 0xb5, 0xdf, 0xfb, 0xe9, 0x15, 0x9d, 0xe9, 0x0e, 0xda, 0xb2, 0x6d, 0x4b, 0xdf, - 0xf6, 0xfe, 0x2f, 0x6c, 0xfa, 0xac, 0xbd, 0xf2, 0xf1, 0xe5, 0x7d, 0x4f, 0x7e, 0x81, 0x69, 0xae, - 0xd8, 0xba, 0xfd, 0x69, 0x77, 0x16, 0x51, 0x13, 0xad, 0x3f, 0xe3, 0xc5, 0x8f, 0xfe, 0xdf, 0x7f, - 0x99, 0xa1, 0xeb, 0x7f, 0x9c, 0x19, 0x9a, 0xaa, 0xcf, 0x0c, 0xb5, 0xab, 0x99, 0xa1, 0xff, 0x03, - 0x97, 0xbc, 0x2d, 0xf8, 0xa4, 0x21, 0x00, 0x00, -}; - -#endif diff --git a/tm_firmware/500/tmctrl/rebootex/main.cpp b/tm_firmware/500/tmctrl/rebootex/main.cpp index 5a90d9c..6a50ecd 100644 --- a/tm_firmware/500/tmctrl/rebootex/main.cpp +++ b/tm_firmware/500/tmctrl/rebootex/main.cpp @@ -1,3 +1,10 @@ +/* + * Based on rebootex/main.c from minimum edition - https://github.com/PSP-Archive/minimum_edition +*/ + +#include +#include + #include #include #include @@ -5,28 +12,42 @@ #include #include -#include - #include +#include "rebootPatches.h" +#include "rebootex_config.h" +#include "btcnf.h" + +#if PSP_MODEL == 0 +#define BTCNF_PATH "/kd/pspbtcnf.bin" +#elif PSP_MODEL == 1 +#define BTCNF_PATH "/kd/pspbtcnf_02g.bin" +#endif + namespace { - using v_v_function_t = std::add_pointer_t; - using v_iiii_function_t = std::add_pointer_t; - using module_start_function_t = std::add_pointer_t; - inline auto const cache1Ptr = reinterpret_cast(0x886007C0); - inline auto const cache2Ptr = reinterpret_cast(0x8860022C); - inline auto const rebootEntryPtr = reinterpret_cast(0x88600000); + using v_iiiiiii_function_t = std::add_pointer_t; + inline auto const rebootEntryPtr = reinterpret_cast(0x88600000); - [[noreturn]] inline void rebootEntry(s32 const a0, s32 const a1, s32 const a2, s32 const a3) { - rebootEntryPtr(a0, a1, a2, a3); + int btcnf_load_flag; + int rtm_flag; - __builtin_unreachable(); - } + char *systemctrl = (char *)0x88FB0100; + u32 sizeSystemctrl = 0; + + char *onRebootAfter = NULL; + void *onRebootBuf = NULL; + u32 onRebootSize = 0; + u32 onRebootFlag = 0; + + int bootIndex = 0; - void clearCaches() { - cache1Ptr(); - cache2Ptr(); + char path[260]; + + [[noreturn]] inline void rebootEntry(s32 const a0, s32 const a1, s32 const a2, s32 const a3, s32 const t0, s32 const t1, s32 const t2) { + rebootEntryPtr(a0, a1, a2, a3, t0, t1, t2); + + __builtin_unreachable(); } FATFS fs; @@ -41,88 +62,106 @@ namespace { } int sceBootLfatOpenPatched(char *filename) { - //if (f_open(&fp, filename, FA_OPEN_EXISTING | FA_READ) == FR_OK) - return 0; - } - int sceBootLfatReadPatched(void *buffer, int buffer_size) { - // u32 bytes_read; - // if (f_read(&fp, buffer, buffer_size, &bytes_read) == FR_OK) - return 0; - } + if (strcmp(filename, BTCNF_PATH) == 0) + { + if (bootIndex == 0) + filename[9] = 'j'; + else if (bootIndex == 1) + filename[9] = 'k'; + else if (bootIndex == 2) + filename[9] = 'l'; + + if (onRebootAfter) + btcnf_load_flag = 1; + } + else if (strcmp(filename, "/rtm.prx") == 0) + { + rtm_flag = 1; + return 0; + } + else if (strcmp(filename, "/kd/lfatfs.prx") == 0) { + strcpy(filename, "/tmctrl500.prx"); + } - int sceBootLfatClosePatched() { - // f_close(&fp); - return 0; - } + strcpy(path, TM_PATH); + strcat(path, filename); - int checkPSPHeaderPatched() { - return 0; + if (f_open(&fp, path, FA_OPEN_EXISTING | FA_READ) == FR_OK) { + return 0; + } + + return -1; } - v_v_function_t memlmdOriginal; + int sceBootLfatReadPatched(void *buffer, int buffer_size) { - int memlmdDecrypt() { - return 0; - } + if (rtm_flag) + { + int load_size = onRebootSize; - int loadCoreModuleStartPatched(SceSize args, void *argp, void *unk, module_start_function_t module_start) { - u32 const text_addr = reinterpret_cast(module_start) - 0xC74; + if( load_size > buffer_size) + load_size = buffer_size; - MAKE_CALL(text_addr + 0x41D0, memlmdDecrypt); - MAKE_CALL(text_addr + 0x68F8, memlmdDecrypt); + memcpy(buffer, onRebootBuf, load_size); + + onRebootSize -= load_size; + onRebootBuf += load_size; + return load_size; + } - memlmdOriginal = reinterpret_cast(text_addr + 0x81D4); + u32 ret; + f_read(&fp, buffer, buffer_size, &ret); - // disable unsign check - _sw(0x1021, text_addr + 0x691C); // move $v0, $zero - _sw(0x1021, text_addr + 0x694C); // move $v0, $zero - _sw(0x1021, text_addr + 0x69E4); // move $v0, $zero + if (btcnf_load_flag) + { + btcnf_load_flag = 0; - clearCaches(); + module_rtm[0].before_path = onRebootAfter; + module_rtm[0].flag = onRebootFlag; - return module_start(args, argp, unk); + ret = btcnf_patch(buffer, ret, module_rtm, 0, 0); + } + + return ret; } - u32 config1, config2, config3, config4, config5, config6; -} + int sceBootLfatClosePatched() { -int main(s32 const a0, s32 const a1, s32 const a2, s32 const a3) { - MAKE_CALL(0x8860200C, sceBootLfatMountPatched); - MAKE_CALL(0x88602020, sceBootLfatOpenPatched); - MAKE_CALL(0x88602090, sceBootLfatReadPatched); - MAKE_CALL(0x886020BC, sceBootLfatClosePatched); + if(rtm_flag) + { + rtm_flag = 0; + return 0; + } - // patch ~PSP header check - _sw(0xAFA50000, 0x88605030); // sw $a1, ($sp) - _sw(0x20A30000, 0x88605034); // addi $v1, $a1, 0 + f_close(&fp); + + return 0; + } +} - MAKE_CALL(0x88606A90, checkPSPHeaderPatched); +int main(s32 const a0, s32 const a1, s32 const a2, s32 const a3, s32 const t0, s32 const t1, s32 const t2) { - MAKE_FUNCTION_RETURN(0x886030E0, 1); + struct RebootexParam *rebootex_param = reinterpret_cast(REBOOTEX_PARAM_OFFSET); - _sw(0, 0x88602018); - _sw(0, 0x8860206C); - _sw(0, 0x88602084); + bootIndex = rebootex_param->reboot_index; - // Patch the call to LoadCore module_start - _sw(0x113821, 0x88604EF0); // jr $t7 -> move $a3, $t7 // a3 = LoadCore module_start - MAKE_JUMP(0x88604EF4, loadCoreModuleStartPatched); // move $sp, $s4 -> j PatchLoadCore - _sw(0x2A0E821, 0x88604EF8); //nop -> move $sp, $s4 + onRebootAfter = reinterpret_cast(rebootex_param->on_reboot_after); + onRebootBuf = rebootex_param->on_reboot_buf; + onRebootSize = rebootex_param->on_reboot_size; + onRebootFlag = rebootex_param->on_reboot_flag; - _sw(0, 0x88606D38); + btcnf_load_flag = 0; + rtm_flag = 0; - MAKE_FUNCTION_RETURN0(0x886013CC); - - //Read systemctrl config ? - config1 = _lw(0x88FB00D0); - config2 = _lw(0x88FB00D4); - config3 = _lw(0x88FB00D8); - config4 = _lw(0x88FB00DC); - config5 = 0; - config6 = 0; + MsLfatFuncs funcs = { + .msMount = reinterpret_cast(sceBootLfatMountPatched), + .msOpen = reinterpret_cast(sceBootLfatOpenPatched), + .msRead = reinterpret_cast(sceBootLfatReadPatched), + .msClose = reinterpret_cast(sceBootLfatClosePatched), + }; - clearCaches(); + patchRebootBin(&funcs); // Hmm? iplSysregSpiClkEnable(ClkSpi::SPI1); @@ -135,5 +174,5 @@ int main(s32 const a0, s32 const a1, s32 const a2, s32 const a3) { iplSysconInit(); iplSysconCtrlMsPower(true); - rebootEntry(a0, a1, a2, a3); + rebootEntry(a0, a1, a2, a3, t0, t1, t2); } \ No newline at end of file diff --git a/tm_firmware/661/tmctrl/main.c b/tm_firmware/661/tmctrl/main.c index 22ec617..d1b2352 100644 --- a/tm_firmware/661/tmctrl/main.c +++ b/tm_firmware/661/tmctrl/main.c @@ -19,20 +19,6 @@ PSP_MODULE_INFO("TimeMachine_Control", PSP_MODULE_KERNEL | PSP_MODULE_SINGLE_START | PSP_MODULE_SINGLE_LOAD | PSP_MODULE_NO_STOP, 1, 0); -int SysEventHandler(int eventId, char *eventName, void *param, int *result); - -PspSysEventHandler sysEventHandler = - { - .size = sizeof(PspSysEventHandler), - .name = "", - .type_mask = 0x00FFFF00, - .handler = SysEventHandler}; - -extern SceUID flashemu_sema; -extern int msNotReady; -extern FileHandler file_handler[MAX_FILES]; - -extern int CloseOpenFile(int *argv); STMOD_HANDLER previous; @@ -68,69 +54,6 @@ int codePagesceIoOpenPatched(const char *file, int flags, SceMode mode) return sceIoOpen(file, flags, mode); } -int df_dopenPatched(int type, void * cb, void *arg) -{ - int res; - - while(1) { - res = sceKernelExtendKernelStack(type, cb, arg); - if (res != 0x80010018) - return res; - - if (*(int *)(arg + 4) == 0) - continue; - - if (memcmp((void *)(*(int *)(arg + 4) + 4), TM_PATH_W, sizeof(TM_PATH_W)) == 0) - continue; - - res = sceKernelExtendKernelStack(0x4000, (void *)CloseOpenFile, 0); - if (res < 0) - break; - } - return res; -} - -int df_openPatched(int type, void * cb, void *arg) -{ - int res; - - while(1) { - res = sceKernelExtendKernelStack(type, cb, arg); - if (res != 0x80010018) - return res; - - if (*(int *)(arg + 4) == 0) - continue; - - if (memcmp((void *)(*(int *)(arg + 4) + 4), TM_PATH_W, sizeof(TM_PATH_W)) == 0) - continue; - - res = sceKernelExtendKernelStack(0x4000, (void *)CloseOpenFile, 0); - if (res < 0) - break; - } - return res; -} - -int df_devctlPatched(int type, void *cb, void *arg) -{ - int res; - - while(1) - { - res = sceKernelExtendKernelStack(type, cb, arg); - if (res != 0x80010018) - break; - - res = sceKernelExtendKernelStack(0x4000, (void *)CloseOpenFile, 0); - - if (res < 0) - break; - } - - return res; -} - int OnModuleStart(SceModule2 *mod) { char *moduleName = mod->modname; @@ -197,34 +120,7 @@ int module_start(SceSize args, void *argp) int module_reboot_before(SceSize args, void *argp) { - SceUInt timeout = 500000; - sceKernelWaitSema(flashemu_sema, 1, &timeout); - sceKernelDeleteSema(flashemu_sema); - sceIoUnassign("flash0:"); - sceIoUnassign("flash1:"); - sceIoUnassign("flash2:"); - sceIoUnassign("flash3:"); - sceKernelUnregisterSysEventHandler(&sysEventHandler); + UninstallFlashEmu(); return 0; } - -int SysEventHandler(int eventId, char *eventName, void *param, int *result) -{ - if (eventId == 0x4000) //suspend - { - int i; - for(i = 0; i < MAX_FILES; i++) - { - if(file_handler[i].opened && file_handler[i].unk_8 == 0 && file_handler[i].flags != DIR_FLAG) - { - file_handler[i].offset = sceIoLseek(file_handler[i].fd, 0, PSP_SEEK_CUR); - file_handler[i].unk_8 = 1; - sceIoClose(file_handler[i].fd); - } - } - } - else if (eventId == 0x10009) // resume - msNotReady = 1; - return 0; -} From 4bfcf9b925594f2edd6169cc70e63330b9ecab89 Mon Sep 17 00:00:00 2001 From: meetpatty Date: Fri, 10 Jan 2025 07:44:17 +1300 Subject: [PATCH 2/2] Add support for 5.00 on 03g. --- .../500/common/include/rebootPatches.h | 33 +++++++++++++++++++ tm_firmware/500/ipl_payload/CMakeLists.txt | 2 +- tm_firmware/500/ipl_payload/main.cpp | 32 +++++++++++------- .../500/ipl_payload/payloadex/CMakeLists.txt | 2 +- .../500/ipl_payload/payloadex/main.cpp | 3 ++ .../payloadex_loader/CMakeLists.txt | 2 +- .../500/ipl_payload/payloadex_loader/main.cpp | 5 +++ tm_firmware/500/tmctrl/CMakeLists.txt | 1 + tm_firmware/500/tmctrl/main.c | 3 ++ .../500/tmctrl/rebootex/CMakeLists.txt | 2 +- tm_firmware/500/tmctrl/rebootex/main.cpp | 2 ++ 11 files changed, 72 insertions(+), 15 deletions(-) diff --git a/tm_firmware/500/common/include/rebootPatches.h b/tm_firmware/500/common/include/rebootPatches.h index 771d0d2..96db825 100644 --- a/tm_firmware/500/common/include/rebootPatches.h +++ b/tm_firmware/500/common/include/rebootPatches.h @@ -112,6 +112,39 @@ static const struct Patches patches = { }, #endif +#elif (PSP_MODEL == 2) +#if defined PAYLOADEX + .rebootPatches = { + .BootLfatMountPatch = 0x88603494, + .BootLfatOpenPatch = 0x886034a4, + .BootLfatReadPatch = 0x8860350c, + .BootLfatClosePatch = 0x8860352c, + .CheckPspConfigPatch = 0x8860a408, + .KdebugPatchAddr = 0x8860c2a0, + .LfatMountPatchAddr = 0x8860349c, + .LfatSeekPatchAddr1 = 0x886034ec, + .LfatSeekPatchAddr2 = 0x886034fc, + .LoadCorePatchAddr = 0x886029d0, + .HashCheckPatchAddr = 0x88602f68, + .SigcheckPatchAddr = 0x88600a54, + }, +#elif defined REBOOTEX + .rebootPatches = { + .BootLfatMountPatch = 0x8860200c, + .BootLfatOpenPatch = 0x88602020, + .BootLfatReadPatch = 0x88602090, + .BootLfatClosePatch = 0x886020bc, + .CheckPspConfigPatch = 0x88605030, + .KdebugPatchAddr = 0x886030e0, + .LfatMountPatchAddr = 0x88602018, + .LfatSeekPatchAddr1 = 0x8860206c, + .LfatSeekPatchAddr2 = 0x88602084, + .LoadCorePatchAddr = 0x88604ee8, + .HashCheckPatchAddr = 0x88606d38, + .SigcheckPatchAddr = 0x886013cc, + }, +#endif + #endif .loadCorePatches = { .ModuleOffsetAddr = 0x00000c74, diff --git a/tm_firmware/500/ipl_payload/CMakeLists.txt b/tm_firmware/500/ipl_payload/CMakeLists.txt index 55877ca..f05958a 100644 --- a/tm_firmware/500/ipl_payload/CMakeLists.txt +++ b/tm_firmware/500/ipl_payload/CMakeLists.txt @@ -10,7 +10,7 @@ configure_file( "${CMAKE_CURRENT_BINARY_DIR}/linker.x" ) -foreach(GEN 1 2) +foreach(GEN 1 2 3) math(EXPR MODEL "${GEN}-1") set(EXEC_NAME payload_500_0${GEN}g) add_executable(${EXEC_NAME}) diff --git a/tm_firmware/500/ipl_payload/main.cpp b/tm_firmware/500/ipl_payload/main.cpp index 0b92bc0..bee9aad 100644 --- a/tm_firmware/500/ipl_payload/main.cpp +++ b/tm_firmware/500/ipl_payload/main.cpp @@ -11,9 +11,17 @@ #if PSP_MODEL == 0 #include #define LD_PAYLOADEX_ADDR 0x0400c534 +#define CLR_SCRATCHPAD_ADDR 0x04001100 #elif PSP_MODEL == 1 #include #define LD_PAYLOADEX_ADDR 0x0400d534 +#define CLR_SCRATCHPAD_ADDR 0x040011e4 +#define SET_KEYS_ADDRESS 0x04001144 +#elif PSP_MODEL == 2 +#include +#define LD_PAYLOADEX_ADDR 0x0400d534 +#define CLR_SCRATCHPAD_ADDR 0x04001218 +#define SET_KEYS_ADDRESS 0x04001178 #endif namespace { @@ -30,17 +38,22 @@ namespace { } void clearCaches() { - iplKernelDcacheWritebackInvalidateAll(); + iplKernelDcacheWritebackInvalidateAll(); iplKernelIcacheInvalidateAll(); } -#if PSP_MODEL == 1 - u32 key[] = +#ifdef SET_KEYS_ADDRESS + u32 key[] = { +#if PSP_MODEL == 1 0x802a43ad, 0xa570d79a, 0x890e5087, 0xc6055fe5, 0xb7558656, 0x89d4608b, 0x83d431ea, 0x469dc537, +#elif PSP_MODEL == 2 + 0x6e85db79, 0x3af7377a, 0xc404855d, 0xa3bc96c3, + 0x112603fb, 0x5afd5d28, 0xe3a192e9, 0xf39ef7f7, +#endif 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0 + 0x0, 0x0, 0x0, 0x0 }; int setkey() { @@ -78,13 +91,10 @@ int main() { //Change payload entry point to payloadex _sw(LUI(GPREG_T9, 0x88fc), LD_PAYLOADEX_ADDR); -#if PSP_MODEL == 0 - _sw(0, 0x04001100); -#else - _sw(0, 0x04000360); - _sw(0, 0x040011e4); - MAKE_JUMP(0x04001144, setkey); - _sw(0, 0x04001148); + _sw(0, CLR_SCRATCHPAD_ADDR); + +#ifdef SET_KEYS_ADDRESS + MAKE_JUMP(SET_KEYS_ADDRESS, setkey); #endif clearCaches(); diff --git a/tm_firmware/500/ipl_payload/payloadex/CMakeLists.txt b/tm_firmware/500/ipl_payload/payloadex/CMakeLists.txt index eb51931..89d191b 100644 --- a/tm_firmware/500/ipl_payload/payloadex/CMakeLists.txt +++ b/tm_firmware/500/ipl_payload/payloadex/CMakeLists.txt @@ -7,7 +7,7 @@ configure_file( "${CMAKE_CURRENT_BINARY_DIR}/linker.x" ) -foreach(GEN 1 2) +foreach(GEN 1 2 3) math(EXPR MODEL "${GEN}-1") set(EXEC_NAME payloadex_500_0${GEN}g) add_executable(${EXEC_NAME}) diff --git a/tm_firmware/500/ipl_payload/payloadex/main.cpp b/tm_firmware/500/ipl_payload/payloadex/main.cpp index e0ef8b0..269d338 100644 --- a/tm_firmware/500/ipl_payload/payloadex/main.cpp +++ b/tm_firmware/500/ipl_payload/payloadex/main.cpp @@ -18,6 +18,9 @@ #elif PSP_MODEL == 1 #include "pspbtcnf_recovery_02g.h" #define BTCNF_PATH "/kd/pspbtcnf_02g.bin" +#elif PSP_MODEL == 2 +#include "pspbtcnf_recovery_03g.h" +#define BTCNF_PATH "/kd/pspbtcnf_03g.bin" #endif namespace { diff --git a/tm_firmware/500/ipl_payload/payloadex_loader/CMakeLists.txt b/tm_firmware/500/ipl_payload/payloadex_loader/CMakeLists.txt index a09b8ce..2dde8ad 100644 --- a/tm_firmware/500/ipl_payload/payloadex_loader/CMakeLists.txt +++ b/tm_firmware/500/ipl_payload/payloadex_loader/CMakeLists.txt @@ -7,7 +7,7 @@ configure_file( "${CMAKE_CURRENT_BINARY_DIR}/linker.x" ) -foreach(GEN 1 2) +foreach(GEN 1 2 3) math(EXPR MODEL "${GEN}-1") set(EXEC_NAME payloadex_loader_500_0${GEN}g) add_executable(${EXEC_NAME}) diff --git a/tm_firmware/500/ipl_payload/payloadex_loader/main.cpp b/tm_firmware/500/ipl_payload/payloadex_loader/main.cpp index 25531a9..6e22aac 100644 --- a/tm_firmware/500/ipl_payload/payloadex_loader/main.cpp +++ b/tm_firmware/500/ipl_payload/payloadex_loader/main.cpp @@ -12,6 +12,8 @@ #include #elif PSP_MODEL == 1 #include +#elif PSP_MODEL == 2 +#include #endif namespace { @@ -24,6 +26,9 @@ namespace { #elif PSP_MODEL == 1 inline auto const sceSysconCommonWrite = reinterpret_cast(0x04006b98); inline auto const sceSysconCommonRead = reinterpret_cast(0x04006a54); +#elif PSP_MODEL == 2 + inline auto const sceSysconCommonWrite = reinterpret_cast(0x04006ba8); + inline auto const sceSysconCommonRead = reinterpret_cast(0x04006a64); #endif void clearCaches() { diff --git a/tm_firmware/500/tmctrl/CMakeLists.txt b/tm_firmware/500/tmctrl/CMakeLists.txt index e3b8df0..0a04373 100644 --- a/tm_firmware/500/tmctrl/CMakeLists.txt +++ b/tm_firmware/500/tmctrl/CMakeLists.txt @@ -14,6 +14,7 @@ add_custom_command(OUTPUT rebootex.h --gzip --c_style rebootex_01g="$".bin rebootex_02g="$".bin + rebootex_03g="$".bin rebootex.h ) diff --git a/tm_firmware/500/tmctrl/main.c b/tm_firmware/500/tmctrl/main.c index 01630b9..604a62a 100755 --- a/tm_firmware/500/tmctrl/main.c +++ b/tm_firmware/500/tmctrl/main.c @@ -33,6 +33,9 @@ int sceKernelGzipDecompressPatched(u8 *dest, int destSize, u8 *src, u32 unknown) case 1: src = rebootex_02g; break; + case 2: + src = rebootex_03g; + break; } return sceKernelGzipDecompress(dest, destSize, src, 0); diff --git a/tm_firmware/500/tmctrl/rebootex/CMakeLists.txt b/tm_firmware/500/tmctrl/rebootex/CMakeLists.txt index 40d0c72..ea62cac 100644 --- a/tm_firmware/500/tmctrl/rebootex/CMakeLists.txt +++ b/tm_firmware/500/tmctrl/rebootex/CMakeLists.txt @@ -7,7 +7,7 @@ configure_file( "${CMAKE_CURRENT_BINARY_DIR}/linker.x" ) -foreach(GEN 1 2) +foreach(GEN 1 2 3) math(EXPR MODEL "${GEN}-1") set(EXEC_NAME rebootex500_0${GEN}g) add_executable(${EXEC_NAME}) diff --git a/tm_firmware/500/tmctrl/rebootex/main.cpp b/tm_firmware/500/tmctrl/rebootex/main.cpp index 6a50ecd..8e324e7 100644 --- a/tm_firmware/500/tmctrl/rebootex/main.cpp +++ b/tm_firmware/500/tmctrl/rebootex/main.cpp @@ -22,6 +22,8 @@ #define BTCNF_PATH "/kd/pspbtcnf.bin" #elif PSP_MODEL == 1 #define BTCNF_PATH "/kd/pspbtcnf_02g.bin" +#elif PSP_MODEL == 2 +#define BTCNF_PATH "/kd/pspbtcnf_03g.bin" #endif namespace {