From 60efc2bda6b98c6f7e67ce2f464acaf7e1358b91 Mon Sep 17 00:00:00 2001 From: Jcw87 Date: Thu, 19 Oct 2023 21:04:51 -0700 Subject: [PATCH] dspproc, dsptask, osdsp, osdsp_task --- configure.py | 8 +- include/JSystem/JAudio/dspproc.h | 15 + include/JSystem/JAudio/dsptask.h | 13 + include/JSystem/JAudio/osdsp.h | 8 + include/JSystem/JAudio/osdsp_task.h | 17 + include/dolphin/dsp.h | 22 +- src/JSystem/JAudio/dspproc.c | 70 +++- src/JSystem/JAudio/dsptask.c | 568 +++++++++++++++++++++++++++- src/JSystem/JAudio/osdsp.c | 28 +- src/JSystem/JAudio/osdsp_task.c | 125 +++++- 10 files changed, 825 insertions(+), 49 deletions(-) create mode 100644 include/JSystem/JAudio/dspproc.h create mode 100644 include/JSystem/JAudio/dsptask.h create mode 100644 include/JSystem/JAudio/osdsp.h create mode 100644 include/JSystem/JAudio/osdsp_task.h diff --git a/configure.py b/configure.py index 3c4628f66..a7c5411af 100644 --- a/configure.py +++ b/configure.py @@ -696,10 +696,10 @@ config.libs = [ Object(NonMatching, "JSystem/JAudio/JASChannelMgr.cpp"), Object(NonMatching, "JSystem/JAudio/JASOscillator.cpp"), Object(NonMatching, "JSystem/JAudio/JASDriverTables.cpp"), - Object(NonMatching, "JSystem/JAudio/dspproc.c"), - Object(NonMatching, "JSystem/JAudio/dsptask.c"), - Object(NonMatching, "JSystem/JAudio/osdsp.c"), - Object(NonMatching, "JSystem/JAudio/osdsp_task.c"), + Object(Matching, "JSystem/JAudio/dspproc.c", extra_cflags="-lang c++ -O4 -func_align 32"), + Object(NonMatching, "JSystem/JAudio/dsptask.c", extra_cflags="-lang c++ -O4 -func_align 32"), + Object(Matching, "JSystem/JAudio/osdsp.c", extra_cflags="-lang c++ -O4 -func_align 32 -str nopool"), + Object(Matching, "JSystem/JAudio/osdsp_task.c", extra_cflags="-lang c++ -O4 -func_align 32"), Object(NonMatching, "JSystem/JAudio/JAIAnimation.cpp"), Object(NonMatching, "JSystem/JAudio/JAIBasic.cpp"), Object(NonMatching, "JSystem/JAudio/JAIBankWave.cpp"), diff --git a/include/JSystem/JAudio/dspproc.h b/include/JSystem/JAudio/dspproc.h new file mode 100644 index 000000000..f17884a12 --- /dev/null +++ b/include/JSystem/JAudio/dspproc.h @@ -0,0 +1,15 @@ +#ifndef DSPPROC_H +#define DSPPROC_H + +#include "dolphin/types.h" + +void DSPReleaseHalt2(u32); +void DSPReleaseHalt(); +void setup_callback(u16); +void DsetupTable(u32, u32, u32, u32, u32); +void DsetMixerLevel(f32); +void DsyncFrame(u32, u32, u32); +void dummy_callback(u16); +void DsetDolbyDelay(u32, u16); + +#endif /* DSPPROC_H */ diff --git a/include/JSystem/JAudio/dsptask.h b/include/JSystem/JAudio/dsptask.h new file mode 100644 index 000000000..12ad7fcb1 --- /dev/null +++ b/include/JSystem/JAudio/dsptask.h @@ -0,0 +1,13 @@ +#ifndef DSPTASK_H +#define DSPTASK_H + +#include "dolphin/dsp.h" + +void DspHandShake(void*); +void DspBoot(DSPCallback); +int DSPSendCommands2(u32*, u32, void (*)(u16)); +void DspInitWork(); +int DspStartWork(u32, void (*)(u16)); +void DspFinishWork(u16); + +#endif /* DSPTASK_H */ diff --git a/include/JSystem/JAudio/osdsp.h b/include/JSystem/JAudio/osdsp.h new file mode 100644 index 000000000..7cc4d6a1c --- /dev/null +++ b/include/JSystem/JAudio/osdsp.h @@ -0,0 +1,8 @@ +#ifndef OSDSP_H +#define OSDSP_H + +#include "dolphin/dsp.h" + +void DSPAddPriorTask(STRUCT_DSP_TASK*); + +#endif /* OSDSP_H */ diff --git a/include/JSystem/JAudio/osdsp_task.h b/include/JSystem/JAudio/osdsp_task.h new file mode 100644 index 000000000..116d51e73 --- /dev/null +++ b/include/JSystem/JAudio/osdsp_task.h @@ -0,0 +1,17 @@ +#ifndef OSDSP_TASK_H +#define OSDSP_TASK_H + +#include "dolphin/types.h" + +typedef struct STRUCT_DSP_TASK DSPTaskInfo; +typedef struct OSContext OSContext; + +extern DSPTaskInfo* DSP_prior_task; + +extern "C" void __DSPHandler(int, OSContext*); +void DsyncFrame2(u32, u32, u32); +void Dsp_Update_Request(); +bool Dsp_Running_Check(); +void Dsp_Running_Start(); + +#endif /* OSDSP_TASK_H */ diff --git a/include/dolphin/dsp.h b/include/dolphin/dsp.h index 534ab88cd..f408874f6 100644 --- a/include/dolphin/dsp.h +++ b/include/dolphin/dsp.h @@ -4,6 +4,9 @@ #include "dolphin/os/OS.h" #include "dolphin/types.h" +volatile u16 __DSPRegs[32] : 0xCC005000; +volatile u32 __AIRegs[8] : 0xCC006C00; + #ifdef __cplusplus extern "C" { #endif @@ -47,24 +50,31 @@ typedef struct STRUCT_DSP_TASK { } DSPTaskInfo; +extern DSPTaskInfo* __DSP_tmp_task; +extern DSPTaskInfo* __DSP_last_task; +extern DSPTaskInfo* __DSP_first_task; +extern DSPTaskInfo* __DSP_curr_task; + +u32 DSPCheckMailToDSP(); +u32 DSPCheckMailFromDSP(); +u32 DSPReadMailFromDSP(); +void DSPSendMailToDSP(u32 mail); +void DSPAssertInt(); void DSPInit(); void DSPReset(); void DSPHalt(); -void DSPSendMailToDSP(u32 mail); -u32 DSPCheckMailToDSP(); -u32 DSPCheckMailFromDSP(); u32 DSPGetDMAStatus(); - DSPTaskInfo* DSPAddTask(DSPTaskInfo* task); void __DSP_exec_task(DSPTaskInfo* curr, DSPTaskInfo* next); void __DSP_boot_task(DSPTaskInfo* task); -void __DSP_remove_task(DSPTaskInfo* task); +void __DSP_insert_task(DSPTaskInfo* task); void __DSP_add_task(DSPTaskInfo* task); +void __DSP_remove_task(DSPTaskInfo* task); void __DSP_debug_printf(const char* fmt, ...); #ifdef __cplusplus } #endif -#endif // _DOLPHIN_DSP \ No newline at end of file +#endif // _DOLPHIN_DSP diff --git a/src/JSystem/JAudio/dspproc.c b/src/JSystem/JAudio/dspproc.c index 514aafecc..f24ed73ea 100644 --- a/src/JSystem/JAudio/dspproc.c +++ b/src/JSystem/JAudio/dspproc.c @@ -3,46 +3,80 @@ // Translation Unit: dspproc.c // -#include "dspproc.h" -#include "dolphin/types.h" +#include "JSystem/JAudio/dspproc.h" +#include "JSystem/JAudio/JASDSPInterface.h" +#include "JSystem/JAudio/dsptask.h" +#include "dolphin/dsp.h" /* 8028E600-8028E648 .text DSPReleaseHalt2__FUl */ -void DSPReleaseHalt2(unsigned long) { - /* Nonmatching */ +void DSPReleaseHalt2(u32 msg) { + u32 msgs[2]; + u16 dspMap = DSP_CreateMap2(msg); + msgs[0] = (msg << 16) | dspMap; + + DSPSendCommands2(msgs, 0, NULL); } /* 8028E660-8028E694 .text DSPReleaseHalt__Fv */ void DSPReleaseHalt() { - /* Nonmatching */ + u32 msgs[2]; + msgs[0] = 0x30000; + DSPSendCommands2(msgs, 0, NULL); } +static volatile BOOL flag; + /* 8028E6A0-8028E6AC .text setup_callback__FUs */ -void setup_callback(unsigned short) { - /* Nonmatching */ +void setup_callback(u16) { + flag = 0; } /* 8028E6C0-8028E724 .text DsetupTable__FUlUlUlUlUl */ -void DsetupTable(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long) { - /* Nonmatching */ +void DsetupTable(u32 param_1, u32 param_2, u32 param_3, u32 param_4, u32 param_5) { + u32 table[5]; + table[0] = (param_1 & 0xFFFF) | 0x81000000; + table[1] = param_2; + table[2] = param_3; + table[3] = param_4; + table[4] = param_5; + flag = 1; + DSPSendCommands2(table,5,setup_callback); + while (true) { + if (flag == 0) { + return; + } + } } +static u16 DSP_MIXERLEVEL = 0x4000; + /* 8028E740-8028E764 .text DsetMixerLevel__Ff */ -void DsetMixerLevel(float) { - /* Nonmatching */ +void DsetMixerLevel(f32 level) { + DSP_MIXERLEVEL = 4096.0f * level; } /* 8028E780-8028E7C8 .text DsyncFrame__FUlUlUl */ -void DsyncFrame(unsigned long, unsigned long, unsigned long) { - /* Nonmatching */ +void DsyncFrame(u32 param_1, u32 param_2, u32 param_3) { + u32 msgs[3]; + msgs[0] = (param_1 & 0xff) << 0x10 | 0x82000000 | DSP_MIXERLEVEL; + msgs[1] = param_2; + msgs[2] = param_3; + DSPSendCommands2(msgs, 3, 0); } +static volatile BOOL d_waitflag; + /* 8028E7E0-8028E7EC .text dummy_callback__FUs */ -void dummy_callback(unsigned short) { - /* Nonmatching */ +void dummy_callback(u16) { + d_waitflag = 0; } /* 8028E800-8028E854 .text DsetDolbyDelay__FUlUs */ -void DsetDolbyDelay(unsigned long, unsigned short) { - /* Nonmatching */ +void DsetDolbyDelay(u32 param_1, u16 param_2) { + u32 msgs[2]; + msgs[0] = param_2 | 0x8D000000; + msgs[1] = param_1; + d_waitflag = 1; + DSPSendCommands2(msgs, 2, dummy_callback); + while (d_waitflag) {} } - diff --git a/src/JSystem/JAudio/dsptask.c b/src/JSystem/JAudio/dsptask.c index 4f91e78a1..fa9bd5c97 100644 --- a/src/JSystem/JAudio/dsptask.c +++ b/src/JSystem/JAudio/dsptask.c @@ -3,36 +3,588 @@ // Translation Unit: dsptask.c // -#include "dsptask.h" +#include "JSystem/JAudio/dsptask.h" +#include "JSystem/JAudio/osdsp.h" +#include "JSystem/JAudio/osdsp_task.h" +#include "dolphin/dsp.h" #include "dolphin/types.h" /* 8028E860-8028E898 .text DspHandShake__FPv */ void DspHandShake(void*) { /* Nonmatching */ + while (DSPCheckMailFromDSP() == 0) {} + DSPReadMailFromDSP(); + DSPCheckMailFromDSP(); + Dsp_Running_Start(); } +static u8 jdsp[] = { + 0x02, 0x9F, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0x00, 0x00, + 0x02, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0x00, 0x00, 0x02, 0x9F, 0x05, 0xB8, + 0x02, 0x9F, 0x00, 0x4E, 0x12, 0x05, 0x02, 0xBF, 0x00, 0x57, 0x81, 0x00, 0x00, 0x9F, 0x10, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x5F, 0x1B, 0x1E, 0x02, 0xBF, 0x06, 0x88, 0x02, 0xBF, 0x04, 0xC0, + 0x02, 0xBF, 0x0E, 0x14, 0x0E, 0x00, 0x02, 0xBF, 0x06, 0x6A, 0x00, 0x9E, 0x11, 0x11, 0x02, 0xBF, + 0x06, 0x74, 0x0E, 0x00, 0x00, 0xFE, 0x03, 0x4E, 0x13, 0x05, 0x02, 0x9F, 0x06, 0xC5, 0x00, 0xDF, + 0x03, 0x57, 0x00, 0xFF, 0x03, 0x45, 0x00, 0xDE, 0x03, 0x56, 0x1F, 0xFE, 0x03, 0x40, 0x00, 0xFF, + 0x00, 0xFF, 0x03, 0x44, 0x14, 0x79, 0x02, 0x40, 0x00, 0x7E, 0x00, 0xFE, 0x03, 0x43, 0x02, 0x00, + 0x00, 0x75, 0x1C, 0x1E, 0x17, 0x0F, 0x00, 0x92, 0x00, 0xFF, 0x0E, 0x04, 0x02, 0xBF, 0x06, 0x6A, + 0x00, 0xDE, 0x03, 0x56, 0x02, 0xBF, 0x06, 0x74, 0x02, 0x9F, 0x00, 0x2D, 0x12, 0x05, 0x02, 0xBF, + 0x00, 0x57, 0x0E, 0x01, 0x02, 0xBF, 0x06, 0x6A, 0x13, 0x05, 0x02, 0x9F, 0x00, 0x2D, 0x12, 0x02, + 0x12, 0x03, 0x12, 0x04, 0x13, 0x06, 0x8E, 0x00, 0x8C, 0x00, 0x8B, 0x00, 0x00, 0x9E, 0xFF, 0xFF, + 0x1D, 0x1E, 0x1D, 0x3E, 0x1D, 0x5E, 0x1D, 0x7E, 0x00, 0x92, 0x00, 0xFF, 0x02, 0xDF, 0x00, 0x90, + 0x00, 0x00, 0x0C, 0x00, 0x00, 0x81, 0x03, 0x58, 0x00, 0x7E, 0x00, 0x71, 0x19, 0x3E, 0x1B, 0x1E, + 0x19, 0x3E, 0x1B, 0x1E, 0x02, 0xDF, 0x02, 0x9F, 0x00, 0x43, 0x02, 0x9F, 0x00, 0x43, 0x02, 0x9F, + 0x00, 0x95, 0x02, 0x9F, 0x02, 0x43, 0x02, 0x9F, 0x00, 0x73, 0x02, 0x9F, 0x05, 0x80, 0x02, 0x9F, + 0x05, 0x92, 0x02, 0x9F, 0x04, 0x69, 0x02, 0x9F, 0x04, 0x1D, 0x02, 0x9F, 0x04, 0x85, 0x02, 0x9F, + 0x04, 0x4D, 0x02, 0x9F, 0x00, 0x43, 0x02, 0x9F, 0x00, 0x43, 0x02, 0x9F, 0x00, 0x43, 0x02, 0x9F, + 0x00, 0xB2, 0x02, 0x9F, 0x00, 0x43, 0x02, 0x9F, 0x00, 0x43, 0x00, 0x80, 0x03, 0x80, 0x0E, 0x04, + 0x02, 0xBF, 0x00, 0x67, 0x00, 0x81, 0x03, 0x82, 0x00, 0x9F, 0x00, 0x00, 0x00, 0x80, 0x02, 0x80, + 0x02, 0xBF, 0x05, 0x23, 0x00, 0x81, 0x03, 0x84, 0x00, 0x9F, 0x03, 0x00, 0x00, 0x80, 0x00, 0x20, + 0x02, 0xBF, 0x05, 0x23, 0x00, 0xDE, 0x03, 0x45, 0x00, 0xFE, 0x03, 0x42, 0x02, 0xBF, 0x0B, 0xEC, + 0x02, 0x9F, 0x00, 0x43, 0x00, 0x80, 0x03, 0x74, 0x0E, 0x01, 0x00, 0xFE, 0x03, 0x77, 0x00, 0xFE, + 0x03, 0x7C, 0x02, 0xBF, 0x00, 0x67, 0x00, 0xDE, 0x03, 0x45, 0x00, 0xFE, 0x03, 0x76, 0x02, 0x9F, + 0x00, 0x43, 0x00, 0x81, 0x03, 0x4C, 0x00, 0x9F, 0x04, 0x00, 0x00, 0x80, 0x00, 0xC0, 0x02, 0xBF, + 0x05, 0x23, 0x02, 0xDF, 0x00, 0x81, 0x03, 0x4C, 0x00, 0x9F, 0x04, 0x00, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x81, 0x03, 0x4C, 0x19, 0x3E, 0x19, 0x3C, 0x00, 0x98, 0x00, 0x00, 0x70, 0x00, 0x02, 0xBF, + 0x05, 0x32, 0x02, 0xDF, 0x19, 0x1E, 0x19, 0x1A, 0x00, 0x5F, 0x64, 0xA0, 0x1B, 0x7E, 0x1B, 0x7A, + 0x02, 0xDF, 0x19, 0x1E, 0x19, 0x1A, 0x00, 0x7F, 0x00, 0xE8, 0x32, 0xB2, 0x65, 0xA0, 0x33, 0xBA, + 0x64, 0xA1, 0x00, 0x00, 0x02, 0xDF, 0x8A, 0x00, 0x15, 0x7F, 0x1C, 0x20, 0x1C, 0x03, 0x19, 0x3A, + 0x90, 0x51, 0x92, 0x5B, 0x00, 0x7F, 0x00, 0xF7, 0x46, 0x51, 0x92, 0xB2, 0x46, 0x51, 0x92, 0xB2, + 0x8B, 0x00, 0x02, 0xDF, 0x8A, 0x00, 0x19, 0x1A, 0x90, 0x50, 0x92, 0x50, 0x00, 0x5F, 0x92, 0xA0, + 0x8B, 0x00, 0x02, 0xDF, 0x81, 0x00, 0x89, 0x00, 0x0E, 0x50, 0x00, 0x80, 0x0D, 0x00, 0x00, 0x5E, + 0x1B, 0x1F, 0x00, 0x80, 0x0D, 0x60, 0x00, 0x5E, 0x1B, 0x1F, 0x02, 0xBF, 0x0E, 0x3F, 0x81, 0x00, + 0x89, 0x00, 0x0E, 0x50, 0x00, 0x80, 0x0C, 0xA0, 0x00, 0x5E, 0x1B, 0x1F, 0x00, 0x80, 0x0F, 0x40, + 0x00, 0x5E, 0x1B, 0x1F, 0x00, 0x80, 0x0F, 0xA0, 0x00, 0x5E, 0x1B, 0x1F, 0x00, 0x80, 0x0A, 0x00, + 0x00, 0x5E, 0x1B, 0x1F, 0x00, 0x80, 0x09, 0xA0, 0x00, 0x5E, 0x1B, 0x1F, 0x02, 0xDF, 0x00, 0xC0, + 0x03, 0xA0, 0x19, 0x1A, 0x00, 0xDF, 0x03, 0xA1, 0x00, 0x9B, 0x00, 0xA0, 0x00, 0x81, 0x03, 0x93, + 0x18, 0xBC, 0xB8, 0x71, 0xBC, 0x00, 0x00, 0x80, 0x00, 0x50, 0x05, 0x08, 0x02, 0xBF, 0x05, 0x25, + 0x00, 0xDE, 0x03, 0x90, 0x02, 0xA0, 0x00, 0x01, 0x02, 0x9D, 0x01, 0x45, 0x00, 0x80, 0x03, 0x98, + 0x0E, 0x08, 0x00, 0xC1, 0x03, 0xA1, 0x02, 0xBF, 0x0B, 0x2E, 0x0F, 0x50, 0x00, 0xC0, 0x03, 0xA1, + 0x00, 0xDA, 0x03, 0x94, 0x86, 0x00, 0x02, 0x95, 0x01, 0x52, 0x1C, 0x7A, 0x00, 0xD8, 0x03, 0x95, + 0x02, 0xBF, 0x00, 0xEB, 0x0F, 0x50, 0x00, 0xC0, 0x03, 0xA1, 0x00, 0xDA, 0x03, 0x96, 0x86, 0x00, + 0x02, 0x95, 0x01, 0x5F, 0x1C, 0x7A, 0x00, 0xD8, 0x03, 0x97, 0x02, 0xBF, 0x00, 0xEB, 0x00, 0xDE, + 0x03, 0x90, 0x02, 0xA0, 0x00, 0x02, 0x02, 0xDD, 0x00, 0x80, 0x03, 0x98, 0x0E, 0x08, 0x00, 0xC1, + 0x03, 0xA1, 0x02, 0xBF, 0x0B, 0x2E, 0x02, 0xDF, 0x89, 0x00, 0x00, 0x9F, 0x0D, 0xC0, 0x00, 0xFF, + 0x03, 0xA1, 0x00, 0x9F, 0x03, 0xA8, 0x00, 0xFF, 0x03, 0xA2, 0x00, 0x9F, 0x03, 0xA4, 0x00, 0xFF, + 0x03, 0xA0, 0x11, 0x04, 0x01, 0x9F, 0x00, 0xC0, 0x03, 0xA2, 0x00, 0x83, 0x03, 0x90, 0x0F, 0x0E, + 0x02, 0xBF, 0x00, 0xDA, 0x00, 0xDA, 0x03, 0x90, 0x86, 0x00, 0x02, 0x95, 0x01, 0x91, 0x00, 0xDF, + 0x03, 0xA1, 0x1C, 0x7F, 0x05, 0x50, 0x1C, 0x1F, 0x0F, 0x06, 0x02, 0xBF, 0x00, 0xDA, 0x02, 0xBF, + 0x01, 0x27, 0x00, 0xDE, 0x03, 0xA2, 0x04, 0x10, 0x00, 0xFE, 0x03, 0xA2, 0x00, 0xDE, 0x03, 0xA1, + 0x04, 0x60, 0x00, 0xFE, 0x03, 0xA1, 0x00, 0xDE, 0x03, 0xA0, 0x74, 0x00, 0x00, 0xFE, 0x03, 0xA0, + 0x0F, 0x50, 0x00, 0x80, 0x0C, 0x00, 0x00, 0x83, 0x0E, 0x80, 0x00, 0x98, 0x7F, 0xFF, 0x02, 0xBF, + 0x00, 0xEB, 0x0F, 0x50, 0x00, 0x80, 0x0C, 0x00, 0x00, 0x83, 0x0E, 0xE0, 0x00, 0x98, 0xB8, 0x20, + 0x02, 0xBF, 0x00, 0xEB, 0x0F, 0x28, 0x00, 0x80, 0x0C, 0x78, 0x00, 0x83, 0x0E, 0x80, 0x00, 0x98, + 0xB8, 0x20, 0x02, 0xBF, 0x00, 0xEB, 0x0F, 0x28, 0x00, 0x80, 0x0C, 0x78, 0x00, 0x83, 0x0E, 0xE0, + 0x00, 0x98, 0x7F, 0xFF, 0x02, 0xBF, 0x00, 0xEB, 0x81, 0x00, 0x89, 0x00, 0x0E, 0x50, 0x00, 0x80, + 0x0C, 0x00, 0x00, 0x5E, 0x1B, 0x1F, 0x00, 0x80, 0x0C, 0x50, 0x00, 0x5E, 0x1B, 0x1F, 0x02, 0xDF, + 0x00, 0xC0, 0x03, 0xA0, 0x18, 0x1A, 0x81, 0x00, 0x18, 0x1E, 0x00, 0xDB, 0x03, 0x91, 0x74, 0x00, + 0xD1, 0x00, 0x02, 0x70, 0x81, 0x00, 0x1B, 0x1E, 0x00, 0xDF, 0x03, 0xA1, 0x00, 0x9B, 0x00, 0xA0, + 0x00, 0x81, 0x03, 0x93, 0x18, 0xBC, 0xB8, 0x71, 0xBC, 0x00, 0x00, 0x80, 0x00, 0x50, 0x02, 0xBF, + 0x05, 0x32, 0x02, 0xDF, 0x89, 0x00, 0x0F, 0x28, 0x00, 0x80, 0x0C, 0x50, 0x00, 0x83, 0x0E, 0xA8, + 0x00, 0x98, 0xB8, 0x20, 0x02, 0xBF, 0x00, 0xEB, 0x89, 0x00, 0x0F, 0x28, 0x00, 0x80, 0x0C, 0x50, + 0x00, 0x83, 0x0F, 0x08, 0x00, 0x98, 0x7F, 0xFF, 0x02, 0xBF, 0x00, 0xEB, 0x00, 0x9F, 0x0D, 0xC0, + 0x00, 0xFF, 0x03, 0xA1, 0x00, 0x9F, 0x03, 0xA8, 0x00, 0xFF, 0x03, 0xA2, 0x00, 0x9F, 0x03, 0xA4, + 0x00, 0xFF, 0x03, 0xA0, 0x11, 0x04, 0x02, 0x28, 0x00, 0xC0, 0x03, 0xA2, 0x00, 0x83, 0x03, 0x90, + 0x0F, 0x0E, 0x02, 0xBF, 0x00, 0xDA, 0x00, 0xDA, 0x03, 0x90, 0x86, 0x00, 0x02, 0x95, 0x02, 0x1A, + 0x02, 0xBF, 0x01, 0xD0, 0x00, 0xDE, 0x03, 0xA2, 0x04, 0x10, 0x00, 0xFE, 0x03, 0xA2, 0x00, 0xDE, + 0x03, 0xA1, 0x04, 0x60, 0x00, 0xFE, 0x03, 0xA1, 0x00, 0xDE, 0x03, 0xA0, 0x74, 0x00, 0x00, 0xFE, + 0x03, 0xA0, 0x02, 0xDF, 0x00, 0x81, 0x03, 0x86, 0x00, 0x9F, 0x03, 0xA8, 0x00, 0x80, 0x00, 0x40, + 0x02, 0xBF, 0x05, 0x23, 0x02, 0xDF, 0x19, 0x1E, 0x18, 0x9C, 0x48, 0x00, 0x1B, 0x1E, 0x1B, 0x1C, + 0x02, 0xDF, 0x81, 0x00, 0x89, 0x00, 0x00, 0xDF, 0x03, 0x54, 0x00, 0xDE, 0x03, 0x4E, 0x82, 0x00, + 0x02, 0x93, 0x02, 0x39, 0x02, 0xDF, 0x00, 0x80, 0x03, 0x88, 0x00, 0x81, 0x00, 0x67, 0x0E, 0x02, + 0x17, 0x3F, 0x00, 0xDE, 0x03, 0x44, 0x00, 0xFE, 0x03, 0x41, 0x00, 0xDE, 0x03, 0x45, 0x00, 0xFE, + 0x03, 0x8E, 0x81, 0x00, 0x00, 0xFE, 0x03, 0x55, 0x02, 0xBF, 0x02, 0x2A, 0x02, 0xBF, 0x05, 0xA4, + 0x00, 0xDE, 0x03, 0x41, 0x00, 0x7E, 0x04, 0x18, 0x02, 0xBF, 0x01, 0x02, 0x02, 0xBF, 0x01, 0x6C, + 0x02, 0xBF, 0x09, 0x5F, 0x00, 0xDE, 0x03, 0x55, 0x74, 0x00, 0x00, 0xFE, 0x03, 0x55, 0x81, 0x00, + 0x00, 0xFE, 0x03, 0x54, 0x00, 0xDE, 0x03, 0x42, 0x00, 0x7E, 0x03, 0xC0, 0x02, 0xBF, 0x02, 0x39, + 0x81, 0x00, 0x89, 0x00, 0x00, 0xDE, 0x03, 0x54, 0x14, 0x7C, 0x02, 0x00, 0x04, 0xFC, 0x1C, 0x1E, + 0x18, 0x1F, 0x00, 0xDE, 0x03, 0x54, 0x02, 0x40, 0x00, 0x0F, 0x3D, 0x80, 0x03, 0xC0, 0x80, 0x00, + 0x02, 0x9C, 0x03, 0xBC, 0x00, 0xD8, 0x03, 0x54, 0x00, 0x9A, 0x01, 0x80, 0x81, 0x00, 0x00, 0xDE, + 0x03, 0x80, 0x00, 0xDC, 0x03, 0x81, 0x90, 0x00, 0x94, 0x00, 0x00, 0xFE, 0x03, 0x4C, 0x00, 0xFC, + 0x03, 0x4D, 0x02, 0xBF, 0x00, 0xC1, 0x00, 0xDA, 0x04, 0x00, 0x86, 0x00, 0x02, 0x95, 0x03, 0xBC, + 0x00, 0xDA, 0x04, 0x01, 0x86, 0x00, 0x02, 0x94, 0x03, 0xBC, 0x00, 0xDA, 0x04, 0x33, 0x00, 0xFA, + 0x03, 0xF8, 0x00, 0xDA, 0x04, 0x06, 0x86, 0x00, 0x02, 0x94, 0x0D, 0xFF, 0x81, 0x00, 0x00, 0xDE, + 0x04, 0x80, 0x06, 0x09, 0x02, 0x95, 0x02, 0xBD, 0x06, 0x05, 0x02, 0x95, 0x02, 0xBD, 0x06, 0x08, + 0x02, 0x95, 0x09, 0x8F, 0x06, 0x10, 0x02, 0x95, 0x0A, 0x14, 0x06, 0x20, 0x02, 0x95, 0x0A, 0x9A, + 0x06, 0x21, 0x02, 0x95, 0x0A, 0xA2, 0x02, 0x9F, 0x08, 0x7C, 0x00, 0xD8, 0x04, 0x02, 0x81, 0x00, + 0x89, 0x00, 0x00, 0xDC, 0x04, 0x30, 0x8D, 0x00, 0x09, 0x50, 0xA0, 0x00, 0xA4, 0x00, 0x14, 0x04, + 0x8C, 0x00, 0x1F, 0xFE, 0x00, 0x83, 0x05, 0x80, 0x02, 0xBF, 0x07, 0x3D, 0x02, 0x9F, 0x02, 0xD0, + 0x00, 0x80, 0x05, 0x80, 0x00, 0x81, 0x05, 0x20, 0x00, 0x99, 0x00, 0x00, 0x02, 0xBF, 0x0D, 0x7F, + 0x00, 0xDA, 0x04, 0xA8, 0x86, 0x00, 0x02, 0x95, 0x02, 0xE1, 0x00, 0x80, 0x05, 0x20, 0x02, 0xBF, + 0x0C, 0x84, 0x00, 0x9E, 0x05, 0x20, 0x00, 0xFE, 0x03, 0x8F, 0x89, 0x00, 0x00, 0xDF, 0x04, 0x84, + 0x03, 0x40, 0x00, 0x1F, 0xB9, 0x00, 0x02, 0x95, 0x03, 0x11, 0x00, 0xDE, 0x03, 0x8F, 0x5C, 0x00, + 0x00, 0xFE, 0x03, 0x8F, 0x1C, 0x7E, 0x00, 0x80, 0x04, 0x40, 0x05, 0xFE, 0x02, 0xBF, 0x00, 0xDA, + 0x00, 0x80, 0x04, 0x90, 0x00, 0xC1, 0x03, 0x8F, 0x89, 0x00, 0x00, 0xDF, 0x04, 0x84, 0x03, 0x40, + 0x00, 0x1F, 0x02, 0xBF, 0x0B, 0x4D, 0x00, 0xDE, 0x03, 0x8F, 0x04, 0x50, 0x1C, 0x1E, 0x00, 0x83, + 0x04, 0x40, 0x89, 0x00, 0x00, 0xDF, 0x04, 0x84, 0x03, 0x40, 0x00, 0x1F, 0x05, 0xFE, 0x02, 0xBF, + 0x00, 0xDA, 0x00, 0xDE, 0x04, 0x84, 0x02, 0x40, 0x00, 0x20, 0x02, 0x95, 0x03, 0x33, 0x00, 0x80, + 0x04, 0xA4, 0x00, 0xC1, 0x03, 0x8F, 0x00, 0x82, 0x04, 0x54, 0x00, 0x83, 0x04, 0xA7, 0x18, 0xFA, + 0x86, 0x00, 0x02, 0x94, 0x03, 0x31, 0x18, 0xFA, 0x86, 0x00, 0x02, 0x94, 0x03, 0x31, 0x18, 0xFA, + 0x86, 0x00, 0x02, 0x94, 0x03, 0x31, 0x81, 0x00, 0x18, 0xFE, 0x02, 0x80, 0x7F, 0xFF, 0x02, 0x95, + 0x03, 0x33, 0x02, 0xBF, 0x0B, 0x68, 0x81, 0x00, 0x00, 0xDE, 0x04, 0x2C, 0xB1, 0x00, 0x02, 0x95, + 0x03, 0x3D, 0x02, 0xBF, 0x0C, 0xD3, 0x02, 0x9F, 0x03, 0xB2, 0x81, 0x00, 0x1C, 0x9E, 0x1C, 0xDE, + 0x74, 0x00, 0x1C, 0xFE, 0x81, 0x00, 0x00, 0xDE, 0x04, 0x07, 0xB1, 0x00, 0x02, 0x95, 0x03, 0x55, + 0x00, 0xC3, 0x03, 0x8F, 0x00, 0x07, 0x00, 0x80, 0x04, 0x77, 0x00, 0x84, 0xFF, 0xFF, 0x00, 0x87, + 0xFF, 0xFF, 0x19, 0x9A, 0x65, 0x54, 0x00, 0x5E, 0x65, 0xAD, 0x00, 0xDA, 0x04, 0x85, 0x86, 0x00, + 0x02, 0x95, 0x03, 0x6B, 0x89, 0x00, 0x00, 0x86, 0x00, 0x05, 0x00, 0x82, 0x04, 0x0A, 0x11, 0x06, + 0x03, 0x63, 0x18, 0xDE, 0x14, 0x7F, 0x4D, 0x36, 0xB9, 0x00, 0x02, 0x94, 0x03, 0x6B, 0x00, 0x9A, + 0x00, 0x01, 0x00, 0xFA, 0x04, 0x01, 0x8F, 0x00, 0x00, 0x86, 0x00, 0x02, 0x00, 0x82, 0x04, 0x08, + 0x11, 0x06, 0x03, 0x9B, 0x81, 0x00, 0x19, 0x5E, 0x12, 0x00, 0xB1, 0x00, 0x02, 0x75, 0x13, 0x00, + 0x1C, 0x7E, 0x19, 0x5E, 0x19, 0x5F, 0x5C, 0x00, 0x14, 0xFB, 0x1F, 0x5E, 0x1F, 0x1C, 0x18, 0x5E, + 0x02, 0x40, 0x00, 0xFF, 0x1F, 0x7E, 0x18, 0x5E, 0x14, 0x78, 0x00, 0x9C, 0x00, 0x00, 0xD1, 0x00, + 0x02, 0x95, 0x03, 0x90, 0x18, 0x5E, 0x02, 0x72, 0x74, 0x00, 0x02, 0x71, 0x78, 0x00, 0x1A, 0x5E, + 0x00, 0x06, 0x00, 0xDE, 0x03, 0x8F, 0x56, 0x00, 0x02, 0x9D, 0x03, 0x99, 0x1C, 0x1E, 0x02, 0xBF, + 0x0C, 0xA9, 0x00, 0x00, 0x1B, 0x5F, 0x00, 0x0A, 0x8E, 0x00, 0x81, 0x00, 0x00, 0xDE, 0x04, 0x07, + 0xB1, 0x00, 0x02, 0x95, 0x03, 0xB2, 0x00, 0xC3, 0x03, 0x8F, 0x00, 0x87, 0x00, 0x4F, 0x00, 0x1F, + 0x00, 0x80, 0x04, 0x77, 0x00, 0x84, 0xFF, 0xFF, 0x00, 0x87, 0xFF, 0xFF, 0x19, 0xFA, 0x65, 0x57, + 0x00, 0x5E, 0x65, 0xAF, 0x00, 0xDA, 0x04, 0x06, 0x86, 0x00, 0x02, 0x94, 0x03, 0xBA, 0x81, 0x00, + 0x00, 0xFE, 0x04, 0x04, 0x02, 0xBF, 0x00, 0xCA, 0x00, 0xDE, 0x03, 0x54, 0x74, 0x00, 0x00, 0xFE, + 0x03, 0x54, 0x0E, 0x00, 0x00, 0xFE, 0x03, 0x4E, 0x0E, 0x04, 0x02, 0xBF, 0x06, 0x6A, 0x00, 0xDE, + 0x03, 0x55, 0x02, 0x60, 0xFF, 0x00, 0x02, 0xBF, 0x06, 0x74, 0x02, 0xBF, 0x0C, 0x0A, 0x02, 0xBF, + 0x0C, 0x1C, 0x02, 0xBF, 0x0C, 0x71, 0x00, 0xDE, 0x03, 0x41, 0x78, 0x00, 0x00, 0xFE, 0x03, 0x41, + 0x00, 0x80, 0x09, 0xA0, 0x00, 0x83, 0x0D, 0x00, 0x0F, 0x50, 0x00, 0x98, 0x5A, 0x82, 0x02, 0xBF, + 0x00, 0xEB, 0x00, 0x80, 0x09, 0xA0, 0x00, 0x83, 0x0D, 0x60, 0x0F, 0x50, 0x02, 0xBF, 0x00, 0xEB, + 0x00, 0x83, 0x0D, 0x00, 0x02, 0xBF, 0x0C, 0xC1, 0x00, 0x81, 0x03, 0x88, 0x00, 0x9F, 0x0D, 0x00, + 0x00, 0x80, 0x00, 0x50, 0x02, 0xBF, 0x05, 0x30, 0x00, 0x80, 0x0F, 0xA0, 0x00, 0x83, 0x0D, 0x60, + 0x0F, 0x50, 0x00, 0x98, 0x80, 0x00, 0x02, 0xBF, 0x00, 0xEB, 0x00, 0x83, 0x0D, 0x60, 0x02, 0xBF, + 0x0C, 0xC1, 0x00, 0x81, 0x03, 0x8A, 0x00, 0x9F, 0x0D, 0x60, 0x00, 0x80, 0x00, 0x50, 0x02, 0xBF, + 0x05, 0x30, 0x00, 0x9A, 0x00, 0x00, 0x00, 0x98, 0x00, 0xA0, 0x00, 0x80, 0x03, 0x88, 0x02, 0xBF, + 0x02, 0x33, 0x00, 0x80, 0x03, 0x8A, 0x02, 0xBF, 0x02, 0x33, 0x02, 0xBF, 0x01, 0xEA, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x2D, 0x02, 0x9F, 0x06, 0x03, 0x00, 0x80, 0x03, 0x46, 0x02, 0xBF, + 0x00, 0x67, 0x02, 0xBF, 0x00, 0x67, 0x00, 0x81, 0x03, 0x46, 0x19, 0x3E, 0x19, 0x3C, 0x00, 0x9F, + 0x04, 0x00, 0x00, 0xC0, 0x03, 0x45, 0x02, 0xBF, 0x05, 0x25, 0x00, 0x81, 0x03, 0x48, 0x19, 0x3E, + 0x19, 0x3C, 0x00, 0x9F, 0x08, 0x00, 0x00, 0xC0, 0x03, 0x45, 0x02, 0xBF, 0x05, 0x25, 0x00, 0x81, + 0x03, 0x46, 0x19, 0x3E, 0x19, 0x3C, 0x00, 0x9F, 0x08, 0x00, 0x00, 0xC0, 0x03, 0x45, 0x02, 0xBF, + 0x05, 0x32, 0x00, 0x81, 0x03, 0x48, 0x19, 0x3E, 0x19, 0x3C, 0x00, 0x9F, 0x04, 0x00, 0x00, 0xC0, + 0x03, 0x45, 0x02, 0xBF, 0x05, 0x32, 0x02, 0x9F, 0x00, 0x43, 0x00, 0x80, 0x03, 0x46, 0x02, 0xBF, + 0x00, 0x67, 0x02, 0xBF, 0x00, 0x67, 0x00, 0x81, 0x03, 0x46, 0x19, 0x3E, 0x19, 0x3C, 0x00, 0x9F, + 0x04, 0x00, 0x00, 0xC0, 0x03, 0x45, 0x02, 0xBF, 0x05, 0x25, 0x00, 0x81, 0x03, 0x48, 0x19, 0x3E, + 0x19, 0x3C, 0x00, 0x9F, 0x04, 0x00, 0x00, 0xC0, 0x03, 0x45, 0x02, 0xBF, 0x05, 0x32, 0x02, 0x9F, + 0x00, 0x43, 0x00, 0x80, 0x03, 0x46, 0x02, 0xBF, 0x00, 0x67, 0x02, 0xBF, 0x00, 0x67, 0x00, 0x81, + 0x03, 0x46, 0x19, 0x3E, 0x19, 0x3C, 0x00, 0x9F, 0x04, 0x00, 0x00, 0xC0, 0x03, 0x45, 0x02, 0xBF, + 0x05, 0x55, 0x00, 0x81, 0x03, 0x48, 0x19, 0x3E, 0x19, 0x3C, 0x00, 0x9F, 0x04, 0x00, 0x00, 0xC0, + 0x03, 0x45, 0x02, 0xBF, 0x05, 0x32, 0x02, 0x9F, 0x00, 0x43, 0x00, 0x80, 0x03, 0x46, 0x02, 0xBF, + 0x00, 0x67, 0x02, 0xBF, 0x00, 0x67, 0x00, 0x81, 0x03, 0x46, 0x19, 0x3E, 0x19, 0x3C, 0x00, 0x9F, + 0x04, 0x00, 0x00, 0xC0, 0x03, 0x44, 0x02, 0xBF, 0x05, 0x25, 0x00, 0x81, 0x03, 0x48, 0x19, 0x3E, + 0x19, 0x3C, 0x00, 0x9F, 0x08, 0x00, 0x00, 0xC0, 0x03, 0x44, 0x02, 0xBF, 0x05, 0x25, 0x00, 0x80, + 0x04, 0x00, 0x00, 0x83, 0x08, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0xDA, 0x03, 0x45, 0x00, 0xDF, + 0x03, 0x44, 0x8F, 0x00, 0x19, 0x7B, 0xB8, 0x00, 0x19, 0x7B, 0x00, 0x7F, 0x04, 0xB2, 0x19, 0x9E, + 0xBC, 0x00, 0x80, 0xB2, 0x00, 0x00, 0x8E, 0x00, 0x00, 0x81, 0x03, 0x46, 0x19, 0x3E, 0x19, 0x3C, + 0x00, 0x9F, 0x04, 0x00, 0x00, 0xC0, 0x03, 0x44, 0x02, 0xBF, 0x05, 0x32, 0x02, 0x9F, 0x00, 0x43, + 0x00, 0x92, 0x00, 0xFF, 0x81, 0x00, 0x00, 0x80, 0x0B, 0x00, 0x10, 0xFF, 0x1B, 0x1E, 0x1B, 0x1E, + 0x81, 0x00, 0x00, 0x9F, 0x0B, 0x00, 0x00, 0x80, 0x01, 0x00, 0x02, 0xBF, 0x05, 0x73, 0x02, 0xDF, + 0x02, 0xBF, 0x04, 0xE1, 0x00, 0xDF, 0x04, 0xFB, 0x00, 0x9E, 0x0B, 0x00, 0x4C, 0x00, 0x1C, 0x1E, + 0x18, 0x1E, 0x74, 0x00, 0x1A, 0x1E, 0x02, 0xBF, 0x04, 0xEA, 0x81, 0x00, 0x00, 0xFE, 0x04, 0xFB, + 0x02, 0xDF, 0x00, 0x92, 0x00, 0xFF, 0x81, 0x00, 0x00, 0x9F, 0x0B, 0x00, 0x00, 0x80, 0x00, 0x40, + 0x02, 0x9F, 0x05, 0x55, 0x81, 0x00, 0x00, 0x9F, 0x0B, 0x00, 0x00, 0x80, 0x00, 0x50, 0x02, 0x9F, + 0x05, 0x73, 0x02, 0xBF, 0x04, 0xE1, 0x89, 0x00, 0x00, 0x80, 0x04, 0xFC, 0x81, 0x00, 0x11, 0x04, + 0x05, 0x05, 0x00, 0x00, 0x19, 0x1E, 0x00, 0x00, 0x11, 0x10, 0x05, 0x03, 0x02, 0xC0, 0x00, 0x01, + 0x02, 0x7D, 0x75, 0x00, 0x14, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0x04, 0xFC, + 0x00, 0xFE, 0x0B, 0x48, 0x00, 0xDE, 0x04, 0xFD, 0x00, 0xFE, 0x0B, 0x49, 0x00, 0xDE, 0x04, 0xFE, + 0x00, 0xFE, 0x0B, 0x4A, 0x00, 0xDE, 0x04, 0xFF, 0x00, 0xFE, 0x0B, 0x4B, 0x00, 0x9E, 0x0B, 0x00, + 0x4C, 0x00, 0x1C, 0x1E, 0x18, 0x1E, 0x74, 0x00, 0x1A, 0x1E, 0x02, 0xBF, 0x04, 0xEA, 0x02, 0xDF, + 0x02, 0xBF, 0x04, 0xEA, 0x02, 0xDF, 0x19, 0x3E, 0x19, 0x3C, 0x2F, 0xCD, 0x0F, 0x00, 0x2F, 0xC9, + 0x2E, 0xCE, 0x2C, 0xCF, 0x1F, 0xE0, 0x15, 0x01, 0x2F, 0xCB, 0x02, 0xBF, 0x05, 0x36, 0x02, 0xDF, + 0x19, 0x3E, 0x19, 0x3C, 0x2F, 0xCD, 0x0F, 0x01, 0x02, 0x9F, 0x05, 0x27, 0x26, 0xC9, 0x02, 0xA0, + 0x00, 0x04, 0x02, 0x9C, 0x05, 0x36, 0x02, 0xDF, 0x19, 0x3E, 0x19, 0x3C, 0x00, 0xFF, 0xFF, 0xCD, + 0x0F, 0x00, 0x00, 0xFF, 0xFF, 0xC9, 0x00, 0xFE, 0xFF, 0xCE, 0x00, 0xFC, 0xFF, 0xCF, 0x1F, 0xE0, + 0x15, 0x01, 0x00, 0xFF, 0xFF, 0xCB, 0x02, 0xDF, 0x00, 0xDE, 0xFF, 0xC9, 0x02, 0xA0, 0x00, 0x04, + 0x02, 0x9C, 0x05, 0x4C, 0x02, 0xDF, 0x19, 0x3E, 0x19, 0x3C, 0x02, 0x40, 0x7F, 0xFF, 0x02, 0xBF, + 0x05, 0x61, 0x00, 0x7A, 0x05, 0x5F, 0x26, 0xD3, 0x1B, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0xDF, 0x1C, 0x3F, 0x0F, 0x0A, 0x2F, 0xD1, 0x1F, 0x5E, 0x1F, 0x1C, 0x00, 0x9E, 0xFF, 0xFF, + 0x2E, 0xD6, 0x2E, 0xD7, 0x1F, 0xDA, 0x1F, 0x98, 0x14, 0x7F, 0x2E, 0xD8, 0x2C, 0xD9, 0x1F, 0x40, + 0x02, 0xDF, 0x19, 0x3E, 0x19, 0x3C, 0x00, 0x90, 0x00, 0x01, 0x02, 0xBF, 0x05, 0x61, 0x00, 0x7A, + 0x05, 0x7E, 0x19, 0x3E, 0x2E, 0xD3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xDF, + 0x00, 0x80, 0x03, 0x46, 0x02, 0xBF, 0x00, 0x67, 0x02, 0xBF, 0x00, 0x67, 0x00, 0x81, 0x03, 0x46, + 0x00, 0xDF, 0x03, 0x49, 0x03, 0x40, 0xFF, 0xFF, 0x00, 0xC0, 0x03, 0x45, 0x02, 0xBF, 0x05, 0x23, + 0x02, 0x9F, 0x00, 0x43, 0x00, 0x80, 0x03, 0x46, 0x02, 0xBF, 0x00, 0x67, 0x02, 0xBF, 0x00, 0x67, + 0x00, 0x81, 0x03, 0x46, 0x00, 0xDF, 0x03, 0x49, 0x03, 0x40, 0xFF, 0xFF, 0x00, 0xC0, 0x03, 0x45, + 0x02, 0xBF, 0x05, 0x30, 0x02, 0x9F, 0x00, 0x43, 0x00, 0x92, 0x00, 0xFF, 0x00, 0x9E, 0xFF, 0xFF, + 0x2E, 0xD4, 0x2E, 0xD5, 0x2E, 0xD6, 0x2E, 0xD7, 0x02, 0xDF, 0x00, 0xFF, 0xFF, 0xD1, 0x03, 0x40, + 0x00, 0x03, 0x79, 0x00, 0x02, 0xCA, 0x00, 0xFE, 0xFF, 0xD8, 0x00, 0xFC, 0xFF, 0xD9, 0x02, 0xDF, + 0x12, 0x05, 0x8E, 0x00, 0x00, 0xF0, 0x03, 0xFD, 0x00, 0xFC, 0x03, 0xFF, 0xF4, 0x00, 0x00, 0xFC, + 0x03, 0xFE, 0x00, 0xFA, 0x03, 0xFA, 0x81, 0x00, 0x00, 0xDE, 0xFF, 0xFE, 0x02, 0xC0, 0x80, 0x00, + 0x02, 0x9C, 0x06, 0xB9, 0x00, 0xDA, 0xFF, 0xFF, 0x86, 0x00, 0x02, 0x94, 0x06, 0x92, 0x00, 0xDE, + 0xFF, 0xFE, 0x02, 0xC0, 0x80, 0x00, 0x02, 0x9C, 0x05, 0xCF, 0x02, 0x40, 0x00, 0x0F, 0x1F, 0x5E, + 0x74, 0x00, 0x0C, 0x00, 0x14, 0x04, 0x00, 0xFE, 0x03, 0x4E, 0x1F, 0xDA, 0x1F, 0x40, 0x02, 0x00, + 0x04, 0xFC, 0x1C, 0x1E, 0x00, 0xDE, 0xFF, 0xFF, 0x1A, 0x1E, 0x1C, 0x1A, 0x00, 0xDE, 0x03, 0xFE, + 0x00, 0xDC, 0x03, 0xFF, 0x00, 0xD0, 0x03, 0xFD, 0x00, 0xDA, 0x03, 0xFA, 0x13, 0x05, 0x02, 0xFF, + 0x00, 0x9A, 0x00, 0x02, 0x00, 0xFA, 0x03, 0xA3, 0x00, 0xE0, 0x03, 0xF9, 0x02, 0xBF, 0x06, 0x7C, + 0x16, 0xFC, 0xDC, 0xD1, 0x16, 0xFD, 0x00, 0x02, 0x16, 0xFB, 0x00, 0x01, 0x00, 0x21, 0x06, 0x17, + 0x06, 0x18, 0x06, 0x58, 0x06, 0x5B, 0x00, 0xE0, 0x03, 0xF9, 0x00, 0x9E, 0x00, 0x05, 0x02, 0xBF, + 0x06, 0x6A, 0x8E, 0x00, 0x81, 0x00, 0x89, 0x00, 0x02, 0xBF, 0x06, 0x5E, 0x27, 0xFF, 0x00, 0x9E, + 0x05, 0xFF, 0x4C, 0x00, 0x1C, 0x7E, 0x03, 0x13, 0x1C, 0x7F, 0x17, 0x6F, 0x00, 0x21, 0x00, 0x21, + 0x00, 0x9A, 0x00, 0x02, 0x00, 0xFA, 0x03, 0xA3, 0x81, 0x00, 0x89, 0x00, 0x02, 0xBF, 0x06, 0x5E, + 0x24, 0xFF, 0x02, 0xBF, 0x06, 0x64, 0x25, 0xFF, 0x02, 0xBF, 0x06, 0x64, 0x27, 0xFF, 0x2E, 0xCE, + 0x2C, 0xCF, 0x16, 0xC9, 0x00, 0x01, 0x2F, 0xCD, 0x2D, 0xCB, 0x81, 0x00, 0x89, 0x00, 0x02, 0xBF, + 0x06, 0x5E, 0x24, 0xFF, 0x1C, 0x9E, 0x1C, 0xBC, 0x02, 0xBF, 0x06, 0x64, 0x25, 0xFF, 0x02, 0xBF, + 0x06, 0x64, 0x27, 0xFF, 0x1C, 0xDF, 0x1C, 0xFD, 0x81, 0x00, 0x02, 0xBF, 0x06, 0x5E, 0x26, 0xFF, + 0x1C, 0x1E, 0x89, 0x00, 0x02, 0xBF, 0x06, 0x64, 0x20, 0xFF, 0x1F, 0x5F, 0x02, 0xBF, 0x06, 0x5E, + 0x21, 0xFF, 0x02, 0xBF, 0x06, 0x5E, 0x23, 0xFF, 0x26, 0xC9, 0x02, 0xA0, 0x00, 0x04, 0x02, 0x9C, + 0x06, 0x4C, 0x12, 0x06, 0x12, 0x03, 0x12, 0x04, 0x12, 0x05, 0x02, 0x9F, 0x80, 0xB5, 0x00, 0x21, + 0x02, 0x9F, 0x80, 0x00, 0x00, 0x21, 0x00, 0xC0, 0x03, 0xF9, 0x17, 0x0F, 0x26, 0xFE, 0x02, 0xC0, + 0x80, 0x00, 0x02, 0x9C, 0x06, 0x5E, 0x02, 0xDF, 0x27, 0xFE, 0x03, 0xC0, 0x80, 0x00, 0x02, 0x9C, + 0x06, 0x64, 0x02, 0xDF, 0x02, 0xBF, 0x06, 0x82, 0x16, 0xFC, 0xDC, 0xD1, 0x2E, 0xFD, 0x16, 0xFB, + 0x00, 0x01, 0x02, 0xBF, 0x06, 0x82, 0x02, 0xDF, 0x02, 0xBF, 0x06, 0x82, 0x16, 0xFC, 0xF3, 0x55, + 0x2E, 0xFD, 0x02, 0xBF, 0x06, 0x82, 0x02, 0xDF, 0x26, 0xFC, 0x02, 0xC0, 0x80, 0x00, 0x02, 0x9D, + 0x06, 0x7C, 0x02, 0xDF, 0x27, 0xFC, 0x03, 0xC0, 0x80, 0x00, 0x02, 0x9D, 0x06, 0x82, 0x02, 0xDF, + 0x00, 0x9A, 0x02, 0x80, 0x00, 0xFA, 0x03, 0x50, 0x00, 0xFA, 0x03, 0x51, 0x0A, 0x00, 0x00, 0xFA, + 0x03, 0x52, 0x02, 0xDF, 0x00, 0xE0, 0x03, 0xFB, 0x00, 0xE8, 0x03, 0xFC, 0x00, 0xC0, 0x03, 0x50, + 0x00, 0x88, 0x00, 0x2F, 0x1B, 0x1A, 0x00, 0xDE, 0xFF, 0xFE, 0x02, 0xC0, 0x80, 0x00, 0x02, 0x9C, + 0x06, 0x9B, 0x00, 0xDC, 0xFF, 0xFF, 0x1B, 0x1E, 0x1B, 0x1C, 0x1F, 0xDA, 0x78, 0x00, 0x1F, 0x5E, + 0x86, 0x00, 0x02, 0x94, 0x06, 0x9B, 0x81, 0x00, 0x00, 0xDE, 0x03, 0x52, 0x74, 0x00, 0x00, 0xFE, + 0x03, 0x52, 0x00, 0xE0, 0x03, 0x50, 0x00, 0xC0, 0x03, 0xFB, 0x00, 0xC8, 0x03, 0xFC, 0x02, 0x9F, + 0x05, 0xE6, 0x00, 0xE0, 0x03, 0xFB, 0x00, 0xE8, 0x03, 0xFC, 0x00, 0xC0, 0x03, 0x50, 0x00, 0x88, + 0x00, 0x2F, 0x0A, 0x00, 0x1B, 0x1A, 0x02, 0x9F, 0x06, 0xAB, 0x00, 0xC0, 0x03, 0x51, 0x00, 0x88, + 0x00, 0x2F, 0x00, 0xDA, 0x03, 0x52, 0x86, 0x00, 0x02, 0x95, 0x06, 0xED, 0x12, 0x05, 0x00, 0xDA, + 0x03, 0x52, 0x1F, 0xDA, 0x78, 0x00, 0x00, 0xFE, 0x03, 0x52, 0x13, 0x05, 0x00, 0x81, 0x03, 0x56, + 0x19, 0x1E, 0x02, 0xC0, 0x80, 0x00, 0x02, 0x9D, 0x06, 0xF1, 0x1F, 0x5E, 0x86, 0x00, 0x02, 0x95, + 0x06, 0xF5, 0x00, 0x7A, 0x06, 0xE6, 0x19, 0x1E, 0x1B, 0x3E, 0x19, 0x1E, 0x1B, 0x3E, 0x00, 0xE0, + 0x03, 0x51, 0x00, 0x88, 0xFF, 0xFF, 0x02, 0x9F, 0x00, 0x2F, 0x00, 0x88, 0xFF, 0xFF, 0x02, 0x9F, + 0x00, 0x2D, 0x00, 0xE0, 0x03, 0x51, 0x02, 0x9F, 0x06, 0xC9, 0x00, 0x80, 0x06, 0xC5, 0x02, 0x9F, + 0x05, 0xF0, 0x81, 0x00, 0x0E, 0x10, 0x22, 0x32, 0x86, 0x00, 0x02, 0xD5, 0x54, 0x00, 0x02, 0x00, + 0x04, 0x58, 0x1C, 0x1E, 0x1F, 0xDA, 0x04, 0xFE, 0x1F, 0x1E, 0x19, 0x1E, 0x02, 0x91, 0x07, 0x0C, + 0x19, 0x1A, 0x00, 0x58, 0x64, 0xA0, 0x64, 0x33, 0x1B, 0x7E, 0x02, 0xDF, 0x02, 0xBF, 0x06, 0xF9, + 0x81, 0x00, 0x26, 0x32, 0x5C, 0x00, 0x2E, 0x32, 0x00, 0x92, 0x00, 0xFF, 0x02, 0xDF, 0x00, 0xDE, + 0x04, 0xFB, 0x74, 0x00, 0x00, 0xFE, 0x04, 0xFB, 0x81, 0x00, 0x2E, 0x32, 0x2E, 0x66, 0x2E, 0x67, + 0x26, 0x8A, 0x24, 0x8B, 0x2E, 0x3A, 0x2C, 0x3B, 0x26, 0x8C, 0x24, 0x8D, 0x2E, 0x38, 0x2C, 0x39, + 0x02, 0xDF, 0x81, 0x00, 0x26, 0x89, 0x02, 0x40, 0x00, 0x0F, 0x1F, 0x5E, 0x81, 0x00, 0x0E, 0x10, + 0x54, 0x00, 0x2E, 0x32, 0x26, 0x8A, 0x24, 0x8B, 0x22, 0x88, 0x20, 0x89, 0x58, 0x00, 0x0A, 0x00, + 0x20, 0x32, 0x58, 0x00, 0x2E, 0x3A, 0x2C, 0x3B, 0x02, 0xDF, 0x00, 0x92, 0x00, 0x04, 0x81, 0x00, + 0x26, 0x04, 0xB1, 0x00, 0x02, 0xB4, 0x07, 0x17, 0x81, 0x00, 0x26, 0x01, 0xB1, 0x00, 0x02, 0x94, + 0x07, 0xE5, 0x22, 0x32, 0xC9, 0x00, 0x02, 0x93, 0x07, 0x0E, 0x55, 0x00, 0x02, 0xBF, 0x06, 0xF9, + 0x22, 0x3A, 0x86, 0x00, 0x02, 0x94, 0x07, 0x59, 0x81, 0x00, 0x26, 0x3B, 0x82, 0x00, 0x02, 0x91, + 0x07, 0xAB, 0x81, 0x00, 0x1F, 0xDF, 0x04, 0x0F, 0x14, 0x7C, 0x1F, 0x7E, 0x0C, 0x00, 0x14, 0x04, + 0x1F, 0x1E, 0x0A, 0x00, 0x81, 0x00, 0x26, 0x3A, 0x24, 0x3B, 0x58, 0x00, 0x02, 0x90, 0x07, 0x71, + 0x81, 0x00, 0x26, 0x3B, 0x5C, 0x00, 0x2E, 0x32, 0x81, 0x00, 0x2E, 0x3A, 0x2E, 0x3B, 0x02, 0x9F, + 0x07, 0x77, 0x2E, 0x3A, 0x2C, 0x3B, 0x0C, 0x00, 0x1F, 0xD8, 0x5C, 0x00, 0x2E, 0x32, 0x81, 0x00, + 0x1F, 0xDB, 0x02, 0xBF, 0x07, 0xEB, 0x22, 0x32, 0x86, 0x00, 0x02, 0x95, 0x07, 0xA8, 0x0A, 0x10, + 0x81, 0x00, 0x1F, 0xC3, 0x54, 0x00, 0x1C, 0x7E, 0x00, 0x80, 0x04, 0x58, 0x19, 0x7E, 0x19, 0x7A, + 0x10, 0x0E, 0x64, 0xA2, 0x1B, 0x1E, 0x1B, 0x1A, 0x81, 0x00, 0x26, 0x3A, 0x24, 0x3B, 0xB1, 0x00, + 0x02, 0x94, 0x07, 0xA8, 0x22, 0x32, 0x86, 0x00, 0x02, 0x95, 0x07, 0xA8, 0x00, 0x80, 0x04, 0x67, + 0x81, 0x00, 0x26, 0x8B, 0xB1, 0x00, 0x02, 0x95, 0x07, 0xA8, 0x02, 0x00, 0x00, 0x0F, 0x02, 0x40, + 0x00, 0x0F, 0x02, 0x00, 0x04, 0x58, 0x1C, 0x7E, 0x00, 0x7A, 0x07, 0xA7, 0x18, 0xFE, 0x1A, 0x9E, + 0x00, 0x92, 0x00, 0xFF, 0x02, 0xDF, 0xB1, 0x00, 0x02, 0x95, 0x07, 0xBB, 0x5D, 0x00, 0x04, 0x0F, + 0x14, 0x7C, 0x0C, 0x00, 0x00, 0xE3, 0x03, 0x63, 0x02, 0xBF, 0x07, 0xEB, 0x00, 0xDE, 0x03, 0x63, + 0x22, 0x3B, 0x44, 0x00, 0x1C, 0x7E, 0x81, 0x00, 0x26, 0x81, 0xB1, 0x00, 0x02, 0x95, 0x07, 0xE3, + 0x23, 0x80, 0x26, 0x88, 0x24, 0x89, 0x14, 0x08, 0x14, 0xF4, 0x23, 0x80, 0x8D, 0x00, 0xC8, 0x10, + 0xAE, 0x00, 0x8C, 0x00, 0xF0, 0x00, 0x4E, 0x00, 0x23, 0x8C, 0x21, 0x8D, 0x4A, 0x00, 0x2E, 0x38, + 0x2C, 0x39, 0x26, 0x82, 0x2E, 0x67, 0x26, 0x83, 0x2E, 0x66, 0x00, 0xE3, 0x03, 0x63, 0x00, 0x83, + 0x04, 0x58, 0x81, 0x00, 0x0E, 0x01, 0x02, 0xBF, 0x07, 0xEB, 0x00, 0xC3, 0x03, 0x63, 0x02, 0xBF, + 0x07, 0x29, 0x02, 0x9F, 0x07, 0x49, 0x0E, 0x01, 0x2E, 0x01, 0x81, 0x00, 0x00, 0x5F, 0x1B, 0x7E, + 0x00, 0x92, 0x00, 0xFF, 0x02, 0xDF, 0x00, 0xFF, 0x03, 0x60, 0x00, 0xFE, 0x03, 0x61, 0x26, 0x38, + 0x24, 0x39, 0x0F, 0x05, 0x02, 0xBF, 0x05, 0xAD, 0x26, 0x38, 0x24, 0x39, 0x89, 0x00, 0x00, 0xDF, + 0x03, 0x61, 0x22, 0x80, 0xD0, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x2E, 0x38, 0x2C, 0x39, 0x81, 0x00, + 0x00, 0xDE, 0x03, 0x61, 0x00, 0x7E, 0x08, 0x6B, 0x00, 0x80, 0xFF, 0xD3, 0x00, 0x84, 0x00, 0x00, + 0x19, 0x9E, 0x89, 0x00, 0x1F, 0xFE, 0x14, 0x01, 0x02, 0x40, 0x00, 0x1E, 0x02, 0x00, 0x03, 0x00, + 0x1C, 0x3E, 0x15, 0x7C, 0x03, 0x40, 0x00, 0x0F, 0x0A, 0x11, 0x55, 0x00, 0x81, 0x00, 0x26, 0x80, + 0x06, 0x05, 0x02, 0x95, 0x08, 0x32, 0x00, 0x9A, 0x00, 0xF0, 0x0B, 0x0F, 0x00, 0x82, 0x03, 0x64, + 0x19, 0x98, 0x60, 0x00, 0x11, 0x07, 0x08, 0x29, 0x34, 0x00, 0x14, 0x08, 0x60, 0x32, 0x36, 0x44, + 0x14, 0x0C, 0x60, 0x32, 0x34, 0x00, 0x14, 0x08, 0x60, 0x32, 0x36, 0x00, 0x14, 0x0C, 0x1B, 0x5E, + 0x02, 0x9F, 0x08, 0x52, 0x00, 0x9A, 0xC0, 0x00, 0x00, 0x82, 0x03, 0x64, 0x19, 0x98, 0x60, 0x00, + 0x11, 0x03, 0x08, 0x45, 0x14, 0x08, 0x34, 0x00, 0x60, 0x32, 0x14, 0x0A, 0x34, 0x00, 0x60, 0x32, + 0x14, 0x0C, 0x34, 0x00, 0x60, 0x32, 0x14, 0x0E, 0x34, 0x44, 0x60, 0x32, 0x14, 0x08, 0x34, 0x00, + 0x60, 0x32, 0x14, 0x0A, 0x34, 0x00, 0x60, 0x32, 0x14, 0x0C, 0x34, 0x00, 0x60, 0x32, 0x14, 0x0E, + 0x34, 0x00, 0x1B, 0x5E, 0x8F, 0x00, 0x1F, 0x7F, 0x20, 0x66, 0x27, 0x67, 0x19, 0x3A, 0x19, 0x39, + 0x00, 0x80, 0x03, 0x64, 0x1C, 0x80, 0xA0, 0x00, 0xEA, 0x70, 0x11, 0x08, 0x08, 0x66, 0x3A, 0x93, + 0xA4, 0x78, 0x14, 0x85, 0xE8, 0x33, 0x3B, 0x92, 0xA5, 0x70, 0x15, 0x85, 0xEA, 0x3B, 0x2F, 0x67, + 0x8E, 0x00, 0x1F, 0xF8, 0x2F, 0x66, 0x89, 0x00, 0x00, 0xDF, 0x03, 0x60, 0x02, 0xDF, 0xB1, 0x00, + 0x02, 0xD5, 0x04, 0xFE, 0x1F, 0x1E, 0x19, 0x1E, 0x02, 0x91, 0x08, 0x7A, 0x19, 0x1A, 0x00, 0x58, + 0x64, 0xA0, 0x64, 0x33, 0x1B, 0x7E, 0x02, 0xDF, 0x81, 0x00, 0x1F, 0x5E, 0x00, 0xD8, 0x04, 0x02, + 0x00, 0xDC, 0x04, 0x30, 0x00, 0x80, 0x05, 0x20, 0x00, 0xDF, 0x04, 0x80, 0x15, 0x01, 0x03, 0x40, + 0x00, 0x7E, 0x03, 0x00, 0x08, 0x91, 0x1C, 0x5F, 0x17, 0x5F, 0x00, 0xFC, 0x04, 0x30, 0x02, 0x9F, + 0x02, 0xD8, 0x02, 0x9F, 0x08, 0xB2, 0x02, 0x9F, 0x08, 0xED, 0x02, 0x9F, 0x08, 0xD5, 0x02, 0x9F, + 0x08, 0xC2, 0x02, 0x9F, 0x08, 0xFB, 0x02, 0x9F, 0x08, 0xB1, 0x02, 0x9F, 0x09, 0x19, 0x02, 0x9F, + 0x09, 0x1C, 0x02, 0x9F, 0x08, 0xB1, 0x02, 0x9F, 0x08, 0xB1, 0x02, 0x9F, 0x09, 0x3A, 0x02, 0x9F, + 0x08, 0xF3, 0x02, 0x9F, 0x08, 0xF7, 0x02, 0x9F, 0x08, 0xB1, 0x02, 0x9F, 0x08, 0xB1, 0x02, 0x9F, + 0x08, 0xB1, 0x02, 0xDF, 0x14, 0x01, 0x00, 0x9B, 0xC0, 0x00, 0x00, 0x99, 0x40, 0x00, 0x11, 0x50, + 0x08, 0xBF, 0x02, 0xC0, 0x00, 0x01, 0x02, 0x7C, 0x1B, 0x1B, 0x02, 0x7D, 0x1B, 0x19, 0x48, 0x00, + 0x14, 0x7F, 0x02, 0xDF, 0x14, 0x02, 0x89, 0x00, 0x1F, 0xB8, 0x15, 0x01, 0x00, 0x9B, 0xC0, 0x00, + 0x00, 0x99, 0x40, 0x00, 0x11, 0x50, 0x08, 0xD2, 0x02, 0xC0, 0x00, 0x03, 0x02, 0x7C, 0x1B, 0x1B, + 0x02, 0x7D, 0x1B, 0x19, 0x4C, 0x00, 0x14, 0x7E, 0x02, 0xDF, 0x14, 0x01, 0x00, 0x81, 0x0C, 0xA0, + 0x00, 0x9B, 0xC0, 0x00, 0x00, 0x99, 0x40, 0x00, 0x89, 0x00, 0x00, 0x82, 0x00, 0x00, 0x11, 0x50, + 0x08, 0xEA, 0x02, 0xC0, 0x00, 0x01, 0x02, 0x7C, 0x1B, 0x1B, 0x02, 0x7D, 0x1B, 0x19, 0x18, 0x3D, + 0x49, 0x00, 0x1F, 0xE2, 0x4C, 0x39, 0x14, 0x7F, 0x02, 0xDF, 0x89, 0x00, 0x1F, 0xB8, 0x15, 0x7F, + 0x10, 0x50, 0x4C, 0x20, 0x02, 0xDF, 0x00, 0x82, 0x01, 0x80, 0x02, 0x9F, 0x08, 0xFD, 0x00, 0x82, + 0x01, 0xC0, 0x02, 0x9F, 0x08, 0xFD, 0x00, 0x82, 0x01, 0x40, 0x00, 0x8A, 0x00, 0x3F, 0x00, 0x86, + 0x00, 0x00, 0x14, 0x06, 0x89, 0x00, 0x1F, 0xB8, 0x15, 0x05, 0x00, 0x9B, 0x00, 0x3F, 0x00, 0x9A, + 0x00, 0x00, 0x36, 0x00, 0x1C, 0xDE, 0x00, 0x1A, 0x34, 0x00, 0x11, 0x50, 0x09, 0x13, 0x4C, 0x4A, + 0x36, 0x06, 0x1C, 0xDE, 0x34, 0x0E, 0x1B, 0x19, 0x1F, 0xC2, 0x14, 0x7A, 0x00, 0x8A, 0xFF, 0xFF, + 0x02, 0xDF, 0x10, 0x50, 0x1B, 0x18, 0x02, 0xDF, 0x00, 0x82, 0x01, 0x00, 0x00, 0x8A, 0x00, 0x3F, + 0x00, 0x86, 0x00, 0x00, 0x14, 0x06, 0x89, 0x00, 0x1F, 0xB8, 0x15, 0x05, 0x00, 0x9B, 0x00, 0x3F, + 0x00, 0x9A, 0x00, 0x00, 0x36, 0x00, 0x1C, 0xDE, 0x00, 0x1A, 0x34, 0x00, 0x11, 0x50, 0x09, 0x34, + 0x4C, 0x4A, 0x36, 0x06, 0x1C, 0xDE, 0x34, 0x0E, 0x1B, 0x19, 0x1F, 0xC2, 0x14, 0x7A, 0x00, 0x8A, + 0xFF, 0xFF, 0x02, 0xDF, 0x00, 0x82, 0x01, 0x00, 0x00, 0x8A, 0x00, 0x3F, 0x00, 0x86, 0x00, 0x00, + 0x00, 0x81, 0x0C, 0xA0, 0x14, 0x06, 0x89, 0x00, 0x1F, 0xB8, 0x15, 0x05, 0x00, 0x9B, 0x00, 0x3F, + 0x00, 0x9A, 0x00, 0x00, 0x36, 0x00, 0x1C, 0xDE, 0x00, 0x1A, 0x34, 0x00, 0x11, 0x50, 0x09, 0x59, + 0x19, 0x39, 0xA0, 0x00, 0x14, 0x0A, 0x4E, 0x00, 0x14, 0x76, 0x4C, 0x4A, 0x36, 0x06, 0x1C, 0xDE, + 0x34, 0x0E, 0x1B, 0x19, 0x1F, 0xC2, 0x14, 0x7A, 0x00, 0x8A, 0xFF, 0xFF, 0x02, 0xDF, 0x00, 0x80, + 0x01, 0xBE, 0x19, 0x18, 0x19, 0x1A, 0x00, 0x80, 0x01, 0x80, 0x00, 0x83, 0x01, 0x80, 0x90, 0x70, + 0x1F, 0xFE, 0x11, 0x20, 0x09, 0x70, 0x7C, 0x00, 0xD4, 0x50, 0x65, 0x33, 0xC5, 0x50, 0x15, 0x01, + 0x64, 0x3B, 0x00, 0x80, 0x01, 0xFE, 0x19, 0x1A, 0x19, 0x18, 0x00, 0x80, 0x01, 0xC0, 0x00, 0x83, + 0x01, 0xC0, 0x1F, 0xF8, 0x90, 0x70, 0xF8, 0x00, 0x02, 0x40, 0x01, 0xFF, 0x02, 0x60, 0x20, 0x00, + 0x02, 0xBF, 0x09, 0x83, 0x02, 0xDF, 0xB9, 0x00, 0x02, 0x72, 0x7C, 0x00, 0x1F, 0x7E, 0x47, 0x00, + 0x11, 0x10, 0x09, 0x8D, 0x47, 0x3B, 0x47, 0x3B, 0x47, 0x3B, 0x47, 0x3B, 0x02, 0xDF, 0x00, 0x92, + 0x00, 0x04, 0x20, 0x02, 0x81, 0x00, 0x89, 0x00, 0x24, 0x30, 0x8D, 0x00, 0x09, 0x50, 0xA0, 0x00, + 0xA4, 0x00, 0x14, 0x04, 0x8C, 0x00, 0x1F, 0xFE, 0x00, 0x83, 0x05, 0x80, 0x22, 0x01, 0x86, 0x00, + 0x02, 0x94, 0x09, 0xB1, 0x22, 0x04, 0x86, 0x00, 0x02, 0xB4, 0x09, 0xF9, 0x81, 0x00, 0x26, 0x05, + 0xB1, 0x00, 0x02, 0x95, 0x09, 0xBE, 0x81, 0x00, 0x2E, 0x05, 0x22, 0x81, 0x86, 0x00, 0x02, 0x94, + 0x09, 0xB8, 0x81, 0x00, 0x00, 0x5F, 0x1B, 0x7E, 0x74, 0x00, 0x2E, 0x01, 0x02, 0x9F, 0x09, 0xF2, + 0x26, 0x88, 0x24, 0x89, 0x2E, 0x34, 0x2C, 0x35, 0x02, 0xBF, 0x09, 0xF9, 0x00, 0xFF, 0x03, 0x60, + 0x26, 0x38, 0x24, 0x39, 0x0F, 0x05, 0x02, 0xBF, 0x05, 0xAD, 0x00, 0xDF, 0x03, 0x60, 0x81, 0x00, + 0x26, 0x3A, 0xB1, 0x00, 0x02, 0x94, 0x09, 0xD9, 0x26, 0x3B, 0x5C, 0x00, 0x02, 0x90, 0x09, 0xD9, + 0x22, 0x3B, 0x02, 0xBF, 0x0A, 0x0A, 0x55, 0x00, 0x0A, 0x01, 0x00, 0xFA, 0x04, 0x05, 0x02, 0x9F, + 0x09, 0xAB, 0x1F, 0x5F, 0x02, 0xBF, 0x0A, 0x0A, 0x00, 0xFA, 0x03, 0x62, 0x81, 0x00, 0x26, 0x3A, + 0x24, 0x3B, 0x15, 0x70, 0x0A, 0x01, 0x00, 0x81, 0x04, 0x05, 0x5C, 0x00, 0xB1, 0x00, 0x02, 0x75, + 0x1A, 0x3A, 0x2E, 0x3A, 0x2C, 0x3B, 0x26, 0x38, 0x24, 0x39, 0x00, 0xD8, 0x03, 0x62, 0x70, 0x00, + 0x2C, 0x39, 0x2E, 0x38, 0x00, 0x92, 0x00, 0xFF, 0x02, 0x9F, 0x02, 0xD0, 0x81, 0x00, 0x2E, 0x34, + 0x2E, 0x35, 0x23, 0x34, 0x21, 0x35, 0x26, 0x8A, 0x24, 0x8B, 0x5A, 0x00, 0x2E, 0x3A, 0x2C, 0x3B, + 0x26, 0x34, 0x24, 0x35, 0x23, 0x8C, 0x21, 0x8D, 0x4A, 0x00, 0x2E, 0x38, 0x2C, 0x39, 0x81, 0x00, + 0x2E, 0x05, 0x02, 0xDF, 0x00, 0x80, 0xFF, 0xD3, 0x00, 0x84, 0x00, 0x00, 0x00, 0x7A, 0x0A, 0x12, + 0x19, 0x9E, 0x14, 0x88, 0x1B, 0x7E, 0x02, 0xDF, 0x00, 0x92, 0x00, 0x04, 0x20, 0x02, 0x81, 0x00, + 0x89, 0x00, 0x24, 0x30, 0x8D, 0x00, 0x09, 0x50, 0xA0, 0x00, 0xA4, 0x00, 0x14, 0x04, 0x8C, 0x00, + 0x1F, 0xFE, 0x00, 0x83, 0x05, 0x80, 0x22, 0x01, 0x86, 0x00, 0x02, 0x94, 0x0A, 0x36, 0x22, 0x04, + 0x86, 0x00, 0x02, 0xB4, 0x0A, 0x7F, 0x81, 0x00, 0x26, 0x05, 0xB1, 0x00, 0x02, 0x95, 0x0A, 0x43, + 0x81, 0x00, 0x2E, 0x05, 0x22, 0x81, 0x86, 0x00, 0x02, 0x94, 0x0A, 0x3D, 0x81, 0x00, 0x00, 0x5F, + 0x1B, 0x7E, 0x74, 0x00, 0x2E, 0x01, 0x02, 0x9F, 0x0A, 0x78, 0x26, 0x88, 0x24, 0x89, 0x2E, 0x34, + 0x2C, 0x35, 0x02, 0xBF, 0x0A, 0x7F, 0x00, 0xFF, 0x03, 0x60, 0x26, 0x38, 0x24, 0x39, 0x0F, 0x06, + 0x02, 0xBF, 0x05, 0xAD, 0x00, 0xDF, 0x03, 0x60, 0x81, 0x00, 0x26, 0x3A, 0xB1, 0x00, 0x02, 0x94, + 0x0A, 0x5E, 0x26, 0x3B, 0x5C, 0x00, 0x02, 0x90, 0x0A, 0x5E, 0x22, 0x3B, 0x02, 0xBF, 0x0A, 0x91, + 0x55, 0x00, 0x0A, 0x01, 0x00, 0xFA, 0x04, 0x05, 0x02, 0x9F, 0x0A, 0x30, 0x1F, 0x5F, 0x02, 0xBF, + 0x0A, 0x91, 0x00, 0xFA, 0x03, 0x62, 0x81, 0x00, 0x26, 0x3A, 0x24, 0x3B, 0x15, 0x70, 0x0A, 0x01, + 0x00, 0x81, 0x04, 0x05, 0x5C, 0x00, 0xB1, 0x00, 0x02, 0x75, 0x1A, 0x3A, 0x2E, 0x3A, 0x2C, 0x3B, + 0x26, 0x38, 0x24, 0x39, 0x00, 0xD8, 0x03, 0x62, 0x70, 0x00, 0x70, 0x00, 0x2C, 0x39, 0x2E, 0x38, + 0x00, 0x92, 0x00, 0xFF, 0x02, 0x9F, 0x02, 0xD0, 0x81, 0x00, 0x2E, 0x34, 0x2E, 0x35, 0x23, 0x34, + 0x21, 0x35, 0x26, 0x8A, 0x24, 0x8B, 0x5A, 0x00, 0x2E, 0x3A, 0x2C, 0x3B, 0x26, 0x34, 0x24, 0x35, + 0x14, 0x01, 0x23, 0x8C, 0x21, 0x8D, 0x4A, 0x00, 0x2E, 0x38, 0x2C, 0x39, 0x81, 0x00, 0x2E, 0x05, + 0x02, 0xDF, 0x00, 0x80, 0xFF, 0xD3, 0x00, 0x84, 0x00, 0x00, 0x00, 0x7A, 0x0A, 0x98, 0x19, 0x9E, + 0x1B, 0x7E, 0x02, 0xDF, 0x89, 0x00, 0x0F, 0x50, 0x00, 0x83, 0x05, 0x20, 0x02, 0xBF, 0x0A, 0xB3, + 0x02, 0x9F, 0x02, 0xD8, 0x00, 0xD8, 0x04, 0x02, 0x81, 0x00, 0x89, 0x00, 0x00, 0xDC, 0x04, 0x30, + 0x0A, 0x50, 0x90, 0x00, 0x94, 0x00, 0x14, 0x04, 0x1F, 0xFE, 0x00, 0x83, 0x05, 0x80, 0x02, 0xBF, + 0x0A, 0xB3, 0x02, 0x9F, 0x02, 0xD0, 0x00, 0x92, 0x00, 0x04, 0x81, 0x00, 0x26, 0x3A, 0x24, 0x3B, + 0x1F, 0x1F, 0x0A, 0x00, 0x58, 0x00, 0x02, 0x92, 0x0A, 0xD1, 0x89, 0x00, 0x00, 0xC0, 0x04, 0x3B, + 0x02, 0xBF, 0x0A, 0xF6, 0x81, 0x00, 0x1F, 0xD8, 0x22, 0x3B, 0x54, 0x00, 0x00, 0x07, 0x19, 0x79, + 0x00, 0x5E, 0x1B, 0x79, 0x0F, 0x01, 0x2F, 0x01, 0x89, 0x00, 0x2F, 0x3B, 0x00, 0x92, 0x00, 0xFF, + 0x02, 0xDF, 0x2E, 0x3A, 0x2C, 0x3B, 0x81, 0x00, 0x89, 0x00, 0x26, 0x8A, 0x27, 0x34, 0x5C, 0x00, + 0x2E, 0x36, 0x50, 0x00, 0x02, 0x90, 0x0A, 0xF0, 0x00, 0xC0, 0x04, 0x36, 0x02, 0xBF, 0x0A, 0xF6, + 0x81, 0x00, 0x1F, 0xD8, 0x22, 0x36, 0x54, 0x00, 0x1C, 0x1E, 0x81, 0x00, 0x2E, 0x34, 0x26, 0x88, + 0x24, 0x89, 0x2E, 0x8C, 0x2C, 0x8D, 0x02, 0xBF, 0x0A, 0xF6, 0x00, 0x92, 0x00, 0xFF, 0x02, 0xDF, + 0x1C, 0x18, 0x02, 0xBF, 0x0A, 0xF6, 0x00, 0x92, 0x00, 0xFF, 0x02, 0xDF, 0x81, 0x00, 0x1F, 0xC0, + 0xB1, 0x00, 0x02, 0xD5, 0x89, 0x00, 0x27, 0x34, 0x03, 0x40, 0x00, 0x01, 0x0B, 0x00, 0x1F, 0x3F, + 0x26, 0x8C, 0x24, 0x8D, 0x89, 0x00, 0x25, 0x34, 0x15, 0x01, 0x4C, 0x00, 0x5A, 0x00, 0x5A, 0x00, + 0x1C, 0x20, 0x1F, 0xE0, 0x05, 0x02, 0x1C, 0x1F, 0x00, 0x9F, 0x0B, 0x00, 0x00, 0x92, 0x00, 0xFF, + 0x02, 0xBF, 0x05, 0x25, 0x00, 0x92, 0x00, 0x04, 0x27, 0x34, 0x1F, 0x61, 0x47, 0x00, 0x2F, 0x34, + 0x00, 0x80, 0x0B, 0x00, 0x89, 0x00, 0x1F, 0xF9, 0xB9, 0x00, 0x02, 0x74, 0x00, 0x08, 0x89, 0x00, + 0x1F, 0xE1, 0x19, 0x1E, 0x07, 0x01, 0x02, 0x93, 0x0B, 0x2C, 0x19, 0x1A, 0x05, 0xFE, 0x00, 0x5F, + 0x64, 0xA0, 0x1B, 0x7E, 0x1B, 0x7A, 0x02, 0xDF, 0x1B, 0x7E, 0x02, 0xDF, 0x8A, 0x00, 0x00, 0x83, + 0x03, 0xE8, 0x19, 0x1E, 0x19, 0x1A, 0x10, 0x06, 0x64, 0xA0, 0x1B, 0x7E, 0x1B, 0x7A, 0x00, 0x80, + 0x03, 0xE8, 0x00, 0x88, 0x00, 0x07, 0x11, 0x50, 0x0B, 0x48, 0x1C, 0x61, 0x84, 0xC3, 0xF2, 0xC3, + 0xF2, 0xC3, 0xF2, 0xC3, 0xF2, 0xC3, 0xF2, 0xC3, 0xF2, 0xC3, 0xF2, 0xC3, 0xF2, 0x00, 0xFE, 0x00, + 0x1B, 0x3E, 0x00, 0x88, 0xFF, 0xFF, 0x8B, 0x00, 0x02, 0xDF, 0x8A, 0x00, 0x05, 0xFE, 0x00, 0x83, + 0x03, 0xE8, 0x19, 0x1E, 0x19, 0x1A, 0x00, 0x5F, 0x64, 0xA0, 0x1B, 0x7E, 0x1B, 0x7A, 0x00, 0x80, + 0x03, 0xE8, 0x05, 0x01, 0x1D, 0x1F, 0x11, 0x50, 0x0B, 0x63, 0x1C, 0x61, 0x84, 0xC3, 0x00, 0x5F, + 0xF2, 0xC3, 0xF2, 0x00, 0xFE, 0x00, 0x1B, 0x3E, 0x00, 0x88, 0xFF, 0xFF, 0x8B, 0x00, 0x02, 0xDF, + 0x00, 0x83, 0x03, 0xE8, 0x19, 0x1E, 0x19, 0x1A, 0x64, 0xA0, 0x64, 0xA0, 0x1B, 0x7E, 0x1B, 0x7A, + 0x00, 0x80, 0x03, 0xE8, 0x00, 0x88, 0x00, 0x03, 0x00, 0x85, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, + 0x1F, 0xC2, 0x19, 0x5B, 0x19, 0x59, 0x19, 0x5F, 0x19, 0x5A, 0x1C, 0x5E, 0x1F, 0xDA, 0x1C, 0x61, + 0x8A, 0x00, 0x8F, 0x00, 0x19, 0x1A, 0xB8, 0x50, 0xE2, 0x50, 0xEA, 0x50, 0xE8, 0xE8, 0xB6, 0x50, + 0x11, 0x27, 0x0B, 0x93, 0xE3, 0xA8, 0x19, 0x7E, 0xE8, 0x50, 0xEA, 0xF8, 0xBF, 0x50, 0xE2, 0xA9, + 0x19, 0x7F, 0xEA, 0x50, 0xE8, 0xE8, 0xB6, 0x50, 0xE3, 0xA8, 0x19, 0x7E, 0xE8, 0x50, 0xEA, 0xF8, + 0xBF, 0x00, 0x1B, 0xFF, 0x19, 0x7F, 0x8E, 0x00, 0x8B, 0x00, 0x00, 0x88, 0xFF, 0xFF, 0x1B, 0x5B, + 0x1B, 0x59, 0x1B, 0x5F, 0x1B, 0x5E, 0x02, 0xDF, 0x00, 0x83, 0x03, 0xE8, 0x19, 0x1E, 0x19, 0x1A, + 0x64, 0xA0, 0x64, 0xA0, 0x1B, 0x7E, 0x1B, 0x7A, 0x00, 0x80, 0x03, 0xE8, 0x00, 0x88, 0x00, 0x03, + 0x00, 0x85, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x1F, 0xC2, 0x19, 0x5B, 0x19, 0x59, 0x19, 0x5F, + 0x19, 0x5A, 0x1C, 0x5E, 0x1F, 0xDA, 0x1C, 0x61, 0x8A, 0x00, 0x8F, 0x00, 0x19, 0x1A, 0xB8, 0x00, + 0xE3, 0x50, 0xE2, 0x50, 0xEA, 0x00, 0xEA, 0x50, 0xE8, 0x77, 0xEC, 0xE8, 0xB2, 0x00, 0x11, 0x27, + 0x0B, 0xD8, 0xE2, 0x50, 0xE3, 0xA8, 0x19, 0x7E, 0xE8, 0x00, 0xE8, 0x50, 0xEA, 0x7F, 0xEE, 0xF8, + 0xBB, 0x00, 0xE3, 0x50, 0xE2, 0xA9, 0x19, 0x7F, 0xEA, 0x00, 0xEA, 0x50, 0xE8, 0x77, 0xEC, 0xE8, + 0xB2, 0x00, 0xE2, 0x50, 0xE3, 0xA8, 0x19, 0x7E, 0xE8, 0x00, 0xE8, 0x50, 0xEA, 0x7F, 0xEE, 0xF8, + 0xBB, 0x00, 0x1B, 0xFF, 0x19, 0x7F, 0x8E, 0x00, 0x8B, 0x00, 0x00, 0x88, 0xFF, 0xFF, 0x1B, 0x5B, + 0x1B, 0x59, 0x1B, 0x5F, 0x1B, 0x5E, 0x02, 0xDF, 0x0E, 0xFF, 0x00, 0xFE, 0x03, 0xF2, 0x81, 0x00, + 0x00, 0xFE, 0x03, 0xF0, 0x00, 0xFE, 0x03, 0xF6, 0x00, 0x9E, 0x01, 0x00, 0x00, 0xFE, 0x03, 0xF7, + 0x00, 0xDA, 0x03, 0xF7, 0x00, 0x9E, 0x80, 0x00, 0x54, 0x00, 0x00, 0xFE, 0x03, 0xF5, 0x0E, 0x30, + 0x00, 0xFE, 0x03, 0xF3, 0x0E, 0x10, 0x00, 0xFE, 0x03, 0xF4, 0x00, 0x9E, 0x00, 0x96, 0x00, 0xFE, + 0x03, 0xF1, 0x02, 0xDF, 0x00, 0x80, 0x0A, 0x00, 0x81, 0x00, 0x00, 0xDE, 0x03, 0xF0, 0x89, 0x00, + 0xB1, 0x00, 0x02, 0x75, 0x05, 0x50, 0x00, 0xFF, 0x03, 0xF0, 0x02, 0x00, 0x0A, 0x60, 0x1C, 0x7E, + 0x0F, 0x4E, 0x02, 0xBF, 0x00, 0xDA, 0x02, 0xDF, 0x00, 0xDE, 0x03, 0xF1, 0x02, 0x00, 0x0A, 0x60, + 0x1C, 0x7E, 0x81, 0x00, 0x89, 0x00, 0x00, 0x9F, 0x00, 0xA0, 0x00, 0xDE, 0x03, 0xF1, 0x5D, 0x00, + 0x0E, 0x50, 0x07, 0x50, 0x02, 0x70, 0x5D, 0x00, 0x00, 0xDA, 0x03, 0xF2, 0x86, 0x00, 0x02, 0x90, + 0x0C, 0x4D, 0x00, 0xDE, 0x03, 0xF3, 0x5C, 0x00, 0x02, 0x93, 0x0C, 0x38, 0x02, 0x9F, 0x0C, 0x52, + 0x00, 0xDB, 0x03, 0xF7, 0x00, 0x9E, 0x80, 0x00, 0x46, 0x00, 0x02, 0x9F, 0x0C, 0x44, 0x00, 0xDB, + 0x03, 0xF7, 0x00, 0x9E, 0x80, 0x00, 0x56, 0x00, 0x00, 0xFE, 0x03, 0xF5, 0x1F, 0xDA, 0x7C, 0x00, + 0x1F, 0x5E, 0x00, 0xFE, 0x03, 0xF2, 0x02, 0x9F, 0x0C, 0x52, 0x00, 0xDE, 0x03, 0xF4, 0x5D, 0x00, + 0x02, 0x93, 0x0C, 0x3F, 0x89, 0x00, 0x00, 0xDD, 0x03, 0xF5, 0x15, 0x01, 0x81, 0x00, 0x00, 0xDC, + 0x03, 0xF6, 0x00, 0x8B, 0x00, 0x9F, 0x00, 0x80, 0x0A, 0x00, 0x09, 0x00, 0x11, 0x50, 0x0C, 0x65, + 0x18, 0x78, 0x4C, 0x00, 0x1C, 0xFE, 0x00, 0x1F, 0x1F, 0xD9, 0x1B, 0x18, 0x00, 0x9F, 0x0A, 0x60, + 0x1F, 0xC3, 0x5C, 0x00, 0x00, 0xFE, 0x03, 0xF1, 0x00, 0xFC, 0x03, 0xF6, 0x00, 0x8B, 0xFF, 0xFF, + 0x02, 0xDF, 0x0F, 0x50, 0x00, 0x80, 0x0A, 0x00, 0x00, 0x83, 0x0D, 0x60, 0x00, 0x98, 0x3F, 0xFF, + 0x02, 0xBF, 0x00, 0xEB, 0x0F, 0x50, 0x00, 0x80, 0x0A, 0x00, 0x00, 0x83, 0x0D, 0x00, 0x00, 0x98, + 0x3F, 0xFF, 0x02, 0xBF, 0x00, 0xEB, 0x02, 0xDF, 0x8A, 0x00, 0x8F, 0x00, 0x81, 0x00, 0x00, 0xDE, + 0x04, 0x04, 0xB1, 0x00, 0x02, 0x95, 0x0C, 0x91, 0x81, 0x00, 0x00, 0xFE, 0x04, 0x78, 0x00, 0xFE, + 0x04, 0x79, 0x00, 0xDF, 0x04, 0x79, 0x00, 0xDB, 0x04, 0x78, 0x09, 0x00, 0x00, 0x84, 0x00, 0x00, + 0x11, 0x50, 0x0C, 0xA1, 0x19, 0x9E, 0x5C, 0x7C, 0xC0, 0x00, 0x6E, 0x00, 0x14, 0x88, 0x4A, 0x00, + 0x1B, 0x1E, 0x1F, 0x7E, 0x00, 0xFB, 0x04, 0x78, 0x00, 0xFF, 0x04, 0x79, 0x8B, 0x00, 0x8E, 0x00, + 0x02, 0xDF, 0xB9, 0x00, 0x02, 0x94, 0x0C, 0xAF, 0x68, 0x00, 0xB1, 0x00, 0x02, 0xD5, 0x1C, 0x23, + 0x19, 0x7E, 0x19, 0x1B, 0xD8, 0x58, 0x11, 0x20, 0x0C, 0xB9, 0xDC, 0xD3, 0x62, 0x31, 0xDC, 0xD3, + 0x62, 0x31, 0x49, 0x00, 0x11, 0x08, 0x0C, 0xBF, 0xDC, 0xD3, 0x62, 0x31, 0xDC, 0xD3, 0x62, 0x31, + 0x02, 0xDF, 0x8F, 0x00, 0x8D, 0x00, 0x1C, 0x03, 0x00, 0xD9, 0x03, 0x8E, 0x0B, 0x04, 0x19, 0x7A, + 0xB0, 0x53, 0xB6, 0x00, 0x11, 0x28, 0x0C, 0xCF, 0x3A, 0xD3, 0xB6, 0x30, 0x3A, 0xD3, 0xB6, 0x30, + 0x8C, 0x00, 0x8E, 0x00, 0x02, 0xDF, 0x00, 0xDA, 0x04, 0x85, 0x86, 0x00, 0x02, 0x95, 0x0C, 0xE5, + 0x81, 0x00, 0x00, 0xDE, 0x04, 0x2A, 0x14, 0x7F, 0x00, 0xFE, 0x04, 0x2B, 0xB1, 0x00, 0x02, 0x94, + 0x0C, 0xE5, 0x00, 0x9A, 0x00, 0x01, 0x00, 0xFA, 0x04, 0x01, 0x8F, 0x00, 0x81, 0x00, 0x00, 0xDE, + 0x04, 0x28, 0x14, 0x78, 0x00, 0xDF, 0x04, 0x28, 0x03, 0x40, 0x00, 0x7F, 0x1F, 0x1E, 0x1F, 0x5F, + 0x02, 0x20, 0x00, 0x7F, 0x1F, 0x3E, 0x03, 0x20, 0x00, 0x7F, 0x1F, 0x7F, 0x81, 0x00, 0x89, 0x00, + 0x00, 0x9F, 0x02, 0x00, 0x1F, 0xD8, 0x4C, 0x00, 0x1C, 0x1E, 0x18, 0x18, 0x1F, 0xDA, 0x4C, 0x00, + 0x1C, 0x1E, 0x18, 0x1A, 0x1F, 0xD9, 0x4C, 0x00, 0x1C, 0x1E, 0x18, 0x19, 0x1F, 0xDB, 0x4C, 0x00, + 0x1C, 0x1E, 0x18, 0x1B, 0x00, 0x80, 0x0B, 0x00, 0x98, 0x00, 0xAE, 0x00, 0xB6, 0x30, 0x96, 0x30, + 0x6E, 0x30, 0x1B, 0x1E, 0x00, 0x80, 0x0B, 0x00, 0x00, 0x81, 0x0B, 0x04, 0x00, 0xDA, 0x04, 0x2A, + 0x02, 0xBF, 0x0D, 0x62, 0x00, 0x81, 0x0B, 0x08, 0x00, 0x80, 0x0B, 0x04, 0x00, 0xDA, 0x04, 0x2A, + 0x00, 0xDE, 0x04, 0x29, 0xC0, 0x00, 0x6E, 0x00, 0x14, 0x81, 0x1F, 0x5E, 0x02, 0xBF, 0x0D, 0x62, + 0x00, 0x80, 0x0B, 0x00, 0x00, 0x81, 0x0B, 0x0C, 0x81, 0x00, 0x89, 0x00, 0x00, 0xDE, 0x04, 0x2B, + 0x00, 0xDF, 0x04, 0x2A, 0x00, 0xFE, 0x04, 0x2A, 0x5C, 0x00, 0x1F, 0x5E, 0x02, 0xBF, 0x0D, 0x6B, + 0x00, 0x80, 0x0B, 0x0C, 0x00, 0x81, 0x0B, 0x10, 0x00, 0xDA, 0x04, 0x29, 0x02, 0xBF, 0x0D, 0x62, + 0x00, 0x81, 0x0B, 0x04, 0x00, 0x82, 0x0B, 0x0C, 0x00, 0x83, 0x0D, 0x77, 0x11, 0x08, 0x0D, 0x5F, + 0x19, 0x5F, 0x15, 0xFB, 0x1F, 0x1D, 0x1F, 0x5F, 0x19, 0x3F, 0x00, 0xE1, 0x0B, 0x24, 0x00, 0xE2, + 0x0B, 0x25, 0x02, 0x1B, 0x00, 0xE3, 0x0B, 0x26, 0x1C, 0x7E, 0x00, 0xC0, 0x03, 0x8F, 0x02, 0xBF, + 0x0C, 0xA9, 0x00, 0xC1, 0x0B, 0x24, 0x00, 0xC2, 0x0B, 0x25, 0x00, 0xC3, 0x0B, 0x26, 0x00, 0x00, + 0x8E, 0x00, 0x02, 0xDF, 0x19, 0x1F, 0xD0, 0x78, 0xD6, 0x78, 0xD6, 0x31, 0x19, 0x1F, 0xD6, 0x31, + 0x6E, 0x31, 0x1B, 0x3E, 0x02, 0xDF, 0x8D, 0x00, 0x1F, 0x7E, 0x19, 0x18, 0xA8, 0x40, 0xAE, 0x40, + 0xAE, 0x31, 0x19, 0x18, 0xAE, 0x31, 0x6E, 0x31, 0x1B, 0x3E, 0x8C, 0x00, 0x02, 0xDF, 0x0D, 0x00, + 0x0D, 0x60, 0x0F, 0x40, 0x0C, 0xA0, 0x0E, 0x80, 0x0E, 0xE0, 0x0C, 0x00, 0x0C, 0x50, 0x00, 0xF9, + 0x03, 0x61, 0x1F, 0xC0, 0x02, 0x00, 0xFF, 0xFC, 0x1C, 0x1E, 0x1C, 0x5E, 0x00, 0x83, 0x04, 0x3C, + 0x19, 0x7E, 0x19, 0x7F, 0x80, 0xA2, 0x64, 0xA3, 0x65, 0x30, 0x1B, 0x1F, 0x1C, 0x02, 0x81, 0x00, + 0x00, 0xDE, 0x04, 0x02, 0x00, 0xFE, 0x03, 0x62, 0x14, 0x74, 0x1F, 0x7E, 0x1F, 0x3C, 0x89, 0x00, + 0x00, 0xDD, 0x04, 0x30, 0x15, 0x04, 0x06, 0x04, 0x02, 0x90, 0x0D, 0xF3, 0x1F, 0xDD, 0x00, 0x82, + 0x02, 0xB0, 0x10, 0x50, 0x4B, 0x2A, 0x1F, 0xBE, 0x00, 0xFE, 0x03, 0x60, 0x89, 0x00, 0x1F, 0xBE, + 0x0A, 0xF8, 0x00, 0x9B, 0x00, 0xFC, 0x00, 0xD8, 0x03, 0x61, 0x00, 0x82, 0x02, 0xB0, 0x00, 0x83, + 0x02, 0xB0, 0x19, 0x5E, 0x34, 0x80, 0x11, 0x28, 0x0D, 0xB8, 0x36, 0x7A, 0x35, 0xB3, 0x37, 0x72, + 0x34, 0xBB, 0x8A, 0x00, 0x00, 0x82, 0x02, 0xB0, 0x00, 0xDD, 0x04, 0x30, 0x15, 0x04, 0x1F, 0xE0, + 0x81, 0x00, 0x00, 0xDE, 0x03, 0x62, 0x14, 0x74, 0x1F, 0x7E, 0x1F, 0x3C, 0x8F, 0x00, 0x19, 0x43, + 0x4B, 0xC3, 0x90, 0xC3, 0xF2, 0xC3, 0xF2, 0xC3, 0xF2, 0x00, 0xFE, 0x00, 0x1C, 0x1F, 0x19, 0x43, + 0x4B, 0xC3, 0x90, 0xC3, 0x11, 0x4E, 0x0D, 0xDA, 0xF2, 0xC3, 0xF2, 0xC3, 0xF2, 0x31, 0x1C, 0x1F, + 0x19, 0x43, 0x4B, 0xC3, 0x92, 0xC3, 0xF2, 0xC3, 0xF2, 0xC3, 0xF2, 0x31, 0xFE, 0x00, 0x1B, 0x3E, + 0x8B, 0x00, 0x8E, 0x00, 0x00, 0xFE, 0x04, 0x33, 0x1C, 0x1F, 0x15, 0x0C, 0x03, 0x40, 0x0F, 0xFF, + 0x00, 0xFF, 0x04, 0x30, 0x00, 0x83, 0x04, 0x3C, 0x19, 0x1E, 0x19, 0x1F, 0x80, 0xA0, 0x64, 0xA1, + 0x65, 0x33, 0x1B, 0x7F, 0x02, 0xDF, 0x1F, 0xE0, 0x1C, 0x1F, 0x11, 0x28, 0x0D, 0xFC, 0x4B, 0x70, + 0x1B, 0x3E, 0x1C, 0x1F, 0x4B, 0x70, 0x1B, 0x3E, 0x1C, 0x1F, 0x02, 0x9F, 0x0D, 0xE2, 0x00, 0x83, + 0x05, 0x20, 0x00, 0xDE, 0x04, 0x33, 0x10, 0x50, 0x1B, 0x7E, 0x02, 0x9F, 0x02, 0xD8, 0x1C, 0x20, + 0x18, 0x5F, 0x1F, 0x7F, 0x19, 0x3A, 0x64, 0x00, 0x00, 0x78, 0x0E, 0x11, 0x56, 0x59, 0x67, 0x30, + 0x55, 0x51, 0x64, 0x38, 0x1A, 0x5B, 0x02, 0xDF, 0x00, 0x98, 0x82, 0x40, 0x00, 0xF8, 0x04, 0xE8, + 0x00, 0x98, 0x7F, 0xFF, 0x00, 0xF8, 0x04, 0xE9, 0x00, 0x98, 0x7D, 0xBF, 0x00, 0xF8, 0x04, 0xEA, + 0x00, 0x98, 0x84, 0x3F, 0x00, 0xF8, 0x04, 0xEB, 0x00, 0x98, 0xB2, 0x3B, 0x00, 0xF8, 0x04, 0xF0, + 0x00, 0x98, 0x7F, 0xFF, 0x00, 0xF8, 0x04, 0xF1, 0x00, 0x98, 0x4D, 0xC4, 0x00, 0xF8, 0x04, 0xF2, + 0x00, 0x98, 0xD8, 0x08, 0x00, 0xF8, 0x04, 0xF3, 0x00, 0x98, 0x00, 0x00, 0x00, 0x80, 0x04, 0xEC, + 0x10, 0x04, 0x1B, 0x18, 0x00, 0x80, 0x04, 0xF4, 0x10, 0x04, 0x1B, 0x18, 0x02, 0xDF, 0x00, 0x80, + 0x0F, 0x40, 0x00, 0x83, 0x0B, 0x00, 0x89, 0x00, 0x0F, 0x50, 0x00, 0x98, 0x67, 0x84, 0x02, 0xBF, + 0x00, 0xFA, 0x00, 0x80, 0x04, 0xE8, 0x00, 0x82, 0x04, 0xEC, 0x00, 0x81, 0x0B, 0x00, 0x02, 0xBF, + 0x0B, 0xA4, 0x89, 0x00, 0x0F, 0x50, 0x00, 0x80, 0x0B, 0x00, 0x00, 0x83, 0x0D, 0x00, 0x00, 0x98, + 0x7F, 0xFF, 0x02, 0xBF, 0x00, 0xEB, 0x89, 0x00, 0x0F, 0x50, 0x00, 0x80, 0x0B, 0x00, 0x00, 0x83, + 0x0D, 0x60, 0x00, 0x98, 0xB8, 0x20, 0x02, 0xBF, 0x00, 0xEB, 0x00, 0x80, 0x0C, 0xA0, 0x00, 0x83, + 0x0B, 0x00, 0x89, 0x00, 0x0F, 0x50, 0x00, 0x98, 0x67, 0x84, 0x02, 0xBF, 0x00, 0xFA, 0x00, 0x80, + 0x04, 0xE8, 0x00, 0x82, 0x04, 0xF4, 0x00, 0x81, 0x0B, 0x00, 0x02, 0xBF, 0x0B, 0xA4, 0x89, 0x00, + 0x0F, 0x50, 0x00, 0x80, 0x0B, 0x00, 0x00, 0x83, 0x0D, 0x00, 0x00, 0x98, 0x47, 0xE0, 0x02, 0xBF, + 0x00, 0xEB, 0x89, 0x00, 0x0F, 0x50, 0x00, 0x80, 0x0B, 0x00, 0x00, 0x83, 0x0D, 0x60, 0x00, 0x98, + 0x80, 0x01, 0x02, 0xBF, 0x00, 0xEB, 0x02, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static STRUCT_DSP_TASK audio_task; + +static u8 AUDIO_YIELD_BUFFER[8192]; + /* 8028E8A0-8028E94C .text DspBoot__FPFPv_v */ -void DspBoot(void (*)(void*)) { +void DspBoot(void (*param_1)(void*)) { /* Nonmatching */ + DspInitWork(); + audio_task.priority = 0xf0; + audio_task.iram_mmem_addr = (u16*)(jdsp + 0x80000000); + audio_task.iram_length = sizeof(jdsp); + audio_task.iram_addr = 0; + audio_task.dram_mmem_addr = (u16*)(AUDIO_YIELD_BUFFER + 0x80000000); + audio_task.dram_length = sizeof(AUDIO_YIELD_BUFFER); + audio_task.dram_addr = 0; + audio_task.dsp_init_vector = 0; + audio_task.dsp_resume_vector = 0x10; + audio_task.init_cb = DspHandShake; + audio_task.res_cb = NULL; + audio_task.done_cb = NULL; + audio_task.req_cb = param_1; + DSPInit(); + DSPAddPriorTask(&audio_task); } /* 8028E960-8028EA48 .text DSPSendCommands2__FPUlUlPFUs_v */ -void DSPSendCommands2(unsigned long*, unsigned long, void (*)(unsigned short)) { +int DSPSendCommands2(u32* param_1, u32 param_2, void (*param_3)(u16)) { /* Nonmatching */ + while (Dsp_Running_Check() == 0); + + BOOL status = OSDisableInterrupts(); + if (DSPCheckMailToDSP()) { + OSRestoreInterrupts(status); + return -1; + } + + DSPSendMailToDSP(param_2); + DSPAssertInt(); + while(DSPCheckMailToDSP() != 0); + + if (param_1 == 0) { + param_2 = 1; + } + + int startWorkStatus; + if (param_3 != NULL) { + startWorkStatus = DspStartWork(param_1[0], param_3); + } + + for (int i = 0; i < param_2; i++) { + DSPSendMailToDSP(param_1[i]); + while (DSPCheckMailToDSP() != 0); + } + + OSRestoreInterrupts(status); + return startWorkStatus; } +typedef struct { + u16 field_0x0; + u16 field_0x2; + void (*field_0x4)(u16); +} TaskWorkStruct; + +static TaskWorkStruct taskwork[16]; + /* 8028EA60-8028EA8C .text DspInitWork__Fv */ void DspInitWork() { /* Nonmatching */ + for (int i = 0; i < 16; i++) { + taskwork[i].field_0x4 = NULL; + } } +static u32 taskreadp; +static u32 taskwritep; + /* 8028EAA0-8028EAE8 .text DspStartWork__FUlPFUs_v */ -void DspStartWork(unsigned long, void (*)(unsigned short)) { - /* Nonmatching */ +int DspStartWork(u32 param_1, void (*param_2)(u16)) { + u32 taskWritePrev = taskwritep; + u32 writeVal = ((taskWritePrev + 1) & 0xf); + if (writeVal == taskreadp) { + return 0; + } + + taskwritep = writeVal; + taskwork[taskWritePrev].field_0x0 = param_1 >> 0x10; + taskwork[taskWritePrev].field_0x4 = param_2; + return taskWritePrev + 1; } /* 8028EB00-8028EB68 .text DspFinishWork__FUs */ -void DspFinishWork(unsigned short) { - /* Nonmatching */ -} +void DspFinishWork(u16 param_1) { + if (param_1 == taskwork[taskreadp].field_0x0) { + if (taskwork[taskreadp].field_0x4) { + taskwork[taskreadp].field_0x4(taskreadp); + } + taskreadp = (taskreadp + 1) & 0xf; + } +} diff --git a/src/JSystem/JAudio/osdsp.c b/src/JSystem/JAudio/osdsp.c index 6fda16b87..3eaf3db10 100644 --- a/src/JSystem/JAudio/osdsp.c +++ b/src/JSystem/JAudio/osdsp.c @@ -3,16 +3,36 @@ // Translation Unit: osdsp.c // -#include "osdsp.h" +#include "JSystem/JAudio/osdsp.h" +#include "JSystem/JAudio/osdsp_task.h" #include "dolphin/types.h" /* 8028EB80-8028EC04 .text DSPAddTask */ -void DSPAddTask { +DSPTaskInfo* DSPAddTask(DSPTaskInfo* task) { /* Nonmatching */ + if (DSP_prior_task == NULL) { + OSReport("Prior Task is not inited\n"); + return NULL; + } + BOOL status = OSDisableInterrupts(); + __DSP_insert_task(task); + task->state = 0; + task->flags = 1; + OSRestoreInterrupts(status); + return task; } /* 8028EC20-8028EC9C .text DSPAddPriorTask__FP15STRUCT_DSP_TASK */ -void DSPAddPriorTask(STRUCT_DSP_TASK*) { +void DSPAddPriorTask(STRUCT_DSP_TASK* task) { /* Nonmatching */ + if (DSP_prior_task != NULL) { + OSReport("Already inited prior DSP task\n"); + return; + } + BOOL status = OSDisableInterrupts(); + DSP_prior_task = (DSPTaskInfo*)task; + task->state = 0; + task->flags = 1; + __DSP_boot_task((DSPTaskInfo*)task); + OSRestoreInterrupts(status); } - diff --git a/src/JSystem/JAudio/osdsp_task.c b/src/JSystem/JAudio/osdsp_task.c index 2124a44a4..595388bd4 100644 --- a/src/JSystem/JAudio/osdsp_task.c +++ b/src/JSystem/JAudio/osdsp_task.c @@ -3,31 +3,138 @@ // Translation Unit: osdsp_task.c // -#include "osdsp_task.h" -#include "dolphin/types.h" +#include "JSystem/JAudio/osdsp_task.h" +#include "JSystem/JAudio/dspproc.h" +#include "dolphin/dsp.h" +#include "dolphin/os/OSContext.h" + +u32 sync_stack[3]; +vu8 DSP_prior_yield; +s32 AUDIO_UPDATE_REQUEST; +DSPTaskInfo* DSP_prior_task; /* 8028ECA0-8028EFA4 .text __DSPHandler */ -void __DSPHandler { +void __DSPHandler(int interrupt, OSContext* context) { /* Nonmatching */ + OSContext funcContext; + __DSPRegs[5] = ((u16)(__DSPRegs[5]) & ~0x28) | 0x80; + OSClearContext(&funcContext); + OSSetCurrentContext(&funcContext); + + if (DSP_prior_yield == 1 || DSP_prior_yield == 0) { + __DSP_curr_task = DSP_prior_task; + } + + while (DSPCheckMailFromDSP() == 0); + u32 mail = DSPReadMailFromDSP(); + + if ((__DSP_curr_task->flags & 2) && mail == 0xDCD10002) { + mail = 0xDCD10003; + } + + switch (mail) { + case 0xDCD10000: + __DSP_curr_task->state = 1; + if (__DSP_curr_task == DSP_prior_task) { + DSP_prior_yield = 1; + } + if (__DSP_curr_task->init_cb != NULL) { + __DSP_curr_task->init_cb(__DSP_curr_task); + } + break; + case 0xDCD10001: + __DSP_curr_task->state = 1; + if (__DSP_curr_task == DSP_prior_task) { + DSP_prior_yield = 1; + Dsp_Update_Request(); + } + if (__DSP_curr_task->res_cb != NULL) { + __DSP_curr_task->res_cb(__DSP_curr_task); + } + break; + case 0xDCD10002: + DSPSendMailToDSP(0xCDD10001); + while (DSPCheckMailToDSP() != 0); + __DSP_curr_task->state = 2; + if (__DSP_curr_task->next == NULL && AUDIO_UPDATE_REQUEST) { + __DSP_exec_task(__DSP_curr_task, DSP_prior_task); + AUDIO_UPDATE_REQUEST = 0; + __DSP_curr_task = DSP_prior_task; + } else { + __DSP_exec_task(__DSP_curr_task, __DSP_curr_task->next); + __DSP_curr_task = __DSP_curr_task->next; + } + break; + case 0xDCD10003: + if (__DSP_curr_task->done_cb != NULL) { + __DSP_curr_task->done_cb(__DSP_curr_task); + } + DSPSendMailToDSP(0xCDD10001); + while (DSPCheckMailToDSP() != 0); + __DSP_curr_task->state = 3; + if (__DSP_curr_task->next == NULL) { + __DSP_exec_task(NULL, DSP_prior_task); + __DSP_remove_task(__DSP_curr_task); + __DSP_curr_task = DSP_prior_task; + } else { + __DSP_exec_task(NULL, __DSP_curr_task->next); + __DSP_curr_task = __DSP_curr_task->next; + __DSP_remove_task(__DSP_curr_task->prev); + } + break; + case 0xDCD10004: + if (__DSP_curr_task->req_cb != NULL) { + __DSP_curr_task->req_cb(__DSP_curr_task); + } + break; + case 0xDCD10005: + if (__DSP_first_task == NULL || AUDIO_UPDATE_REQUEST) { + DSPSendMailToDSP(0xCDD10003); + while (DSPCheckMailToDSP() != 0); + AUDIO_UPDATE_REQUEST = 0; + __DSP_curr_task = DSP_prior_task; + Dsp_Update_Request(); + } else { + DSP_prior_yield = 3; + DSPSendMailToDSP(0xCDD10001); + while (DSPCheckMailToDSP() != 0); + __DSP_exec_task(DSP_prior_task, __DSP_first_task); + __DSP_curr_task = __DSP_first_task; + } + break; + } + + OSClearContext(&funcContext); + OSSetCurrentContext(context); } /* 8028EFC0-8028F010 .text DsyncFrame2__FUlUlUl */ -void DsyncFrame2(unsigned long, unsigned long, unsigned long) { - /* Nonmatching */ +void DsyncFrame2(u32 param_1, u32 param_2, u32 param_3) { + if (DSP_prior_yield != 1) { + sync_stack[0] = param_1; + sync_stack[1] = param_2; + sync_stack[2] = param_3; + AUDIO_UPDATE_REQUEST = 1; + return; + } + DsyncFrame(param_1, param_2, param_3); + AUDIO_UPDATE_REQUEST = 0; } /* 8028F020-8028F060 .text Dsp_Update_Request__Fv */ void Dsp_Update_Request() { - /* Nonmatching */ + if (AUDIO_UPDATE_REQUEST) { + DsyncFrame2(sync_stack[0], sync_stack[1], sync_stack[2]); + } } /* 8028F060-8028F074 .text Dsp_Running_Check__Fv */ -void Dsp_Running_Check() { +bool Dsp_Running_Check() { /* Nonmatching */ + return DSP_prior_yield == 1; } /* 8028F080-8028F08C .text Dsp_Running_Start__Fv */ void Dsp_Running_Start() { - /* Nonmatching */ + DSP_prior_yield = 1; } -