From aaeb80f0cba81f8271dc8047e5c772fd289a7cf6 Mon Sep 17 00:00:00 2001 From: Blake Warner Date: Sun, 6 Feb 2022 17:39:42 -0500 Subject: [PATCH] sound timings working #108 #103 #82 #74 #43 #19 --- extract_z64_variables.py | 87 ------ include/redef_msgqueue.h | 75 +++++ include/z64audio.h | 235 +++++++++++---- setup.py | 3 +- src/code/audioMgr.c | 34 ++- src/code/audio_heap.c | 9 +- src/code/audio_init_params.c | 81 +++++ src/code/audio_load.c | 129 +++++--- src/code/audio_synthesis.c | 14 +- src/code/code_800E4FE0.c | 19 +- src/code/code_800EC960.c | 2 - src/code/code_800F7260.c | 38 +-- src/code/z_message_PAL.c | 4 +- src/port/audio/audio_sdl.cpp | 1 + src/port/code_800F9280.c | 17 +- src/port/main.c | 10 +- src/port/pc_main.cpp | 30 +- src/port/rsp.c | 27 +- src/port/rsp_boot.c | 7 +- src/port/ultra_reimplementation.cpp | 98 ++++-- tools/create_luts.py | 8 + tools/extract_missing_assets.py | 44 ++- tools/extract_z64_variables.py | 453 ++++++++++++++++++++++++++++ 23 files changed, 1092 insertions(+), 333 deletions(-) delete mode 100644 extract_z64_variables.py create mode 100644 include/redef_msgqueue.h create mode 100644 tools/extract_z64_variables.py diff --git a/extract_z64_variables.py b/extract_z64_variables.py deleted file mode 100644 index 0fad649ea..000000000 --- a/extract_z64_variables.py +++ /dev/null @@ -1,87 +0,0 @@ - -class Section: - def __init__(self, name, offset, sz, elementSize = 8): - self.name = name - self.offset = offset - self.sz = sz - self.elementSize = elementSize - - def serialize(self, f, z64): - z64.seek(self.offset) - - if self.getSize() == self.getElementSize(): - f.write('u%d %s = ' % (self.getElementSize() * 8, self.name)) - buffer = z64.read(self.getElementSize()) - n = int.from_bytes(buffer, "big") - f.write(('0x%%%d.%dX' % (self.getElementSize() * 2, self.getElementSize() * 2)) % (n)) - f.write(';\n\n') - return - - f.write('u%d %s[0x%X] = {' % (self.getElementSize() * 8, self.name, self.getSize())) - - lst = [] - while z64.tell() < self.offset + self.sz: - buffer = z64.read(self.getElementSize()) - n = int.from_bytes(buffer, "big") - lst.append(('0x%%%d.%dX' % (self.getElementSize() * 2, self.getElementSize() * 2)) % (n)) - #f.write(('0x%%%d.%dX, ' % (self.getElementSize() * 2, self.getElementSize() * 2)) % (n)) - - f.write(', '.join(lst)) - - f.write('};\n\n') - - def getSize(self): - return int(self.sz / self.getElementSize()) - - def getElementSize(self): - return self.elementSize - -sections = {'src/port/rsp.c': [ - Section('gSoundFontTable', 0xBCC270, 0x270, 1), - Section('gSequenceFontTable', 0xBCC4E0, 0x1C0, 1), - Section('gSequenceTable', 0xBCC6A0, 0x6F0, 1), - Section('gSampleBankTable', 0xBCCD90, 0x80, 1), - Section('rspAspMainDataStart', 0xBCCE10, 0x2E0), - Section('D_80155F50', 0xBCD0F0, 0x1630, 1), - Section('D_80157580', 0xBCE720, 0x420, 1), - Section('D_801579A0', 0xBCEB40, 0x390, 1), - Section('gJpegUCodeData', 0xBCEED0, 0x60), - Section('D_801120C0', 0xB89260, 0xFB0, 8), - Section('D_80113070', 0xB8A210, 0x18C0, 1), - Section('gJpegUCode', 0xB8BAD0, 0xAF0, 8) - ], - 'src/port/rsp_boot.c': [ - Section('D_80009320', 0x9F20, 0xD0, 1), - Section('D_800093F0', 0x9FF0, 0x20, 1) - ], - 'src/port/code_800F9280.c': [ - Section('sSeqCmdWrPos', 0xBAA5A0, 0x4, 1), - Section('sSeqCmdRdPos', 0xBAA5A4, 0x4, 1), - Section('D_80133408', 0xBAA5A8, 0x1, 1), - Section('D_8013340C', 0xBAA5AC, 0x1, 1), - Section('D_80133410', 0xBAA5B0, 0x4, 1), - Section('gAudioSpecId', 0xBAA5B4, 0x1, 1), - Section('D_80133418', 0xBAA5B8, 0x1, 1), - ''' - Section('D_80133420', 0xBAA5C0, 0x48), - Section('D_80133468', 0xBAA608, 0x48), - Section('D_801334B0', 0xBAA650, 0x90), - Section('D_80133540', 0xBAA6E0, 0x48), - Section('D_80133588', 0xBAA728, 0x48), - Section('D_801335D0', 0xBAA770, 0x48), - Section('D_80133618', 0xBAA7B8, 0x48), - Section('D_80133660', 0xBAA800, 0x48), - Section('D_801336A8', 0xBAA848, 0x48), - Section('D_801336F0', 0xBAA890, 0x48), - Section('D_80133738', 0xBAA8D8, 0x90) - ''' - ] -} - -with open('baserom.z64', 'rb') as z64: - for filename, s in sections.items(): - with open(filename, 'w') as f: - f.write('#include "global.h"\n\n') - - for section in s: - section.serialize(f, z64) \ No newline at end of file diff --git a/include/redef_msgqueue.h b/include/redef_msgqueue.h new file mode 100644 index 000000000..721d589dc --- /dev/null +++ b/include/redef_msgqueue.h @@ -0,0 +1,75 @@ +#undef osCreateMesgQueue + +static void osCreateMesgQueue(OSMesgQueue* mq, OSMesg* msg, s32 count) +{ + mq->mtqueue = NULL; + mq->fullqueue = NULL; + mq->validCount = 0; + mq->first = 0; + mq->msgCount = count; + mq->msg = msg; +} + +#undef osSendMesg + +static s32 osSendMesg(OSMesgQueue* mq, OSMesg mesg, s32 flag) +{ + register u32 index; + + while(mq->validCount >= mq->msgCount) + { + if(flag == OS_MESG_BLOCK) + { + int zyz = 0; + } + else + { + return -1; + } + } + + index = (mq->first + mq->validCount) % mq->msgCount; + mq->msg[index] = mesg; + mq->validCount++; + + if(mq->mtqueue->next != NULL) + { + //osStartThread(__osPopThread(&mq->mtqueue)); + } + + + return 0; +} + +#undef osRecvMesg + +static s32 osRecvMesg(OSMesgQueue* mq, OSMesg* msg, s32 flag) +{ + while(mq->validCount == 0) + { + if(flag == OS_MESG_NOBLOCK) + { + return -1; + } + else + { + return -1; // TODO FIX HACK + } + } + + if(msg != NULL) + { + *msg = mq->msg[mq->first]; + } + + mq->first = (mq->first + 1) % mq->msgCount; + mq->validCount--; + + if(mq->fullqueue->next != NULL) + { + //osStartThread(__osPopThread(&mq->fullqueue)); + } + + return 0; +} + diff --git a/include/z64audio.h b/include/z64audio.h index 4de4c764f..9e69c5142 100644 --- a/include/z64audio.h +++ b/include/z64audio.h @@ -123,11 +123,19 @@ typedef struct { } AdpcmBook; // size >= 0x8 typedef struct { - /* 0x00 */ u32 codec : 4; - /* 0x00 */ u32 medium : 2; - /* 0x00 */ u32 unk_bit26 : 1; - /* 0x00 */ u32 unk_bit25 : 1; - /* 0x01 */ u32 size : 24; +#ifdef LITTLE_ENDIAN + u32 size : 24; + u32 unk_bit25 : 1; + u32 unk_bit26 : 1; + u32 medium : 2; + u32 codec : 4; +#else + u32 codec : 4; + u32 medium : 2; + u32 unk_bit26 : 1; + u32 unk_bit25 : 1; + u32 size : 24; +#endif /* 0x04 */ u8* sampleAddr; /* 0x08 */ AdpcmLoop* loop; /* 0x0C */ AdpcmBook* book; @@ -138,6 +146,15 @@ typedef struct { /* 0x04 */ f32 tuning; // frequency scale factor } SoundFontSound; // size = 0x8 +typedef enum +{ + CACHE_LOAD_PERMANENT = 0, + CACHE_LOAD_PERSISTENT, + CACHE_LOAD_TEMPORARY, + CACHE_LOAD_EITHER, + CACHE_LOAD_EITHER_NOSYNC +} AudioCacheLoadType; + typedef struct { /* 0x00 */ s16 numSamplesAfterDownsampling; // never read /* 0x02 */ s16 chunkLen; // never read @@ -231,14 +248,25 @@ typedef struct { // Also known as a Group, according to debug strings. typedef struct { - /* 0x000 */ u8 enabled : 1; - /* 0x000 */ u8 finished : 1; - /* 0x000 */ u8 muted : 1; - /* 0x000 */ u8 seqDmaInProgress : 1; - /* 0x000 */ u8 fontDmaInProgress : 1; - /* 0x000 */ u8 recalculateVolume : 1; - /* 0x000 */ u8 stopScript : 1; - /* 0x000 */ u8 unk_0b1 : 1; +#ifdef LITTLE_ENDIAN + u8 unk_0b1 : 1; + u8 stopScript : 1; + u8 recalculateVolume : 1; + u8 fontDmaInProgress : 1; + u8 seqDmaInProgress : 1; + u8 muted : 1; + u8 finished : 1; + u8 enabled : 1; +#else + u8 enabled : 1; + u8 finished : 1; + u8 muted : 1; + u8 seqDmaInProgress : 1; + u8 fontDmaInProgress : 1; + u8 recalculateVolume : 1; + u8 stopScript : 1; + u8 unk_0b1 : 1; +#endif /* 0x001 */ u8 state; /* 0x002 */ u8 noteAllocPolicy; /* 0x003 */ u8 muteBehavior; @@ -281,11 +309,19 @@ typedef struct { typedef struct { /* 0x00 */ union { struct A { - /* 0x00 */ u8 unk_0b80 : 1; - /* 0x00 */ u8 hang : 1; - /* 0x00 */ u8 decay : 1; - /* 0x00 */ u8 release : 1; - /* 0x00 */ u8 state : 4; +#ifdef LITTLE_ENDIAN + u8 state : 4; + u8 release : 1; + u8 decay : 1; + u8 hang : 1; + u8 unk_0b80 : 1; +#else + u8 unk_0b80 : 1; + u8 hang : 1; + u8 decay : 1; + u8 release : 1; + u8 state : 4; +#endif } s; /* 0x00 */ u8 asByte; } action; @@ -301,12 +337,21 @@ typedef struct { } AdsrState; typedef struct { - /* 0x00 */ u8 unused : 2; - /* 0x00 */ u8 bit2 : 2; - /* 0x00 */ u8 strongRight : 1; - /* 0x00 */ u8 strongLeft : 1; - /* 0x00 */ u8 stereoHeadsetEffects : 1; - /* 0x00 */ u8 usesHeadsetPanEffects : 1; +#ifdef LITTLE_ENDIAN + u8 usesHeadsetPanEffects : 1; + u8 stereoHeadsetEffects : 1; + u8 strongLeft : 1; + u8 strongRight : 1; + u8 bit2 : 2; + u8 unused : 2; +#else + u8 unused : 2; + u8 bit2 : 2; + u8 strongRight : 1; + u8 strongLeft : 1; + u8 stereoHeadsetEffects : 1; + u8 usesHeadsetPanEffects : 1; +#endif } StereoData; typedef union { @@ -329,19 +374,36 @@ typedef struct { // Also known as a SubTrack, according to sm64 debug strings. typedef struct SequenceChannel { - /* 0x00 */ u8 enabled : 1; - /* 0x00 */ u8 finished : 1; - /* 0x00 */ u8 stopScript : 1; - /* 0x00 */ u8 stopSomething2 : 1; // sets SequenceLayer.stopSomething - /* 0x00 */ u8 hasInstrument : 1; - /* 0x00 */ u8 stereoHeadsetEffects : 1; - /* 0x00 */ u8 largeNotes : 1; // notes specify duration and velocity - /* 0x00 */ u8 unused : 1; +#ifdef LITTLE_ENDIAN + u8 unused : 1; + u8 largeNotes : 1; // notes specify duration and velocity + u8 stereoHeadsetEffects : 1; + u8 hasInstrument : 1; + u8 stopSomething2 : 1; // sets SequenceLayer.stopSomething + u8 stopScript : 1; + u8 finished : 1; + u8 enabled : 1; +#else + u8 enabled : 1; + u8 finished : 1; + u8 stopScript : 1; + u8 stopSomething2 : 1; // sets SequenceLayer.stopSomething + u8 hasInstrument : 1; + u8 stereoHeadsetEffects : 1; + u8 largeNotes : 1; // notes specify duration and velocity + u8 unused : 1; +#endif union { struct { - /* 0x01 */ u8 freqScale : 1; - /* 0x01 */ u8 volume : 1; - /* 0x01 */ u8 pan : 1; +#ifdef LITTLE_ENDIAN + u8 pan : 1; + u8 volume : 1; + u8 freqScale : 1; +#else + u8 freqScale : 1; + u8 volume : 1; + u8 pan : 1; +#endif } s; /* 0x01 */ u8 asByte; } changes; @@ -393,14 +455,25 @@ typedef struct SequenceChannel { // Might also be known as a Track, according to sm64 debug strings (?). typedef struct SequenceLayer { - /* 0x00 */ u8 enabled : 1; - /* 0x00 */ u8 finished : 1; - /* 0x00 */ u8 stopSomething : 1; - /* 0x00 */ u8 continuousNotes : 1; // keep the same note for consecutive notes with the same sound - /* 0x00 */ u8 bit3 : 1; // "loaded"? - /* 0x00 */ u8 ignoreDrumPan : 1; - /* 0x00 */ u8 bit1 : 1; // "has initialized continuous notes"? - /* 0x00 */ u8 notePropertiesNeedInit : 1; +#ifdef LITTLE_ENDIAN + u8 notePropertiesNeedInit : 1; + u8 bit1 : 1; // "has initialized continuous notes"? + u8 ignoreDrumPan : 1; + u8 bit3 : 1; // "loaded"? + u8 continuousNotes : 1; // keep the same note for consecutive notes with the same sound + u8 stopSomething : 1; + u8 finished : 1; + u8 enabled : 1; +#else + u8 enabled : 1; + u8 finished : 1; + u8 stopSomething : 1; + u8 continuousNotes : 1; // keep the same note for consecutive notes with the same sound + u8 bit3 : 1; // "loaded"? + u8 ignoreDrumPan : 1; + u8 bit1 : 1; // "has initialized continuous notes"? + u8 notePropertiesNeedInit : 1; +#endif /* 0x01 */ Stereo stereo; /* 0x02 */ u8 instOrWave; /* 0x03 */ u8 gateTime; @@ -494,21 +567,40 @@ typedef struct { typedef struct { struct { - /* 0x00 */ volatile u8 enabled : 1; - /* 0x00 */ u8 needsInit : 1; - /* 0x00 */ u8 finished : 1; // ? - /* 0x00 */ u8 unused : 1; - /* 0x00 */ u8 stereoStrongRight : 1; - /* 0x00 */ u8 stereoStrongLeft : 1; - /* 0x00 */ u8 stereoHeadsetEffects : 1; - /* 0x00 */ u8 usesHeadsetPanEffects : 1; // ? +#ifdef LITTLE_ENDIAN + u8 usesHeadsetPanEffects : 1; // ? + u8 stereoHeadsetEffects : 1; + u8 stereoStrongLeft : 1; + u8 stereoStrongRight : 1; + u8 unused : 1; + u8 finished : 1; // ? + u8 needsInit : 1; + volatile u8 enabled : 1; +#else + volatile u8 enabled : 1; + u8 needsInit : 1; + u8 finished : 1; // ? + u8 unused : 1; + u8 stereoStrongRight : 1; + u8 stereoStrongLeft : 1; + u8 stereoHeadsetEffects : 1; + u8 usesHeadsetPanEffects : 1; // ? +#endif } bitField0; struct { - /* 0x01 */ u8 reverbIndex : 3; - /* 0x01 */ u8 bookOffset : 2; - /* 0x01 */ u8 isSyntheticWave : 1; - /* 0x01 */ u8 hasTwoParts : 1; - /* 0x01 */ u8 usesHeadsetPanEffects2 : 1; +#ifdef LITTLE_ENDIAN + u8 usesHeadsetPanEffects2 : 1; + u8 hasTwoParts : 1; + u8 isSyntheticWave : 1; + u8 bookOffset : 2; + u8 reverbIndex : 3; +#else + u8 reverbIndex : 3; + u8 bookOffset : 2; + u8 isSyntheticWave : 1; + u8 hasTwoParts : 1; + u8 usesHeadsetPanEffects2 : 1; +#endif } bitField1; /* 0x02 */ u8 unk_2; /* 0x03 */ u8 headsetPanRight; @@ -671,12 +763,22 @@ typedef struct { typedef struct { union{ u32 opArgs; +#ifdef LITTLE_ENDIAN + struct + { + u8 arg2; + u8 arg1; + u8 arg0; + u8 op; + }; +#else struct { u8 op; u8 arg0; u8 arg1; u8 arg2; }; +#endif }; union { void* data; @@ -723,7 +825,7 @@ typedef struct { /* 0x4C */ OSIoMesg ioMesg; } AudioSlowLoad; // size = 0x64 -typedef struct { +typedef struct AudioTableEntry { /* 0x00 */ uintptr_t romAddr; /* 0x04 */ u32 size; /* 0x08 */ s8 medium; @@ -733,7 +835,7 @@ typedef struct { /* 0x0E */ s16 shortData3; } AudioTableEntry; // size = 0x10 -typedef struct { +typedef struct AudioTable { /* 0x00 */ s16 numEntries; /* 0x02 */ s16 unkMediumParam; /* 0x04 */ uintptr_t romAddr; @@ -741,6 +843,15 @@ typedef struct { /* 0x10 */ AudioTableEntry entries[1]; // (dynamic size) } AudioTable; // size >= 0x20 +typedef struct AudioTableDef +{ + /* 0x00 */ s16 numEntries; + /* 0x02 */ s16 unkMediumParam; + /* 0x04 */ uintptr_t romAddr; + /* 0x08 */ char pad[0x8]; + /* 0x10 */ AudioTableEntry entries[]; // (dynamic size) +} AudioTableDef; // size >= 0x20 + typedef struct { /* 0x00 */ OSTask task; /* 0x40 */ OSMesgQueue* taskQueue; @@ -1335,10 +1446,10 @@ extern u8 D_80133418; extern const AudioContextInitSizes D_8014A6C4; extern s16 gOcarinaSongItemMap[]; -extern u8 gSoundFontTable[]; -extern u8 gSequenceFontTable[]; -extern u8 gSequenceTable[]; -extern u8 gSampleBankTable[]; +extern AudioTableDef gSoundFontTable; +extern u16 gSequenceFontTable[]; +extern AudioTableDef gSequenceTable; +extern AudioTableDef gSampleBankTable; extern u8 gAudioHeap[0x38000]; extern ActiveSound gActiveSounds[7][MAX_CHANNELS_PER_BANK]; // total size = 0xA8 diff --git a/setup.py b/setup.py index 1ec136ce1..2f2c48a2d 100644 --- a/setup.py +++ b/setup.py @@ -54,8 +54,7 @@ def build(): subprocess.check_call([sys.executable, str('tools/msgenc.py'), str('assets/text/charmap.txt'), str('assets/text/message_data_staff.h'), str('build/assets/text/message_data_staff.enc.h')]) subprocess.check_call([sys.executable, str('tools/extract_missing_assets.py')]) subprocess.check_call([sys.executable, str('tools/create_luts.py')]) - #subprocess.check_call([sys.executable, str('tools/mark_segments.py')]) - #subprocess.check_call([sys.executable, str('tools/extract_z64_variables.py')]) + subprocess.check_call([sys.executable, str('tools/extract_z64_variables.py')]) print("Finished asset extraction and parsing") diff --git a/src/code/audioMgr.c b/src/code/audioMgr.c index cd383c77c..d72452d46 100644 --- a/src/code/audioMgr.c +++ b/src/code/audioMgr.c @@ -1,4 +1,4 @@ -#define INTERNAL_SRC_CODE_AUDIOMGR_C +#define INTERNAL_SRC_CODE_AUDIOMGR_C #include "global.h" #include "z64audio.h" #include "audiomgr.h" @@ -8,13 +8,36 @@ #include "regs.h" #include "z64game.h" #include "def/audioMgr.h" +#include "def/code_800EC960.h" +#include "def/code_800E4FE0.h" +#include "def/audio_playback.h" + +static AudioMgr* g_audioMgr = NULL; void AudioMgr_HandleRetrace(AudioMgr* audioMgr); void func_800C3C80(AudioMgr* audioMgr) { + return; +} + +void AudioMgr_HandleRetraceNULL() { + AudioMgr_HandleRetrace(NULL); } void AudioMgr_HandleRetrace(AudioMgr* audioMgr) { + if(!audioMgr) + { + audioMgr = g_audioMgr; + } + + if(!audioMgr) + { + return; + } + + AudioTask* task = func_800E4FE0(); + + return; } void AudioMgr_HandlePRENMI(AudioMgr* audioMgr) { @@ -27,4 +50,13 @@ void AudioMgr_Unlock(AudioMgr* audioMgr) { } void AudioMgr_Init(AudioMgr* audioMgr, void* stack, OSPri pri, OSId id, SchedContext* sched, IrqMgr* irqMgr) { + bzero(audioMgr, sizeof(AudioMgr)); + g_audioMgr = audioMgr; + + IrqMgrClient irqClient; + s16* msg = NULL; + + Audio_Init(); + //AudioLoad_SetDmaHandler(DmaMgr_DmaHandler); + Audio_InitSound(); } diff --git a/src/code/audio_heap.c b/src/code/audio_heap.c index 093779536..49d5157bb 100644 --- a/src/code/audio_heap.c +++ b/src/code/audio_heap.c @@ -10,6 +10,7 @@ #include "def/audio_seqplayer.h" #include "def/code_800E6840.h" #include "def/code_800F7260.h" +#include "def/initialize.h" void AudioHeap_InitSampleCaches(u32 persistentSize, u32 temporarySize); SampleCacheEntry* AudioHeap_AllocTemporarySampleCacheEntry(u32 size); @@ -20,6 +21,7 @@ void AudioHeap_DiscardSampleCaches(void); void AudioHeap_DiscardSampleBank(s32 sampleBankId); void AudioHeap_DiscardSampleBanks(void); + f32 func_800DDE20(f32 arg0) { return 256.0f * gAudioContext.audioBufferParameters.unkUpdatesPerFrameScaled / arg0; } @@ -241,6 +243,11 @@ void AudioHeap_PopCache(s32 tableType) { persistent = &loadedPool->persistent; persistentPool = &persistent->pool; + if(persistent == NULL) // TODO FIX HACK + { + return; + } + if (persistent->numEntries == 0) { return; } @@ -821,7 +828,7 @@ void AudioHeap_Init(void) { spec = &gAudioSpecs[gAudioContext.audioResetSpecIdToLoad]; gAudioContext.sampleDmaCount = 0; gAudioContext.audioBufferParameters.frequency = spec->frequency; - gAudioContext.audioBufferParameters.aiFrequency = 0; // TODO FIX osAiSetFrequency(gAudioContext.audioBufferParameters.frequency); + gAudioContext.audioBufferParameters.aiFrequency = osAiSetFrequency(gAudioContext.audioBufferParameters.frequency); gAudioContext.audioBufferParameters.samplesPerFrameTarget = ((gAudioContext.audioBufferParameters.frequency / gAudioContext.refreshRate) + 0xF) & 0xFFF0; gAudioContext.audioBufferParameters.minAiBufferLength = diff --git a/src/code/audio_init_params.c b/src/code/audio_init_params.c index 09f323e91..5834d194f 100644 --- a/src/code/audio_init_params.c +++ b/src/code/audio_init_params.c @@ -3,8 +3,89 @@ #include "z64audio.h" #include "def/audio_init_params.h" +u8 D_8016F0E0[0xA0]; // unused +AudioContext gAudioContext; +void (*D_801755D0)(void); +s32 D_801755D8[3]; // unused + const s16 D_8014A6C0[] = { 0x1C00, // unused 0x0030, // gTatumsPerBeat }; + const AudioContextInitSizes D_8014A6C4 = { 0x37F00, 0xE0E0, 0xBCE0 }; + +ReverbSettings D_80133420[][3] = { + { + { 1, 0x30, 0x3000, 0, 0, 0x7FFF, 0x0000, 0x0000, 0xFF, 0x3000, 0x0, 0x0 }, + { 1, 0x20, 0x0800, 0, 0, 0x7FFF, 0x0000, 0x0000, 0xFF, 0x0000, 0x0, 0x0 }, + }, + { + { 1, 0x30, 0x3000, 0, 0, 0x7FFF, 0x0000, 0x0000, 0xFF, 0x3000, 0x0, 0x0 }, + { 1, 0x30, 0x1800, 0, 0, 0x7FFF, 0x0000, 0x0000, 0xFF, 0x0000, 0xB, 0xB }, + }, + { + { 1, 0x30, 0x3000, 0, 0, 0x7FFF, 0x0000, 0x0000, 0xFF, 0x3000, 0x0, 0x0 }, + { 1, 0x38, 0x2800, 0, 0, 0x7FFF, 0x0000, 0x0000, 0xFF, 0x0000, 0x7, 0x7 }, + }, + { + { 1, 0x30, 0x3000, 0, 0, 0x7FFF, 0x0000, 0x0000, 0xFF, 0x3000, 0x0, 0x0 }, + { 1, 0x50, 0x5000, 0, 0, 0x7FFF, 0x1000, 0x1000, 0xFF, 0x3000, 0x7, 0x7 }, + }, + { + { 1, 0x30, 0x3000, 0, 0, 0x7FFF, 0x0000, 0x0000, 0xFF, 0x3000, 0x0, 0x0 }, + { 1, 0x40, 0x5000, 0, 0, 0x7FFF, 0x1800, 0x1800, 0xFF, 0x3000, 0x7, 0x7 }, + }, + { + { 1, 0x30, 0x3000, 0, 0, 0x7FFF, 0x0000, 0x0000, 0xFF, 0x3000, 0x0, 0x0 }, + { 1, 0x40, 0x5C00, 0, 0, 0x7FFF, 0x2000, 0x2000, 0xFF, 0x3000, 0x4, 0x4 }, + }, + { + { 1, 0x30, 0x3000, 0, 0, 0x7FFF, 0x0000, 0x0000, 0xFF, 0x3000, 0x0, 0x0 }, + { 1, 0x30, 0x6000, 0, 0, 0x7FFF, 0x1000, 0x1000, 0xFF, 0x3000, 0xA, 0xA }, + }, + { + { 1, 0x30, 0x3000, 0, 0, 0x7FFF, 0x0000, 0x0000, 0xFF, 0x3000, 0x0, 0x0 }, + { 1, 0x30, 0x6800, 0, 0, 0x7FFF, 0x1400, 0x1400, 0xFF, 0x3000, 0x6, 0x6 }, + }, + { + { 1, 0x30, 0x3000, 0, 0, 0x7FFF, 0x0000, 0x0000, 0xFF, 0x3000, 0x0, 0x0 }, + { 2, 0x50, 0x5000, 0, 0, 0x7FFF, 0xD000, 0x3000, 0xFF, 0x3000, 0x0, 0x0 }, + }, + { + { 1, 0x30, 0x3000, 0, 0, 0x7FFF, 0x0000, 0x0000, 0xFF, 0x3000, 0x0, 0x0 }, + { 1, 0x20, 0x0000, 0, 0, 0x7FFF, 0x0000, 0x0000, 0xFF, 0x0000, 0x0, 0x0 }, + }, + { + { 1, 0x30, 0x3000, 0, 0, 0x7FFF, 0x0000, 0x0000, 0xFF, 0x3000, 0x0, 0x0 }, + { 1, 0x30, 0x1800, 0, 0, 0x7FFF, 0x0000, 0x0000, 0xFF, 0x0000, 0xB, 0xB }, + }, + { + { 1, 0x30, 0x3000, 0, 0, 0x7FFF, 0x0000, 0x0000, 0xFF, 0x3000, 0x0, 0x0 }, + }, + { + { 1, 0x30, 0x3000, 0, 0, 0x7FFF, 0x0000, 0x0000, 0xFF, 0x3000, 0x0, 0x0 }, + { 1, 0x40, 0x5000, 0, 0, 0x7FFF, 0x0000, 0x0000, 0xFF, 0x3000, 0x0, 0x0 }, + }, +}; + +AudioSpec gAudioSpecs[18] = { + { 32000, 1, 24, 4, 0, 0, 2, D_80133420[0], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x4000, 0x2880, 0, 0, 0 }, + { 32000, 1, 24, 4, 0, 0, 2, D_80133420[1], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 }, + { 32000, 1, 24, 4, 0, 0, 2, D_80133420[2], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 }, + { 32000, 1, 23, 4, 0, 0, 2, D_80133420[4], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 }, + { 32000, 1, 23, 4, 0, 0, 2, D_80133420[5], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 }, + { 32000, 1, 24, 4, 0, 0, 2, D_80133420[6], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 }, + { 32000, 1, 24, 4, 0, 0, 2, D_80133420[7], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 }, + { 32000, 1, 23, 4, 0, 0, 2, D_80133420[8], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 }, + { 32000, 1, 24, 4, 0, 0, 2, D_80133420[9], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 }, + { 32000, 1, 23, 4, 0, 0, 2, D_80133420[8], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 }, + { 32000, 1, 28, 3, 0, 0, 2, D_80133420[10], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x2800, 0x2880, 0, 0, 0 }, + { 32000, 1, 28, 3, 0, 0, 1, D_80133420[11], 0x300, 0x200, 0x7FFF, 0, 0x4800, 0, 0x4000, 0, 0, 0, 0 }, + { 32000, 1, 28, 3, 0, 0, 1, D_80133420[11], 0x300, 0x200, 0x7FFF, 0, 0, 0, 0x4000, 0x4800, 0, 0, 0 }, + { 32000, 1, 22, 4, 0, 0, 2, D_80133420[0], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 }, + { 32000, 1, 22, 4, 0, 0, 2, D_80133420[8], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 }, + { 32000, 1, 16, 4, 0, 0, 2, D_80133420[0], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 }, + { 22050, 1, 24, 4, 0, 0, 2, D_80133420[0], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 }, + { 32000, 1, 24, 4, 0, 0, 2, D_80133420[2], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3600, 0x2600, 0, 0, 0 }, +}; \ No newline at end of file diff --git a/src/code/audio_load.c b/src/code/audio_load.c index fc92cfd67..b86d86f96 100644 --- a/src/code/audio_load.c +++ b/src/code/audio_load.c @@ -2,6 +2,10 @@ #include "ultra64.h" #include "global.h" #include "z64audio.h" +#include "audio/bank.h" +#include "audio/seq.h" +#include "audio/table.h" +#include #include "segment_symbols.h" #include "def/audio_heap.h" #include "def/audio_init_params.h" @@ -16,6 +20,10 @@ #include "def/heaps.h" #include "def/recvmesg.h" +#include "redef_msgqueue.h" + +#define BEE32(s) s + extern u32 osTvType; #define MK_ASYNC_MSG(retData, tableType, id, status) (((retData) << 24) | ((tableType) << 16) | ((id) << 8) | (status)) @@ -356,9 +364,22 @@ void AudioLoad_SetSampleFontLoadStatus(s32 sampleBankId, s32 status) { } } +static AudioTable* LoadTable(AudioTable* table) +{ + for(s16 i = 0; i < table->numEntries; i++) + { + AudioTableEntry* entry = &table->entries[i]; + continue; + } + + return table; +} + void AudioLoad_InitTable(AudioTable* table, void* romAddr, u16 unkMediumParam) { s32 i; + LoadTable(table); + table->unkMediumParam = unkMediumParam; table->romAddr = romAddr; @@ -479,7 +500,7 @@ void AudioLoad_AsyncLoadFont(s32 fontId, s32 arg1, s32 retData, OSMesgQueue* ret u8* AudioLoad_GetFontsForSequence(s32 seqId, u32* outNumFonts) { s32 index; - return NULL; // TODO FIX + index = ((u16*)gAudioContext.sequenceFontTable)[seqId]; *outNumFonts = gAudioContext.sequenceFontTable[index++]; @@ -642,7 +663,7 @@ u32 AudioLoad_TrySyncLoadSampleBank(u32 sampleBankId, u32* outMedium, s32 noLoad } SoundFontData* AudioLoad_SyncLoadFont(u32 fontId) { - SoundFontData* ret; + SoundFontData* mem; s32 sampleBankId1; s32 sampleBankId2; s32 didAllocate; @@ -669,15 +690,15 @@ SoundFontData* AudioLoad_SyncLoadFont(u32 fontId) { relocInfo.baseAddr2 = 0; } - ret = AudioLoad_SyncLoad(FONT_TABLE, fontId, &didAllocate); - if (ret == NULL) { + mem = AudioLoad_SyncLoad(FONT_TABLE, fontId, &didAllocate); + if (mem == NULL) { return NULL; } if (didAllocate == true) { - AudioLoad_RelocateFontAndPreloadSamples(realFontId, ret, &relocInfo, false); + AudioLoad_RelocateFontAndPreloadSamples(realFontId, mem, &relocInfo, false); } - return ret; + return mem; } void* AudioLoad_SyncLoad(u32 tableType, u32 id, s32* didAllocate) { @@ -687,13 +708,13 @@ void* AudioLoad_SyncLoad(u32 tableType, u32 id, s32* didAllocate) { u32 medium; s32 status; uintptr_t romAddr; - s32 cachePolicy; - void* ret; + AudioCacheLoadType cachePolicy; + void* mem; u32 realId; realId = AudioLoad_GetRealTableIndex(tableType, id); - ret = AudioLoad_SearchCaches(tableType, realId); - if (ret != NULL) { + mem = AudioLoad_SearchCaches(tableType, realId); + if (mem != NULL) { *didAllocate = false; status = 2; } else { @@ -704,38 +725,38 @@ void* AudioLoad_SyncLoad(u32 tableType, u32 id, s32* didAllocate) { cachePolicy = table->entries[id].cachePolicy; romAddr = table->entries[realId].romAddr; switch (cachePolicy) { - case 0: - ret = AudioHeap_AllocPermanent(tableType, realId, size); - if (ret == NULL) { - return ret; + case CACHE_LOAD_PERMANENT: + mem = AudioHeap_AllocPermanent(tableType, realId, size); + if (mem == NULL) { + return mem; } break; - case 1: - ret = AudioHeap_AllocCached(tableType, size, CACHE_PERSISTENT, realId); - if (ret == NULL) { - return ret; + case CACHE_LOAD_PERSISTENT: + mem = AudioHeap_AllocCached(tableType, size, CACHE_PERSISTENT, realId); + if (mem == NULL) { + return mem; } break; - case 2: - ret = AudioHeap_AllocCached(tableType, size, CACHE_TEMPORARY, realId); - if (ret == NULL) { - return ret; + case CACHE_LOAD_TEMPORARY: + mem = AudioHeap_AllocCached(tableType, size, CACHE_TEMPORARY, realId); + if (mem == NULL) { + return mem; } break; - case 3: - case 4: - ret = AudioHeap_AllocCached(tableType, size, CACHE_EITHER, realId); - if (ret == NULL) { - return ret; + case CACHE_LOAD_EITHER: + case CACHE_LOAD_EITHER_NOSYNC: + mem = AudioHeap_AllocCached(tableType, size, CACHE_EITHER, realId); + if (mem == NULL) { + return mem; } break; } *didAllocate = true; if (medium == MEDIUM_UNK) { - AudioLoad_SyncDmaUnkMedium(romAddr, ret, size, (s16)table->unkMediumParam); + AudioLoad_SyncDmaUnkMedium(romAddr, mem, size, (s16)table->unkMediumParam); } else { - AudioLoad_SyncDma(romAddr, ret, size, medium); + AudioLoad_SyncDma(romAddr, mem, size, medium); } status = cachePolicy == 0 ? 5 : 2; @@ -755,7 +776,7 @@ void* AudioLoad_SyncLoad(u32 tableType, u32 id, s32* didAllocate) { break; } - return ret; + return mem; } u32 AudioLoad_GetRealTableIndex(s32 tableType, u32 id) { @@ -804,6 +825,10 @@ AudioTable* AudioLoad_GetLoadTable(s32 tableType) { return ret; } +static_assert(sizeof(Drum) == 0x10, "Drum is incorrect size"); +static_assert(sizeof(SoundFontSound) == 0x8, "SoundFontSound is incorrect size"); +static_assert(sizeof(SoundFont) == 0x14, "SoundFont is incorrect size"); + void AudioLoad_RelocateFont(s32 fontId, SoundFontData* mem, RelocInfo* relocInfo) { u32 reloc; u32 reloc2; @@ -816,16 +841,18 @@ void AudioLoad_RelocateFont(s32 fontId, SoundFontData* mem, RelocInfo* relocInfo s32 numSfx = gAudioContext.soundFonts[fontId].numSfx; void** ptrs = (void**)mem; -#define BASE_OFFSET(x) (void*)((u32)(x) + (u32)(mem)) - +#define BASE_OFFSET(x) (void*)((BEE32((uintptr_t)x)) + (u32)(mem)) +//#define BASE_OFFSET(x) (void*)(((uintptr_t)x) + (u32)(mem)) reloc2 = ptrs[0]; - if (1) {} + if ((reloc2 != 0) && (numDrums != 0)) { ptrs[0] = BASE_OFFSET(reloc2); for (i = 0; i < numDrums; i++) { reloc = ((Drum**)ptrs[0])[i]; + //reloc = (Drum*)ptrs[0] + i; if (reloc != 0) { reloc = BASE_OFFSET(reloc); + drum = reloc; ((Drum**)ptrs[0])[i] = drum = reloc; if (!drum->loaded) { AudioLoad_RelocateSample(&drum->sound, mem, relocInfo); @@ -838,7 +865,7 @@ void AudioLoad_RelocateFont(s32 fontId, SoundFontData* mem, RelocInfo* relocInfo } reloc2 = ptrs[1]; - if (1) {} + if ((reloc2 != 0) && (numSfx != 0)) { ptrs[1] = BASE_OFFSET(reloc2); for (i = 0; i < numSfx; i++) { @@ -858,6 +885,7 @@ void AudioLoad_RelocateFont(s32 fontId, SoundFontData* mem, RelocInfo* relocInfo for (i = 2; i <= 2 + numInstruments - 1; i++) { if (ptrs[i] != NULL) { + inst = ptrs[i]; ptrs[i] = BASE_OFFSET(ptrs[i]); inst = ptrs[i]; if (!inst->loaded) { @@ -908,6 +936,7 @@ void AudioLoad_SyncDma(u32 devAddr, u8* addr, u32 size, s32 medium) { } void AudioLoad_SyncDmaUnkMedium(u32 devAddr, u8* addr, u32 size, s32 unkMediumParam) { + return; } s32 AudioLoad_Dma(OSIoMesg* mesg, u32 priority, s32 direction, u32 devAddr, void* ramAddr, u32 size, @@ -940,8 +969,9 @@ s32 AudioLoad_Dma(OSIoMesg* mesg, u32 priority, s32 direction, u32 devAddr, void mesg->dramAddr = ramAddr; mesg->devAddr = devAddr; mesg->size = size; - handle->transferInfo.cmdType = 2; - sDmaHandler(handle, mesg, direction); + memcpy(ramAddr, devAddr, size); + //handle->transferInfo.cmdType = 2; + //sDmaHandler(handle, mesg, direction); return 0; } @@ -1154,9 +1184,9 @@ void AudioLoad_Init(void* heap, u32 heapSize) { gAudioContext.aiBuffers[i] = AudioHeap_AllocZeroed(&gAudioContext.audioInitPool, AIBUF_LEN * sizeof(s16)); } - gAudioContext.sequenceTable = (AudioTable*)gSequenceTable; - gAudioContext.soundFontTable = (AudioTable*)gSoundFontTable; - gAudioContext.sampleBankTable = (AudioTable*)gSampleBankTable; + gAudioContext.sequenceTable = (AudioTable*)&gSequenceTable; + gAudioContext.soundFontTable = (AudioTable*)&gSoundFontTable; + gAudioContext.sampleBankTable = (AudioTable*)&gSampleBankTable; gAudioContext.sequenceFontTable = gSequenceFontTable; gAudioContext.numSequences = gAudioContext.sequenceTable->numEntries; @@ -1164,9 +1194,9 @@ void AudioLoad_Init(void* heap, u32 heapSize) { gAudioContext.resetStatus = 1; AudioHeap_ResetStep(); - AudioLoad_InitTable(gAudioContext.sequenceTable, _AudioseqSegmentRomStart, 0); - AudioLoad_InitTable(gAudioContext.soundFontTable, _AudiobankSegmentRomStart, 0); - AudioLoad_InitTable(gAudioContext.sampleBankTable, _AudiotableSegmentRomStart, 0); + AudioLoad_InitTable(gAudioContext.sequenceTable, Audioseq, 0); + AudioLoad_InitTable(gAudioContext.soundFontTable, Audiobank_le, 0); + AudioLoad_InitTable(gAudioContext.sampleBankTable, Audiotable, 0); numFonts = gAudioContext.soundFontTable->numEntries; gAudioContext.soundFonts = AudioHeap_Alloc(&gAudioContext.audioInitPool, numFonts * sizeof(SoundFont)); @@ -1575,22 +1605,24 @@ void AudioLoad_AsyncDma(AudioAsyncLoad* asyncLoad, u32 size) { } void AudioLoad_AsyncDmaUnkMedium(u32 devAddr, void* ramAddr, u32 size, s16 arg3) { + int xyz = 0; } -#define RELOC(v, base) (reloc = (void*)((u32)(v) + (u32)(base))) +#define RELOC(v, base) (reloc = (void*)(BEE32((u32)(v)) + (u32)(base))) +//#define RELOC(v, base) (reloc = (void*)((u32)(v) + (u32)(base))) void AudioLoad_RelocateSample(SoundFontSound* sound, SoundFontData* mem, RelocInfo* relocInfo) { SoundFontSample* sample; void* reloc; - if ((u32)sound->sample <= 0x80000000) { + if (BEE32((u32)sound->sample) <= 0x80000000) { sample = sound->sample = RELOC(sound->sample, mem); if (sample->size != 0 && sample->unk_bit25 != 1) { sample->loop = RELOC(sample->loop, mem); sample->book = RELOC(sample->book, mem); // Resolve the sample medium 2-bit bitfield into a real value based on relocInfo. - switch (sample->medium) { + switch (BEE32(sample->medium)) { case 0: sample->sampleAddr = RELOC(sample->sampleAddr, relocInfo->baseAddr1); sample->medium = relocInfo->medium1; @@ -1640,7 +1672,6 @@ void AudioLoad_RelocateFontAndPreloadSamples(s32 fontId, SoundFontData* mem, Rel for (i = 0; i < gAudioContext.numUsedSamples; i++) { size += ALIGN16(gAudioContext.usedSamples[i]->size); } - if (size && size) {} for (i = 0; i < gAudioContext.numUsedSamples; i++) { if (gAudioContext.preloadSampleStackTop == 120) { @@ -2024,16 +2055,16 @@ void AudioLoad_ScriptLoad(s32 tableType, s32 id, s8* isDone) { void AudioLoad_ProcessScriptLoads(void) { u32 temp = 0; - u32 sp20; + u32 sp20 = 0; // TODO FIX s8* isDone; - if (osRecvMesg(&sScriptLoadQueue, (OSMesg*)&sp20, OS_MESG_NOBLOCK) != -1) { + //if (osRecvMesg(&sScriptLoadQueue, (OSMesg*)&sp20, OS_MESG_NOBLOCK) != -1) { TODO FIX HACK temp = sp20 >> 24; isDone = sScriptLoadDonePointers[temp]; if (isDone != NULL) { *isDone = 0; } - } + //} } void AudioLoad_InitScriptLoads(void) { diff --git a/src/code/audio_synthesis.c b/src/code/audio_synthesis.c index ff7f4f5a0..c7fa66e39 100644 --- a/src/code/audio_synthesis.c +++ b/src/code/audio_synthesis.c @@ -685,7 +685,7 @@ Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisS s32 nTrailingSamplesToIgnore; s32 phi_a1_2; s32 frameIndex; - s32 skipBytes; + s32 skipBytes;// = 0; // TODO HACK not sure why this isnt being set s32 temp_v1_6; void* buf; s32 nSamplesToDecode; @@ -698,10 +698,10 @@ Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisS s32 phi_s4; s32 nFirstFrameSamplesToIgnore; s32 pad2[7]; - s32 frameSize; + s32 frameSize = 0; // TODO HACK not sure why this isnt being set s32 nFramesToDecode; - s32 skipInitialSamples; - s32 sampleDataStart; + s32 skipInitialSamples = 16; // TODO HACK not sure why this isnt being set + s32 sampleDataStart = 0; // TODO HACK not sure why this isnt being set u8* sampleData; s32 nParts; s32 curPart; @@ -795,9 +795,7 @@ Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisS gAudioContext.curLoadedBook = audioFontSample->book->book; break; } - if (1) {} - if (1) {} - if (1) {} + nEntries = 16 * audioFontSample->book->order * audioFontSample->book->npredictors; aLoadADPCM(cmd++, nEntries, gAudioContext.curLoadedBook); } @@ -869,6 +867,8 @@ Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisS goto skip; case CODEC_REVERB: break; + default: + break; } if (nFramesToDecode != 0) { diff --git a/src/code/code_800E4FE0.c b/src/code/code_800E4FE0.c index 6425f514b..92c66055a 100644 --- a/src/code/code_800E4FE0.c +++ b/src/code/code_800E4FE0.c @@ -16,6 +16,10 @@ #include "def/createmesgqueue.h" #include "def/recvmesg.h" +#include "redef_msgqueue.h" + +u32 osGetCount(void); + #define SAMPLES_TO_OVERPRODUCE 0x10 #define EXTRA_BUFFERED_AI_SAMPLES_TARGET 0x80 @@ -91,7 +95,7 @@ AudioTask* func_800E5000(void) { if (gAudioContext.resetTimer < 16) { if (gAudioContext.aiBufLengths[index] != 0) { - // TODO FIX osAiSetNextBuffer(gAudioContext.aiBuffers[index], gAudioContext.aiBufLengths[index] * 4); + osAiSetNextBuffer(gAudioContext.aiBuffers[index], gAudioContext.aiBufLengths[index] * 4); if (gAudioContext.aiBuffers[index]) {} if (gAudioContext.aiBufLengths[index]) {} } @@ -167,9 +171,6 @@ AudioTask* func_800E5000(void) { if (gAudioContext.resetStatus == 0) { // msg = 0000RREE R = read pos, E = End Pos while (osRecvMesg(gAudioContext.cmdProcQueueP, (OSMesg*)&sp4C, OS_MESG_NOBLOCK) != -1) { - if (1) {} - if (1) {} - if (1) {} Audio_ProcessCmds(sp4C); j++; } @@ -180,7 +181,7 @@ AudioTask* func_800E5000(void) { gAudioContext.curAbiCmdBuf = AudioSynth_Update(gAudioContext.curAbiCmdBuf, &abiCmdCnt, currAiBuffer, gAudioContext.aiBufLengths[index]); - gAudioContext.audioRandom = (gAudioContext.audioRandom + gAudioContext.totalTaskCnt); // TODO FIX *osGetCount(); + gAudioContext.audioRandom = (gAudioContext.audioRandom + gAudioContext.totalTaskCnt) * osGetCount(); gAudioContext.audioRandom = gAudioContext.aiBuffers[index][gAudioContext.totalTaskCnt & 0xFF] + gAudioContext.audioRandom; gWaveSamples[8] = (s16*)(((u8*)func_800E4FE0) + (gAudioContext.audioRandom & 0xFFF0)); @@ -373,8 +374,8 @@ void Audio_InitMesgQueuesInternal(void) { void Audio_QueueCmd(u32 opArgs, void** data) { AudioCmd* cmd = &gAudioContext.cmdBuf[gAudioContext.cmdWrPos & 0xFF]; - cmd->opArgs = opArgs; - cmd->data = *data; + cmd->opArgs = opArgs; // BE32(opArgs); + cmd->data = (u32)*data; // BE32((u32)*data); // TODO FIX broke in 64 bit gAudioContext.cmdWrPos++; @@ -527,7 +528,7 @@ s32 func_800E5EDC(void) { } void func_800E5F34(void) { - return; // TODO FIX HACK + return; // TODO FIX HACK IGNORE // macro? // clang-format off s32 chk = -1; s32 sp28; do {} while (osRecvMesg(gAudioContext.audioResetQueueP, (OSMesg*)&sp28, OS_MESG_NOBLOCK) != chk); @@ -826,7 +827,7 @@ s32 func_800E66C0(s32 arg0) { u32 Audio_NextRandom(void) { static u32 audRand = 0x12345678; - // TODO FIX audRand = ((osGetCount() + 0x1234567) * (audRand + gAudioContext.totalTaskCnt)); + audRand = ((osGetCount() + 0x1234567) * (audRand + gAudioContext.totalTaskCnt)); audRand += gAudioContext.audioRandom; return audRand; } diff --git a/src/code/code_800EC960.c b/src/code/code_800EC960.c index c951f8951..b8f2f337e 100644 --- a/src/code/code_800EC960.c +++ b/src/code/code_800EC960.c @@ -3043,7 +3043,6 @@ void Audio_ClearSariaBgmAtPos(Vec3f* pos) { * equally between the two bgm channels. Split based on note priority */ void Audio_SplitBgmChannels(s8 volSplit) { - return; // TODO FIX u8 volume; u8 notePriority; u16 channelBits; @@ -3293,7 +3292,6 @@ void func_800F5C2C(void) { } void Audio_PlayFanfare(u16 seqId) { - return; // TODO FIX u16 sp26; u32 sp20; u8* sp1C; diff --git a/src/code/code_800F7260.c b/src/code/code_800F7260.c index bc296ea58..5ba2de067 100644 --- a/src/code/code_800F7260.c +++ b/src/code/code_800F7260.c @@ -42,13 +42,13 @@ char D_80133398[] = " L"; // bss static SoundRequest sSoundRequests[0x100]; -static SoundBankEntry D_8016BAD0[9]; -static SoundBankEntry D_8016BC80[12]; -static SoundBankEntry D_8016BEC0[22]; -static SoundBankEntry D_8016C2E0[20]; -static SoundBankEntry D_8016C6A0[8]; -static SoundBankEntry D_8016C820[3]; -static SoundBankEntry D_8016C8B0[5]; +static SoundBankEntry gSoundBankPlayer[9]; +static SoundBankEntry gSoundBankItem[12]; +static SoundBankEntry gSoundBankEnvironment[22]; +static SoundBankEntry gSoundBankEnemy[20]; +static SoundBankEntry gSoundBankSystem[8]; +static SoundBankEntry gSoundBankOcarina[3]; +static SoundBankEntry gSoundBankVoice[5]; static u8 sSoundBankListEnd[7]; static u8 sSoundBankFreeListStart[7]; static u8 sSoundBankUnused[7]; @@ -83,12 +83,12 @@ u8 sSoundRequestReadIndex = 0; * 6 : Voice Bank size 5 */ SoundBankEntry* gSoundBanks[7] = { - D_8016BAD0, D_8016BC80, D_8016BEC0, D_8016C2E0, D_8016C6A0, D_8016C820, D_8016C8B0, + gSoundBankPlayer, gSoundBankItem, gSoundBankEnvironment, gSoundBankEnemy, gSoundBankSystem, gSoundBankOcarina, gSoundBankVoice, }; u8 sBankSizes[ARRAY_COUNT(gSoundBanks)] = { - ARRAY_COUNT(D_8016BAD0), ARRAY_COUNT(D_8016BC80), ARRAY_COUNT(D_8016BEC0), ARRAY_COUNT(D_8016C2E0), - ARRAY_COUNT(D_8016C6A0), ARRAY_COUNT(D_8016C820), ARRAY_COUNT(D_8016C8B0), + ARRAY_COUNT(gSoundBankPlayer), ARRAY_COUNT(gSoundBankItem), ARRAY_COUNT(gSoundBankEnvironment), ARRAY_COUNT(gSoundBankEnemy), + ARRAY_COUNT(gSoundBankSystem), ARRAY_COUNT(gSoundBankOcarina), ARRAY_COUNT(gSoundBankVoice), }; u8 gSfxChannelLayout = 0; @@ -112,7 +112,6 @@ u8 gAudioSfxSwapOff = 0; u8 D_801333F8 = 0; void Audio_SetSoundBanksMute(u16 muteMask) { - return; // TODO FIX u8 bankId; for (bankId = 0; bankId < ARRAY_COUNT(gSoundBanks); bankId++) { @@ -126,14 +125,12 @@ void Audio_SetSoundBanksMute(u16 muteMask) { } void Audio_QueueSeqCmdMute(u8 channelIdx) { - return; // TODO FIX D_801333D0 |= (1 << channelIdx); Audio_SetVolScale(SEQ_PLAYER_BGM_MAIN, 2, 0x40, 0xF); Audio_SetVolScale(SEQ_PLAYER_BGM_SUB, 2, 0x40, 0xF); } void Audio_ClearBGMMute(u8 channelIdx) { - return; // TODO FIX D_801333D0 &= ((1 << channelIdx) ^ 0xFFFF); if (D_801333D0 == 0) { Audio_SetVolScale(SEQ_PLAYER_BGM_MAIN, 2, 0x7F, 0xF); @@ -142,7 +139,6 @@ void Audio_ClearBGMMute(u8 channelIdx) { } void Audio_PlaySoundGeneral(u16 sfxId, Vec3f* pos, u8 token, f32* freqScale, f32* vol, s8* reverbAdd) { - return; // TODO FIX u8 i; SoundRequest* req; @@ -178,7 +174,6 @@ void Audio_PlaySoundGeneral(u16 sfxId, Vec3f* pos, u8 token, f32* freqScale, f32 } void Audio_RemoveMatchingSoundRequests(u8 aspect, SoundBankEntry* cmp) { - return; // TODO FIX SoundRequest* req; s32 remove; u8 i = sSoundRequestReadIndex; @@ -225,7 +220,6 @@ void Audio_RemoveMatchingSoundRequests(u8 aspect, SoundBankEntry* cmp) { } void Audio_ProcessSoundRequest(void) { - return; // TODO FIX u16 sfxId; u8 count; u8 index; @@ -328,7 +322,6 @@ void Audio_ProcessSoundRequest(void) { } void Audio_RemoveSoundBankEntry(u8 bankId, u8 entryIndex) { - return; // TODO FIX SoundBankEntry* entry = &gSoundBanks[bankId][entryIndex]; u8 i; @@ -356,7 +349,6 @@ void Audio_RemoveSoundBankEntry(u8 bankId, u8 entryIndex) { } void Audio_ChooseActiveSounds(u8 bankId) { - return; // TODO FIX u8 numChosenSounds; u8 numChannels; u8 entryIndex; @@ -513,7 +505,6 @@ void Audio_ChooseActiveSounds(u8 bankId) { } void Audio_PlayActiveSounds(u8 bankId) { - return; // TODO FIX u8 entryIndex; SequenceChannel* channel; SoundBankEntry* entry; @@ -574,7 +565,6 @@ void Audio_PlayActiveSounds(u8 bankId) { } void Audio_StopSfxByBank(u8 bankId) { - return; // TODO FIX SoundBankEntry* entry; s32 pad; SoundBankEntry cmp; @@ -595,7 +585,6 @@ void Audio_StopSfxByBank(u8 bankId) { } void func_800F8884(u8 bankId, Vec3f* pos) { - return; // TODO FIX HACK SoundBankEntry* entry; u8 entryIndex = gSoundBanks[bankId][0].next; u8 prevEntryIndex = 0; @@ -692,7 +681,6 @@ void Audio_StopSfxByTokenAndId(u8 token, u16 sfxId) { } void Audio_StopSfxById(u32 sfxId) { - return; // TODO FIX SoundBankEntry* entry; u8 entryIndex = gSoundBanks[SFX_BANK(sfxId)][0].next; u8 prevEntryIndex = 0; @@ -717,7 +705,6 @@ void Audio_StopSfxById(u32 sfxId) { } void Audio_ProcessSoundRequests(void) { - return; // TODO FIX while (sSoundRequestWriteIndex != sSoundRequestReadIndex) { Audio_ProcessSoundRequest(); sSoundRequestReadIndex++; @@ -725,7 +712,6 @@ void Audio_ProcessSoundRequests(void) { } void Audio_SetUnusedBankLerp(u8 bankId, u8 target, u16 delay) { - return; // TODO FIX if (delay == 0) { delay++; } @@ -735,7 +721,6 @@ void Audio_SetUnusedBankLerp(u8 bankId, u8 target, u16 delay) { } void Audio_StepUnusedBankLerp(u8 bankId) { - return; // TODO FIX if (sUnusedBankLerp[bankId].remainingFrames != 0) { sUnusedBankLerp[bankId].remainingFrames--; if (sUnusedBankLerp[bankId].remainingFrames != 0) { @@ -747,7 +732,6 @@ void Audio_StepUnusedBankLerp(u8 bankId) { } void func_800F8F88(void) { - return; // TODO FIX u8 bankId; if (IS_SEQUENCE_CHANNEL_VALID(gAudioContext.seqPlayers[SEQ_PLAYER_SFX].channels[0])) { @@ -761,7 +745,6 @@ void func_800F8F88(void) { } u8 Audio_IsSfxPlaying(u32 sfxId) { - return false; // TODO FIX SoundBankEntry* entry; u8 entryIndex = gSoundBanks[SFX_BANK(sfxId)][0].next; @@ -776,7 +759,6 @@ u8 Audio_IsSfxPlaying(u32 sfxId) { } void Audio_ResetSounds(void) { - return; // TODO FIX u8 bankId; u8 i; u8 entryIndex; diff --git a/src/code/z_message_PAL.c b/src/code/z_message_PAL.c index 0b494f8b5..2c7f050bc 100644 --- a/src/code/z_message_PAL.c +++ b/src/code/z_message_PAL.c @@ -2471,9 +2471,7 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { case MSGMODE_DISPLAY_SONG_PLAYED: case MSGMODE_SONG_DEMONSTRATION: msgCtx->ocarinaStaff = Audio_OcaGetDisplayingStaff(); -#ifndef ENABLE_AUDIO - msgCtx->ocarinaStaff->state = 0; // TODO FIX HACK -#endif + if (msgCtx->ocarinaStaff->state == 0) { if (msgCtx->msgMode == MSGMODE_DISPLAY_SONG_PLAYED) { msgCtx->msgMode = MSGMODE_DISPLAY_SONG_PLAYED_TEXT_BEGIN; diff --git a/src/port/audio/audio_sdl.cpp b/src/port/audio/audio_sdl.cpp index c8d02d25d..ac0d7ea0c 100644 --- a/src/port/audio/audio_sdl.cpp +++ b/src/port/audio/audio_sdl.cpp @@ -1,3 +1,4 @@ +#define ENABLE_SDL_AUDIO #if defined(ENABLE_SDL_AUDIO) #ifdef __MINGW32__ diff --git a/src/port/code_800F9280.c b/src/port/code_800F9280.c index 042a4863a..8b15f4902 100644 --- a/src/port/code_800F9280.c +++ b/src/port/code_800F9280.c @@ -1,16 +1 @@ -#include "global.h" - -u8 sSeqCmdWrPos[0x4] = {0x00, 0x00, 0x00, 0x00}; - -u8 sSeqCmdRdPos[0x4] = {0x00, 0x00, 0x00, 0x00}; - -u8 D_80133408 = 0x00; - -u8 D_8013340C = 0x01; - -u8 D_80133410[0x4] = {0x00, 0x01, 0x02, 0x03}; - -u8 gAudioSpecId = 0x00; - -u8 D_80133418 = 0x00; - +#include "assets/code_800F9280.h" diff --git a/src/port/main.c b/src/port/main.c index 89339e6ff..dee8abc3d 100644 --- a/src/port/main.c +++ b/src/port/main.c @@ -2,12 +2,16 @@ #include "ultra64/types.h" #include "ultra64/vi.h" #include "z64audio.h" +#include "audiomgr.h" #include "z_prenmi_buff.h" #include "ultra64/rcp.h" #include "ultra64/exception.h" #include "def/sys_cfb.h" #include "def/code_800FC620.h" #include "def/z_debug.h" +#include "audiomgr.h" +#include "def/code_800EC960.h" +#include "def/audioMgr.h" //f32 qNaN0x3FFFFF; f32 qNaN0x10000; @@ -24,6 +28,8 @@ s32 gScreenHeight = SCREEN_HEIGHT; u32 gSystemHeapSize = 0; #endif +AudioMgr gAudioMgr; + unk_D_8016E750 D_8016E750[4]; u8 osAppNmiBuffer[0x40]; UNK_TYPE D_06000000; @@ -38,8 +44,6 @@ u32 osRomBase; u32 osMemSize = 0x800000; -AudioSpec gAudioSpecs[18]; - void (*D_801755D0)(void) = NULL; void xxxDebugDisplay_Init(void) @@ -170,6 +174,8 @@ int main() { //Main_LogSystemHeap(); + AudioMgr_Init(&gAudioMgr, NULL, NULL, 0xA, NULL, NULL); + /*StackCheck_Init(&sGraphStackInfo, sGraphStack, sGraphStack + sizeof(sGraphStack), 0, 0x100, "graph"); osCreateThread(&sGraphThread, 4, Graph_ThreadEntry, arg, sGraphStack + sizeof(sGraphStack), Z_PRIORITY_GRAPH); diff --git a/src/port/pc_main.cpp b/src/port/pc_main.cpp index 7cb3c3b05..d5213b841 100644 --- a/src/port/pc_main.cpp +++ b/src/port/pc_main.cpp @@ -1,6 +1,5 @@ #define WIN32_LEAN_AND_MEAN #define ENABLE_OPENGL -#define DISABLE_AUDIO #define USE_GLIDEN64 #include "window.h" @@ -144,10 +143,12 @@ s8 D_8032C648; extern AudioAPI audio_sdl; AudioAPI* audio_api = nullptr; +/* #ifdef ENABLE_SDL_AUDIO #else AudioAPI audio_sdl; #endif +*/ #endif #ifdef USE_CF3D @@ -254,6 +255,32 @@ extern "C" { void hid_update(); } +extern void* gAudioBuffer; +extern u32 gAudioBufferSize; +extern "C" { + void AudioMgr_HandleRetraceNULL(); +} + +void audio_thread() +{ + int samples_left = audio_api->buffered(); + u32 num_audio_samples = samples_left < audio_api->get_desired_buffered() ? 544 : 528; + + s16 audio_buffer[544 * 2 * 2]; + for(int i = 0; i < 2; i++) + { + create_next_audio_buffer(audio_buffer + i * (num_audio_samples * 2), num_audio_samples); + } + + AudioMgr_HandleRetraceNULL(); + + if(audio_api /* && !config().game().disableSound()*/) + { + //audio_api->play((const u8*)audio_buffer, 2 * num_audio_samples * 4); + audio_api->play((const u8*)gAudioBuffer, gAudioBufferSize); + } +} + void main_func(void) { sm64::log("initializing app\n"); @@ -392,6 +419,7 @@ extern "C" { gWindow->setTargetFrameRate(60 / frameRateDivisor()); gWindow->end_frame(); } + audio_thread(); } float gfx_ar_ratio() diff --git a/src/port/rsp.c b/src/port/rsp.c index a182f0cda..c488ca695 100644 --- a/src/port/rsp.c +++ b/src/port/rsp.c @@ -1,26 +1 @@ -#include "global.h" - -u8 gSoundFontTable[0x270] = {0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xA0, 0x02, 0x00, 0x00, 0xFF, 0x5C, 0x04, 0x00, 0x88, 0x00, 0x00, 0x3A, 0xA0, 0x00, 0x00, 0x17, 0xB0, 0x02, 0x00, 0x00, 0xFF, 0x33, 0x01, 0x00, 0x29, 0x00, 0x00, 0x52, 0x50, 0x00, 0x00, 0x0C, 0xE0, 0x02, 0x02, 0x00, 0xFF, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x30, 0x00, 0x00, 0x15, 0xD0, 0x02, 0x02, 0x01, 0xFF, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x02, 0x02, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x0B, 0x60, 0x02, 0x02, 0x01, 0xFF, 0x0D, 0x40, 0x00, 0x00, 0x00, 0x00, 0x81, 0x60, 0x00, 0x00, 0x05, 0x20, 0x02, 0x02, 0x01, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x80, 0x00, 0x00, 0x08, 0x40, 0x02, 0x02, 0x03, 0xFF, 0x0A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x8E, 0xC0, 0x00, 0x00, 0x0B, 0x20, 0x02, 0x02, 0x01, 0xFF, 0x0A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x99, 0xE0, 0x00, 0x00, 0x0F, 0xC0, 0x02, 0x02, 0x01, 0xFF, 0x0D, 0x40, 0x00, 0x00, 0x00, 0x00, 0xA9, 0xA0, 0x00, 0x00, 0x0B, 0x00, 0x02, 0x02, 0x01, 0xFF, 0x0E, 0x40, 0x00, 0x00, 0x00, 0x00, 0xB4, 0xA0, 0x00, 0x00, 0x03, 0x90, 0x02, 0x02, 0x01, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x30, 0x00, 0x00, 0x03, 0x20, 0x02, 0x02, 0x01, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0x50, 0x00, 0x00, 0x06, 0xF0, 0x02, 0x02, 0x01, 0xFF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0x40, 0x00, 0x00, 0x03, 0x90, 0x02, 0x02, 0x05, 0xFF, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5, 0xD0, 0x00, 0x00, 0x0B, 0x40, 0x02, 0x02, 0x01, 0xFF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0x10, 0x00, 0x00, 0x09, 0xE0, 0x02, 0x02, 0x06, 0xFF, 0x0A, 0x40, 0x00, 0x00, 0x00, 0x00, 0xDA, 0xF0, 0x00, 0x00, 0x05, 0x60, 0x02, 0x02, 0x01, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x50, 0x00, 0x00, 0x0C, 0xC0, 0x02, 0x01, 0x01, 0xFF, 0x0D, 0x40, 0x00, 0x00, 0x00, 0x00, 0xED, 0x10, 0x00, 0x00, 0x03, 0xA0, 0x02, 0x02, 0x01, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xB0, 0x00, 0x00, 0x0A, 0xA0, 0x02, 0x02, 0x01, 0xFF, 0x0A, 0x40, 0x00, 0x00, 0x00, 0x00, 0xFB, 0x50, 0x00, 0x00, 0x0A, 0x60, 0x02, 0x02, 0x01, 0xFF, 0x0A, 0x40, 0x00, 0x00, 0x00, 0x01, 0x05, 0xB0, 0x00, 0x00, 0x0B, 0xF0, 0x02, 0x02, 0x01, 0xFF, 0x0B, 0x40, 0x00, 0x00, 0x00, 0x01, 0x11, 0xA0, 0x00, 0x00, 0x01, 0xF0, 0x02, 0x02, 0x01, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x13, 0x90, 0x00, 0x00, 0x08, 0x60, 0x02, 0x02, 0x01, 0xFF, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1B, 0xF0, 0x00, 0x00, 0x05, 0xB0, 0x02, 0x02, 0x01, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x21, 0xA0, 0x00, 0x00, 0x02, 0x50, 0x02, 0x02, 0x01, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x01, 0x23, 0xF0, 0x00, 0x00, 0x04, 0xE0, 0x02, 0x02, 0x01, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x28, 0xD0, 0x00, 0x00, 0x04, 0xC0, 0x02, 0x02, 0x01, 0xFF, 0x05, 0x00, 0x00, 0x00, 0x00, 0x01, 0x2D, 0x90, 0x00, 0x00, 0x0C, 0x00, 0x02, 0x02, 0x01, 0xFF, 0x0C, 0x40, 0x00, 0x00, 0x00, 0x01, 0x39, 0x90, 0x00, 0x00, 0x02, 0x70, 0x02, 0x02, 0x01, 0xFF, 0x05, 0x00, 0x00, 0x00, 0x00, 0x01, 0x3C, 0x00, 0x00, 0x00, 0x06, 0x40, 0x02, 0x02, 0x01, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x42, 0x40, 0x00, 0x00, 0x13, 0x00, 0x02, 0x02, 0x01, 0xFF, 0x10, 0x40, 0x00, 0x00, 0x00, 0x01, 0x55, 0x40, 0x00, 0x00, 0x11, 0xA0, 0x02, 0x02, 0x01, 0xFF, 0x10, 0x40, 0x00, 0x00, 0x00, 0x01, 0x66, 0xE0, 0x00, 0x00, 0x17, 0x20, 0x02, 0x02, 0x01, 0xFF, 0x10, 0x40, 0x00, 0x00, 0x00, 0x01, 0x7E, 0x00, 0x00, 0x00, 0x0D, 0xE0, 0x02, 0x01, 0x01, 0xFF, 0x0F, 0x40, 0x00, 0x00, 0x00, 0x01, 0x8B, 0xE0, 0x00, 0x00, 0x06, 0x60, 0x02, 0x01, 0x01, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x01, 0x92, 0x40, 0x00, 0x01, 0x2B, 0x60, 0x02, 0x02, 0x00, 0xFF, 0x02, 0x00, 0x00, 0x00}; - -u8 gSequenceFontTable[0x1C0] = {0x00, 0xDC, 0x00, 0xDF, 0x00, 0xE1, 0x00, 0xE3, 0x00, 0xE5, 0x00, 0xE7, 0x00, 0xE9, 0x00, 0xEB, 0x00, 0xED, 0x00, 0xEF, 0x00, 0xF1, 0x00, 0xF3, 0x00, 0xF5, 0x00, 0xF7, 0x00, 0xF9, 0x00, 0xFB, 0x00, 0xFD, 0x00, 0xFF, 0x01, 0x01, 0x01, 0x03, 0x01, 0x05, 0x01, 0x07, 0x01, 0x09, 0x01, 0x0B, 0x01, 0x0D, 0x01, 0x0F, 0x01, 0x11, 0x01, 0x13, 0x01, 0x15, 0x01, 0x17, 0x01, 0x19, 0x01, 0x1B, 0x01, 0x1D, 0x01, 0x1F, 0x01, 0x21, 0x01, 0x23, 0x01, 0x25, 0x01, 0x27, 0x01, 0x29, 0x01, 0x2B, 0x01, 0x2D, 0x01, 0x2F, 0x01, 0x31, 0x01, 0x33, 0x01, 0x35, 0x01, 0x37, 0x01, 0x39, 0x01, 0x3B, 0x01, 0x3D, 0x01, 0x3F, 0x01, 0x41, 0x01, 0x43, 0x01, 0x45, 0x01, 0x47, 0x01, 0x49, 0x01, 0x4B, 0x01, 0x4D, 0x01, 0x4F, 0x01, 0x51, 0x01, 0x53, 0x01, 0x55, 0x01, 0x57, 0x01, 0x59, 0x01, 0x5B, 0x01, 0x5D, 0x01, 0x5F, 0x01, 0x61, 0x01, 0x63, 0x01, 0x65, 0x01, 0x67, 0x01, 0x69, 0x01, 0x6B, 0x01, 0x6D, 0x01, 0x6F, 0x01, 0x71, 0x01, 0x73, 0x01, 0x75, 0x01, 0x77, 0x01, 0x79, 0x01, 0x7B, 0x01, 0x7D, 0x01, 0x7F, 0x01, 0x81, 0x01, 0x83, 0x01, 0x85, 0x01, 0x87, 0x01, 0x89, 0x01, 0x8B, 0x01, 0x8D, 0x01, 0x8F, 0x01, 0x91, 0x01, 0x93, 0x01, 0x95, 0x01, 0x97, 0x01, 0x99, 0x01, 0x9B, 0x01, 0x9D, 0x01, 0x9F, 0x01, 0xA1, 0x01, 0xA3, 0x01, 0xA5, 0x01, 0xA7, 0x01, 0xA9, 0x01, 0xAB, 0x01, 0xAD, 0x01, 0xAF, 0x01, 0xB1, 0x01, 0xB3, 0x01, 0xB5, 0x01, 0xB7, 0x02, 0x01, 0x00, 0x01, 0x02, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x0B, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x04, 0x01, 0x05, 0x01, 0x06, 0x01, 0x03, 0x01, 0x23, 0x01, 0x03, 0x01, 0x23, 0x01, 0x03, 0x01, 0x23, 0x01, 0x12, 0x01, 0x07, 0x01, 0x08, 0x01, 0x09, 0x01, 0x09, 0x01, 0x0A, 0x01, 0x03, 0x01, 0x0C, 0x01, 0x03, 0x01, 0x1E, 0x01, 0x0D, 0x01, 0x0E, 0x01, 0x03, 0x01, 0x03, 0x01, 0x12, 0x01, 0x12, 0x01, 0x12, 0x01, 0x12, 0x01, 0x12, 0x01, 0x03, 0x01, 0x23, 0x01, 0x09, 0x01, 0x03, 0x01, 0x0F, 0x01, 0x09, 0x01, 0x05, 0x01, 0x10, 0x01, 0x11, 0x01, 0x11, 0x01, 0x11, 0x01, 0x03, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x03, 0x01, 0x09, 0x01, 0x08, 0x01, 0x13, 0x01, 0x14, 0x01, 0x09, 0x01, 0x15, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x16, 0x01, 0x13, 0x01, 0x09, 0x01, 0x17, 0x01, 0x12, 0x01, 0x24, 0x01, 0x18, 0x01, 0x19, 0x01, 0x13, 0x01, 0x20, 0x01, 0x1B, 0x01, 0x1C, 0x01, 0x1D, 0x01, 0x03, 0x01, 0x1F, 0x01, 0x20, 0x01, 0x20, 0x01, 0x09, 0x01, 0x21, 0x01, 0x22, 0x01, 0x21, 0x01, 0x09, 0x01, 0x20, 0x01, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -u8 gSequenceTable[0x6F0] = {0x00, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x90, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x90, 0x00, 0x00, 0x10, 0x40, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xD0, 0x00, 0x00, 0x25, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9F, 0xD0, 0x00, 0x00, 0x0A, 0xB0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0x80, 0x00, 0x00, 0x08, 0x90, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB3, 0x10, 0x00, 0x00, 0x09, 0x80, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBC, 0x90, 0x00, 0x00, 0x0B, 0x80, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0x10, 0x00, 0x00, 0x07, 0xA0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xB0, 0x00, 0x00, 0x05, 0xC0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0x70, 0x00, 0x00, 0x07, 0x30, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0xA0, 0x00, 0x00, 0x06, 0xA0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE3, 0x40, 0x00, 0x00, 0x07, 0x40, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0x80, 0x00, 0x00, 0x09, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF3, 0x80, 0x00, 0x00, 0x06, 0xF0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0x70, 0x00, 0x00, 0x08, 0x20, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x90, 0x00, 0x00, 0x06, 0xB0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x09, 0x40, 0x00, 0x00, 0x07, 0xC0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x11, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x19, 0x00, 0x00, 0x00, 0x09, 0xF0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x22, 0xF0, 0x00, 0x00, 0x09, 0x60, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x2C, 0x50, 0x00, 0x00, 0x05, 0xF0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x32, 0x40, 0x00, 0x00, 0x06, 0x50, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x38, 0x90, 0x00, 0x00, 0x05, 0x80, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x3E, 0x10, 0x00, 0x00, 0x06, 0x70, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x44, 0x80, 0x00, 0x00, 0x01, 0x70, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x45, 0xF0, 0x00, 0x00, 0x1A, 0xB0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x60, 0xA0, 0x00, 0x00, 0x10, 0xF0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x71, 0x90, 0x00, 0x00, 0x0F, 0x30, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xC0, 0x00, 0x00, 0x03, 0x10, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x83, 0xD0, 0x00, 0x00, 0x07, 0x10, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8A, 0xE0, 0x00, 0x00, 0x11, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9B, 0xE0, 0x00, 0x00, 0x05, 0x70, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xA1, 0x50, 0x00, 0x00, 0x01, 0xB0, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xA3, 0x00, 0x00, 0x00, 0x06, 0x30, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xA9, 0x30, 0x00, 0x00, 0x01, 0x50, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xAA, 0x80, 0x00, 0x00, 0x05, 0x60, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xAF, 0xE0, 0x00, 0x00, 0x02, 0x30, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xB2, 0x10, 0x00, 0x00, 0x04, 0xC0, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xB6, 0xD0, 0x00, 0x00, 0x09, 0xA0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x70, 0x00, 0x00, 0x28, 0xD0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE9, 0x40, 0x00, 0x00, 0x04, 0xD0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEE, 0x10, 0x00, 0x00, 0x0A, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x10, 0x00, 0x00, 0x12, 0x40, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0A, 0x50, 0x00, 0x00, 0x04, 0x50, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0E, 0xA0, 0x00, 0x00, 0x17, 0x20, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x25, 0xC0, 0x00, 0x00, 0x05, 0xA0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x2B, 0x60, 0x00, 0x00, 0x12, 0xE0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3E, 0x40, 0x00, 0x00, 0x25, 0xA0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x63, 0xE0, 0x00, 0x00, 0x0A, 0x20, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x6E, 0x00, 0x00, 0x00, 0x11, 0xA0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x7F, 0xA0, 0x00, 0x00, 0x05, 0x40, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x84, 0xE0, 0x00, 0x00, 0x04, 0x90, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x89, 0x70, 0x00, 0x00, 0x05, 0x10, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x8E, 0x80, 0x00, 0x00, 0x07, 0x90, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x96, 0x10, 0x00, 0x00, 0x05, 0x90, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x9B, 0xA0, 0x00, 0x00, 0x05, 0xB0, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xA1, 0x50, 0x00, 0x00, 0x13, 0x10, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xB4, 0x60, 0x00, 0x00, 0x01, 0xC0, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xB6, 0x20, 0x00, 0x00, 0x09, 0x80, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xBF, 0xA0, 0x00, 0x00, 0x03, 0x90, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xC3, 0x30, 0x00, 0x00, 0x0F, 0x90, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xD2, 0xC0, 0x00, 0x00, 0x03, 0xE0, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xD6, 0xA0, 0x00, 0x00, 0x09, 0x60, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xE0, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x1A, 0x80, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x14, 0x80, 0x00, 0x00, 0x06, 0x60, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1A, 0xE0, 0x00, 0x00, 0x1A, 0xD0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x35, 0xB0, 0x00, 0x00, 0x05, 0xB0, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x3B, 0x60, 0x00, 0x00, 0x00, 0xB0, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x3C, 0x10, 0x00, 0x00, 0x01, 0x40, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x3D, 0x50, 0x00, 0x00, 0x01, 0x70, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x3E, 0xC0, 0x00, 0x00, 0x00, 0x80, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x3F, 0x40, 0x00, 0x00, 0x01, 0x30, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x40, 0x70, 0x00, 0x00, 0x00, 0xD0, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x41, 0x40, 0x00, 0x00, 0x04, 0x80, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x45, 0xC0, 0x00, 0x00, 0x04, 0x10, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x49, 0xD0, 0x00, 0x00, 0x10, 0x20, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x59, 0xF0, 0x00, 0x00, 0x0B, 0x70, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x65, 0x60, 0x00, 0x00, 0x0E, 0x10, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x73, 0x70, 0x00, 0x00, 0x04, 0xA0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x78, 0x10, 0x00, 0x00, 0x11, 0xA0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x89, 0xB0, 0x00, 0x00, 0x02, 0x10, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x8B, 0xC0, 0x00, 0x00, 0x0A, 0x30, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x95, 0xF0, 0x00, 0x00, 0x03, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x98, 0xF0, 0x00, 0x00, 0x03, 0x10, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x9C, 0x00, 0x00, 0x00, 0x0E, 0xC0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xAA, 0xC0, 0x00, 0x00, 0x04, 0x70, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xAF, 0x30, 0x00, 0x00, 0x03, 0xA0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xB2, 0xD0, 0x00, 0x00, 0x02, 0x20, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xB4, 0xF0, 0x00, 0x00, 0x07, 0x20, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xBC, 0x10, 0x00, 0x00, 0x11, 0x30, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xCD, 0x40, 0x00, 0x00, 0x18, 0x90, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE5, 0xD0, 0x00, 0x00, 0x04, 0x90, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xEA, 0x60, 0x00, 0x00, 0x01, 0x60, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xEB, 0xC0, 0x00, 0x00, 0x1D, 0xC0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x80, 0x00, 0x00, 0x03, 0x60, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0C, 0xE0, 0x00, 0x00, 0x0A, 0xC0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x17, 0xA0, 0x00, 0x00, 0x0C, 0xD0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x24, 0x70, 0x00, 0x00, 0x05, 0x80, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x29, 0xF0, 0x00, 0x00, 0x17, 0x30, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x41, 0x20, 0x00, 0x00, 0x11, 0xB0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x52, 0xD0, 0x00, 0x00, 0x06, 0x40, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x59, 0x10, 0x00, 0x00, 0x26, 0x10, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x7F, 0x20, 0x00, 0x00, 0x34, 0xA0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xB3, 0xC0, 0x00, 0x00, 0x18, 0xB0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xCC, 0x70, 0x00, 0x00, 0x08, 0xA0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xD5, 0x10, 0x00, 0x00, 0x13, 0x70, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xE8, 0x80, 0x00, 0x00, 0x08, 0xA0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xF1, 0x20, 0x00, 0x00, 0x09, 0x60, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -u8 gSampleBankTable[0x80] = {0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xB2, 0xA0, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xB2, 0xA0, 0x00, 0x00, 0x5C, 0xD0, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x0F, 0x70, 0x00, 0x01, 0xD0, 0xB0, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xE0, 0x20, 0x00, 0x00, 0xA5, 0xD0, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x85, 0xF0, 0x00, 0x00, 0xFA, 0xB0, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x80, 0xA0, 0x00, 0x02, 0x92, 0xF0, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -u64 rspAspMainDataStart[0x5C] = {0x000000010002FFFF, 0x002008007FFF4000, 0x1F681230114C1F18, 0x1E2C14F41E9C1CB0, 0x117C17CC11E81AA4, 0x1B3411901C5C1220, 0x178418301A201884, 0x1A841A941A481BA0, 0xF0000F0000F0000F, 0x0001001001001000, 0xC00030000C000300, 0x0001000400100040, 0x0002000400060008, 0x000A000C000E0010, 0x0001000100010001, 0x0001000100010001, 0x0000000100020004, 0x0008001001000200, 0x0001000000000000, 0x0001000000000000, 0x0000000100000000, 0x0000000100000000, 0x0000000000010000, 0x0000000000010000, 0x0000000000000001, 0x0000000000000001, 0x2000400060008000, 0xA000C000E000FFFF, 0x0C3966AD0D46FFDF, 0x0B3966960E5FFFD8, 0x0A4466690F83FFD0, 0x095A662610B4FFC8, 0x087D65CD11F0FFBF, 0x07AB655E1338FFB6, 0x06E464D9148CFFAC, 0x0628643F15EBFFA1, 0x0577638F1756FF96, 0x04D162CB18CBFF8A, 0x043561F31A4CFF7E, 0x03A461061BD7FF71, 0x031C60071D6CFF64, 0x029F5EF51F0BFF56, 0x022A5DD020B3FF48, 0x01BE5C9A2264FF3A, 0x015B5B53241EFF2C, 0x010159FC25E0FF1E, 0x00AE589627A9FF10, 0x00635720297AFF02, 0x001F559D2B50FEF4, 0xFFE2540D2D2CFEE8, 0xFFAC52702F0DFEDB, 0xFF7C50C730F3FED0, 0xFF534F1432DCFEC6, 0xFF2E4D5734C8FEBD, 0xFF0F4B9136B6FEB6, 0xFEF549C238A5FEB0, 0xFEDF47ED3A95FEAC, 0xFECE46113C85FEAB, 0xFEC044303E74FEAC, 0xFEB6424A4060FEAF, 0xFEAF4060424AFEB6, 0xFEAC3E744430FEC0, 0xFEAB3C854611FECE, 0xFEAC3A9547EDFEDF, 0xFEB038A549C2FEF5, 0xFEB636B64B91FF0F, 0xFEBD34C84D57FF2E, 0xFEC632DC4F14FF53, 0xFED030F350C7FF7C, 0xFEDB2F0D5270FFAC, 0xFEE82D2C540DFFE2, 0xFEF42B50559D001F, 0xFF02297A57200063, 0xFF1027A9589600AE, 0xFF1E25E059FC0101, 0xFF2C241E5B53015B, 0xFF3A22645C9A01BE, 0xFF4820B35DD0022A, 0xFF561F0B5EF5029F, 0xFF641D6C6007031C, 0xFF711BD7610603A4, 0xFF7E1A4C61F30435, 0xFF8A18CB62CB04D1, 0xFF961756638F0577, 0xFFA115EB643F0628, 0xFFAC148C64D906E4, 0xFFB61338655E07AB, 0xFFBF11F065CD087D, 0xFFC810B46626095A, 0xFFD00F8366690A44, 0xFFD80E5F66960B39, 0xFFDF0D4666AD0C39}; - -u8 D_80155F50[0x1630] = {0x4A, 0x00, 0x00, 0x2C, 0xC8, 0x1F, 0x20, 0x1B, 0xC8, 0x1E, 0x20, 0x1C, 0x20, 0x17, 0x0B, 0xA8, 0x4A, 0x00, 0x00, 0x50, 0x20, 0x16, 0x0D, 0x00, 0x4B, 0x1F, 0x00, 0x51, 0x8C, 0x0B, 0x00, 0xF0, 0x8C, 0x0C, 0x0F, 0xC4, 0x20, 0x01, 0x28, 0x00, 0x11, 0x60, 0x00, 0x06, 0x40, 0x81, 0x20, 0x00, 0x31, 0x8C, 0x00, 0x01, 0x11, 0x80, 0x00, 0x1E, 0xAC, 0x00, 0x0F, 0xC4, 0x08, 0x00, 0x04, 0x5A, 0x8C, 0x1A, 0x0B, 0xF8, 0x40, 0x0B, 0x58, 0x00, 0x31, 0x6B, 0x00, 0x01, 0x15, 0x60, 0x00, 0x0B, 0x40, 0x02, 0x48, 0x00, 0x8C, 0x03, 0x0F, 0xE8, 0x00, 0x62, 0x58, 0x22, 0x1D, 0x60, 0x00, 0x07, 0x40, 0x01, 0x50, 0x00, 0x8C, 0x04, 0x0F, 0xEC, 0x10, 0x20, 0x00, 0x04, 0x00, 0x24, 0x58, 0x22, 0x05, 0x61, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x14, 0x22, 0x00, 0x08, 0x40, 0x0B, 0x58, 0x00, 0x31, 0x6B, 0x04, 0x00, 0x15, 0x60, 0xFF, 0xFD, 0x20, 0x0B, 0x00, 0x01, 0x40, 0x8B, 0x58, 0x00, 0x8C, 0x02, 0x0F, 0xEC, 0x40, 0x82, 0x40, 0x00, 0x40, 0x82, 0x48, 0x00, 0xAC, 0x02, 0x00, 0xF0, 0x8C, 0x0B, 0x00, 0xF4, 0x15, 0x60, 0x00, 0x02, 0x8C, 0x0B, 0x0F, 0xE0, 0xAC, 0x0B, 0x00, 0xF4, 0x8C, 0x01, 0x0F, 0xD0, 0x8C, 0x02, 0x02, 0xE0, 0x8C, 0x03, 0x02, 0xE8, 0x8C, 0x04, 0x04, 0x10, 0x8C, 0x05, 0x04, 0x18, 0x00, 0x41, 0x10, 0x20, 0x00, 0x61, 0x18, 0x20, 0xAC, 0x02, 0x02, 0xE0, 0xAC, 0x03, 0x02, 0xE8, 0x00, 0x81, 0x20, 0x20, 0x00, 0xA1, 0x28, 0x20, 0xAC, 0x04, 0x04, 0x10, 0xAC, 0x05, 0x04, 0x18, 0x8C, 0x1A, 0x0F, 0xF0, 0x20, 0x0B, 0x02, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x07, 0xED, 0x37, 0xEC, 0x00, 0x00, 0x20, 0x13, 0x00, 0xA7, 0x37, 0x58, 0x00, 0x00, 0x0C, 0x00, 0x07, 0xF6, 0x24, 0x14, 0x09, 0x20, 0x27, 0x5A, 0x00, 0xA8, 0x20, 0x1B, 0xFF, 0x58, 0x0C, 0x00, 0x07, 0xF2, 0x40, 0x01, 0x20, 0x00, 0x8F, 0x79, 0x09, 0xC8, 0x13, 0x60, 0xFF, 0xF6, 0x30, 0x21, 0x00, 0x80, 0x00, 0x19, 0x66, 0x03, 0x00, 0x0C, 0x58, 0x40, 0x95, 0x6B, 0x03, 0x6E, 0x14, 0x20, 0x03, 0x7E, 0x8F, 0x78, 0x09, 0xCC, 0x01, 0x60, 0x00, 0x08, 0x27, 0x7B, 0x00, 0x08, 0x0C, 0x00, 0x04, 0x89, 0x87, 0x74, 0x09, 0xC1, 0x33, 0x33, 0x0F, 0xF8, 0x00, 0x14, 0xA0, 0x83, 0x08, 0x00, 0x07, 0xF6, 0x20, 0x1F, 0x11, 0x90, 0x8C, 0x0B, 0x01, 0xEC, 0x01, 0x79, 0x58, 0x24, 0x01, 0x78, 0x58, 0x25, 0x08, 0x00, 0x04, 0x65, 0xAC, 0x0B, 0x01, 0xEC, 0x90, 0x01, 0x00, 0xDE, 0x10, 0x20, 0x03, 0x6E, 0x20, 0x21, 0xFF, 0xFC, 0x08, 0x00, 0x04, 0x08, 0x8C, 0x3A, 0x01, 0x38, 0xC8, 0x1D, 0x18, 0x1A, 0x8C, 0x19, 0x00, 0xD8, 0x22, 0xF7, 0x00, 0x08, 0xEA, 0xFD, 0x18, 0x7F, 0xAE, 0xF8, 0x00, 0x04, 0xAE, 0xF9, 0x00, 0x00, 0x08, 0x00, 0x04, 0x96, 0x22, 0xF7, 0x00, 0x08, 0x20, 0x1F, 0x12, 0x10, 0x00, 0x18, 0x5D, 0x82, 0x31, 0x6B, 0x00, 0x3C, 0x8D, 0x6B, 0x00, 0xF8, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x18, 0xC2, 0x02, 0x03, 0xE0, 0x00, 0x08, 0x03, 0x0B, 0xC0, 0x20, 0xAC, 0x19, 0x00, 0xC8, 0x08, 0x00, 0x04, 0x84, 0xAC, 0x18, 0x00, 0xCC, 0xAC, 0x19, 0x00, 0xC0, 0x08, 0x00, 0x04, 0x84, 0xAC, 0x18, 0x00, 0xC4, 0x20, 0x1F, 0x11, 0x94, 0x02, 0xF6, 0x58, 0x22, 0x19, 0x60, 0x03, 0x5C, 0x40, 0x0C, 0x30, 0x00, 0x8C, 0x18, 0x00, 0xF0, 0x25, 0x73, 0x01, 0x58, 0x15, 0x80, 0xFF, 0xFC, 0x8C, 0x0C, 0x0F, 0xEC, 0x40, 0x98, 0x48, 0x00, 0x03, 0x13, 0x58, 0x20, 0x01, 0x8B, 0x60, 0x22, 0x05, 0x81, 0x00, 0x08, 0x40, 0x0B, 0x58, 0x00, 0x31, 0x6B, 0x04, 0x00, 0x15, 0x60, 0xFF, 0xFD, 0x8C, 0x18, 0x0F, 0xE8, 0x40, 0x0B, 0x50, 0x00, 0x11, 0x78, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x40, 0x98, 0x40, 0x00, 0x40, 0x0B, 0x50, 0x00, 0x01, 0x78, 0x58, 0x22, 0x19, 0x60, 0x00, 0x02, 0x01, 0x73, 0x58, 0x22, 0x19, 0x60, 0xFF, 0xFB, 0x03, 0x13, 0x58, 0x20, 0xAC, 0x0B, 0x00, 0xF0, 0x22, 0x73, 0xFF, 0xFF, 0x22, 0xD4, 0xDE, 0xA8, 0x3A, 0xD6, 0x02, 0x08, 0x08, 0x00, 0x07, 0xF6, 0x22, 0xD7, 0xFE, 0xA8, 0x20, 0x0B, 0x04, 0x10, 0x08, 0x00, 0x07, 0xED, 0x20, 0x0C, 0x12, 0xD8, 0x37, 0xFE, 0x00, 0x00, 0x24, 0x05, 0x00, 0x14, 0x24, 0x12, 0x00, 0x06, 0x24, 0x0F, 0x09, 0xC8, 0xA6, 0x41, 0x03, 0xCA, 0xA6, 0x42, 0x03, 0xCC, 0xA6, 0x43, 0x03, 0xCE, 0xA6, 0x40, 0x03, 0xD0, 0x8C, 0x1D, 0x03, 0xCC, 0x8C, 0xA9, 0x03, 0xF8, 0x8C, 0x70, 0x00, 0x24, 0x02, 0x09, 0x80, 0x24, 0x22, 0x51, 0xFF, 0xFA, 0x3A, 0x52, 0x00, 0x1C, 0x22, 0x55, 0xFF, 0xFA, 0x96, 0x22, 0x03, 0xD0, 0x22, 0x31, 0x00, 0x02, 0x10, 0x40, 0x00, 0x5F, 0x8C, 0x4B, 0x00, 0x24, 0x01, 0x69, 0x58, 0x24, 0x11, 0x70, 0x00, 0x57, 0x35, 0x70, 0x00, 0x00, 0x12, 0x00, 0x00, 0x03, 0x34, 0x53, 0x00, 0x00, 0x34, 0x73, 0x00, 0x00, 0x34, 0x43, 0x00, 0x00, 0x00, 0x05, 0x58, 0x40, 0xC9, 0x62, 0x18, 0x30, 0xCA, 0x64, 0x18, 0x01, 0xCA, 0x65, 0x18, 0x00, 0xC8, 0x66, 0x18, 0x01, 0xC8, 0x67, 0x18, 0x00, 0x4B, 0x1F, 0x10, 0xC7, 0x4A, 0x02, 0x22, 0x06, 0x4A, 0x02, 0x2A, 0x4F, 0x4A, 0x03, 0x32, 0x8E, 0x4A, 0x03, 0x3A, 0xCF, 0x4A, 0x48, 0x42, 0x14, 0xC8, 0x19, 0x20, 0x1D, 0x4A, 0x49, 0x4A, 0x50, 0x4A, 0x4A, 0x52, 0x94, 0x4A, 0x4B, 0x5A, 0xD0, 0x4A, 0xA8, 0x42, 0x14, 0x4A, 0xA9, 0x4A, 0x50, 0x4A, 0xAA, 0x52, 0x94, 0x4A, 0xAB, 0x5A, 0xD0, 0x4B, 0x01, 0x5F, 0x6A, 0x4B, 0x6B, 0x58, 0xF2, 0x4B, 0x6A, 0x58, 0xB1, 0x4B, 0x00, 0x58, 0xF2, 0x4B, 0x79, 0xEF, 0x53, 0x4B, 0x7D, 0x10, 0x86, 0x4B, 0x7D, 0x18, 0xCF, 0x4B, 0x00, 0x18, 0xE1, 0x4B, 0x1F, 0x10, 0xA7, 0x4B, 0x62, 0x57, 0x44, 0x4B, 0x62, 0x5A, 0xCD, 0x4B, 0x00, 0x02, 0x8E, 0x4B, 0x6B, 0x5B, 0x72, 0x4B, 0x6A, 0x5B, 0x31, 0x4B, 0x00, 0x5B, 0x72, 0x4A, 0x0A, 0x67, 0x44, 0x4A, 0x0A, 0x6F, 0x4D, 0x4A, 0x0B, 0x62, 0x8E, 0x4A, 0x0B, 0x6A, 0xCF, 0x4B, 0x3F, 0x0F, 0x47, 0x4B, 0x9F, 0x52, 0x8E, 0x4B, 0x9F, 0x5A, 0xCF, 0x4A, 0x0A, 0x67, 0x44, 0x4A, 0x0A, 0x6F, 0x4D, 0x4A, 0x0B, 0x63, 0x0E, 0x4A, 0x0B, 0x6B, 0x4F, 0x4A, 0x0C, 0x47, 0x44, 0xC8, 0x7A, 0x38, 0x02, 0x4A, 0x0C, 0x4F, 0x4D, 0xC8, 0x7A, 0x14, 0x05, 0x4A, 0x0D, 0x42, 0x8E, 0xCA, 0x79, 0x38, 0x02, 0x4A, 0x0D, 0x4A, 0xCF, 0xCA, 0x79, 0x14, 0x05, 0x4B, 0x62, 0x57, 0x44, 0x4B, 0x62, 0x5A, 0xCD, 0x4B, 0x00, 0x52, 0x8E, 0x4B, 0x01, 0x5A, 0xE0, 0x4B, 0x1F, 0x52, 0xA7, 0x4B, 0x01, 0x57, 0x55, 0x4B, 0x00, 0x5A, 0xE3, 0x4B, 0x01, 0x52, 0xA7, 0x4B, 0x1F, 0x50, 0x86, 0x4B, 0x6A, 0x37, 0x44, 0x4B, 0x6A, 0x3F, 0x4D, 0x4B, 0x62, 0x27, 0x4C, 0x4B, 0x62, 0x2E, 0x0D, 0x4B, 0x00, 0x05, 0xCE, 0x4B, 0x6A, 0xD7, 0x45, 0x4B, 0x62, 0xCD, 0x8D, 0x20, 0x07, 0x00, 0x00, 0x20, 0x01, 0x00, 0x02, 0xA6, 0xAF, 0x03, 0xD0, 0x08, 0x00, 0x06, 0x7D, 0x20, 0x1F, 0x98, 0x70, 0xE9, 0xF9, 0x10, 0x72, 0xE9, 0xFA, 0x0A, 0x67, 0xE9, 0xF6, 0x38, 0x78, 0xE9, 0xF6, 0x14, 0x71, 0xE9, 0xE3, 0x0A, 0x66, 0x21, 0xEF, 0xFF, 0xD8, 0x22, 0xB5, 0x00, 0x02, 0x16, 0x00, 0xFF, 0xA2, 0x34, 0x43, 0x00, 0x00, 0xA6, 0xA3, 0x03, 0xD0, 0x08, 0x00, 0x04, 0xC8, 0x22, 0xB5, 0x00, 0x02, 0x02, 0xB2, 0x58, 0x22, 0x05, 0x60, 0x00, 0x0F, 0xA6, 0xA0, 0x03, 0xD0, 0x96, 0xA3, 0x03, 0xCE, 0x14, 0xA0, 0xFF, 0x93, 0x20, 0xA5, 0xFF, 0xFC, 0xAC, 0x00, 0x03, 0xCC, 0x96, 0x41, 0x03, 0xCA, 0x96, 0x42, 0x03, 0xCC, 0x96, 0xA3, 0x03, 0xCE, 0x48, 0x81, 0x15, 0x00, 0x4B, 0xBF, 0x00, 0xEA, 0x48, 0x82, 0x26, 0x00, 0x0C, 0x00, 0x06, 0x9F, 0x48, 0x83, 0x17, 0x00, 0x16, 0xB2, 0xFF, 0xF7, 0x22, 0x52, 0x00, 0x02, 0x03, 0xC0, 0x00, 0x08, 0xAC, 0x1D, 0x03, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x34, 0x03, 0x80, 0x0C, 0x00, 0x04, 0x89, 0x97, 0x61, 0x09, 0xC1, 0x02, 0x81, 0xA0, 0x22, 0x0C, 0x00, 0x07, 0xF6, 0x20, 0x33, 0xFF, 0xFF, 0x94, 0x05, 0x01, 0xEC, 0x00, 0x01, 0x08, 0xC2, 0x03, 0x21, 0x78, 0x22, 0x95, 0xEF, 0x03, 0x80, 0x36, 0x8E, 0x00, 0x00, 0x90, 0x08, 0x01, 0xD9, 0x30, 0xA6, 0x00, 0x02, 0x14, 0xC0, 0xFE, 0xC8, 0x30, 0xA7, 0x00, 0x01, 0x15, 0x00, 0x00, 0x06, 0x00, 0x07, 0x38, 0xC0, 0xA0, 0x19, 0x01, 0xD9, 0x20, 0x15, 0x00, 0x40, 0x20, 0x14, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x22, 0x20, 0x13, 0x00, 0x80, 0xC8, 0x08, 0x20, 0x08, 0xC8, 0x0A, 0x20, 0x09, 0xC8, 0x0C, 0x20, 0x0A, 0xC8, 0x0E, 0x20, 0x0B, 0x4B, 0x00, 0x42, 0x50, 0xC8, 0x09, 0x18, 0x11, 0x4B, 0x00, 0x52, 0xD0, 0xC8, 0x0B, 0x18, 0x13, 0x4B, 0x00, 0x63, 0x50, 0xC8, 0x0D, 0x18, 0x15, 0x4B, 0x00, 0x73, 0xD0, 0xC8, 0x0F, 0x18, 0x17, 0xC8, 0x08, 0x1C, 0x10, 0xC8, 0x0A, 0x1C, 0x12, 0x0C, 0x00, 0x06, 0x7D, 0xC8, 0x0C, 0x1C, 0x14, 0x0C, 0x00, 0x07, 0xF2, 0xC8, 0x0E, 0x1C, 0x16, 0xC9, 0xD4, 0x18, 0x00, 0x4B, 0x35, 0x6C, 0x33, 0xC9, 0xD4, 0x1C, 0x02, 0x4B, 0x01, 0x7F, 0x46, 0x8D, 0xCB, 0x00, 0x1C, 0x4B, 0x01, 0x5F, 0x4F, 0xC9, 0xD6, 0x16, 0x02, 0x4A, 0x94, 0x67, 0x4E, 0x34, 0xC9, 0x00, 0x00, 0x4A, 0x94, 0x47, 0x4F, 0xC9, 0x22, 0x30, 0x16, 0x4A, 0xB4, 0x6F, 0x4E, 0xAD, 0xCB, 0x00, 0x08, 0x4A, 0xB4, 0x4F, 0x4F, 0xC9, 0xC7, 0x30, 0x01, 0x4A, 0xD4, 0x75, 0xCE, 0x14, 0xC0, 0xFE, 0xDD, 0x4A, 0xD4, 0x56, 0x0F, 0x4B, 0x7F, 0xCE, 0xE3, 0xC9, 0xD6, 0x12, 0x06, 0x4B, 0x00, 0xC8, 0xE3, 0x20, 0x21, 0xFF, 0xFC, 0x4B, 0x92, 0xBF, 0x44, 0x01, 0x07, 0x58, 0x22, 0x4B, 0x92, 0xC0, 0x8D, 0xE9, 0x7B, 0x07, 0xF3, 0x4B, 0x00, 0x05, 0x4E, 0xE9, 0x7B, 0x03, 0xCB, 0x4B, 0x43, 0x4E, 0xB3, 0xE9, 0x03, 0x0E, 0x7A, 0x4B, 0xB2, 0xB9, 0xC6, 0xE9, 0x19, 0x14, 0x7C, 0x4B, 0xB2, 0xC1, 0x8F, 0xE9, 0x19, 0x18, 0x79, 0x4B, 0x62, 0x47, 0x72, 0xE9, 0x1A, 0x0E, 0x7B, 0x4B, 0x75, 0x59, 0x71, 0xE9, 0x1A, 0x11, 0x73, 0x4B, 0xE2, 0x59, 0x32, 0xC9, 0xC3, 0x18, 0x01, 0x4B, 0xF5, 0x79, 0x71, 0x00, 0x01, 0x5F, 0xC3, 0x4B, 0x00, 0x79, 0x32, 0x31, 0x6B, 0x00, 0x28, 0x4A, 0xF8, 0xC7, 0x65, 0x21, 0xEF, 0x00, 0x50, 0x4A, 0xF7, 0xBF, 0x64, 0x01, 0xEB, 0x40, 0x22, 0x4A, 0x05, 0xAF, 0x44, 0x48, 0x4A, 0x08, 0x00, 0x4A, 0x05, 0x17, 0x4D, 0xE9, 0x17, 0x1C, 0x7C, 0x4A, 0x04, 0xAD, 0x4E, 0xC9, 0xD4, 0x18, 0x04, 0x4A, 0x04, 0x10, 0x8F, 0xE9, 0xF7, 0x18, 0x77, 0x4B, 0x00, 0xC7, 0x63, 0xC9, 0x17, 0x0F, 0x72, 0x4B, 0x3F, 0x0F, 0x47, 0xE9, 0x18, 0x1C, 0x7B, 0x4B, 0x9F, 0xAE, 0x8E, 0xC9, 0xF7, 0x0B, 0x5E, 0x4B, 0x9F, 0x16, 0x4F, 0xE9, 0xF8, 0x18, 0x76, 0x4B, 0xFF, 0x00, 0xA7, 0xC9, 0xD4, 0x1C, 0x06, 0x4A, 0xE6, 0xC7, 0x65, 0xE9, 0x03, 0x10, 0x7A, 0x4A, 0x05, 0xD7, 0x44, 0xC9, 0x18, 0x0F, 0x6E, 0x4A, 0x05, 0xCF, 0x4D, 0xE9, 0xE3, 0x12, 0x70, 0x4A, 0x04, 0xD1, 0x4E, 0xC9, 0xF8, 0x0B, 0x5A, 0x4A, 0x04, 0xC9, 0x0F, 0xA5, 0x0A, 0xFF, 0xFE, 0x4B, 0xFF, 0x10, 0x8F, 0x00, 0x0A, 0x59, 0x00, 0x4A, 0xE7, 0xBF, 0x64, 0x48, 0x4A, 0x08, 0x00, 0x4A, 0xE5, 0xBF, 0x44, 0xE9, 0x05, 0x0F, 0x7D, 0x4A, 0xE5, 0xC7, 0x4D, 0x21, 0xCE, 0x00, 0x20, 0x4A, 0xE2, 0xBE, 0x8E, 0xA5, 0x0A, 0xFF, 0xFC, 0x4A, 0xE2, 0xC6, 0x4F, 0x00, 0x0A, 0x51, 0x00, 0x4A, 0x12, 0xB0, 0xC5, 0xA5, 0xEB, 0xFF, 0xD6, 0xA5, 0xEA, 0xFF, 0xD4, 0x4B, 0x92, 0xD7, 0x44, 0xE9, 0xE5, 0x0B, 0x69, 0x4B, 0x92, 0xCE, 0x4D, 0xE9, 0x04, 0x0F, 0x7C, 0x4B, 0x00, 0x06, 0x8E, 0xE9, 0xE4, 0x0B, 0x68, 0xE9, 0x03, 0x12, 0x7B, 0x4B, 0x01, 0x8F, 0x47, 0xE9, 0xE3, 0x16, 0x71, 0x4B, 0x7F, 0x9F, 0x4F, 0x4A, 0x10, 0xD6, 0x8E, 0x1C, 0x20, 0xFF, 0x9C, 0x4A, 0x10, 0xCE, 0x4F, 0x07, 0xE0, 0xFE, 0xAD, 0x4B, 0x00, 0xC8, 0xE3, 0xE9, 0x19, 0x14, 0x7C, 0x4B, 0x7F, 0xCE, 0xE3, 0xE9, 0xF9, 0x10, 0x72, 0xE9, 0x1A, 0x0E, 0x7B, 0xE9, 0xFA, 0x0A, 0x67, 0xE9, 0x03, 0x0E, 0x7A, 0x10, 0xE0, 0xFD, 0xEC, 0xE9, 0xE3, 0x0A, 0x66, 0xE9, 0x1B, 0x07, 0xEB, 0x08, 0x00, 0x04, 0x65, 0xE9, 0xFB, 0x03, 0xC3, 0x20, 0x0D, 0x01, 0x80, 0xC8, 0x10, 0x18, 0x1C, 0xC8, 0x10, 0x1C, 0x1C, 0xC9, 0xBD, 0x10, 0x18, 0xC8, 0x11, 0x18, 0x1D, 0xC8, 0x11, 0x1C, 0x1D, 0x4B, 0x7F, 0xFC, 0xE0, 0x4A, 0x10, 0x05, 0x51, 0xC9, 0xB2, 0x12, 0x1A, 0x4B, 0x1D, 0x84, 0x27, 0xC9, 0xB2, 0x16, 0x1A, 0x4B, 0x01, 0x04, 0xE7, 0xC8, 0x12, 0x14, 0x37, 0x4B, 0x3D, 0x8C, 0x67, 0xC9, 0xB2, 0x0D, 0x03, 0x4B, 0x35, 0x4C, 0x33, 0x03, 0xE0, 0x00, 0x08, 0x22, 0xE8, 0x00, 0x50, 0x0C, 0x00, 0x06, 0x93, 0xAE, 0xF8, 0x00, 0x04, 0x20, 0x1F, 0x11, 0x94, 0xAE, 0xF9, 0x00, 0x04, 0xCA, 0xE2, 0x30, 0x00, 0x92, 0xE1, 0x00, 0x05, 0x92, 0xE2, 0x00, 0x06, 0x92, 0xE3, 0x00, 0x07, 0x4B, 0xBF, 0x00, 0xEA, 0x94, 0x21, 0x03, 0x80, 0x4B, 0xDF, 0x09, 0x06, 0x94, 0x42, 0x03, 0x80, 0x4B, 0x3E, 0x10, 0x8C, 0x94, 0x63, 0x03, 0x80, 0x4B, 0x00, 0x01, 0x0E, 0x34, 0x24, 0x00, 0x00, 0x4B, 0xFF, 0x01, 0x6D, 0xC8, 0x26, 0x10, 0x06, 0x4B, 0xFF, 0x01, 0xED, 0xC8, 0x44, 0x10, 0x06, 0x4B, 0xA2, 0x71, 0xB3, 0xC8, 0x68, 0x10, 0x06, 0x4B, 0xFF, 0x02, 0x6D, 0x8C, 0x25, 0x00, 0x24, 0x4B, 0xE2, 0x72, 0x33, 0x8C, 0x46, 0x00, 0x24, 0x4B, 0x26, 0x00, 0x90, 0x8C, 0x67, 0x00, 0x24, 0x4A, 0x04, 0x32, 0x91, 0x30, 0xAB, 0x70, 0xB0, 0x4A, 0x06, 0x22, 0xD1, 0x00, 0xCB, 0x58, 0x24, 0x4A, 0x08, 0x33, 0x11, 0x00, 0xEB, 0x58, 0x24, 0x4B, 0x24, 0x13, 0x60, 0x4A, 0x04, 0x33, 0xA7, 0x15, 0x60, 0x01, 0x41, 0x90, 0x0B, 0x01, 0xEE, 0x4B, 0x2C, 0x57, 0x47, 0x8C, 0x0C, 0x03, 0xCC, 0x4B, 0x2B, 0x67, 0x4F, 0x00, 0xA6, 0x28, 0x25, 0x4B, 0x24, 0x10, 0xA3, 0x00, 0xA7, 0x28, 0x25, 0x4A, 0x04, 0x32, 0xA7, 0x8D, 0x6B, 0x03, 0xC2, 0x4B, 0x28, 0x69, 0xA3, 0x48, 0x06, 0xE8, 0x00, 0x4A, 0x08, 0x71, 0x27, 0x00, 0xAC, 0x28, 0x24, 0x4A, 0x0E, 0x43, 0xA7, 0x14, 0xA0, 0xFD, 0xF6, 0x00, 0xCB, 0x58, 0x20, 0x4A, 0x02, 0x31, 0xA0, 0x05, 0x61, 0x01, 0x2F, 0x4A, 0x0A, 0x20, 0xA7, 0x4A, 0x04, 0x52, 0xA7, 0x48, 0x01, 0x76, 0x00, 0x4B, 0xBF, 0x71, 0x06, 0x10, 0xC0, 0x01, 0x2A, 0x4A, 0x0E, 0x11, 0x91, 0x48, 0x02, 0x16, 0x00, 0x4A, 0x0E, 0x52, 0x11, 0x48, 0x03, 0x56, 0x00, 0x4A, 0x02, 0x72, 0xD1, 0x8C, 0x06, 0x01, 0xEC, 0x4A, 0x0A, 0x73, 0x11, 0xC8, 0x2D, 0x10, 0x08, 0x4A, 0x02, 0x53, 0xD1, 0xC8, 0x4D, 0x14, 0x08, 0x4B, 0x08, 0x34, 0x07, 0xC8, 0x6D, 0x16, 0x08, 0x4B, 0x0B, 0x44, 0x0F, 0x00, 0x06, 0x5A, 0x80, 0x4B, 0x11, 0x8C, 0x5D, 0x05, 0x61, 0x00, 0x0A, 0x4B, 0x30, 0x84, 0x1D, 0xC8, 0x32, 0x30, 0x02, 0x4B, 0x06, 0x53, 0xF3, 0xC8, 0x53, 0x30, 0x02, 0x4B, 0x2F, 0x45, 0x30, 0xC8, 0x75, 0x30, 0x02, 0x4B, 0x31, 0x45, 0xB2, 0x4B, 0x30, 0x4D, 0xF1, 0x08, 0x00, 0x06, 0xF0, 0x4B, 0x00, 0x4E, 0x32, 0xC8, 0x92, 0x30, 0x02, 0x4B, 0x2F, 0x45, 0x30, 0xC8, 0x32, 0x03, 0x13, 0x4B, 0x31, 0x45, 0xB2, 0xC8, 0x93, 0x30, 0x02, 0x4B, 0x30, 0x4D, 0xF1, 0xC8, 0x53, 0x03, 0x13, 0x4B, 0x00, 0x4E, 0x32, 0xC8, 0x95, 0x30, 0x02, 0x4B, 0x06, 0x53, 0xF3, 0xC8, 0x75, 0x03, 0x13, 0x4B, 0x26, 0x55, 0x30, 0x4B, 0x26, 0x55, 0xB2, 0x8C, 0x25, 0x00, 0x20, 0x4B, 0x28, 0x5D, 0x30, 0x8C, 0x47, 0x00, 0x20, 0x4B, 0x28, 0x5D, 0xB2, 0x8C, 0x68, 0x00, 0x20, 0x4B, 0x7E, 0x94, 0x84, 0x90, 0x09, 0x01, 0xE7, 0x4B, 0x7E, 0x9C, 0xC4, 0x00, 0xA7, 0x58, 0x22, 0x4B, 0x7E, 0xAD, 0x44, 0x00, 0x0B, 0x67, 0xC3, 0x4B, 0x08, 0x5B, 0xF3, 0x01, 0x6C, 0x58, 0x24, 0x4B, 0xFE, 0xA7, 0x44, 0x00, 0xAB, 0x28, 0x22, 0x4B, 0xFE, 0xB5, 0x8D, 0x00, 0xA8, 0x58, 0x22, 0x4B, 0x00, 0x05, 0x0E, 0x00, 0x0B, 0x67, 0xC3, 0x4B, 0x5E, 0x7E, 0x45, 0x01, 0x6C, 0x58, 0x24, 0x4B, 0x00, 0x03, 0xCE, 0x00, 0xAB, 0x28, 0x22, 0x4A, 0x04, 0x01, 0x15, 0xAE, 0xE5, 0x00, 0x10, 0x4A, 0x00, 0x06, 0x91, 0xCA, 0xFB, 0x10, 0x04, 0x4A, 0x14, 0xCF, 0x45, 0x48, 0x05, 0x88, 0x80, 0x4A, 0x14, 0x7F, 0x4C, 0x90, 0x07, 0x01, 0xE6, 0x4A, 0x16, 0x7D, 0x0E, 0xC8, 0x53, 0x0F, 0x0E, 0x4A, 0x16, 0xCB, 0xCF, 0xC8, 0x75, 0x0F, 0x0E, 0x4A, 0x10, 0xBF, 0x44, 0xC8, 0x47, 0x0F, 0x0F, 0x4A, 0x10, 0xC7, 0x4D, 0xC8, 0x69, 0x0F, 0x0F, 0x4A, 0x11, 0xBC, 0x0E, 0x34, 0xCB, 0x00, 0xC8, 0x4A, 0x11, 0xC4, 0x4F, 0x01, 0x69, 0x58, 0x25, 0x4B, 0xBE, 0xA5, 0xA8, 0x4B, 0x7E, 0x7B, 0xE6, 0xA2, 0xEB, 0x00, 0x00, 0x4B, 0xDE, 0x0F, 0x47, 0xEA, 0xEA, 0x09, 0x01, 0x4B, 0x9E, 0x84, 0x0E, 0xEA, 0xE2, 0x09, 0x02, 0x4B, 0x9E, 0x8C, 0x4F, 0xEA, 0xEE, 0x09, 0x03, 0x4B, 0x0E, 0x1F, 0x46, 0x30, 0xAC, 0x00, 0x80, 0x4B, 0x24, 0xB7, 0x4C, 0x01, 0x87, 0x60, 0x25, 0x4B, 0x24, 0x7F, 0x4D, 0xA2, 0xEC, 0x00, 0x01, 0x4B, 0x3A, 0xB0, 0x8E, 0x11, 0x20, 0x00, 0x1D, 0x4B, 0x3A, 0x78, 0xCF, 0x4B, 0x1B, 0x47, 0x72, 0x4B, 0x3B, 0x42, 0xB1, 0x4A, 0x6D, 0x03, 0x90, 0x4B, 0x00, 0x46, 0xF2, 0x4B, 0xFF, 0x05, 0xAA, 0x4B, 0x0A, 0x6F, 0x45, 0x4B, 0x0A, 0x77, 0x4C, 0xC8, 0x36, 0x10, 0x05, 0x4B, 0x1B, 0x73, 0x8E, 0xC8, 0x56, 0x14, 0x05, 0x4B, 0x1B, 0x6B, 0x4F, 0x4B, 0xFF, 0x02, 0xAA, 0x4B, 0xFE, 0xF7, 0x63, 0xC8, 0x6A, 0x14, 0x05, 0x4A, 0x8E, 0xB7, 0x45, 0x4A, 0x8D, 0xB5, 0x8F, 0x4B, 0x00, 0x06, 0x4E, 0x4B, 0xCE, 0x57, 0x45, 0x4B, 0xCD, 0x52, 0x8F, 0x4B, 0x00, 0x03, 0x4E, 0xEA, 0xF6, 0x18, 0x04, 0x4A, 0x16, 0x9C, 0xE7, 0xEA, 0xF9, 0x18, 0x05, 0x4A, 0x19, 0x39, 0xE7, 0xCA, 0xF2, 0x1C, 0x04, 0x4A, 0x0A, 0xAD, 0x67, 0xCA, 0xE5, 0x1C, 0x05, 0x4A, 0x0D, 0x4A, 0x67, 0x4A, 0x17, 0x87, 0x44, 0xC8, 0x25, 0x0F, 0x0F, 0x4A, 0x17, 0x8F, 0x4D, 0xC8, 0x32, 0x0F, 0x0E, 0x4A, 0x18, 0x85, 0xCE, 0x84, 0x41, 0x00, 0x18, 0x4A, 0x18, 0x8E, 0x0F, 0x26, 0xE2, 0x00, 0x20, 0x4A, 0x05, 0x4A, 0x95, 0x30, 0xC3, 0x00, 0x04, 0x4A, 0x12, 0xAA, 0x51, 0x00, 0x01, 0x0B, 0x80, 0x4A, 0x05, 0x3B, 0x55, 0xAE, 0xE1, 0x00, 0x08, 0x4A, 0x12, 0x99, 0xD1, 0xEA, 0xE3, 0x0B, 0x08, 0x4B, 0x26, 0x57, 0x46, 0xEA, 0xE2, 0x0B, 0x09, 0x4B, 0x26, 0x4F, 0x4F, 0xEA, 0xE3, 0x0A, 0x0C, 0x4B, 0x2C, 0x6F, 0x4E, 0xEA, 0xE2, 0x0A, 0x0D, 0x4B, 0x2C, 0x3F, 0x4F, 0xEA, 0xEF, 0x08, 0x06, 0x4B, 0x22, 0x10, 0x9D, 0xEA, 0xF4, 0x08, 0x07, 0x4B, 0x03, 0x18, 0xDD, 0xEA, 0xEF, 0x0B, 0x0A, 0x4B, 0x08, 0x6F, 0x46, 0xEA, 0xF4, 0x0B, 0x0B, 0x4B, 0x08, 0x3F, 0x4F, 0xEA, 0xEF, 0x0A, 0x0E, 0x4B, 0x0B, 0x57, 0x4E, 0xEA, 0xF4, 0x0A, 0x0F, 0x4B, 0x0B, 0x4F, 0x4F, 0x00, 0x03, 0x59, 0x00, 0x4B, 0x26, 0x31, 0x9D, 0x00, 0x4B, 0x08, 0x20, 0x4B, 0x07, 0x39, 0xDD, 0x00, 0x09, 0x59, 0x40, 0x4B, 0x37, 0x17, 0x44, 0x00, 0x2B, 0xB8, 0x20, 0x4B, 0x37, 0x1F, 0x4D, 0x30, 0xC6, 0x00, 0x01, 0x4B, 0x38, 0x10, 0x8E, 0x00, 0x06, 0x59, 0x00, 0x4B, 0x38, 0x18, 0xCF, 0x02, 0xEB, 0xB8, 0x20, 0x4B, 0x37, 0x37, 0x44, 0x4B, 0x37, 0x3F, 0x4D, 0x4B, 0x38, 0x31, 0x8E, 0xE8, 0x42, 0x18, 0x03, 0x4B, 0x38, 0x39, 0xCF, 0xE8, 0x43, 0x18, 0x01, 0x4B, 0x74, 0x17, 0x4C, 0xE8, 0x22, 0x1C, 0x03, 0x4B, 0x74, 0x1F, 0x4D, 0xE8, 0x23, 0x1C, 0x01, 0x4B, 0x6F, 0x12, 0x0E, 0xE8, 0x46, 0x18, 0x07, 0x4B, 0x6F, 0x1A, 0x4F, 0xE8, 0x47, 0x18, 0x05, 0x4B, 0x01, 0x2F, 0x46, 0xE8, 0x26, 0x1C, 0x07, 0x4B, 0x01, 0x97, 0x4F, 0xE8, 0x27, 0x1C, 0x05, 0x4B, 0x24, 0x47, 0x4C, 0xE8, 0x48, 0x18, 0x06, 0x4B, 0x24, 0x4F, 0x4D, 0xE8, 0x49, 0x18, 0x04, 0x4B, 0x3A, 0x41, 0x4E, 0xE8, 0x28, 0x1C, 0x06, 0x4B, 0x3A, 0x4C, 0x8F, 0xE8, 0x29, 0x1C, 0x04, 0x4B, 0x24, 0x42, 0x86, 0x10, 0xC0, 0x00, 0x16, 0x4B, 0xFE, 0x42, 0x06, 0x4B, 0xFE, 0x4A, 0x4F, 0xE8, 0x45, 0x18, 0x02, 0x4B, 0xFE, 0x10, 0x86, 0xE8, 0x52, 0x18, 0x00, 0x4B, 0xFE, 0x18, 0xCF, 0xE8, 0x25, 0x1C, 0x02, 0x4B, 0xFE, 0x31, 0x86, 0xE8, 0x32, 0x1C, 0x00, 0x4B, 0xFE, 0x39, 0xCF, 0xEA, 0xE8, 0x0F, 0x7D, 0x4B, 0xFE, 0x57, 0x44, 0xEA, 0xE9, 0x0F, 0x7C, 0x4B, 0xFE, 0x29, 0x4E, 0xEA, 0xE2, 0x0F, 0x7B, 0x4B, 0xFE, 0x94, 0x8F, 0xEA, 0xE3, 0x0F, 0x7A, 0xEA, 0xE6, 0x0F, 0x7F, 0xEA, 0xE7, 0x0F, 0x7E, 0xEA, 0xE5, 0x0F, 0x79, 0x08, 0x00, 0x04, 0x97, 0xEA, 0xF2, 0x0F, 0x78, 0xE8, 0x45, 0x18, 0x02, 0xE8, 0x52, 0x18, 0x00, 0xE8, 0x25, 0x1C, 0x02, 0x08, 0x00, 0x04, 0x97, 0xE8, 0x32, 0x1C, 0x00, 0x97, 0x39, 0x03, 0x80, 0x97, 0x18, 0x03, 0x80, 0x24, 0x01, 0x70, 0xB0, 0x8F, 0x2B, 0x00, 0x24, 0x00, 0x2B, 0x08, 0x24, 0x10, 0x20, 0xFC, 0xAD, 0x8F, 0x2B, 0x00, 0x4C, 0x17, 0x38, 0xFF, 0xFC, 0x27, 0x39, 0x00, 0x28, 0x08, 0x00, 0x04, 0x7B, 0x97, 0x39, 0x03, 0x80, 0x87, 0x39, 0x00, 0x06, 0x03, 0x38, 0x10, 0x22, 0x04, 0x41, 0xFC, 0xA5, 0x8C, 0x18, 0x00, 0xD8, 0x08, 0x00, 0x04, 0x02, 0x93, 0x61, 0x09, 0xC1, 0x08, 0x00, 0x04, 0x10, 0x97, 0x39, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0C, 0x10, 0x00, 0x20, 0x0B, 0x02, 0xE0, 0x8D, 0x78, 0x00, 0x00, 0x95, 0x73, 0x00, 0x04, 0x0C, 0x00, 0x07, 0xF6, 0x95, 0x74, 0x00, 0x06, 0x35, 0x9F, 0x00, 0x00, 0x40, 0x0B, 0x30, 0x00, 0x15, 0x60, 0xFF, 0xFF, 0x40, 0x0B, 0x30, 0x00, 0x03, 0xE0, 0x00, 0x08, 0x40, 0x0B, 0x28, 0x00, 0x15, 0x60, 0xFF, 0xFF, 0x40, 0x0B, 0x28, 0x00, 0x40, 0x94, 0x00, 0x00, 0x06, 0x80, 0x00, 0x03, 0x40, 0x98, 0x08, 0x00, 0x03, 0xE0, 0x00, 0x08, 0x40, 0x93, 0x10, 0x00, 0x03, 0xE0, 0x00, 0x08, 0x40, 0x93, 0x18, 0x00, 0x02, 0xF6, 0x58, 0x22, 0x25, 0x6C, 0x01, 0x57, 0x05, 0x91, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x07, 0xF2, 0x8C, 0x18, 0x00, 0xF0, 0x04, 0x20, 0x00, 0x1A, 0x40, 0x98, 0x48, 0x00, 0x14, 0x20, 0x00, 0x0F, 0x03, 0x5B, 0xD0, 0x20, 0x8F, 0x78, 0x09, 0xC4, 0xAC, 0x1A, 0x0F, 0xF0, 0xAC, 0x18, 0x0F, 0xD0, 0x24, 0x14, 0x10, 0x80, 0x0C, 0x00, 0x07, 0xF6, 0x20, 0x13, 0x0F, 0x47, 0x8C, 0x18, 0x00, 0xD8, 0x24, 0x14, 0x01, 0x80, 0x33, 0x33, 0x0F, 0xFF, 0x03, 0x14, 0xC0, 0x20, 0x0C, 0x00, 0x07, 0xF6, 0x02, 0x74, 0x98, 0x22, 0x08, 0x00, 0x07, 0xF2, 0x20, 0x1F, 0x10, 0x84, 0x8C, 0x0B, 0x0F, 0xD0, 0xAC, 0x1A, 0x0B, 0xF8, 0xAC, 0x0B, 0x0B, 0xFC, 0x20, 0x0C, 0x50, 0x00, 0x8C, 0x18, 0x0F, 0xF8, 0x20, 0x14, 0x80, 0x00, 0x20, 0x13, 0x0B, 0xFF, 0x08, 0x00, 0x07, 0xF6, 0x20, 0x1F, 0x10, 0x88, 0x20, 0x0C, 0x40, 0x00, 0x40, 0x8C, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00, 0xDE, 0x00, 0x19, 0x13, 0xC0, 0x0C, 0x00, 0x04, 0x89, 0x03, 0x5B, 0x18, 0x20, 0x04, 0x40, 0x00, 0x59, 0x37, 0x1A, 0x00, 0x00, 0xAC, 0x23, 0x01, 0x38, 0x20, 0x21, 0x00, 0x04, 0x08, 0x00, 0x04, 0x5E, 0xA0, 0x01, 0x00, 0xDE, 0x20, 0x0B, 0x11, 0x40, 0xAD, 0x79, 0xF0, 0xA4, 0x08, 0x00, 0x04, 0x65, 0xAD, 0x78, 0xF0, 0xA8, 0x00, 0x19, 0x14, 0x02, 0x94, 0x41, 0x27, 0xFE, 0x00, 0x39, 0x08, 0x20, 0x08, 0x00, 0x04, 0x65, 0xAC, 0x38, 0x00, 0x00, 0x8C, 0x0B, 0x00, 0xF4, 0x8C, 0x02, 0x0F, 0xE0, 0x01, 0x78, 0xC0, 0x22, 0x03, 0x02, 0x08, 0x22, 0x04, 0x21, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x34, 0x58, 0x00, 0x00, 0x13, 0x0B, 0x00, 0x4A, 0xAC, 0x18, 0x00, 0xF4, 0x08, 0x00, 0x04, 0x49, 0xAC, 0x00, 0x01, 0xD9, 0x94, 0x33, 0x02, 0xF2, 0x0C, 0x00, 0x07, 0xF2, 0x94, 0x35, 0x02, 0xF2, 0x20, 0x1F, 0x11, 0x94, 0x22, 0x8C, 0x00, 0x18, 0x4B, 0x00, 0x02, 0x4E, 0x22, 0x8B, 0x00, 0x08, 0x4B, 0x00, 0x02, 0x0F, 0x22, 0xB5, 0xFF, 0xE0, 0x4B, 0x00, 0x07, 0x47, 0xCA, 0xA5, 0x18, 0x08, 0xCA, 0xA5, 0x1C, 0x08, 0xCA, 0x83, 0x20, 0x02, 0xCA, 0xA4, 0x18, 0x04, 0xCA, 0xA4, 0x1C, 0x04, 0xCA, 0x82, 0x20, 0x00, 0x4A, 0x83, 0x2F, 0x4C, 0x22, 0x94, 0x00, 0x02, 0x4A, 0x83, 0x27, 0x4D, 0x22, 0xB5, 0x00, 0x08, 0x4A, 0x82, 0x29, 0xCE, 0x16, 0x8B, 0xFF, 0xF4, 0x4A, 0x82, 0x21, 0x8F, 0x16, 0x8C, 0xFF, 0xED, 0x22, 0x94, 0x00, 0x08, 0xEA, 0x69, 0x20, 0x02, 0xEA, 0x68, 0x20, 0x00, 0xEA, 0x67, 0x20, 0x03, 0x03, 0xE0, 0x00, 0x08, 0xEA, 0x66, 0x20, 0x01, 0x33, 0x2B, 0x00, 0x05, 0x15, 0x60, 0x00, 0x08, 0x33, 0x22, 0x00, 0x02, 0x8C, 0x18, 0x00, 0xF4, 0x20, 0x14, 0xE0, 0x00, 0x0C, 0x00, 0x07, 0xF6, 0x20, 0x13, 0x00, 0x3F, 0x23, 0x18, 0x00, 0x40, 0xAC, 0x18, 0x00, 0xF4, 0x8F, 0x78, 0x09, 0xC4, 0x01, 0x82, 0x60, 0x20, 0xAC, 0x00, 0x01, 0xD9, 0x0C, 0x00, 0x04, 0x89, 0x33, 0x21, 0x00, 0xFE, 0x93, 0x73, 0x09, 0xC1, 0x94, 0x34, 0x02, 0xF0, 0x00, 0x19, 0x11, 0x42, 0x95, 0x9F, 0x03, 0x36, 0x08, 0x00, 0x07, 0xF6, 0x02, 0x82, 0xA0, 0x20, 0x8D, 0x63, 0xEF, 0x8C, 0x3C, 0x02, 0x80, 0x00, 0x03, 0x22, 0x10, 0x07, 0x00, 0x19, 0x0A, 0x02, 0x00, 0x22, 0x10, 0x06, 0x00, 0x40, 0x10, 0x27, 0x00, 0x62, 0x18, 0x24, 0x00, 0x78, 0x18, 0x25, 0xAD, 0x63, 0xEF, 0x8C, 0x8C, 0x19, 0x00, 0xC8, 0x08, 0x00, 0x04, 0x84, 0x8C, 0x18, 0x00, 0xCC, 0x90, 0x0B, 0x01, 0xDC, 0x08, 0x00, 0x04, 0xBD, 0x90, 0x06, 0x01, 0xDD, 0x37, 0xFE, 0x00, 0x00, 0x20, 0x0B, 0x04, 0x18, 0x08, 0x00, 0x07, 0xED, 0x20, 0x0C, 0x12, 0xE8, 0x15, 0x60, 0x01, 0x31, 0x20, 0xC6, 0x01, 0x68, 0xA0, 0x19, 0x01, 0xDC, 0xC8, 0x0C, 0x20, 0x02, 0xC8, 0x08, 0x20, 0x00, 0xC8, 0x0D, 0x09, 0x15, 0xC8, 0x09, 0x09, 0x05, 0x4B, 0x2C, 0x43, 0x73, 0xC8, 0x0E, 0x0A, 0x1A, 0x4B, 0x28, 0x42, 0x73, 0xC8, 0x0A, 0x0A, 0x0A, 0x4B, 0x4C, 0x43, 0xB3, 0x20, 0x14, 0x01, 0x50, 0x4B, 0x48, 0x42, 0xB3, 0xCA, 0x87, 0x30, 0x15, 0x4B, 0xCC, 0x4B, 0xB3, 0xC8, 0x0D, 0x0A, 0x19, 0x4B, 0xC8, 0x4A, 0xB3, 0xC8, 0x09, 0x0A, 0x09, 0x4B, 0x8C, 0x4B, 0x33, 0xC8, 0x0C, 0x0A, 0x18, 0x4B, 0x88, 0x4A, 0x33, 0xC8, 0x08, 0x0A, 0x08, 0x4B, 0x27, 0x6F, 0x46, 0x4B, 0x27, 0x4F, 0x4F, 0x4B, 0x07, 0x67, 0x4E, 0xEA, 0x8F, 0x30, 0x16, 0x4B, 0x07, 0x47, 0x4F, 0x8E, 0x8C, 0x00, 0xB0, 0x4B, 0x47, 0x77, 0x4E, 0x4B, 0x47, 0x57, 0x4F, 0x4B, 0x2B, 0x5A, 0xDD, 0xAE, 0x8C, 0x00, 0xB4, 0x4B, 0x0F, 0x7B, 0xDD, 0x12, 0x86, 0x01, 0x0F, 0x4A, 0x0B, 0x5F, 0x44, 0x4A, 0x0B, 0x7F, 0x4D, 0x4A, 0x0F, 0x5C, 0x0E, 0x11, 0x60, 0x00, 0x02, 0x4A, 0x0F, 0x7C, 0x4F, 0x22, 0x94, 0x00, 0x18, 0x4B, 0x30, 0x84, 0x94, 0x20, 0x0B, 0x00, 0x01, 0x4B, 0x31, 0x8F, 0x50, 0x4B, 0x50, 0x94, 0x14, 0x4B, 0x51, 0xEC, 0x50, 0x4B, 0x11, 0x47, 0x76, 0xCA, 0x87, 0x30, 0x18, 0x4B, 0x10, 0x44, 0x35, 0x4B, 0x00, 0x44, 0x76, 0x4B, 0x10, 0x5F, 0x44, 0x4B, 0x10, 0x7F, 0x4D, 0x4B, 0x11, 0x5A, 0xCE, 0x4B, 0x11, 0x7B, 0xCF, 0x4B, 0x7E, 0x5A, 0xC6, 0x08, 0x00, 0x04, 0xD4, 0x4B, 0x7E, 0x7B, 0xCF, 0x4A, 0xA7, 0x01, 0x90, 0xC9, 0x3D, 0x38, 0x17, 0x4A, 0xC7, 0x01, 0x50, 0xC9, 0xDB, 0x38, 0x01, 0x4A, 0xFF, 0xF9, 0x22, 0x30, 0xAB, 0x00, 0x40, 0x11, 0x60, 0x00, 0xA6, 0x20, 0x0C, 0x80, 0x80, 0x4B, 0x00, 0xDF, 0x14, 0xE9, 0xDD, 0x38, 0x01, 0x34, 0x0B, 0x00, 0x04, 0x4B, 0xDE, 0x7F, 0xB3, 0x48, 0x8B, 0xFB, 0x00, 0x91, 0x2B, 0x00, 0xA3, 0x15, 0x60, 0x00, 0x52, 0xC9, 0x22, 0x30, 0x16, 0xC9, 0xDD, 0x38, 0x01, 0x4A, 0x82, 0x3D, 0x01, 0x4A, 0xA2, 0x35, 0x09, 0x4A, 0xC2, 0x2D, 0x09, 0xC9, 0x22, 0x38, 0x14, 0x4A, 0x1C, 0xEF, 0x67, 0x4B, 0xFF, 0xA5, 0x28, 0x4B, 0x00, 0x10, 0xA7, 0x4B, 0xFF, 0xEF, 0x40, 0x4A, 0x94, 0x17, 0x48, 0xE9, 0xDD, 0x38, 0x01, 0x15, 0x2D, 0xFF, 0xF1, 0x21, 0x29, 0xFF, 0xE8, 0xC8, 0x1F, 0x20, 0x1B, 0xC8, 0x1E, 0x20, 0x1C, 0xC9, 0xD6, 0x12, 0x06, 0x05, 0x91, 0x00, 0x09, 0x20, 0x0C, 0x80, 0x80, 0x30, 0xAB, 0x00, 0x04, 0x4B, 0xBF, 0x00, 0xE7, 0x11, 0x60, 0x01, 0x01, 0x4B, 0x7F, 0xCE, 0xE3, 0xC9, 0x22, 0x30, 0x16, 0xC9, 0x34, 0x30, 0x13, 0x08, 0x00, 0x05, 0xC2, 0x4A, 0x82, 0x3D, 0x40, 0xC9, 0x88, 0x20, 0x00, 0xC9, 0x8A, 0x20, 0x01, 0xC9, 0x8C, 0x20, 0x02, 0xC9, 0x8E, 0x20, 0x03, 0x4B, 0x00, 0x42, 0x50, 0xC9, 0x89, 0x18, 0x01, 0x4B, 0x00, 0x52, 0xD0, 0xC9, 0x8B, 0x18, 0x03, 0x4B, 0x00, 0x63, 0x50, 0xC9, 0x8D, 0x18, 0x05, 0x4B, 0x00, 0x73, 0xD0, 0xC9, 0x8F, 0x18, 0x07, 0xC9, 0x88, 0x1C, 0x00, 0xC9, 0x8A, 0x1C, 0x02, 0xC9, 0x8C, 0x1C, 0x04, 0x03, 0xE0, 0x00, 0x08, 0xC9, 0x8E, 0x1C, 0x06, 0xC8, 0x04, 0x08, 0x00, 0xC8, 0x03, 0x08, 0x10, 0xC8, 0x15, 0x08, 0x01, 0xC8, 0x1C, 0x08, 0x11, 0xC8, 0x1E, 0x08, 0x02, 0x4B, 0x04, 0x61, 0x33, 0xC8, 0x1F, 0x08, 0x12, 0x4B, 0x03, 0x60, 0xF3, 0xC8, 0x04, 0x09, 0x04, 0x4B, 0x15, 0x65, 0x73, 0xC8, 0x03, 0x09, 0x14, 0x4B, 0x1C, 0x67, 0x33, 0xC8, 0x15, 0x09, 0x05, 0x4B, 0x1E, 0x67, 0xB3, 0xC8, 0x1C, 0x09, 0x15, 0x4B, 0x1F, 0x67, 0xF3, 0xC8, 0x1E, 0x09, 0x06, 0x4B, 0x24, 0x69, 0x33, 0xC8, 0x1F, 0x09, 0x16, 0x4B, 0x23, 0x68, 0xF3, 0xC8, 0x04, 0x0A, 0x08, 0x4B, 0x35, 0x6D, 0x73, 0xC8, 0x03, 0x0A, 0x18, 0x4B, 0x3C, 0x6F, 0x33, 0xC8, 0x15, 0x0A, 0x09, 0x4B, 0x3E, 0x6F, 0xB3, 0xC8, 0x1C, 0x0A, 0x19, 0x4B, 0x3F, 0x6F, 0xF3, 0xC8, 0x1E, 0x0A, 0x0A, 0x4B, 0x44, 0x71, 0x33, 0xC8, 0x1F, 0x0A, 0x1A, 0x4B, 0x43, 0x70, 0xF3, 0x00, 0x00, 0x60, 0x25, 0x4B, 0x55, 0x75, 0x73, 0x4B, 0x5C, 0x77, 0x33, 0x4B, 0x5E, 0x77, 0xB3, 0x08, 0x00, 0x05, 0x20, 0x4B, 0x5F, 0x77, 0xF3, 0xC9, 0xD4, 0x1C, 0x00, 0x05, 0x90, 0xFF, 0xD8, 0xC9, 0xD4, 0x18, 0x02, 0x4B, 0x01, 0x78, 0x86, 0xC9, 0x3D, 0x18, 0x15, 0x4B, 0x01, 0x58, 0x8F, 0x4A, 0x94, 0x60, 0x8E, 0x4A, 0x94, 0x40, 0x8F, 0x4A, 0xB4, 0x68, 0x8E, 0xC9, 0x3D, 0x1C, 0x15, 0x4A, 0xB4, 0x48, 0x8F, 0x4A, 0xD4, 0x70, 0x8E, 0x4A, 0xD4, 0x50, 0x8F, 0x4A, 0x02, 0xED, 0x11, 0x4B, 0x00, 0xA7, 0x67, 0x4A, 0x1D, 0xE8, 0x87, 0x4B, 0x02, 0x10, 0x9D, 0x4B, 0x3D, 0xEF, 0x5D, 0x4A, 0x5D, 0xEF, 0x54, 0x4A, 0x42, 0x10, 0x90, 0x4A, 0xDD, 0xEF, 0x54, 0x4A, 0xC2, 0x10, 0x90, 0x4B, 0x22, 0x5F, 0x76, 0x4B, 0x3D, 0x5F, 0x75, 0x4B, 0xA2, 0x57, 0x76, 0x4B, 0xBD, 0x7F, 0x75, 0x4B, 0x00, 0x77, 0x76, 0x4A, 0x94, 0x18, 0x86, 0x00, 0x0B, 0x59, 0x00, 0x4A, 0x94, 0x20, 0x8F, 0x91, 0x38, 0x00, 0xAE, 0x4A, 0xB4, 0xE0, 0x8E, 0x48, 0x8B, 0xD8, 0x00, 0x4A, 0xB4, 0xA8, 0x8F, 0x4A, 0xD4, 0xF8, 0x8E, 0x4A, 0xD4, 0xF5, 0x0F, 0x4A, 0xFD, 0xA0, 0x85, 0x4A, 0xDD, 0xA5, 0x0F, 0x4B, 0x7F, 0x10, 0x86, 0x4B, 0x7F, 0xA5, 0x0F, 0x4A, 0x94, 0x38, 0x81, 0x48, 0x8B, 0xDC, 0x00, 0x4A, 0xB4, 0x30, 0x89, 0x91, 0x2B, 0x00, 0xA7, 0x4A, 0xD4, 0x28, 0x89, 0x00, 0x18, 0xC1, 0x40, 0x4B, 0xFF, 0x15, 0x28, 0x48, 0x98, 0xA7, 0x00, 0x4B, 0x5D, 0x47, 0x72, 0x4B, 0x7D, 0x47, 0x71, 0x4B, 0xDD, 0x67, 0x72, 0x4B, 0xFD, 0x67, 0x71, 0x4B, 0xFE, 0xE8, 0x87, 0x48, 0x8B, 0xA3, 0x00, 0x4A, 0x82, 0x10, 0x84, 0x4B, 0x74, 0xEF, 0x40, 0x4B, 0xF4, 0x17, 0x4D, 0x4B, 0x7E, 0xDF, 0x4E, 0x4B, 0x22, 0x10, 0x9D, 0x4B, 0x02, 0x40, 0xB2, 0x4B, 0x1D, 0x40, 0xB1, 0x4B, 0x82, 0x60, 0xB2, 0x4B, 0x9D, 0x60, 0xB1, 0xC9, 0xDD, 0x38, 0x01, 0x4B, 0xFF, 0x10, 0xA8, 0x4A, 0x14, 0x10, 0x80, 0xC9, 0x34, 0x38, 0x14, 0x4A, 0x1C, 0xEF, 0x67, 0x4B, 0xFF, 0x10, 0xA8, 0x4B, 0x00, 0xA5, 0x27, 0x4B, 0xFF, 0xEF, 0x40, 0x4A, 0x82, 0xA7, 0x48, 0xE9, 0xDD, 0x38, 0x01, 0x15, 0x2D, 0xFF, 0x62, 0x21, 0x29, 0xFF, 0xE8, 0x08, 0x00, 0x05, 0x13, 0xC9, 0x34, 0x30, 0x13, 0x4A, 0x82, 0x3D, 0x41, 0xC9, 0x24, 0x38, 0x14, 0x4A, 0xA2, 0x35, 0x49, 0x11, 0x2D, 0x00, 0x2E, 0x4A, 0xC2, 0x2D, 0x49, 0x4A, 0x94, 0x3F, 0x01, 0xC9, 0x23, 0x38, 0x11, 0x4A, 0xB4, 0x37, 0x09, 0x21, 0x2B, 0xFF, 0xE8, 0x4A, 0xD4, 0x2F, 0x09, 0x21, 0x29, 0xFF, 0xD0, 0x4A, 0x1B, 0xEF, 0x67, 0x48, 0x80, 0x23, 0x00, 0x4B, 0x00, 0x18, 0xE7, 0x48, 0x80, 0x27, 0x00, 0x4B, 0xFF, 0xAD, 0x68, 0xC9, 0x22, 0x30, 0x16, 0x4B, 0xFF, 0xE7, 0x28, 0xC9, 0x34, 0x30, 0x13, 0x4B, 0xFF, 0xEF, 0x40, 0x4A, 0x95, 0x27, 0x48, 0x15, 0x6D, 0xFF, 0xEA, 0x4A, 0x9C, 0x1F, 0x48, 0x4B, 0xBF, 0x00, 0xE7, 0xC9, 0xD6, 0x12, 0x06, 0x4B, 0x7F, 0xCE, 0xE3, 0x30, 0xAB, 0x00, 0x04, 0x4A, 0x82, 0x3D, 0x40, 0x11, 0x60, 0x00, 0x5B, 0xE9, 0xDD, 0x38, 0x01, 0x4A, 0xA2, 0x35, 0x48, 0x30, 0xAC, 0x00, 0x08, 0x4A, 0xC2, 0x2D, 0x48, 0x4B, 0xBF, 0x19, 0x2C, 0x4A, 0x94, 0x3F, 0x00, 0x4A, 0xB4, 0x37, 0x08, 0x4A, 0xD4, 0x2F, 0x08, 0xC8, 0x02, 0x20, 0x1D, 0x4B, 0xBF, 0x0D, 0x87, 0x4A, 0x95, 0x1D, 0x88, 0x11, 0x80, 0x00, 0x4F, 0x4A, 0x9C, 0x25, 0x88, 0x4B, 0x02, 0x0D, 0x8F, 0x4A, 0x16, 0xB1, 0x00, 0x4B, 0xFF, 0xB0, 0xC0, 0x4B, 0x42, 0xB0, 0xC8, 0x4B, 0xBF, 0x0D, 0x47, 0x4B, 0x22, 0xB5, 0x88, 0x08, 0x00, 0x06, 0x1C, 0x4A, 0x03, 0x25, 0x88, 0x4A, 0x1B, 0xEF, 0x67, 0x4B, 0x00, 0x21, 0x27, 0x4B, 0xFF, 0xAD, 0x68, 0x4A, 0xFF, 0xF8, 0xE1, 0xC9, 0x22, 0x30, 0x10, 0x4B, 0xBF, 0x00, 0xE7, 0xC9, 0xD6, 0x12, 0x06, 0x4B, 0xFF, 0xEF, 0x40, 0x08, 0x00, 0x05, 0xBD, 0x4A, 0x95, 0x27, 0x48}; - -u8 D_80157580[0x420] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xED, 0x00, 0x00, 0x00, 0x00, 0x50, 0x03, 0xC0, 0xEF, 0x08, 0x0C, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x53, 0x50, 0x20, 0x47, 0x66, 0x78, 0x20, 0x75, 0x63, 0x6F, 0x64, 0x65, 0x20, 0x46, 0x33, 0x44, 0x5A, 0x45, 0x58, 0x2E, 0x4E, 0x6F, 0x4E, 0x20, 0x20, 0x66, 0x69, 0x66, 0x6F, 0x20, 0x32, 0x2E, 0x30, 0x38, 0x4A, 0x20, 0x59, 0x6F, 0x73, 0x68, 0x69, 0x74, 0x61, 0x6B, 0x61, 0x20, 0x59, 0x61, 0x73, 0x75, 0x6D, 0x6F, 0x74, 0x6F, 0x2F, 0x4B, 0x61, 0x77, 0x61, 0x73, 0x65, 0x64, 0x6F, 0x20, 0x31, 0x39, 0x39, 0x39, 0x2E, 0x0A, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x04, 0x00, 0x08, 0x7F, 0x00, 0xFF, 0xFC, 0x40, 0x00, 0x04, 0x20, 0x7F, 0xFF, 0x7F, 0xFC, 0x14, 0x00, 0x10, 0x00, 0x01, 0x00, 0xFF, 0xF0, 0xFF, 0xF8, 0x00, 0x10, 0x00, 0x20, 0xC0, 0x00, 0x44, 0xD3, 0x6C, 0xB3, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x0B, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x97, 0x10, 0x00, 0x00, 0x00, 0x10, 0x18, 0x01, 0x6F, 0x10, 0x00, 0x09, 0xD0, 0x00, 0x00, 0x09, 0xD0, 0x00, 0x40, 0x00, 0xE0, 0x01, 0xF0, 0x04, 0x20, 0x00, 0x80, 0x01, 0xDA, 0x01, 0x80, 0x00, 0xF8, 0x01, 0xE0, 0x02, 0x20, 0x01, 0xD8, 0x00, 0xDA, 0x11, 0x90, 0x10, 0x78, 0x11, 0x90, 0x11, 0x94, 0x11, 0x94, 0x11, 0x94, 0x11, 0xC0, 0x10, 0x28, 0x10, 0x4C, 0x11, 0xD8, 0x10, 0xF0, 0x10, 0x38, 0x11, 0x20, 0x1F, 0xAC, 0x10, 0x00, 0x11, 0xEC, 0x11, 0x94, 0x10, 0x30, 0x11, 0x40, 0x11, 0x3C, 0x10, 0x2C, 0x10, 0x2C, 0x12, 0x14, 0x12, 0x14, 0x12, 0x14, 0x12, 0x14, 0x12, 0x10, 0x12, 0x10, 0x12, 0x10, 0x12, 0x4C, 0x12, 0x10, 0x12, 0x40, 0x12, 0x10, 0x12, 0x00, 0x12, 0x10, 0x12, 0x10, 0x12, 0x10, 0x12, 0x10, 0x12, 0x10, 0x12, 0x10, 0x12, 0x10, 0x12, 0x10, 0x12, 0x10, 0x12, 0x10, 0x12, 0x10, 0x12, 0x20, 0x12, 0x20, 0x12, 0x20, 0x12, 0x14, 0x17, 0x80, 0x1F, 0x08, 0x1E, 0xC8, 0x1E, 0xF0, 0x1A, 0x44, 0x1A, 0x3C, 0x1A, 0x3C, 0x11, 0x94, 0x04, 0x20, 0x04, 0x48, 0x04, 0x70, 0x04, 0x98, 0x04, 0xC0, 0x04, 0xE8, 0x05, 0x10, 0x05, 0x38, 0x05, 0x60, 0x05, 0x88, 0x05, 0xB0, 0x05, 0xD8, 0x06, 0x00, 0x06, 0x28, 0x06, 0x50, 0x06, 0x78, 0x06, 0xA0, 0x06, 0xC8, 0x06, 0xF0, 0x07, 0x18, 0x07, 0x40, 0x07, 0x68, 0x07, 0x90, 0x07, 0xB8, 0x07, 0xE0, 0x08, 0x08, 0x08, 0x30, 0x08, 0x58, 0x08, 0x80, 0x08, 0xA8, 0x08, 0xD0, 0x08, 0xF8, 0x09, 0x20, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x30, 0x30, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x11, 0x88, 0x04, 0xA7, 0x12, 0xD8, 0x00, 0x00, 0x02, 0x58, 0x04, 0xA7, 0x12, 0xD8}; - -u8 D_801579A0[0x390] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xED, 0x00, 0x00, 0x00, 0x00, 0x50, 0x03, 0xC0, 0xEF, 0x08, 0x0C, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x53, 0x50, 0x20, 0x47, 0x66, 0x78, 0x5B, 0x53, 0x61, 0x66, 0x65, 0x5D, 0x20, 0x53, 0x32, 0x44, 0x45, 0x58, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x66, 0x6F, 0x20, 0x32, 0x2E, 0x30, 0x35, 0x20, 0x20, 0x59, 0x6F, 0x73, 0x68, 0x69, 0x74, 0x61, 0x6B, 0x61, 0x20, 0x59, 0x61, 0x73, 0x75, 0x6D, 0x6F, 0x74, 0x6F, 0x20, 0x31, 0x39, 0x39, 0x38, 0x20, 0x4E, 0x69, 0x6E, 0x74, 0x65, 0x6E, 0x64, 0x6F, 0x2E, 0x0A, 0x00, 0x08, 0x00, 0x00, 0x40, 0x00, 0x02, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x03, 0x00, 0x08, 0xFF, 0xF8, 0x01, 0x00, 0x80, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x10, 0x00, 0x04, 0x00, 0x20, 0x00, 0x02, 0x00, 0x3D, 0x10, 0x00, 0x01, 0x32, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x35, 0x24, 0x26, 0x28, 0xFF, 0xFC, 0x04, 0x00, 0x00, 0x20, 0x00, 0x10, 0xFC, 0x00, 0x03, 0xFF, 0x00, 0x1F, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x20, 0xFF, 0xFF, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x11, 0xA4, 0x16, 0xF0, 0x1B, 0xB0, 0x9B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x30, 0x00, 0x60, 0x00, 0x00, 0xFF, 0xF4, 0x00, 0x10, 0x00, 0x14, 0x00, 0x20, 0x00, 0x34, 0x00, 0x30, 0x00, 0x54, 0x00, 0x01, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x48, 0x02, 0x58, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x08, 0x02, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x07, 0xC1, 0xF0, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x3F, 0x08, 0x00, 0x10, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x10, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x0F, 0x20, 0x00, 0x40, 0x00, 0x02, 0x00, 0x00, 0x07, 0x40, 0x00, 0x80, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x00, 0x80, 0x00, 0xFF, 0x01, 0x00, 0x00, 0x7F, 0x02, 0x00, 0x00, 0x3F, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x97, 0x10, 0x00, 0x00, 0x00, 0x10, 0x18, 0x01, 0x7F, 0x10, 0x00, 0x00, 0x00, 0x06, 0x50, 0x07, 0x2F, 0x16, 0xD0, 0x00, 0x00, 0x11, 0x98, 0x07, 0x27, 0x16, 0xD0, 0x1B, 0x90, 0x10, 0x90, 0x10, 0xA4, 0x1F, 0xAC, 0x10, 0x54, 0x10, 0x7C, 0x11, 0xA4, 0x10, 0x1C, 0x10, 0xB8, 0x10, 0xB4, 0x10, 0x18, 0x10, 0x18, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x40, 0x11, 0x40, 0x11, 0x40, 0x11, 0xD0, 0x11, 0x40, 0x11, 0x70, 0x11, 0x40, 0x11, 0x28, 0x11, 0x40, 0x11, 0x40, 0x11, 0x40, 0x11, 0x40, 0x11, 0x40, 0x11, 0x40, 0x11, 0x40, 0x11, 0x40, 0x11, 0x40, 0x11, 0x40, 0x11, 0x40, 0x11, 0x50, 0x11, 0x50, 0x11, 0x50, 0x11, 0x44, 0x1B, 0x90, 0x16, 0xD0, 0x11, 0xA4, 0x10, 0x24, 0x15, 0x50, 0x15, 0x50, 0x15, 0x50, 0x15, 0x50, 0x1B, 0x84, 0x12, 0x08, 0x10, 0xE8, 0x01, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x02, 0xB0}; - -u64 gJpegUCodeData[0xC] = {0x00102000C0000800, 0x0040000200010001, 0x670A5824B6E3C5E3, 0x0FF0FFFF02000800, 0x18F982766A6EB8E3, 0x471D7D8A00000000, 0x5A82A57E30FC89BE, 0x7642000000000000, 0x18F96A6EB8E38276, 0x471D18F982766A6E, 0x6A6E8276E707B8E3, 0x7D8A471D6A6E18F9}; - -u64 D_801120C0[0x1F6] = {0x340A0FC08D420018, 0x8D43001C40803800, 0x0D0006B520010000, 0x201802E020170FB0, 0x8D5C00308D5B0034, 0x4005580030A40001, 0x1080000630A40100, 0x1080000400000000, 0x4004580030840100, 0x1C80FFFD00000000, 0x0D00043100000000, 0x8FBA00008FB90004, 0x001A0DC2302100FE, 0x239C0008237BFFF8, 0x23BD000823DEFFF8, 0x0001102084420010, 0x0040000800000000, 0x0000000D1FC0FFF2, 0x000000001B600005, 0x000000000D000431, 0x0000000009000416, 0x0000000034014000, 0x408120000000000D, 0x000000001000FFFF, 0x0000000023E50000, 0x001C102023630000, 0x2064FFC018800002, 0x200102F020030040, 0x207E00000D0006B5, 0x2063FFFF00A00008, 0x201D02F040043800, 0x1480FFFE00000000, 0x400428001480FFFE, 0x0000000040810000, 0x4082080040831000, 0x03E0000800000000, 0x400438001480FFFE, 0x0000000040042800, 0x1480FFFE00000000, 0x4081000040820800, 0x4083180003E00008, 0x000000003323FFFF, 0x1060FFCE3342FFFF, 0x4A00002C2063FFF0, 0xE8401800E8401801, 0x204200101C60FFFC, 0x2063FFF009000423, 0x0000000000191402, 0xA71A0000A7020002, 0x09000423A7190004, 0x3344FFFF001A0B02, 0x30210FF03323FFFF, 0x00191402C8411800, 0xC86218002021FFF8, 0x20840010E8810878, 0xE881097A20420008, 0xE8810A7CE8810B7E, 0xE882087920630008, 0xE882097BE8820A7D, 0x1C20FFF2E8820B7F, 0x0900042300000000, 0x3321FFFF1020FFA7, 0x3342FFFF00191C02, 0xC8411800C8421801, 0x2021FFF020420010, 0xE8611800E8621801, 0x1C20FFF920630010, 0x0900042300000000, 0x00190A0000010A02, 0x09000423AF010008, 0xC81F20004A1BDEEC, 0x971500004A19CE6C, 0x4A18C62C22B40001, 0x971300024A0D6B6C, 0x4A0E73AC97120004, 0x4A0F7BEC4A10842C, 0x00198A004A118C6C, 0x4A1294AC00118A02, 0x4A139CECEA7B2000, 0xEA7B200120100040, 0x200F0330001A0C02, 0x302800041100000A, 0x00000000200A0005, 0x2009000ECA191802, 0xCA1718032210FFFF, 0xCA191C0222100002, 0x090004B4CA171C03, 0x200A00092009000C, 0xCA191800CA181C00, 0xCA171801CA171C01, 0x001A0C0230210001, 0x1C200008001A0C02, 0x3021000210010002, 0x222200008F020008, 0x226100000D0006B5, 0x2003001FCA7B2001, 0x2273002012400077, 0xCA81180092A10000, 0x302B000F000B5940, 0x4B01C8E8016F6820, 0x4A04212C4A0631AC, 0x150000044B21C968, 0x4B21C1284B41C968, 0x4B61C1A800017102, 0x00091020004E7022, 0x21C2FFFF34038000, 0x11C000022004FFFF, 0x004320064884B000, 0xC9B52000C9B42001, 0x21ADFFFEC9B32802, 0x21ADFFFEC9B22802, 0x21ADFFFEC9B12802, 0x21ADFFFEC9B02802, 0x21ADFFFEC9AF2802, 0x21ADFFFEC9AE2802, 0x21ADFFFEC9AD2802, 0x028AA0204A171F86, 0x02AAA8204A17278E, 0xCA8118004A172F46, 0x92A100004A17374E, 0x19C00003302B000F, 0x4B16F7854B16EF45, 0x000B59404B01C8E8, 0x016F682015000004, 0x4B21C9684B21C128, 0x4B41C9684B61C1A8, 0x000171024BDBA887, 0x000910204BFBA08F, 0x004E70224B1E988F, 0x21C2FFFF4B3E908F, 0x200300014B5E888F, 0x00031BC04B7E808F, 0x11C000022004FFFF, 0x004320064B9E7F0F, 0x4884B0004BBE708F, 0x4BDE688F4BBFF08F, 0x4B3C3E9D4B1C3F1D, 0x4B9FD0864B9FE70F, 0x4B1D988721ACFFFE, 0x4B3D908FC9932802, 0x4B5D888F218CFFFE, 0x4B7D808FC9922802, 0x4B9D788F218CFFFE, 0x4BBD708FC9912802, 0x4BDD688F218CFFFE, 0x4BBFE88FC9902802, 0x4BDCA88F218CFFFE, 0x4BFCA08FC98F2802, 0x4B3B3E9D218CFFFE, 0x4B1B3EDDC98E2802, 0x218CFFFEC98D2802, 0xC9B520004B9FD086, 0xC9B420014B9FDECF, 0x2252FFE0EA7C1800, 0xEA7C1C01EA7B1802, 0xEA7B1C031E40FFB0, 0x227300202261FFE0, 0x22220000090006B1, 0x2003002087080000, 0x8713000287120004, 0x0019120000021202, 0x22E100000002B020, 0x2003001F001A3C02, 0x30EA00011D400005, 0x000000000D0006B5, 0x0000000009000550, 0x00000000A6E00008, 0x4A10842CEAF01800, 0x30EA000211400006, 0xCAF018002108FFFC, 0xE9100800E9100A01, 0x0900056800000000, 0x30EA00041140000C, 0x000000002108FFF0, 0xE9100800E9100801, 0xE9100902E9100903, 0xE9100A04E9100A05, 0xE9100B06E9100B07, 0x0900056800000000, 0x2108FFF8E9101800, 0xCAF70F04C9101800, 0x48889200200A00E0, 0x488A9300489A9400, 0x200A0040488A9500, 0x20090060C93F2001, 0xC93920004A1FCE51, 0xC93E2002C93D2003, 0xC93C2004C93B2005, 0xC93A20064A1FCE51, 0xC938200722F50020, 0x22F400304A16B5AC, 0x4BF7FDC54B92CD8D, 0x4B1EFDCE4B52FD46, 0x4B5EB54E4BB2BC44, 0x4B9E8C464B72FC4E, 0xC9392000EAB52000, 0xEA912000EAF70B84, 0x86B1000086890000, 0x86AD000886850008, 0x86B0000286880002, 0x86AC000A8684000A, 0x86AF000486870004, 0x86AB000C8683000C, 0x86AE000686860006, 0x86AA000E8682000E, 0xCA3018004BF7FDC5, 0xC92F18004BF6FDCF, 0xC9B01C004B92CD8D, 0xC8AF1C004B1EFDCE, 0xCA0E18004B52FD46, 0xC90D18004B5EB54E, 0xC98E1C004BB2BC44, 0xC88D1C00C9EC1800, 0xC8EB1800C96C1C00, 0x4B9E8C46C86B1C00, 0xC9CA1800C8C91800, 0x4B72FC4EC94A1C00, 0x4A0F8200C8491C00, 0x4A0D71C0EAB52000, 0x4A0B6180EA912000, 0x86B100004A095140, 0x868900004A684210, 0x86AD00084A6739D0, 0x868500084A663190, 0x86B000024A652950, 0x868800024AC84210, 0x86AC000A4AC739D0, 0x8684000A4AC63190, 0x86AF00044AC52950, 0x868700044A88E906, 0x86AB000C4A87E10E, 0x8683000C4A86D90E, 0x86AE00064A85D10E, 0x8686000686AA000E, 0x2252FFF0EA642000, 0x1A4000038682000E, 0x0900059A22730010, 0xEAF70804CA301800, 0xEAF0180000161020, 0x22E10000090006B1, 0x20030020001A7C02, 0x31EF00FF334DFFFF, 0x0019740221EFFFFF, 0x332CFFFFC9A12000, 0xC9A22001218CFFE0, 0x21AD0020E9C12000, 0xE9C220011D80FFF9, 0x21CE00201DE0FFF5, 0x0000000009000423, 0x00000000001A7C02, 0x31EF00FF334DFFFF, 0x00197402C9A12000, 0xC9A22001C9A32002, 0xC9A42003C9A52004, 0xC9A62005C9A72006, 0xC9A8200721EFFFFF, 0xE9C12000E9C22001, 0xE9C32002E9C42003, 0xE9C52004E9C62005, 0xE9C72006E9C82007, 0x1DE0FFF621CE0080, 0x0900042300000000, 0x334CFFFF332EFFFF, 0x00196C02C9A10800, 0xC9A20804C9A30808, 0xC9A4080CC9A10902, 0xC9A20906C9A3090A, 0xC9A4090E21AD0020, 0x218CFFF8E9C11000, 0xE9C21001E9C31002, 0xE9C410031D80FFF1, 0x21CE001009000423, 0x000000004A04212C, 0x4A00002CC8032000, 0x02B5A82048952000, 0x48952100001A6302, 0x31930FF002D6B020, 0x4896220048962300, 0x00196502318E0FF0, 0x016B5820488B2400, 0x488B250000196302, 0x318F0FF000196102, 0x31900FF000196100, 0x31910FF0334C0002, 0x000C6042000C6022, 0x488C1000334C0001, 0x000C6022488C1100, 0x334C0008000C6042, 0x000C6022488C1200, 0x334C0004000C6042, 0x000C6022488C1300, 0x001A6202319400FF, 0x4A000010334A0010, 0xCA682000CA6F2001, 0x227300204B014245, 0x4B4142852294FFF0, 0xC9CB2000C9EC2000, 0x4B217C054B617C45, 0xC9D22001C9F32001, 0x4B024A6C4B2252AC, 0xCA0D2000CA2E2000, 0x4A095AD04A0A6310, 0x4B814A454B815285, 0x4B02842C4B228C6C, 0xCA142001CA352001, 0x4A1094904A119CD0, 0x4BA184054BA18C45, 0x4B424A6C4B6252AC, 0xE9CB20004B42842C, 0x4B628C6C15400015, 0xE9EC20004A096B50, 0x4A0A7390E9D22001, 0xE9F320014A10A510, 0x4A11AD5021CE0020, 0xEA0D2000EA2E2000, 0x21EF0020CA682000, 0xEA14200122100020, 0x4A040854EA352001, 0x223100201E80FFCD, 0x4A00001009000423, 0x4A00002C4A0A6B50, 0x4A097390E9D22001, 0xE9F320014A11A510, 0x090006734A10AD50, 0x4A01086C334BFFFF, 0x001A6202318CFF00, 0x488C0C00018B6020, 0x488C0D000019AC02, 0x090004233336FFFF, 0x00196402488C0800, 0x01956020488C0900, 0x332CFFFF488C0A00, 0x0196602009000423, 0x488C0B00001A1B02, 0x30630FF03341FFFF, 0x0019120003E00008, 0x000212020D00069B, 0x00000000090006AD, 0x000000000D00069B, 0x00000000090006B1, 0x000000000D00069E, 0x20010330090006AD, 0x3343FFFF0D0006B5, 0x2063FFFF09000423, 0x000000000D0006BF, 0x2063FFFF09000423, 0x0000000040043800, 0x1480FD8600000000, 0x400428001480FFFE, 0x0000000040810000, 0x40820800090006C8, 0x4083100040043800, 0x1480FD8700000000, 0x400428001480FFFE, 0x0000000040810000, 0x4082080040831800, 0x200400011480FFFF, 0x4004300003E00008, 0x40803800C81F2000, 0x001A930232520FF0, 0x3333FFFF0019A402, 0x3351FFFF4891F000, 0xCA7B2000CA9D2000, 0xCA7A2001CA9C2001, 0x4BDFDEC02252FFE0, 0x4B1EEEC822940020, 0x4BDFD6804B1EE688, 0xCA9D2000EA7B2000, 0xCA7B2002EA7A2001, 0xCA9C200122730020, 0x1E40FFF3CA7A2001, 0x0900042300000000, 0x970D00004A0210AC, 0x970E00024A0318EC, 0x970C000400198A00, 0x00118A02E9C22000, 0xE9C32001001A0C02, 0x302100011C200008, 0x001A0C0230210002, 0x1001000222220000, 0x8F02000821C10000, 0x0D0006B52003001F, 0x21CE00201180000B, 0x00000000C9A23000, 0xC9A3300121AD0010, 0x218CFFE0C9A43000, 0xE9C22000C9A53001, 0xE9C320011D800005, 0x21CE002021C1FFE0, 0x22220000090006B1, 0x20030020218CFFE0, 0xC9A23002E9C42000, 0xC9A33003E9C52001, 0x21AD00201D80FFEE, 0x21CE002009000709, 0x00000000334CFFFF, 0x00196C02001A7902, 0x31EFF000488F1900, 0x001A7D0231EF000F, 0x488F1800C9A12000, 0xC9A220014B230905, 0x4B03090F4B231145, 0x4B03114FE9A42000, 0xE9A52001218CFFE0, 0x1D80FFF621AD0020, 0x090004234A00002C, 0x22ED00004A00002C, 0x22EE0020E9A02000, 0x00191200E9A02001, 0x00021202001A6402, 0x318C00FF1180000B, 0x00000000218CFFFF, 0x1180000A00000000, 0x334FFFFF4A00002C, 0xE9C02000E9C02002, 0x21C10010090006AD, 0x2003001001A00820, 0x0D0006B52003001F, 0xC9D82001C9B92001, 0x4A0E73AC4A000000, 0x200C4000488C7800, 0x4B0FC3884B0FCB88, 0xE9CE2001E9AE2001, 0x01A00820334BFFFF, 0xC9D82001C9DC1801, 0xC9DC1C02C9D41803, 0xC9D41C0421CE0002, 0xC9DF1800C9DF1C01, 0xC9D11802C9D11C03, 0xC9DB1801C9DB1C02, 0xC9D51803C9D51C04, 0x21CE0002C9DE1800, 0xC9DE1C01C9DA1801, 0xC9DA1C02C9D21802, 0xC9D21C03C9D61803, 0xC9D61C0421CE0002, 0xC9DD1800C9DD1C01, 0xC9D91801C9D91C02, 0xC9D31802C9D31C03, 0xC9D71803C9D71C04, 0xC9AF2000C9702000, 0x4A0E73AC4A000000, 0x4B2FBB884B4FB388, 0x4B6FAB884B8FA388, 0x4BAF9B884BCF9388, 0x4BEF8B884B10C388, 0x4B30CB884B50D388, 0x4B70DB884B90E388, 0x4BB0EB884BD0F388, 0x4BF0FB8821EFFFF0, 0xE96E2000216B0010, 0x1DE0FFEA4A1003D4, 0xE9B02000090006B1, 0x2003001F4A1FFFD4, 0x001A930232520FF0, 0x3333FFFF0019A402, 0xCA7B2000CA9D2000, 0xCA7A2001CA9C2001, 0xCA792002CA972002, 0xCA782003CA962003, 0x229400404A1DDED0, 0x4A1CD6904A17CE50, 0x4A16C6102252FFC0, 0xEA7B2000EA7A2001, 0xEA792002EA782003, 0x227300401E40FFED, 0xCA7B200009000423, 0x00000000870E0000, 0x870F0002870D0004, 0x334CFFFF000C6080, 0x332AFFFF000E7400, 0x014E5025000A5C02, 0x316BFFFEC9610800, 0x014C5020000A5C02, 0x316BFFFEC9610900, 0x014C5020000A5C02, 0x316BFFFEC9610A00, 0x014C5020000A5C02, 0x316BFFFEC9610B00, 0x014C502021ADFFF8, 0xE9E1180021EF0008, 0x1DA0FFEC00000000, 0x0D00042300000000, 0xC81F20003352FFFF, 0x3333FFFF0019A402, 0xCA9D2000CA9C2001, 0xCA7B2000CA7A2001, 0x2252FFE022940020, 0x4A1DE6C64A1DE68E, 0xEA7B2001EA7A2000, 0xCA9D2000CA9C2001, 0x1E40FFF722730020, 0x0900042300000000, 0x0D00069B00000000, 0x22E100000D0006B5, 0x2063FFFF8C260004, 0x20C60001AC260004, 0xAC3B0008AC3E000C, 0x3346FFFF0D0006BF, 0xA426000009000423, 0x0000000000000000, 0x0000000000000000}; - -u8 D_80113070[0x18C0] = {0x4A, 0x00, 0x00, 0x2C, 0xC8, 0x1F, 0x20, 0x18, 0xC8, 0x1E, 0x20, 0x19, 0xC8, 0x1D, 0x20, 0x1A, 0xC8, 0x1C, 0x20, 0x1B, 0x20, 0x1E, 0x01, 0xC0, 0x20, 0x17, 0x04, 0xC0, 0x20, 0x16, 0x07, 0xD8, 0x4B, 0x7F, 0x00, 0x51, 0x8C, 0x0B, 0x00, 0xF0, 0x8C, 0x0C, 0x0F, 0xC4, 0x20, 0x01, 0x28, 0x00, 0x11, 0x60, 0x00, 0x06, 0x40, 0x81, 0x20, 0x00, 0x31, 0x8C, 0x00, 0x01, 0x11, 0x80, 0x00, 0x1E, 0xAC, 0x00, 0x0F, 0xC4, 0x08, 0x00, 0x04, 0x5F, 0x8C, 0x1A, 0x0B, 0xF8, 0x40, 0x0B, 0x58, 0x00, 0x31, 0x6B, 0x00, 0x01, 0x15, 0x60, 0x00, 0x0B, 0x40, 0x02, 0x48, 0x00, 0x8C, 0x03, 0x0F, 0xE8, 0x00, 0x62, 0x58, 0x22, 0x1D, 0x60, 0x00, 0x07, 0x40, 0x01, 0x50, 0x00, 0x8C, 0x04, 0x0F, 0xEC, 0x10, 0x20, 0x00, 0x04, 0x00, 0x24, 0x58, 0x22, 0x05, 0x61, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x14, 0x22, 0x00, 0x08, 0x40, 0x0B, 0x58, 0x00, 0x31, 0x6B, 0x04, 0x00, 0x15, 0x60, 0xFF, 0xFD, 0x20, 0x0B, 0x00, 0x01, 0x40, 0x8B, 0x58, 0x00, 0x8C, 0x02, 0x0F, 0xEC, 0x40, 0x82, 0x40, 0x00, 0x40, 0x82, 0x48, 0x00, 0xAC, 0x02, 0x00, 0xF0, 0x8C, 0x0B, 0x00, 0xF4, 0x15, 0x60, 0x00, 0x02, 0x8C, 0x0B, 0x0F, 0xE0, 0xAC, 0x0B, 0x00, 0xF4, 0x8C, 0x01, 0x0F, 0xD0, 0x8C, 0x02, 0x03, 0x04, 0x8C, 0x03, 0x03, 0x0C, 0x8C, 0x04, 0x03, 0x14, 0x8C, 0x05, 0x03, 0x1C, 0x00, 0x41, 0x10, 0x20, 0x00, 0x61, 0x18, 0x20, 0xAC, 0x02, 0x03, 0x04, 0xAC, 0x03, 0x03, 0x0C, 0x00, 0x81, 0x20, 0x20, 0x00, 0xA1, 0x28, 0x20, 0xAC, 0x04, 0x03, 0x14, 0xAC, 0x05, 0x03, 0x1C, 0x8C, 0x19, 0x00, 0xC0, 0x0C, 0x00, 0x04, 0x77, 0x8C, 0x18, 0x00, 0xC4, 0x8C, 0x1A, 0x0F, 0xF0, 0x20, 0x0B, 0x03, 0x0C, 0x0C, 0x00, 0x07, 0xED, 0x37, 0xEC, 0x00, 0x00, 0x20, 0x13, 0x00, 0xA7, 0x37, 0x58, 0x00, 0x00, 0x0C, 0x00, 0x07, 0xF6, 0x24, 0x14, 0x04, 0x18, 0x27, 0x5A, 0x00, 0xA8, 0x20, 0x1B, 0xFF, 0x58, 0x0C, 0x00, 0x07, 0xF2, 0x40, 0x01, 0x20, 0x00, 0x8F, 0x79, 0x04, 0xC0, 0x13, 0x60, 0xFF, 0xF6, 0x30, 0x21, 0x00, 0x80, 0x00, 0x19, 0x66, 0x03, 0x00, 0x0C, 0x58, 0x40, 0x95, 0x6B, 0x03, 0x70, 0x14, 0x20, 0x03, 0x7A, 0x8F, 0x78, 0x04, 0xC4, 0x01, 0x60, 0x00, 0x08, 0x27, 0x7B, 0x00, 0x08, 0xAC, 0x19, 0x00, 0xC0, 0xAC, 0x18, 0x00, 0xC4, 0x20, 0x1F, 0x11, 0x40, 0x33, 0x2B, 0x0F, 0xFF, 0xA4, 0x0B, 0x02, 0x08, 0x00, 0x19, 0x5B, 0x02, 0x31, 0x6B, 0x0F, 0xFF, 0xA4, 0x0B, 0x02, 0x04, 0x33, 0x0B, 0x0F, 0xFF, 0xA4, 0x0B, 0x02, 0x0A, 0x00, 0x18, 0x5B, 0x02, 0x31, 0x6B, 0x0F, 0xFF, 0x03, 0xE0, 0x00, 0x08, 0xA4, 0x0B, 0x02, 0x06, 0x0C, 0x00, 0x04, 0x55, 0x20, 0x14, 0x03, 0xB0, 0x0C, 0x00, 0x07, 0xF6, 0x20, 0x13, 0x00, 0x27, 0xCB, 0xC2, 0x12, 0x11, 0x0C, 0x00, 0x07, 0xF2, 0xCB, 0xC2, 0x16, 0x12, 0xCA, 0x88, 0x20, 0x00, 0x90, 0x01, 0x03, 0xCB, 0x4B, 0xDE, 0x42, 0xC5, 0x4A, 0x02, 0x42, 0x51, 0x4A, 0xC8, 0x0A, 0x8E, 0x4A, 0xA8, 0x01, 0x90, 0x4B, 0x1C, 0x5A, 0xE8, 0x4A, 0xC9, 0x02, 0x60, 0x4A, 0xEA, 0x02, 0xA3, 0x4A, 0x09, 0x40, 0xD1, 0x4A, 0x09, 0x5A, 0xD1, 0x4B, 0x7F, 0x31, 0x4E, 0x4A, 0x09, 0x41, 0xD0, 0x4B, 0x7F, 0x51, 0xCE, 0x4A, 0x07, 0x06, 0xE3, 0x48, 0x4B, 0x08, 0x00, 0x14, 0x20, 0x00, 0x02, 0x4A, 0x0A, 0x59, 0x10, 0x4B, 0x0B, 0x41, 0x33, 0x31, 0x6B, 0x00, 0x88, 0x4B, 0x7D, 0x2E, 0xE3, 0x15, 0x60, 0xFF, 0xCA, 0x4A, 0x0B, 0x29, 0x67, 0x94, 0x02, 0x03, 0xCC, 0x80, 0x05, 0x03, 0xC4, 0x3C, 0x03, 0x35, 0x10, 0x00, 0x02, 0x12, 0x40, 0x00, 0x45, 0x28, 0x24, 0x00, 0x65, 0x18, 0x25, 0xAE, 0xE3, 0x00, 0x00, 0xEA, 0xFD, 0x14, 0x01, 0xEA, 0xFD, 0x12, 0x02, 0xAE, 0xE0, 0x00, 0x0C, 0x90, 0x05, 0x03, 0xC6, 0x90, 0x06, 0x03, 0xC7, 0x90, 0x07, 0x03, 0xC9, 0x8C, 0x04, 0x02, 0x64, 0x00, 0x05, 0x18, 0x80, 0x00, 0x66, 0x18, 0x25, 0x00, 0x03, 0x1C, 0xC0, 0x00, 0x62, 0x18, 0x25, 0x00, 0x07, 0x5D, 0x00, 0x00, 0x8B, 0x20, 0x25, 0xAE, 0xE3, 0x00, 0x10, 0xEA, 0xFD, 0x06, 0x10, 0xAE, 0xE4, 0x00, 0x14, 0x22, 0xF7, 0x00, 0x18, 0x00, 0x06, 0x30, 0xC0, 0x20, 0xC6, 0x02, 0x74, 0xC8, 0xC2, 0x18, 0x00, 0xCA, 0x86, 0x09, 0x12, 0x4B, 0x9F, 0x29, 0x45, 0x4B, 0x04, 0x12, 0x28, 0x4B, 0x67, 0x0A, 0x8E, 0x4B, 0x04, 0x12, 0x44, 0x4B, 0x85, 0x32, 0xCE, 0x10, 0x20, 0x00, 0x02, 0x4B, 0x7D, 0x03, 0x0F, 0x4A, 0x0A, 0x0A, 0x11, 0x4B, 0x0A, 0x12, 0x84, 0x4B, 0xDF, 0x42, 0x05, 0x4B, 0x7D, 0xFA, 0x0E, 0x4B, 0x00, 0x4A, 0x33, 0xEB, 0xCB, 0x09, 0x01, 0xEB, 0xCC, 0x09, 0x00, 0x8F, 0xC2, 0x00, 0x00, 0x8C, 0x18, 0x03, 0xC0, 0x0C, 0x00, 0x04, 0x55, 0x00, 0x02, 0x10, 0x42, 0x00, 0x02, 0x10, 0xC0, 0x00, 0x58, 0x10, 0x20, 0x37, 0x03, 0x00, 0x00, 0x4B, 0x67, 0x18, 0x90, 0x4B, 0x7F, 0x08, 0x8E, 0x94, 0x05, 0x03, 0xBA, 0x48, 0x06, 0x2C, 0x00, 0x48, 0x07, 0x49, 0x00, 0x48, 0x08, 0x1A, 0x00, 0x48, 0x09, 0x1E, 0x00, 0x48, 0x0A, 0x12, 0x00, 0x48, 0x01, 0x3F, 0x00, 0x00, 0x08, 0x43, 0x00, 0x30, 0xA5, 0xFF, 0xFC, 0x00, 0x06, 0x30, 0x80, 0x00, 0xA6, 0x20, 0x22, 0x18, 0x80, 0xFF, 0x8A, 0x00, 0x0A, 0x53, 0x00, 0x18, 0xE0, 0x00, 0x02, 0x3C, 0x0C, 0xE4, 0x00, 0x20, 0x84, 0xFF, 0xFC, 0x00, 0x81, 0x58, 0x22, 0x19, 0x60, 0x00, 0x02, 0x01, 0x4C, 0x50, 0x25, 0x34, 0x24, 0x00, 0x00, 0x80, 0x0F, 0x03, 0xC5, 0x94, 0x0D, 0x03, 0xD4, 0x94, 0x06, 0x03, 0xD2, 0x05, 0xE1, 0x00, 0x04, 0x94, 0x05, 0x03, 0xD0, 0x48, 0x05, 0x52, 0x00, 0x00, 0x05, 0x28, 0x80, 0x20, 0xA5, 0xFF, 0xFF, 0x00, 0x0D, 0x70, 0x40, 0x21, 0xCE, 0xFF, 0xFF, 0x3C, 0x0B, 0x3D, 0x10, 0x01, 0xCB, 0x70, 0x25, 0x00, 0x0F, 0x7E, 0x00, 0x34, 0xA5, 0x70, 0x00, 0x00, 0x05, 0x2B, 0x00, 0x18, 0x80, 0x00, 0x2E, 0x00, 0x24, 0x08, 0x22, 0x94, 0x1D, 0x03, 0xD6, 0x05, 0xE1, 0x00, 0x04, 0x94, 0x15, 0x03, 0xCE, 0x94, 0x0B, 0x03, 0xD0, 0x00, 0x1D, 0xEC, 0x00, 0x03, 0xAB, 0xE8, 0x25, 0x00, 0xA6, 0x80, 0x25, 0x00, 0x95, 0x20, 0x22, 0x04, 0x81, 0x00, 0x10, 0x48, 0x84, 0x11, 0x00, 0x4B, 0x22, 0x30, 0x86, 0x4B, 0x7D, 0x00, 0xCF, 0xEB, 0xC2, 0x09, 0x01, 0xEB, 0xC3, 0x09, 0x00, 0x8F, 0xCB, 0x00, 0x00, 0x02, 0xA4, 0xA8, 0x20, 0x05, 0xE1, 0x00, 0x04, 0x03, 0xAB, 0xE8, 0x20, 0x22, 0xAB, 0xFF, 0xFF, 0x08, 0x00, 0x05, 0x11, 0x00, 0xAB, 0x80, 0x25, 0x23, 0xAB, 0xFF, 0xFE, 0x35, 0x6B, 0xE0, 0x00, 0x00, 0x0B, 0x5A, 0xC0, 0x01, 0x66, 0x80, 0x25, 0x01, 0x35, 0xE0, 0x20, 0x23, 0x9C, 0xFF, 0xFF, 0xEA, 0xFD, 0x07, 0x00, 0xAE, 0xEE, 0x00, 0x08, 0xAE, 0xE2, 0x00, 0x0C, 0xAE, 0xEF, 0x00, 0x10, 0xAE, 0xF0, 0x00, 0x14, 0xEA, 0xFD, 0x04, 0x18, 0x01, 0x5C, 0x58, 0x25, 0xAE, 0xEB, 0x00, 0x20, 0x01, 0x09, 0x58, 0x25, 0xAE, 0xEB, 0x00, 0x24, 0xEA, 0xE8, 0x10, 0x0A, 0xEA, 0xFE, 0x14, 0x0B, 0x0C, 0x00, 0x05, 0x91, 0x22, 0xF7, 0x00, 0x30, 0x23, 0x89, 0x00, 0x01, 0x1C, 0x80, 0xFF, 0xDC, 0x00, 0x5D, 0x10, 0x20, 0x18, 0x20, 0xFF, 0x44, 0xEA, 0xFD, 0x07, 0x00, 0x18, 0xE0, 0x00, 0x28, 0xAE, 0xEE, 0x00, 0x08, 0xAE, 0xE2, 0x00, 0x0C, 0x3C, 0x0B, 0x35, 0x10, 0xAE, 0xEB, 0x00, 0x10, 0x3C, 0x0C, 0x06, 0x00, 0xAE, 0xEC, 0x00, 0x14, 0x3C, 0x1D, 0x33, 0x00, 0xAE, 0xFD, 0x00, 0x18, 0x00, 0x07, 0x38, 0x42, 0x00, 0x0D, 0xA8, 0x42, 0x02, 0xA7, 0xA8, 0x22, 0x00, 0x15, 0x5B, 0x80, 0x21, 0x6B, 0xF0, 0x00, 0x01, 0x6C, 0x58, 0x25, 0xAE, 0xEB, 0x00, 0x1C, 0xEA, 0xFD, 0x04, 0x20, 0xAE, 0xEE, 0x00, 0x28, 0xAE, 0xE3, 0x00, 0x2C, 0x3C, 0x0B, 0x35, 0x10, 0xAE, 0xEB, 0x00, 0x30, 0xA6, 0xF5, 0x00, 0x32, 0x3C, 0x0C, 0x06, 0x00, 0xAE, 0xEC, 0x00, 0x34, 0xAE, 0xFD, 0x00, 0x38, 0x00, 0x07, 0x5B, 0x80, 0x21, 0x6B, 0xF0, 0x00, 0x01, 0x6C, 0x58, 0x25, 0xAE, 0xEB, 0x00, 0x3C, 0x22, 0xF7, 0x00, 0x58, 0xEA, 0xFD, 0x04, 0x68, 0x01, 0x49, 0x58, 0x25, 0xAE, 0xEB, 0xFF, 0xF0, 0x01, 0x09, 0x58, 0x25, 0xAE, 0xEB, 0xFF, 0xF4, 0xEA, 0xE8, 0x10, 0x7E, 0x0C, 0x00, 0x05, 0x91, 0xEA, 0xFE, 0x14, 0x7F, 0x21, 0x29, 0x00, 0x04, 0x20, 0x21, 0xFF, 0xFC, 0x18, 0x20, 0xFF, 0x1A, 0x00, 0x07, 0x58, 0xC0, 0x00, 0x6B, 0x10, 0x20, 0x34, 0x24, 0x00, 0x00, 0x08, 0x00, 0x04, 0xF8, 0x20, 0x01, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x55, 0x20, 0x14, 0x03, 0xA8, 0x0C, 0x00, 0x07, 0xF6, 0x33, 0x33, 0x00, 0xFF, 0x94, 0x0B, 0x02, 0x44, 0xCB, 0xC4, 0x18, 0x07, 0x80, 0x01, 0x02, 0xAE, 0xC9, 0x63, 0x20, 0x00, 0x00, 0x19, 0xCD, 0xC2, 0x0C, 0x00, 0x07, 0xF2, 0x87, 0x39, 0x02, 0x02, 0x92, 0x83, 0x00, 0x0F, 0x8E, 0x87, 0x00, 0x14, 0x8E, 0x85, 0x00, 0x10, 0x8C, 0x64, 0x02, 0xB0, 0x00, 0xE0, 0x40, 0x27, 0x00, 0xA7, 0x30, 0x24, 0x00, 0x87, 0x48, 0x24, 0x11, 0x25, 0x00, 0x27, 0x00, 0x88, 0x48, 0x24, 0x01, 0x26, 0x48, 0x25, 0xAC, 0x69, 0x02, 0xB0, 0x20, 0x0B, 0xFF, 0x81, 0x15, 0x61, 0x00, 0x03, 0xA0, 0x0B, 0x02, 0xAE, 0xEA, 0xFD, 0x07, 0x80, 0x22, 0xF7, 0x00, 0x08, 0x96, 0x84, 0x00, 0x0A, 0xEA, 0xFD, 0x08, 0x00, 0x8E, 0x98, 0x00, 0x04, 0xA6, 0xE4, 0x00, 0x02, 0x0C, 0x00, 0x04, 0x55, 0x96, 0x83, 0x00, 0x08, 0xAE, 0xF8, 0x00, 0x04, 0x82, 0x88, 0x00, 0x01, 0x92, 0x87, 0x00, 0x02, 0x92, 0x85, 0x00, 0x03, 0x20, 0x86, 0x00, 0x01, 0x00, 0xC8, 0x30, 0x24, 0x00, 0x06, 0x31, 0xC0, 0x00, 0x07, 0x3C, 0x00, 0x00, 0x66, 0x18, 0x25, 0x00, 0x67, 0x18, 0x25, 0xAE, 0xE3, 0x00, 0x08, 0xEA, 0xFD, 0x06, 0x08, 0x04, 0x20, 0x00, 0x03, 0xEA, 0xFD, 0x14, 0x03, 0xEA, 0xFD, 0x07, 0x10, 0x22, 0xF7, 0x00, 0x08, 0x96, 0x81, 0x00, 0x0C, 0x00, 0x05, 0x2E, 0x00, 0xAE, 0xE5, 0x00, 0x10, 0x00, 0x04, 0x23, 0x80, 0x00, 0x81, 0x20, 0x25, 0xAE, 0xE4, 0x00, 0x14, 0xEA, 0xFD, 0x04, 0x14, 0x0C, 0x00, 0x05, 0x91, 0x22, 0xF7, 0x00, 0x18, 0x03, 0x20, 0x00, 0x08, 0x20, 0x14, 0x03, 0xC0, 0x20, 0x1F, 0x11, 0xA4, 0x20, 0x0B, 0x00, 0xE7, 0xA2, 0xEB, 0x00, 0x00, 0x22, 0xF7, 0x00, 0x08, 0x02, 0xF6, 0x58, 0x22, 0x19, 0x60, 0x02, 0x5F, 0x40, 0x0C, 0x30, 0x00, 0x8C, 0x18, 0x00, 0xF0, 0x25, 0x73, 0x03, 0x18, 0x15, 0x80, 0xFF, 0xFC, 0x8C, 0x0C, 0x0F, 0xEC, 0x40, 0x98, 0x48, 0x00, 0x03, 0x13, 0x58, 0x20, 0x01, 0x8B, 0x60, 0x22, 0x05, 0x81, 0x00, 0x08, 0x40, 0x0B, 0x58, 0x00, 0x31, 0x6B, 0x04, 0x00, 0x15, 0x60, 0xFF, 0xFD, 0x8C, 0x18, 0x0F, 0xE8, 0x40, 0x0B, 0x50, 0x00, 0x11, 0x78, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x40, 0x98, 0x40, 0x00, 0x40, 0x0B, 0x50, 0x00, 0x01, 0x78, 0x58, 0x22, 0x19, 0x60, 0x00, 0x02, 0x01, 0x73, 0x58, 0x22, 0x19, 0x60, 0xFF, 0xFB, 0x03, 0x13, 0x58, 0x20, 0xAC, 0x0B, 0x00, 0xF0, 0x22, 0x73, 0xFF, 0xFF, 0x22, 0xD4, 0xDC, 0xE8, 0x3A, 0xD6, 0x0C, 0x00, 0x08, 0x00, 0x07, 0xF6, 0x22, 0xD7, 0xFC, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x55, 0x20, 0x13, 0x00, 0x17, 0x0C, 0x00, 0x07, 0xF6, 0x20, 0x14, 0x03, 0xC0, 0x94, 0x0B, 0x02, 0x44, 0xCB, 0xC4, 0x18, 0x07, 0x0C, 0x00, 0x07, 0xF2, 0xC9, 0x63, 0x18, 0x00, 0xCA, 0x82, 0x20, 0x00, 0x90, 0x02, 0x01, 0xE8, 0x80, 0x03, 0x01, 0xEC, 0x00, 0x43, 0x10, 0x26, 0x30, 0x42, 0x01, 0x80, 0x00, 0x02, 0x10, 0xC2, 0x20, 0x41, 0x02, 0xC0, 0x4B, 0x24, 0x11, 0xD1, 0x4B, 0x43, 0x21, 0x90, 0x4B, 0x64, 0x11, 0x50, 0x4B, 0x22, 0x42, 0x30, 0x4B, 0x1B, 0x41, 0x32, 0x4B, 0xA2, 0x62, 0x30, 0x4B, 0x1B, 0x61, 0x32, 0x4A, 0x04, 0x42, 0x14, 0x4B, 0x7D, 0x21, 0x10, 0x4A, 0x88, 0x3E, 0xC4, 0x4A, 0x84, 0x38, 0x8D, 0x4B, 0x7D, 0xDA, 0x4E, 0x4B, 0x1E, 0x16, 0xC5, 0x4B, 0x1E, 0x48, 0x8C, 0xC8, 0x29, 0x20, 0x00, 0x92, 0x8B, 0x00, 0x17, 0x48, 0xCB, 0x08, 0x00, 0x4A, 0x00, 0x0A, 0xA7, 0x4A, 0x8A, 0x4A, 0x2C, 0x4B, 0x06, 0x0E, 0xC7, 0x4A, 0xC7, 0x41, 0x0F, 0x4A, 0x85, 0x0E, 0xC7, 0x4A, 0xC2, 0x49, 0x8F, 0x4B, 0x7D, 0x01, 0xCF, 0xEB, 0xC6, 0x20, 0x00, 0xCB, 0xC6, 0x1C, 0x00, 0xCB, 0xC7, 0x18, 0x01, 0xCB, 0xC2, 0x20, 0x02, 0xCB, 0xC5, 0x08, 0x18, 0xCB, 0xC5, 0x0C, 0x19, 0x4B, 0x63, 0x29, 0x50, 0x4B, 0x03, 0x29, 0x68, 0x4A, 0x85, 0x0E, 0xC7, 0x4A, 0xA2, 0x36, 0xCD, 0x4A, 0x82, 0x36, 0xCF, 0x4A, 0xE2, 0x3E, 0xCD, 0x4A, 0xC2, 0x3A, 0x0F, 0xCB, 0xC2, 0x10, 0x11, 0xCB, 0xC2, 0x14, 0x12, 0x4A, 0x82, 0x46, 0xE3, 0x48, 0x4B, 0x08, 0x00, 0x31, 0x6C, 0x00, 0x0F, 0x11, 0x80, 0xFE, 0x7B, 0x31, 0x6C, 0x00, 0xF0, 0x11, 0x80, 0xFE, 0x79, 0x4A, 0xA2, 0x46, 0xE0, 0x48, 0x4B, 0x08, 0x00, 0x31, 0x6C, 0x00, 0x0F, 0x11, 0x80, 0xFE, 0x75, 0x31, 0x6C, 0x00, 0xF0, 0x11, 0x80, 0xFE, 0x73, 0x4B, 0x7D, 0x40, 0x90, 0xEB, 0xC8, 0x1C, 0x00, 0x4A, 0x48, 0x41, 0x6C, 0xCB, 0xC2, 0x18, 0x00, 0x4A, 0x44, 0x21, 0xAC, 0x4A, 0x62, 0x10, 0xA0, 0x4A, 0x65, 0x29, 0x67, 0x4A, 0x66, 0x31, 0xA7, 0x4A, 0x45, 0x42, 0x2C, 0x4A, 0x46, 0x21, 0x2C, 0x90, 0x01, 0x02, 0xAF, 0x38, 0x21, 0x00, 0x02, 0xA0, 0x01, 0x02, 0xAF, 0x80, 0x0C, 0x02, 0xAE, 0xEA, 0xFD, 0x07, 0x80, 0x14, 0x2C, 0x00, 0x02, 0xA0, 0x01, 0x02, 0xAE, 0x26, 0xF7, 0x00, 0x08, 0x94, 0x07, 0x02, 0x46, 0x92, 0x82, 0x00, 0x14, 0x92, 0x83, 0x00, 0x15, 0x96, 0x84, 0x00, 0x10, 0x96, 0x85, 0x00, 0x12, 0x92, 0x86, 0x00, 0x16, 0x8C, 0xE7, 0x00, 0x04, 0x00, 0x02, 0x15, 0x40, 0x00, 0x03, 0x1C, 0xC0, 0x00, 0x43, 0x10, 0x25, 0x00, 0x04, 0x22, 0x40, 0x00, 0x44, 0x10, 0x25, 0x00, 0x45, 0x10, 0x25, 0xAE, 0xE2, 0x00, 0x00, 0xEA, 0xFD, 0x06, 0x00, 0x00, 0x06, 0x35, 0x00, 0x00, 0xC7, 0x30, 0x25, 0xAE, 0xE6, 0x00, 0x04, 0xA2, 0xE1, 0x00, 0x04, 0x96, 0x84, 0x00, 0x04, 0xEA, 0xFD, 0x12, 0x02, 0x96, 0x85, 0x00, 0x0C, 0x30, 0x84, 0x7F, 0xF8, 0x00, 0x04, 0x22, 0x40, 0x00, 0x05, 0x28, 0xC3, 0x00, 0x85, 0x18, 0x25, 0x20, 0x63, 0xBF, 0xFC, 0xAE, 0xE3, 0x00, 0x0C, 0xA2, 0xE1, 0x00, 0x0C, 0xEA, 0xFD, 0x04, 0x10, 0x26, 0xF7, 0x00, 0x18, 0x4B, 0x3E, 0x01, 0xEB, 0x20, 0x0B, 0x00, 0x20, 0x48, 0xCB, 0x08, 0x00, 0x20, 0x0C, 0x00, 0xE7, 0x4A, 0xC8, 0x38, 0xA7, 0x4A, 0x88, 0x38, 0xE7, 0x4A, 0xA8, 0x39, 0x67, 0x4A, 0xE8, 0x39, 0xA7, 0x48, 0xCC, 0x08, 0x00, 0x4A, 0xC4, 0x10, 0xA7, 0x4A, 0x84, 0x18, 0xE7, 0x4A, 0xA4, 0x29, 0x67, 0x4A, 0xE4, 0x31, 0xA7, 0x4A, 0x02, 0x29, 0x11, 0x4A, 0x02, 0x19, 0xD1, 0x4A, 0x03, 0x12, 0x11, 0x4A, 0x03, 0x2A, 0x51, 0x4B, 0xC7, 0x26, 0xC7, 0x4B, 0xC4, 0x46, 0xCF, 0x4B, 0x0A, 0x52, 0x9D, 0x4B, 0x2B, 0x5A, 0xDD, 0x4B, 0xC4, 0x43, 0x70, 0x4B, 0x7D, 0x43, 0x32, 0x4A, 0x0A, 0x56, 0xD3, 0x4B, 0xC7, 0x4B, 0x70, 0x4B, 0x7D, 0x4B, 0x32, 0x4B, 0xDF, 0xDE, 0xE0, 0x4B, 0x1E, 0xF3, 0xA7, 0x4B, 0xC9, 0x53, 0x70, 0x4B, 0x7D, 0x53, 0x32, 0x4B, 0x2E, 0x5E, 0xC4, 0x4B, 0x2E, 0x52, 0x8D, 0x4B, 0x7D, 0xFA, 0xCE, 0x4B, 0x44, 0x42, 0x73, 0x4B, 0x47, 0x4A, 0x73, 0x4A, 0x0C, 0x6B, 0x54, 0x4B, 0x7D, 0x63, 0x10, 0x4B, 0xC4, 0x44, 0x73, 0x4B, 0xC7, 0x4C, 0x73, 0x4B, 0xC9, 0x54, 0x73, 0x4B, 0x5F, 0x04, 0x90, 0x4B, 0x5F, 0x6B, 0x46, 0x4B, 0x5F, 0x63, 0x0F, 0x4A, 0x11, 0x6E, 0xC4, 0x4A, 0x11, 0x64, 0x0D, 0x4B, 0x7D, 0xFB, 0xCE, 0x4A, 0x0F, 0x03, 0xD5, 0x4A, 0x10, 0x94, 0x11, 0x4A, 0x0F, 0x6E, 0xC4, 0x4A, 0x0F, 0x66, 0xCD, 0x4A, 0x10, 0x6B, 0x4E, 0x4A, 0x10, 0x63, 0x0F, 0x48, 0x02, 0x51, 0x80, 0x30, 0x42, 0x00, 0x80, 0x00, 0x41, 0x10, 0x25, 0x34, 0x42, 0x0A, 0x00, 0x4B, 0x4A, 0x46, 0xF2, 0x4B, 0x4B, 0x54, 0x31, 0x4B, 0x7D, 0x53, 0xF2, 0x4A, 0x09, 0x6E, 0xC6, 0x4A, 0x09, 0x66, 0xCF, 0x4B, 0x2A, 0x52, 0x9D, 0x4B, 0x0B, 0x5A, 0xDD, 0x4B, 0xC7, 0x26, 0xC7, 0x4B, 0xC4, 0x46, 0xCF, 0x4B, 0x2C, 0x63, 0x1D, 0x4B, 0x0D, 0x6B, 0x5D, 0x4B, 0x44, 0x3E, 0xC7, 0x4B, 0x48, 0x26, 0xCF, 0x4B, 0x31, 0x8C, 0x5D, 0x4B, 0x12, 0x94, 0x9D, 0x4B, 0x50, 0x66, 0xC4, 0x4B, 0x50, 0x6E, 0xCD, 0x4B, 0x4F, 0x63, 0x0E, 0x4B, 0x4F, 0x6B, 0x4F, 0x4B, 0x50, 0x8E, 0xC4, 0x4B, 0x50, 0x96, 0xCD, 0x4B, 0x4F, 0x8C, 0x4E, 0x4B, 0x4F, 0x94, 0x8F, 0x48, 0x03, 0x1A, 0x00, 0x4B, 0x9F, 0x03, 0xD0, 0x4B, 0x9F, 0x56, 0xC4, 0x4B, 0x9F, 0x5A, 0x4D, 0x00, 0x03, 0x1B, 0x80, 0x4B, 0x7D, 0x02, 0x0E, 0x4B, 0xBF, 0x11, 0x28, 0x4A, 0x04, 0x01, 0x11, 0x4B, 0x7D, 0x5E, 0xE0, 0x4B, 0x3D, 0x04, 0x27, 0x4B, 0x42, 0x7E, 0xC6, 0x4B, 0xC4, 0x42, 0x0E, 0x4B, 0xC4, 0x4A, 0x4F, 0x4B, 0xC4, 0x79, 0x06, 0x4B, 0x7D, 0x01, 0xCF, 0x4B, 0x10, 0x44, 0xD4, 0x4B, 0x7D, 0x4D, 0x10, 0x4B, 0x2E, 0x66, 0xC4, 0x4B, 0x2E, 0x6B, 0x4D, 0x4B, 0x7D, 0xFB, 0x0E, 0x4B, 0x2E, 0x8E, 0xC4, 0x4B, 0x2E, 0x94, 0x8D, 0x4B, 0x7D, 0xFC, 0x4E, 0x4B, 0xDF, 0x63, 0x06, 0x4B, 0xDF, 0x6B, 0x4F, 0x4B, 0xDF, 0x8C, 0x46, 0x4B, 0xDF, 0x94, 0x8F, 0x4B, 0x0A, 0x66, 0xC4, 0x4B, 0x0A, 0x6E, 0xCD, 0x4B, 0x0B, 0x66, 0xCE, 0x4B, 0x0B, 0x6E, 0xCF, 0x4B, 0x3D, 0x8B, 0x8E, 0x4B, 0x3D, 0x93, 0xCF, 0x4B, 0x3D, 0x16, 0xC7, 0x4B, 0xC4, 0x76, 0xCC, 0x4B, 0xC4, 0x7E, 0xCD, 0x4B, 0xC7, 0x74, 0x0E, 0x4B, 0xC7, 0x7D, 0x4F, 0xA6, 0xE2, 0x00, 0x00, 0xEA, 0xE5, 0x0E, 0x01, 0xEA, 0xE3, 0x0E, 0x02, 0xEA, 0xE2, 0x0E, 0x03, 0xAE, 0xE3, 0x00, 0x08, 0xEA, 0xEB, 0x0A, 0x06, 0xEA, 0xEA, 0x0A, 0x07, 0xEA, 0xE9, 0x08, 0x08, 0xEA, 0xE8, 0x08, 0x09, 0xEA, 0xEB, 0x08, 0x0A, 0xEA, 0xEA, 0x08, 0x0B, 0xEA, 0xF4, 0x09, 0x0C, 0xEA, 0xF3, 0x09, 0x0D, 0xEA, 0xEB, 0x09, 0x0E, 0xEA, 0xEA, 0x09, 0x0F, 0xEA, 0xF5, 0x1B, 0x04, 0xEA, 0xED, 0x1B, 0x05, 0xEA, 0xF0, 0x1B, 0x06, 0xEA, 0xEC, 0x1B, 0x07, 0xEA, 0xEF, 0x1B, 0x08, 0xEA, 0xF2, 0x1B, 0x09, 0xEA, 0xEE, 0x1B, 0x0A, 0xEA, 0xF1, 0x1B, 0x0B, 0x13, 0x20, 0xFE, 0xDC, 0x26, 0xF7, 0x00, 0x60, 0x4B, 0x7D, 0x18, 0x90, 0x20, 0x19, 0x00, 0x00, 0x4B, 0x7D, 0x28, 0xD0, 0x08, 0x00, 0x06, 0x34, 0x4B, 0x7D, 0x31, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0C, 0x1B, 0x80, 0x08, 0x00, 0x07, 0xED, 0x20, 0x0B, 0x03, 0x1C, 0x0C, 0x00, 0x04, 0x55, 0x20, 0x13, 0x00, 0x17, 0x0C, 0x00, 0x07, 0xF6, 0x20, 0x14, 0x03, 0xC0, 0x94, 0x0B, 0x02, 0x44, 0xCB, 0xC4, 0x18, 0x07, 0x0C, 0x00, 0x07, 0xF2, 0xC9, 0x63, 0x18, 0x00, 0x07, 0x20, 0x00, 0x77, 0xCA, 0x82, 0x20, 0x00, 0x4B, 0x44, 0x11, 0x50, 0x4B, 0x03, 0x29, 0x68, 0x4B, 0x7D, 0x01, 0xA8, 0x4B, 0x24, 0x12, 0x11, 0x4B, 0x04, 0x01, 0xD0, 0x4B, 0x22, 0x42, 0x70, 0x4B, 0x1B, 0x41, 0x32, 0x4B, 0xA2, 0x62, 0x70, 0x4B, 0x1B, 0x61, 0x32, 0x4A, 0x04, 0x4A, 0x54, 0x4B, 0x7D, 0x21, 0x10, 0x4B, 0x1E, 0x42, 0xC6, 0x4B, 0x7D, 0x02, 0x8F, 0x4A, 0x89, 0x5E, 0xC4, 0x4A, 0x89, 0x56, 0xCD, 0x4A, 0x84, 0x5A, 0xCE, 0x4A, 0x84, 0x52, 0x8F, 0x94, 0x0B, 0x02, 0x46, 0xC9, 0x64, 0x18, 0x00, 0x4A, 0xC8, 0x3A, 0x50, 0x4B, 0x7F, 0x0A, 0x4E, 0x4B, 0x04, 0x4A, 0x46, 0x4B, 0x24, 0x13, 0x06, 0x92, 0x8B, 0x00, 0x17, 0x31, 0x6B, 0x00, 0x11, 0x25, 0x6B, 0x00, 0x77, 0x48, 0xCB, 0x08, 0x00, 0x4A, 0x09, 0x39, 0xE7, 0x4A, 0x0C, 0x13, 0x67, 0x4B, 0x43, 0x39, 0xD0, 0x4A, 0xCB, 0x36, 0xD4, 0x4A, 0xCA, 0x28, 0x90, 0xCB, 0xC8, 0x10, 0x11, 0xCB, 0xC8, 0x14, 0x12, 0x4A, 0xA8, 0x10, 0xA0, 0x4A, 0x88, 0x2A, 0x51, 0x4A, 0x88, 0x29, 0x63, 0x4A, 0x09, 0x02, 0x67, 0x4A, 0x02, 0x2E, 0xE3, 0x48, 0x41, 0x08, 0x00, 0x30, 0x21, 0x00, 0x11, 0x14, 0x20, 0xFD, 0x51, 0x4A, 0xAD, 0x4E, 0xC7, 0x4B, 0x2B, 0x5A, 0xDD, 0x4B, 0x0A, 0x52, 0x9D, 0x4B, 0x5E, 0x5E, 0xC4, 0x4B, 0x5E, 0x56, 0xCD, 0x4B, 0x7F, 0x5A, 0xCE, 0x4A, 0xC7, 0x09, 0xCE, 0x4B, 0x23, 0x2A, 0x28, 0x4A, 0xFE, 0x42, 0x07, 0x4A, 0x88, 0x6A, 0x05, 0x4A, 0xA8, 0x39, 0xD1, 0x48, 0x01, 0x28, 0x00, 0x48, 0x02, 0x2C, 0x00, 0x48, 0x03, 0x10, 0x00, 0x48, 0x04, 0x14, 0x00, 0x30, 0x42, 0x0F, 0xFF, 0x00, 0x01, 0x0B, 0x00, 0x00, 0x22, 0x08, 0x25, 0x30, 0x84, 0x0F, 0xFF, 0x00, 0x03, 0x1B, 0x00, 0x00, 0x64, 0x18, 0x25, 0x48, 0x05, 0x69, 0x00, 0x90, 0x02, 0x00, 0xC9, 0x30, 0x42, 0x00, 0x20, 0x10, 0x40, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x28, 0x80, 0x20, 0x63, 0xBF, 0xFC, 0x90, 0x02, 0x02, 0xAF, 0x38, 0x42, 0x00, 0x02, 0xA0, 0x02, 0x02, 0xAF, 0x80, 0x0C, 0x02, 0xAE, 0xEA, 0xFD, 0x07, 0x80, 0x14, 0x4C, 0x00, 0x02, 0xA0, 0x02, 0x02, 0xAE, 0x26, 0xF7, 0x00, 0x08, 0xEB, 0xC4, 0x12, 0x00, 0x8F, 0xCA, 0x00, 0x00, 0x92, 0x84, 0x00, 0x14, 0x92, 0x86, 0x00, 0x15, 0x96, 0x87, 0x00, 0x10, 0x96, 0x88, 0x00, 0x12, 0x92, 0x89, 0x00, 0x16, 0x00, 0x04, 0x25, 0x40, 0x00, 0x06, 0x34, 0xC0, 0x00, 0x86, 0x20, 0x25, 0x00, 0x07, 0x3A, 0x40, 0x00, 0x87, 0x20, 0x25, 0x00, 0x88, 0x20, 0x25, 0xAE, 0xE4, 0x00, 0x00, 0xEA, 0xFD, 0x06, 0x00, 0x00, 0x09, 0x4D, 0x00, 0x01, 0x2A, 0x48, 0x25, 0xAE, 0xE9, 0x00, 0x04, 0xA2, 0xE2, 0x00, 0x04, 0x96, 0x87, 0x00, 0x04, 0xEA, 0xFD, 0x12, 0x02, 0x96, 0x88, 0x00, 0x0C, 0x30, 0xE7, 0x7F, 0xF8, 0x00, 0x07, 0x3A, 0x40, 0x00, 0x08, 0x40, 0xC3, 0x00, 0xE8, 0x30, 0x25, 0x20, 0xC6, 0xBF, 0xFC, 0xAE, 0xE6, 0x00, 0x0C, 0xA2, 0xE2, 0x00, 0x0C, 0xAE, 0xE3, 0x00, 0x10, 0xEA, 0xFD, 0x06, 0x90, 0xAE, 0xE1, 0x00, 0x14, 0xA2, 0xE2, 0x00, 0x14, 0xEA, 0xE7, 0x08, 0x0C, 0xEA, 0xE7, 0x0C, 0x0D, 0xA6, 0xE5, 0x00, 0x1C, 0xEA, 0xED, 0x0D, 0x0F, 0x08, 0x00, 0x05, 0x90, 0x26, 0xF7, 0x00, 0x20, 0xCA, 0x82, 0x20, 0x00, 0xCB, 0xC7, 0x09, 0x1A, 0xCB, 0xC7, 0x0D, 0x1B, 0xCB, 0xC8, 0x08, 0x18, 0xCB, 0xC8, 0x0C, 0x19, 0x4B, 0x1F, 0x12, 0x45, 0x4B, 0x7D, 0xFA, 0x8E, 0x4B, 0x27, 0x43, 0x30, 0x4B, 0x1B, 0x42, 0xF2, 0x4B, 0xA7, 0x63, 0x30, 0x4B, 0x1B, 0x62, 0xF2, 0x4A, 0x0B, 0x0E, 0xC6, 0x4B, 0x3D, 0x63, 0x0E, 0x4B, 0x3D, 0x5A, 0xCF, 0x4B, 0x3F, 0x39, 0xC5, 0x4B, 0x7D, 0xFB, 0x4E, 0x4A, 0x02, 0x6E, 0xC6, 0x4A, 0x02, 0x39, 0xCF, 0x4A, 0x8C, 0x56, 0xC4, 0x4A, 0x8C, 0x4E, 0xCD, 0x4A, 0x8B, 0x51, 0x8E, 0x4A, 0x8B, 0x49, 0x4F, 0x4B, 0x44, 0x42, 0x10, 0x4B, 0x03, 0x42, 0x28, 0x4B, 0x3D, 0x29, 0x4E, 0x4B, 0x27, 0x48, 0xB3, 0x08, 0x00, 0x06, 0xF1, 0x4B, 0xA7, 0x68, 0xB3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0C, 0x10, 0x00, 0x20, 0x0B, 0x03, 0x04, 0x8D, 0x78, 0x00, 0x00, 0x95, 0x73, 0x00, 0x04, 0x0C, 0x00, 0x07, 0xF6, 0x95, 0x74, 0x00, 0x06, 0x35, 0x9F, 0x00, 0x00, 0x40, 0x0B, 0x30, 0x00, 0x15, 0x60, 0xFF, 0xFF, 0x40, 0x0B, 0x30, 0x00, 0x03, 0xE0, 0x00, 0x08, 0x40, 0x0B, 0x28, 0x00, 0x15, 0x60, 0xFF, 0xFF, 0x40, 0x0B, 0x28, 0x00, 0x40, 0x94, 0x00, 0x00, 0x06, 0x80, 0x00, 0x03, 0x40, 0x98, 0x08, 0x00, 0x03, 0xE0, 0x00, 0x08, 0x40, 0x93, 0x10, 0x00, 0x03, 0xE0, 0x00, 0x08, 0x40, 0x93, 0x18, 0x00, 0x02, 0xF6, 0x58, 0x22, 0x25, 0x6C, 0x03, 0x17, 0x05, 0x91, 0x01, 0x93, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x07, 0xF2, 0x8C, 0x18, 0x00, 0xF0, 0x04, 0x20, 0x00, 0x1A, 0x40, 0x98, 0x48, 0x00, 0x14, 0x20, 0x00, 0x0F, 0x03, 0x5B, 0xD0, 0x20, 0x8F, 0x78, 0x04, 0xBC, 0xAC, 0x1A, 0x0F, 0xF0, 0xAC, 0x18, 0x0F, 0xD0, 0x24, 0x14, 0x10, 0x80, 0x0C, 0x00, 0x07, 0xF6, 0x20, 0x13, 0x0F, 0x47, 0x8C, 0x18, 0x00, 0xD8, 0x24, 0x14, 0x01, 0x80, 0x33, 0x33, 0x0F, 0xFF, 0x03, 0x14, 0xC0, 0x20, 0x0C, 0x00, 0x07, 0xF6, 0x02, 0x74, 0x98, 0x22, 0x08, 0x00, 0x07, 0xF2, 0x20, 0x1F, 0x10, 0x84, 0x8C, 0x0B, 0x0F, 0xD0, 0xAC, 0x1A, 0x0B, 0xF8, 0xAC, 0x0B, 0x0B, 0xFC, 0x20, 0x0C, 0x50, 0x00, 0x8C, 0x18, 0x0F, 0xF8, 0x20, 0x14, 0x80, 0x00, 0x20, 0x13, 0x0B, 0xFF, 0x08, 0x00, 0x07, 0xF6, 0x20, 0x1F, 0x10, 0x88, 0x20, 0x0C, 0x40, 0x00, 0x40, 0x8C, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x55, 0x87, 0x74, 0x04, 0xB9, 0x33, 0x33, 0x0F, 0xF8, 0x00, 0x14, 0xA0, 0x83, 0x08, 0x00, 0x07, 0xF6, 0x20, 0x1F, 0x11, 0xA0, 0xAD, 0x79, 0xF0, 0xB8, 0x08, 0x00, 0x04, 0x69, 0xAD, 0x78, 0xF0, 0xBC, 0x90, 0x01, 0x00, 0xD1, 0x8C, 0x03, 0x00, 0xD4, 0x03, 0x00, 0x28, 0x27, 0x8C, 0x22, 0x02, 0xB0, 0xA4, 0x19, 0x00, 0xD0, 0x00, 0x78, 0x20, 0x24, 0x00, 0x58, 0x30, 0x24, 0x10, 0xC3, 0x00, 0x58, 0x00, 0x45, 0x30, 0x24, 0x00, 0xC4, 0x30, 0x25, 0xAC, 0x26, 0x02, 0xB0, 0x8C, 0x18, 0x00, 0xD0, 0x90, 0x01, 0x00, 0xDE, 0x00, 0x19, 0x13, 0xC0, 0x0C, 0x00, 0x04, 0x55, 0x03, 0x5B, 0x18, 0x20, 0x04, 0x40, 0x00, 0x48, 0x37, 0x1A, 0x00, 0x00, 0xAC, 0x23, 0x01, 0x38, 0x20, 0x21, 0x00, 0x04, 0x08, 0x00, 0x04, 0x62, 0xA0, 0x01, 0x00, 0xDE, 0x90, 0x01, 0x00, 0xDE, 0x10, 0x20, 0x03, 0xCA, 0x20, 0x21, 0xFF, 0xFC, 0x08, 0x00, 0x04, 0x1D, 0x8C, 0x3A, 0x01, 0x38, 0x00, 0x19, 0x0C, 0x02, 0x94, 0x22, 0x28, 0x86, 0x00, 0x59, 0x10, 0x20, 0x08, 0x00, 0x04, 0x69, 0xAC, 0x58, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x55, 0x97, 0x34, 0x03, 0x88, 0x93, 0x73, 0x04, 0xB9, 0x08, 0x00, 0x07, 0xF6, 0x20, 0x1F, 0x11, 0xA0, 0x8D, 0x63, 0xF0, 0x14, 0x3C, 0x02, 0x80, 0x00, 0x03, 0x22, 0x10, 0x07, 0x00, 0x19, 0x0A, 0x02, 0x00, 0x22, 0x10, 0x06, 0x00, 0x40, 0x10, 0x27, 0x00, 0x62, 0x18, 0x24, 0x00, 0x78, 0x18, 0x25, 0xAD, 0x63, 0xF0, 0x14, 0x8C, 0x19, 0x00, 0xC8, 0x08, 0x00, 0x04, 0x50, 0x8C, 0x18, 0x00, 0xCC, 0xA0, 0x18, 0x02, 0x68, 0x33, 0x01, 0x00, 0x08, 0x24, 0x21, 0x02, 0x48, 0xA4, 0x01, 0x02, 0x44, 0x33, 0x21, 0x00, 0x08, 0x24, 0x21, 0x02, 0x58, 0xA4, 0x01, 0x02, 0x46, 0x33, 0x01, 0x00, 0x18, 0x00, 0x01, 0x08, 0x42, 0x8C, 0x23, 0x02, 0x34, 0x33, 0x01, 0x00, 0x70, 0x00, 0x01, 0x08, 0x82, 0x8C, 0x22, 0x02, 0x14, 0xAC, 0x03, 0x01, 0xFC, 0x08, 0x00, 0x04, 0x69, 0xAC, 0x02, 0x01, 0xF8, 0xC8, 0x1B, 0x18, 0x18, 0xC8, 0x1B, 0x1C, 0x1A, 0x8C, 0x19, 0x00, 0xD8, 0x22, 0xF7, 0x00, 0x10, 0xEA, 0xFB, 0x18, 0x7E, 0xEA, 0xFB, 0x1C, 0x7F, 0xAE, 0xF8, 0x00, 0x04, 0xAE, 0xF9, 0x00, 0x00, 0x08, 0x00, 0x05, 0x90, 0x22, 0xF7, 0x00, 0x08, 0x20, 0x1F, 0x11, 0x40, 0x00, 0x18, 0x5D, 0x82, 0x31, 0x6B, 0x00, 0x3C, 0x8D, 0x6B, 0x00, 0xF8, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x18, 0xC2, 0x02, 0x03, 0xE0, 0x00, 0x08, 0x03, 0x0B, 0xC0, 0x20, 0xAC, 0x19, 0x00, 0xC8, 0x08, 0x00, 0x04, 0x50, 0xAC, 0x18, 0x00, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x55, 0x20, 0x13, 0x00, 0x17, 0x0C, 0x00, 0x07, 0xF6, 0x20, 0x14, 0x03, 0xC0, 0x20, 0x0C, 0x16, 0xDC, 0x08, 0x00, 0x07, 0xED, 0x20, 0x0B, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0C, 0x16, 0x38, 0x08, 0x00, 0x07, 0xED, 0x20, 0x0B, 0x03, 0x14, 0x0C, 0x00, 0x07, 0xF6, 0x20, 0x13, 0x00, 0x27, 0x20, 0x01, 0x03, 0xD8, 0xCB, 0xC2, 0x12, 0x11, 0x0C, 0x00, 0x07, 0xF2, 0xCB, 0xC2, 0x16, 0x12, 0xCA, 0x83, 0x20, 0x00, 0xCA, 0x84, 0x08, 0x0E, 0xCA, 0x84, 0x0C, 0x0F, 0x4B, 0x3F, 0x21, 0x45, 0x4B, 0x7D, 0xF9, 0x8E, 0x4B, 0x04, 0x42, 0x30, 0x4B, 0x7D, 0x41, 0xF2, 0x4B, 0x84, 0x62, 0x30, 0x4B, 0x7D, 0x61, 0xF2, 0x4B, 0x3D, 0x0E, 0xC6, 0x4B, 0x1F, 0x46, 0xCC, 0x4B, 0x1F, 0x39, 0xCD, 0x4B, 0x7D, 0xFA, 0x0E, 0x4B, 0x9F, 0x1E, 0xC6, 0x4B, 0x7D, 0xFA, 0x8F, 0x90, 0x02, 0x03, 0xCB, 0x4B, 0x7F, 0x0E, 0xC6, 0x4A, 0xA3, 0x46, 0xCC, 0x30, 0x42, 0x00, 0x01, 0x4A, 0xA3, 0x3B, 0x0D, 0x4B, 0x7D, 0xFA, 0xCE, 0x4B, 0x1C, 0x5A, 0xE8, 0x4A, 0x8B, 0x1A, 0xD5, 0x4A, 0x8C, 0x03, 0x11, 0x4B, 0x7D, 0x63, 0x23, 0x4B, 0x7D, 0x5A, 0xE7, 0x10, 0x40, 0x00, 0x03, 0x4A, 0xEB, 0x1B, 0x51, 0x4B, 0x6B, 0x1E, 0xD0, 0x4B, 0x5B, 0x50, 0xF3, 0x4A, 0x03, 0x12, 0x51, 0x4A, 0xE2, 0x1A, 0xD1, 0x4A, 0xED, 0x0A, 0xCE, 0x4B, 0x7D, 0x4A, 0x63, 0x4B, 0x7D, 0x5A, 0xE3, 0x4A, 0xC9, 0x6B, 0x51, 0x4A, 0xCB, 0x6B, 0x51, 0x4A, 0xC9, 0x18, 0x90, 0x4B, 0x3D, 0x6E, 0xE3, 0x48, 0xCB, 0x08, 0x00, 0x31, 0x6B, 0x00, 0x88, 0x15, 0x60, 0xFE, 0x7A, 0x4A, 0xED, 0x13, 0x10, 0x4B, 0xED, 0x78, 0xB3, 0x4B, 0x9F, 0x16, 0xC5, 0xE8, 0x22, 0x0A, 0x00, 0xE8, 0x2C, 0x0A, 0x01, 0x10, 0x40, 0x00, 0x02, 0xE8, 0x3B, 0x16, 0x01, 0x4B, 0x4B, 0x52, 0x73, 0x4B, 0xDF, 0x18, 0x86, 0x4A, 0xC9, 0x23, 0x06, 0x4B, 0x7D, 0xFA, 0xCF, 0x4B, 0xFE, 0x63, 0x06, 0x4B, 0xFE, 0x5A, 0xCF, 0x4A, 0x83, 0x0A, 0xCF, 0x48, 0x03, 0x58, 0x00, 0x48, 0x05, 0x11, 0x00, 0x48, 0x04, 0x5C, 0x00, 0x8C, 0x07, 0x03, 0xD0, 0x48, 0x06, 0x15, 0x00, 0x00, 0x65, 0x58, 0x22, 0x05, 0x60, 0x00, 0x05, 0x48, 0x83, 0x58, 0x00, 0x00, 0x65, 0x18, 0x22, 0x20, 0x84, 0x00, 0x20, 0x08, 0x00, 0x06, 0x02, 0x20, 0xE7, 0x00, 0x20, 0x00, 0x86, 0x58, 0x22, 0x05, 0x60, 0x00, 0x04, 0x48, 0x84, 0x5C, 0x00, 0x00, 0x86, 0x20, 0x22, 0x08, 0x00, 0x06, 0x09, 0x00, 0xE6, 0x38, 0x22, 0xAC, 0x07, 0x03, 0xF0, 0x00, 0x87, 0x58, 0x22, 0x00, 0x0B, 0x59, 0x40, 0xAC, 0x0B, 0x03, 0xE4, 0x4A, 0xED, 0x23, 0x06, 0x4B, 0x7D, 0xFA, 0x4F, 0x4B, 0xFE, 0x63, 0x06, 0x4B, 0xFE, 0x4A, 0x4F, 0x90, 0x0B, 0x02, 0x68, 0x31, 0x6B, 0x00, 0x08, 0x00, 0x0B, 0x30, 0xC2, 0x48, 0x04, 0x48, 0x00, 0xA0, 0x06, 0x03, 0xE0, 0x00, 0x06, 0x59, 0x40, 0x20, 0x84, 0x00, 0x0B, 0x00, 0x64, 0x60, 0x20, 0x01, 0x85, 0x60, 0x2A, 0x39, 0x8C, 0x00, 0x01, 0xA0, 0x0C, 0x03, 0xE1, 0x90, 0x0B, 0x03, 0xC6, 0x90, 0x0C, 0x03, 0xC7, 0x00, 0x0B, 0x58, 0x40, 0x21, 0x6B, 0x02, 0xA4, 0x00, 0x0C, 0x60, 0x80, 0x21, 0x8C, 0x02, 0x94, 0xC9, 0x6C, 0x0A, 0x00, 0xC9, 0x8C, 0x10, 0x00, 0x48, 0x86, 0x68, 0x00, 0x4B, 0x63, 0x23, 0x86, 0x4B, 0x7D, 0xFB, 0xCF, 0x4B, 0x5C, 0x6E, 0xC6, 0x4B, 0xFE, 0x76, 0xCC, 0x4B, 0xFE, 0x7B, 0xCD, 0x4B, 0x7D, 0xFB, 0x8E, 0x4B, 0x22, 0x76, 0xD5, 0x4B, 0x7D, 0x7E, 0xE0, 0x4B, 0x22, 0x76, 0xE7, 0x4B, 0x0C, 0x08, 0xCE, 0x4B, 0x3D, 0x0E, 0xC7, 0x4B, 0x2C, 0x18, 0xCD, 0xE8, 0x23, 0x08, 0x05, 0x4B, 0x03, 0x43, 0xF0, 0x4B, 0x7D, 0x43, 0xB2, 0x4B, 0x7F, 0x6E, 0xC7, 0x4B, 0x4C, 0x7E, 0xCC, 0x4B, 0x4C, 0x74, 0x0D, 0x4B, 0x3C, 0x83, 0x46, 0x4B, 0x7D, 0xF8, 0xCF, 0x4B, 0x88, 0x6E, 0xC4, 0x4B, 0x88, 0x1E, 0xCD, 0x4B, 0x87, 0x6B, 0x4E, 0x4B, 0x87, 0x18, 0xCF, 0xE8, 0x23, 0x08, 0x08, 0xE8, 0x2D, 0x08, 0x09, 0xC8, 0x2E, 0x08, 0x07, 0xC8, 0x2F, 0x08, 0x06, 0x4B, 0x88, 0x76, 0xC4, 0x4B, 0x88, 0x7E, 0xCD, 0x4B, 0x87, 0x73, 0x8E, 0x4B, 0x87, 0x7B, 0xCF, 0x4B, 0x9C, 0x73, 0xA8, 0x4B, 0x03, 0x46, 0xF2, 0x4B, 0x0D, 0x41, 0xF1, 0x4B, 0x7D, 0x42, 0x32, 0x4A, 0x07, 0x76, 0xC4, 0x4A, 0x07, 0x7E, 0xCD, 0x4A, 0x08, 0x74, 0x4E, 0x4A, 0x08, 0x7C, 0x8F, 0x4B, 0x5F, 0x8C, 0x46, 0x4B, 0x5F, 0x94, 0x8F, 0x4B, 0x3D, 0x0C, 0x4F, 0x4A, 0x11, 0x69, 0xC6, 0x4A, 0x11, 0x1A, 0x0F, 0x4A, 0x07, 0x76, 0xD5, 0x4A, 0x08, 0x7E, 0xE3, 0x4A, 0x12, 0x8C, 0xA7, 0x4B, 0x12, 0x69, 0xC6, 0x4B, 0x12, 0x1A, 0x0F, 0x4B, 0x9C, 0x3C, 0x68, 0x4A, 0x11, 0x74, 0xD5, 0x4A, 0x08, 0x7D, 0x11, 0x4B, 0x3F, 0x9E, 0xC4, 0x4B, 0x3F, 0xA3, 0xCD, 0x4B, 0x7D, 0xFB, 0x8E, 0x4B, 0x84, 0x73, 0x86, 0x4B, 0x84, 0x7B, 0xCF, 0x4B, 0x3D, 0x1E, 0xC7, 0x4B, 0xBC, 0x3E, 0xE8, 0x4B, 0x3D, 0x6E, 0xCE, 0x4B, 0x7F, 0x99, 0xCE, 0x4B, 0x7F, 0xA2, 0x0F, 0xE8, 0x28, 0x08, 0x0A, 0xE8, 0x27, 0x08, 0x0B, 0x4B, 0x1F, 0x70, 0xC5, 0x4B, 0xDC, 0x18, 0xE8, 0x4B, 0x3F, 0x73, 0x84, 0x4B, 0x3F, 0x7B, 0xCD, 0x4B, 0x7D, 0xFB, 0x8E, 0x4B, 0x0E, 0x81, 0xD1, 0x4B, 0x10, 0x49, 0xF3, 0x08, 0x00, 0x06, 0xEF, 0xE8, 0x27, 0x10, 0x0A, 0x8C, 0x0B, 0x03, 0xFC, 0xEA, 0xFD, 0x07, 0x80, 0x22, 0xF7, 0x00, 0x10, 0x01, 0x74, 0x58, 0x25, 0xAE, 0xEB, 0xFF, 0xF8, 0xEA, 0xFD, 0x14, 0x7F, 0x8C, 0x0B, 0x03, 0xF8, 0xAE, 0xF1, 0x00, 0x04, 0x22, 0xF7, 0x00, 0x18, 0xAE, 0xEB, 0xFF, 0xE8, 0xEA, 0xFD, 0x07, 0x70, 0x3C, 0x0B, 0xF4, 0x00, 0xAE, 0xEB, 0xFF, 0xF8, 0x22, 0x6B, 0x06, 0xFF, 0xA6, 0xEB, 0xFF, 0xFC, 0x00, 0x12, 0x58, 0x80, 0x21, 0x6B, 0xFF, 0xFF, 0x03, 0xE0, 0x00, 0x08, 0xA6, 0xEB, 0xFF, 0xFE, 0x90, 0x0B, 0x03, 0xE0, 0x90, 0x0C, 0x03, 0xE1, 0x00, 0x8B, 0xC8, 0x20, 0x00, 0x6C, 0xC0, 0x22, 0x03, 0x19, 0x58, 0x22, 0x05, 0x60, 0x00, 0x07, 0x94, 0x13, 0x03, 0xE2, 0x37, 0x32, 0x00, 0x00, 0x0C, 0x00, 0x06, 0x7B, 0x34, 0xB1, 0x00, 0x00, 0x00, 0x64, 0x18, 0x22, 0x08, 0x00, 0x07, 0x68, 0x00, 0xA6, 0x28, 0x20, 0x48, 0x93, 0xC0, 0x00, 0x03, 0x23, 0x90, 0x22, 0x1A, 0x40, 0x00, 0x0E, 0x20, 0x74, 0x00, 0x00, 0x8C, 0x11, 0x03, 0xC0, 0x94, 0x0B, 0x03, 0xF4, 0x32, 0x9F, 0x00, 0x01, 0x13, 0xE0, 0x00, 0x05, 0x02, 0x2B, 0x88, 0x20, 0x94, 0x0B, 0x03, 0xF6, 0x22, 0x94, 0xFF, 0xFF, 0x22, 0x52, 0x00, 0x01, 0x02, 0x2B, 0x88, 0x22, 0x48, 0x94, 0xD8, 0x00, 0x4B, 0x18, 0xDE, 0xC6, 0x0C, 0x00, 0x06, 0x75, 0x48, 0x14, 0xD8, 0x00, 0x11, 0x80, 0x00, 0x1D, 0xC8, 0x38, 0x09, 0x0F, 0x48, 0x98, 0xD1, 0x00, 0x4B, 0x38, 0xD6, 0xC6, 0x4B, 0x7D, 0xFE, 0x4F, 0xEB, 0xDB, 0x09, 0x01, 0xEB, 0xD9, 0x09, 0x00, 0x8F, 0xCB, 0x00, 0x00, 0x8C, 0x11, 0x03, 0xC0, 0x33, 0x12, 0x00, 0x01, 0x12, 0x40, 0x00, 0x05, 0x00, 0xAB, 0x60, 0x20, 0x94, 0x0B, 0x03, 0xF6, 0x4B, 0x3D, 0xD6, 0x91, 0x01, 0x8B, 0x60, 0x22, 0x02, 0x2B, 0x88, 0x22, 0xC8, 0x38, 0x0A, 0x0E, 0x22, 0x52, 0x00, 0x01, 0x4B, 0x58, 0xC6, 0xD1, 0x4B, 0xDE, 0xDE, 0xC5, 0x4B, 0x3B, 0xC6, 0x51, 0x48, 0x13, 0xC8, 0x00, 0x4B, 0x18, 0xD6, 0x46, 0x4B, 0x3D, 0xDE, 0x8E, 0x0C, 0x00, 0x06, 0x75, 0x48, 0x14, 0xD1, 0x00, 0x35, 0x91, 0x00, 0x00, 0x48, 0x14, 0xC9, 0x00, 0x0C, 0x00, 0x06, 0x75, 0x48, 0x13, 0xD9, 0x00, 0x1F, 0x00, 0x00, 0x06, 0x00, 0x64, 0x18, 0x22, 0x8C, 0x0B, 0x03, 0xFC, 0x22, 0xF7, 0x00, 0x08, 0xAE, 0xEB, 0xFF, 0xF8, 0x08, 0x00, 0x06, 0xD0, 0xEA, 0xFD, 0x14, 0x7F, 0x34, 0xB1, 0x00, 0x00, 0x94, 0x13, 0x03, 0xE2, 0x37, 0x12, 0x00, 0x00, 0x0C, 0x00, 0x06, 0x75, 0x20, 0x14, 0x00, 0x00, 0x1C, 0x60, 0x00, 0x97, 0x00, 0xA6, 0x28, 0x20, 0x00, 0x03, 0x58, 0x22, 0x48, 0x8B, 0xD8, 0x00, 0x94, 0x0B, 0x03, 0xF4, 0x8C, 0x05, 0x03, 0xC0, 0x4B, 0x38, 0xDE, 0xC6, 0x4B, 0x7D, 0xFE, 0x4F, 0x00, 0xAB, 0x28, 0x20, 0xEB, 0xDB, 0x08, 0x01, 0x94, 0x0C, 0x04, 0x0C, 0xEB, 0xD9, 0x08, 0x00, 0x8F, 0xCB, 0x00, 0x00, 0x00, 0x6C, 0x18, 0x20, 0x08, 0x00, 0x07, 0x68, 0x00, 0xAB, 0x28, 0x20, 0x8F, 0x78, 0x04, 0xBC, 0x20, 0x1F, 0x16, 0xFC, 0x08, 0x00, 0x04, 0x55, 0x20, 0x14, 0x03, 0xB0, 0x0C, 0x00, 0x04, 0x55, 0x20, 0x13, 0x00, 0x17, 0x0C, 0x00, 0x07, 0xF6, 0x20, 0x14, 0x03, 0xC0, 0x20, 0x0C, 0x1B, 0x9C, 0x08, 0x00, 0x07, 0xED, 0x20, 0x0B, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0C, 0x16, 0x38, 0x08, 0x00, 0x07, 0xED, 0x20, 0x0B, 0x03, 0x14, 0xC8, 0x2D, 0x08, 0x0D, 0xC8, 0x31, 0x08, 0x0C, 0x4A, 0x12, 0x86, 0xC6, 0x4B, 0x3D, 0x76, 0xCE, 0x4B, 0x3D, 0x7E, 0xCF, 0x4B, 0x1F, 0x8E, 0xCD, 0x4B, 0x1F, 0x6A, 0x0C, 0x4B, 0xAA, 0x43, 0x51, 0x4B, 0xAA, 0x43, 0x90, 0x4B, 0x7D, 0x46, 0xE3, 0x4A, 0x0E, 0x42, 0x27, 0x4B, 0x7D, 0x6E, 0xE3, 0x4A, 0x08, 0x6A, 0x27, 0x4B, 0x22, 0x4A, 0xF3, 0x4B, 0x2C, 0x5A, 0x85, 0x4B, 0xDF, 0x52, 0x86, 0xE8, 0x2A, 0x10, 0x07, 0xE8, 0x28, 0x08, 0x1B, 0x8C, 0x18, 0x03, 0xC0, 0x4B, 0x3D, 0x56, 0xC6, 0x0C, 0x00, 0x04, 0x55, 0x4B, 0x2A, 0x40, 0x8E, 0xAC, 0x18, 0x03, 0xC0, 0x4B, 0x7D, 0xFB, 0x4F, 0xEB, 0xC2, 0x08, 0x01, 0xEB, 0xCD, 0x08, 0x00, 0x8F, 0xC5, 0x00, 0x00, 0x00, 0xB8, 0x28, 0x20, 0x4B, 0x2A, 0x3A, 0x05, 0x4B, 0x7D, 0xF8, 0x8E, 0xE8, 0x28, 0x08, 0x16, 0xE8, 0x28, 0x09, 0x18, 0xE8, 0x22, 0x08, 0x17, 0xE8, 0x22, 0x09, 0x19, 0x10, 0x40, 0x00, 0x03, 0x4B, 0x0C, 0x58, 0xA8, 0x4B, 0x7F, 0x16, 0xC6, 0x4B, 0x7F, 0x48, 0x8E, 0x94, 0x0B, 0x03, 0xF6, 0x94, 0x0C, 0x03, 0xE2, 0x3C, 0x02, 0xFD, 0x10, 0x00, 0x0B, 0x58, 0x42, 0x21, 0x6B, 0xFF, 0xFF, 0x00, 0x4B, 0x10, 0x25, 0xAC, 0x02, 0x03, 0xF8, 0x3C, 0x07, 0xF5, 0x10, 0x00, 0x0C, 0x62, 0x40, 0x00, 0xEC, 0x38, 0x25, 0xAC, 0x07, 0x03, 0xFC, 0xAE, 0xE7, 0x00, 0x00, 0xEA, 0xFD, 0x14, 0x01, 0xAE, 0xE7, 0x00, 0x08, 0x90, 0x0B, 0x03, 0xC6, 0x90, 0x0C, 0x03, 0xC7, 0x00, 0x0B, 0x59, 0x40, 0x00, 0x0C, 0x60, 0xC0, 0x01, 0x6C, 0x58, 0x25, 0xA2, 0xEB, 0x00, 0x09, 0x90, 0x0B, 0x03, 0xC9, 0x8C, 0x0C, 0x02, 0x64, 0x00, 0x0B, 0x5D, 0x00, 0x01, 0x6C, 0x58, 0x25, 0xAE, 0xEB, 0x00, 0x0C, 0xEA, 0xFD, 0x12, 0x04, 0xAE, 0xE0, 0x00, 0x14, 0x22, 0xF7, 0x00, 0x18, 0x94, 0x03, 0x03, 0xBA, 0x94, 0x0B, 0x04, 0x0E, 0x84, 0x04, 0x04, 0x00, 0x8C, 0x02, 0x03, 0xEC, 0x8C, 0x0F, 0x03, 0xE8, 0x94, 0x0E, 0x03, 0xDE, 0x00, 0x03, 0x18, 0x82, 0xA4, 0x03, 0x04, 0x0C, 0x00, 0x6B, 0x18, 0x22, 0x8C, 0x06, 0x04, 0x04, 0x94, 0x07, 0x03, 0xD8, 0x94, 0x08, 0x03, 0xDA, 0x94, 0x09, 0x03, 0xDC, 0x00, 0x07, 0x3B, 0x00, 0x00, 0x08, 0x43, 0x00, 0x00, 0x02, 0x6A, 0x82, 0x1D, 0xA0, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x18, 0x22, 0x1C, 0x60, 0x00, 0x33, 0x00, 0xA6, 0x28, 0x20, 0xC8, 0x27, 0x08, 0x0F, 0x00, 0x03, 0x58, 0x22, 0x48, 0x8B, 0x39, 0x00, 0x8C, 0x05, 0x03, 0xC0, 0x4B, 0x27, 0x39, 0xC6, 0x4B, 0x7D, 0xFA, 0x0F, 0xEB, 0xC7, 0x08, 0x01, 0xEB, 0xC8, 0x08, 0x00, 0x8F, 0xCB, 0x00, 0x00, 0x94, 0x0C, 0x03, 0xF4, 0x94, 0x1F, 0x04, 0x0C, 0x00, 0xAB, 0x28, 0x20, 0x00, 0xAC, 0x28, 0x20, 0x08, 0x00, 0x07, 0x78, 0x00, 0x7F, 0x18, 0x20, 0x01, 0xCD, 0x70, 0x22, 0x05, 0xC1, 0x00, 0x0F, 0x30, 0x42, 0x03, 0xFF, 0x48, 0x8E, 0xD8, 0x00, 0x4B, 0x1B, 0x21, 0xC6, 0x4B, 0x7D, 0xFA, 0x0F, 0x94, 0x0C, 0x04, 0x02, 0xEB, 0xC8, 0x0C, 0x00, 0xEB, 0xC7, 0x0C, 0x01, 0x8F, 0xCB, 0x00, 0x00, 0x20, 0x84, 0x00, 0x01, 0x00, 0x0B, 0x5A, 0x83, 0x00, 0x8B, 0x20, 0x20, 0x00, 0x8C, 0x58, 0x22, 0x05, 0x60, 0x00, 0x02, 0x01, 0xAE, 0x68, 0x20, 0x21, 0x84, 0x00, 0x00, 0x08, 0x00, 0x06, 0x88, 0x01, 0x2D, 0x50, 0x20, 0xEA, 0xFD, 0x04, 0x00, 0x00, 0x0A, 0x58, 0x80, 0x01, 0x68, 0x58, 0x25, 0xAE, 0xEB, 0x00, 0x08, 0xEA, 0xFD, 0x06, 0x88, 0x00, 0x09, 0x58, 0x80, 0x01, 0x67, 0x58, 0x25, 0xAE, 0xEB, 0x00, 0x0C, 0xEA, 0xE2, 0x08, 0x08, 0xEA, 0xE3, 0x08, 0x09, 0xEA, 0xE4, 0x08, 0x0A, 0xEA, 0xE4, 0x0C, 0x0B, 0x0C, 0x00, 0x05, 0x91, 0x26, 0xF7, 0x00, 0x18, 0x19, 0xC0, 0xFC, 0xF2, 0x21, 0x49, 0x00, 0x00, 0x00, 0x4F, 0x10, 0x20, 0x84, 0x04, 0x04, 0x02, 0x8C, 0x06, 0x04, 0x08, 0x08, 0x00, 0x07, 0x40, 0x4A, 0x03, 0x18, 0xEC, 0x00, 0x00, 0x00, 0x00}; - -u64 gJpegUCode[0x15E] = {0x8C3600048C370038, 0x8C38003C32D60001, 0x12C00009C8022002, 0x8C0301E08C1901E4, 0x8C1A01E88C0901EC, 0x8C0A01F08C0B01F4, 0x0900044D8C0C01F8, 0x8C3D00348C3B0030, 0x201C01E00D0006C2, 0x23BDFFFF0D0006D6, 0x201D007F8C1B01EC, 0x0D0006C2201C0060, 0x0D0006D68C1B01F0, 0x0D0006C2201C00E0, 0x0D0006D68C1B01F4, 0x0D0006C2201C0160, 0x0D0006D68C0901E8, 0x8C1901E01D200005, 0x8C0301E4200A01FF, 0x200B00FF0900044C, 0x200C0200200A02FF, 0x200B01FF200C0300, 0x032CD022233B0000, 0x201C01E00D0006C2, 0x000AE82000031020, 0xC80320034A00002C, 0x0D0006D6032CC820, 0x10430004201B0BE0, 0x235C00000D0006CC, 0x000BE8202063FFFF, 0x200401E0200504E0, 0x2007000321280002, 0x20060060C8012000, 0xC8902000C8912001, 0xC8922002C8932003, 0xC8942004C8952005, 0xC8962006C8972007, 0x20840080C8C52000, 0xC8C62001C8C72002, 0xC8C82003C8C92004, 0xC8CA2005C8CB2006, 0xC8CC200720E7FFFF, 0xE8B820004A058407, 0xE8B920014A068C47, 0xE8BA20024A079487, 0xE8BB20034A089CC7, 0xE8BC20044A09A507, 0xE8BD20054A0AAD47, 0xE8BE20064A0BB587, 0xE8BF20074A0CBDC7, 0x4B0186064B018E46, 0xC89020004B019686, 0xC89120014B019EC6, 0xC89220024B01A706, 0xC89320034B01AF46, 0xC89420044B01B786, 0xC89520054B01BFC6, 0xC8962006C8972007, 0x208400802108FFFF, 0x1D00FFDD20A50080, 0x200800011CE0FFD1, 0x20C60080E8B82000, 0xE8B92001E8BA2002, 0xE8BB2003E8BC2004, 0xE8BD2005E8BE2006, 0xE8BF200721270004, 0x2004056020050860, 0x20E7FFFFC8982000, 0xC8992001C89A2002, 0xC89B2003C89C2004, 0xC89D2005C89E2006, 0xC89F2007E8B80800, 0xE8B80908E8B80A01, 0xE8B80B02E8B80C09, 0xE8B80D10E8B80E18, 0xE8B80F11E8B9080A, 0xE8B90903E8B90A04, 0xE8B90B0BE8B90C12, 0xE8B90D19E8B90E20, 0xE8B90F28E8BA0821, 0xE8BA091AE8BA0A13, 0xE8BA0B0CE8BA0C05, 0xE8BA0D06E8BA0E0D, 0xE8BA0F14E8BB081B, 0xE8BB0922E8BB0A29, 0xE8BB0B30E8BB0C38, 0xE8BB0D31E8BB0E2A, 0xE8BB0F23E8BC081C, 0xE8BC0915E8BC0A0E, 0xE8BC0B07E8BC0C0F, 0xE8BC0D16E8BC0E1D, 0xE8BC0F24E8BD082B, 0xE8BD0932E8BD0A39, 0xE8BD0B3AE8BD0C33, 0xE8BD0D2CE8BD0E25, 0xE8BD0F1EE8BE0817, 0xE8BE091FE8BE0A26, 0xE8BE0B2DE8BE0C34, 0xE8BE0D3BE8BE0E3C, 0xE8BE0F35E8BF082E, 0xE8BF0927E8BF0A2F, 0xE8BF0B36E8BF0C3D, 0xE8BF0D3EE8BF0E37, 0xE8BF0F3F20840080, 0x1CE0FFB520A50080, 0x0D0006D6034CD020, 0x10600004233B0000, 0x201C01E00D0006C2, 0x000AE82021270004, 0x20040860200504E0, 0x20150DE0C8932003, 0xC8952005C8972007, 0xC8912001C8902000, 0xC8942004C8962006, 0xC892200220840080, 0x20E7FFFF4B429A80, 0x4B82AA884B02BAC0, 0xE8B820004BA28AC8, 0xE8BF20074B028A00, 0xE8BB20034B22BA08, 0xE8BC20044B42AA40, 0xE8B920014B629A48, 0xE8BE20064B038180, 0xE8BA20024B23A188, 0xE8BD20054A0A5951, 0x4A0941114A094310, 0x4A0A5BD04B032B40, 0x4B2323484B032B80, 0x4B0323884B038100, 0x4B03A1084B43B140, 0x4B8391484B4391C0, 0x4B63B1C800000000, 0x4A0522104A0522D1, 0x4A0732504A073291, 0x4A0F44104A0F45D1, 0x4A0C5CD04A0C5D11, 0x4A0E4C504A0E4D91, 0x4A0D54904A0D5551, 0xEAB05800EAB05901, 0xEAB05A02EAB05B03, 0xEAB05C04EAB05D05, 0xEAB05E06EAB05F07, 0xCAB85800CAB85F01, 0xCAB85E02CAB85D03, 0xCAB85C04CAB85B05, 0xCAB85A06CAB85907, 0x4B42DA804B82EA88, 0x4B02FAC04BA2CAC8, 0x4B02CA004B22FA08, 0x4B42EA404B62DA48, 0x4B03C1804B23E188, 0x4A0A59514A094111, 0x4A0943104A0A5BD0, 0x4B032B404B232348, 0x4B032B80C8932003, 0x4B032388C8952005, 0x4B03C100C8972007, 0x4B03E108C8912001, 0x4B43F140C8902000, 0x4B83D148C8942004, 0x4B43D1C0C8962006, 0x4B63F1C8C8922002, 0x000000004A052210, 0x4A0522D14A073250, 0x4A0732914B214600, 0x4B217E084B417FC8, 0x4B215EC04B2166C8, 0x4B4167084B214E40, 0x4B2176484B417788, 0x4B2156804B216E88, 0x4B416F4820840080, 0x1CE0FF8F20A50080, 0xE8B82000E8BF2007, 0xE8BB2003E8BC2004, 0xE8B92001E8BE2006, 0xE8BA2002E8BD2005, 0x1D20007800000000, 0x200405604A139CEC, 0x209401004A14A52C, 0x20050BC04A15AD6C, 0xCA8720004A16B5AC, 0xC8131003C8141203, 0xC8151403C8161603, 0x200700084B079E07, 0xCA8820084B27A60F, 0xC80120004B47AE0F, 0xC80420014B67B60F, 0x4B879DC74BA7A5CF, 0x4BC7ADCF4BE7B5CF, 0x4B089E87C8862000, 0x4B28A68FC8852008, 0x4B48AE8F4B68B68F, 0x4B889E474BA8A64F, 0x4BC8AE4F20840010, 0x4BE8B64F22940010, 0x4BE43290E8BC2000, 0x4BE42A50E8BB2001, 0x4B04D3C520A50020, 0x4B04CC054B24C445, 0x4B24BC854B44D2C5, 0x4B44CB054B64C345, 0x4B64BB854A1A7BD0, 0x4A1984104A0B8C50, 0x4A0C94904A186B50, 0x4A1773904A0A7BD0, 0x4A0984104A115451, 0x4A124C914A0A6B50, 0x4A0973904A007BE3, 0xC88620004A008423, 0xC88520084A008C63, 0xCA8720004A0094A3, 0xCA8820084A006B63, 0x4A0073A34B847BE0, 0x4B8484204B848C60, 0x4B8494A04B846B60, 0x4B8473A04BC47BC5, 0x4BC484054BC48C45, 0x4BC494854BC46B45, 0x4BC473854B617BC6, 0x4B6184064B818C47, 0x4B8194874BA16B47, 0x4BA173874B079E07, 0x4B27A60F4B47AE0F, 0x4B67B60F4A117BEA, 0x4A12842A4B879DC7, 0x4BA7A5CF4BC7ADCF, 0x4BE7B5CF4A0D7F2A, 0x4A0E86EA4B089E87, 0x20E7FFFF4B28A68F, 0x208400104B48AE8F, 0x229400104B68B68F, 0x4BC1E72A4BC1DEEA, 0x4B889E474BA8A64F, 0x4BC8AE4F1CE0FFB2, 0x4BE8B64FE8BC2000, 0xE8BB2001090006A0, 0x0000000020040560, 0x4A094A6C20940200, 0x4A0A52AC20050BC0, 0x4A0B5AEC20070002, 0x4A0C632C20080004, 0xCA882008CA872000, 0xC8091003C80A1203, 0xC80B1403C80C1603, 0xC8012000C8042001, 0x229400104B084C07, 0x2108FFFF4B28540F, 0xC88620004B485C0F, 0xC88520084B68640F, 0x208400104A1AC62A, 0x4A19BDEA4B884BC7, 0x4BA853CF4BC85BCF, 0x4BE863CF4BE43490, 0x4BE42C504B074B87, 0x4B27538F4B475B8F, 0x4B67638F4A1CC7AA, 0x4A1BBF6A4B874B47, 0x4BA7534F4BC75B4F, 0x4BE7634F4BC1F7AA, 0x4BC1EF6A4B048605, 0x4B047DC54B247685, 0x4B246E454B448545, 0x4B447D854B647705, 0x4B646EC54A10C610, 0x4A0FBDD04A15D690, 0xE8BE20004A16CE50, 0xE8BD20014A0EE710, 0x20A500204A0DDED0, 0x4A12C6104A11BDD0, 0x4A1A96914A198E51, 0x4A12E7104A11DED0, 0x4A00C6234A00BDE3, 0x4A00D6A34A00CE63, 0x4A00E7234A00DEE3, 0x4B84C6204B84BDE0, 0x4B84D6A04B84CE60, 0x4B84E7204B84DEE0, 0x4BC4C605C8862000, 0x4BC4BDC5C8852008, 0x4BC4D68520840010, 0x4BC4CE454BC4E705, 0x4BC4DEC54B61C606, 0x4B61BDC64B81D687, 0x4B81CE474BA1E707, 0x4BA1DEC74BE43490, 0x4BE42C504A1AC62A, 0x4A19BDEA4B048505, 0x4B047CC54A1CC7AA, 0x4A1BBF6A4B247685, 0x4B246E454B448545, 0x4BC1F7AA4BC1EF6A, 0x4B447D854B647705, 0x4B646EC54A10A610, 0x4A0F9DD04A15D690, 0xE8BE20004A16CE50, 0xE8BD20014A0EE710, 0x20A500204A0DDED0, 0x4A12C6104A11BDD0, 0x4A1A96914A198E51, 0x4A12E7104A11DED0, 0x4A00C6234A00BDE3, 0x4A00D6A34A00CE63, 0x4A00E7234A00DEE3, 0x4B84C6204B84BDE0, 0x4B84D6A04B84CE60, 0x4B84E7204B84DEE0, 0x4BC4C605CA872000, 0x4BC4BDC5CA882008, 0x4BC4D68522940010, 0x4BC4CE454BC4E705, 0x4BC4DEC54B61C606, 0x4B61BDC64B81D687, 0x4B81CE474BA1E707, 0x1D00FF784BA1DEC7, 0x20E7FFFF20080004, 0x1CE0FF7420840080, 0x4A1AC62A4A19BDEA, 0x4A1CC7AA4A1BBF6A, 0x4BC1F7AA4BC1EF6A, 0xE8BE2000E8BD2001, 0x0D0006D600000000, 0x4016200010600013, 0x032CC82032D60080, 0x12C0FDAF00000000, 0x032CC822AC0301E0, 0xAC1901E4AC1A01E8, 0xAC0901ECAC0A01F0, 0xAC0B01F4AC0C01F8, 0x201B000022FC0000, 0x0D0006CC231DFFFF, 0x341510000D0006D6, 0x40952000201B0BE0, 0x235C00000D0006CC, 0x000BE8200D0006D6, 0x2015400040952000, 0x0000000D00000000, 0x090006C000000000, 0x401E380017C0FFFF, 0x401E3800401E2800, 0x17C0FFFF401E2800, 0x409C0000409B0800, 0x03E00008409D1000, 0x401E380017C0FFFF, 0x401E3800401E2800, 0x17C0FFFF401E2800, 0x409B0000409C0800, 0x03E00008409D1800, 0x401E300017C0FFFF, 0x401E300003E00008, 0x4080380000000000}; - +#include "assets/rsp.h" diff --git a/src/port/rsp_boot.c b/src/port/rsp_boot.c index 3a1ef718d..54ff0a31f 100644 --- a/src/port/rsp_boot.c +++ b/src/port/rsp_boot.c @@ -1,6 +1 @@ -#include "global.h" - -u8 D_80009320[0xD0] = {0x09, 0x00, 0x04, 0x19, 0x20, 0x01, 0x0F, 0xC0, 0x8C, 0x22, 0x00, 0x10, 0x20, 0x03, 0x0F, 0x7F, 0x20, 0x07, 0x10, 0x80, 0x40, 0x87, 0x00, 0x00, 0x40, 0x82, 0x08, 0x00, 0x40, 0x83, 0x10, 0x00, 0x40, 0x04, 0x30, 0x00, 0x14, 0x80, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x04, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x08, 0x40, 0x80, 0x38, 0x00, 0x40, 0x08, 0x20, 0x00, 0x31, 0x08, 0x00, 0x80, 0x15, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x08, 0x40, 0x80, 0x38, 0x00, 0x34, 0x08, 0x52, 0x00, 0x40, 0x88, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x22, 0x00, 0x04, 0x30, 0x42, 0x00, 0x02, 0x10, 0x40, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x04, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x58, 0x00, 0x30, 0x42, 0x01, 0x00, 0x1C, 0x40, 0xFF, 0xED, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x22, 0x00, 0x18, 0x8C, 0x23, 0x00, 0x1C, 0x20, 0x63, 0xFF, 0xFF, 0x40, 0x1E, 0x28, 0x00, 0x17, 0xC0, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x40, 0x82, 0x08, 0x00, 0x40, 0x83, 0x10, 0x00, 0x40, 0x04, 0x30, 0x00, 0x14, 0x80, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x04, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -u8 D_800093F0[0x20] = {0xE8, 0x0C, 0x20, 0x01, 0x34, 0x01, 0x40, 0x00, 0x40, 0x81, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - +#include "assets/rsp_boot.h" diff --git a/src/port/ultra_reimplementation.cpp b/src/port/ultra_reimplementation.cpp index 4199cd990..0bd57c4c8 100644 --- a/src/port/ultra_reimplementation.cpp +++ b/src/port/ultra_reimplementation.cpp @@ -47,6 +47,13 @@ typedef s32 OSPri; #define OS_CLOCK_RATE 62500000LL u64 osClockRate = OS_CLOCK_RATE; +extern "C" +{ + u32 osGetCount(void); + s32 osAiSetNextBuffer(void* buf, u32 size); + s32 osAiSetFrequency(u32 frequency); +} + s32 osPiStartDma(struct OSIoMesg* mb, UNUSED s32 priority, UNUSED s32 direction, uintptr_t devAddr, void* vAddr, size_t nbytes, struct OSMesgQueue* mq) { memcpy(vAddr, (const void*)devAddr, nbytes); @@ -98,30 +105,6 @@ u32 osGetCount(void) return counter++; } -s32 osAiSetFrequency(u32 freq) -{ - u32 a1; - s32 a2; - u32 D_8033491C; - - D_8033491C = 0x02E6D354; - - a1 = D_8033491C / (float)freq + .5f; - - if(a1 < 0x84) - { - return -1; - } - - a2 = (a1 / 66) & 0xff; - if(a2 > 16) - { - a2 = 16; - } - - return D_8033491C / (s32)a1; -} - s32 osEepromProbe(UNUSED OSMesgQueue* mq) { return 1; @@ -426,4 +409,69 @@ extern "C" { return 0; } -} \ No newline at end of file +} + +#include "ultra64/rcp.h" + +void* gAudioBuffer = nullptr; +u32 gAudioBufferSize = 0; + +s32 osAiSetNextBuffer(void* buf, u32 size) +{ + static u8 D_80130500 = false; + uintptr_t bufAdjusted = (uintptr_t)buf; + s32 status; + + if(D_80130500) + { + bufAdjusted = (uintptr_t)buf - 0x2000; + } + if((((uintptr_t)buf + size) & 0x1FFF) == 0) + { + D_80130500 = true; + } + else + { + D_80130500 = false; + } + + // Originally a call to __osAiDeviceBusy + /*status = HW_REG(AI_STATUS_REG, s32); + if(status & AI_STATUS_AI_FULL) + { + return -1; + }*/ + + // OS_K0_TO_PHYSICAL replaces osVirtualToPhysical, this replacement + // assumes that only KSEG0 addresses are given + //HW_REG(AI_DRAM_ADDR_REG, uintptr_t) = bufAdjusted; + //HW_REG(AI_LEN_REG, u32) = size; + gAudioBuffer = (void*)bufAdjusted; + gAudioBufferSize = size; + return 0; +} + +extern "C" s32 osViClock; + +s32 osAiSetFrequency(u32 frequency) +{ + u8 bitrate; + f32 dacRateF = ((f32)osViClock / frequency) + 0.5f; + u32 dacRate = dacRateF; + + if(dacRate < 132) + { + return -1; + } + + bitrate = (dacRate / 66); + + if(bitrate > 16) + { + bitrate = 16; + } + + //HW_REG(AI_DACRATE_REG, u32) = dacRate - 1; + //HW_REG(AI_BITRATE_REG, u32) = bitrate - 1; + return osViClock / (s32)dacRate; +} diff --git a/tools/create_luts.py b/tools/create_luts.py index 420eccac8..e39275f15 100644 --- a/tools/create_luts.py +++ b/tools/create_luts.py @@ -4,6 +4,8 @@ import os.path from pathlib import Path import sys +basedir = os.path.abspath(os.path.join(os.path.dirname(os.path.realpath(__file__.replace('\\', '/'))), '../')) + magic = '// GENERATED' includeHeader = '#include "asset_common.h"' removeHeaders = ['#include "z64animation.h"', '#include "z64bgcheck.h"', '#include "asset_common.h"'] @@ -70,7 +72,13 @@ for path in files: if '/text/' in x: continue + + if '/audio/' in x: + continue + if len(x.split('/')) <= 2: # skip root assets directory files + continue + if '/overlays/' in x: skip = True diff --git a/tools/extract_missing_assets.py b/tools/extract_missing_assets.py index 7a5f43507..1fac691ee 100644 --- a/tools/extract_missing_assets.py +++ b/tools/extract_missing_assets.py @@ -5,7 +5,12 @@ from pathlib import Path basedir = os.path.abspath(os.path.join(os.path.dirname(os.path.realpath(__file__.replace('\\', '/'))), '../')) -segments = {'src/code/z_vr_box_assets.h': [ +try: + os.makedirs(os.path.join(basedir, 'assets/audio/')) +except: + pass + +segments = {'assets/z_vr_box_assets.h': [ 'vr_SP1a_static', 'vr_SP1a_pal_static', 'vr_cloud2_static', @@ -57,7 +62,7 @@ segments = {'src/code/z_vr_box_assets.h': [ 'vr_KR3VR_static', 'vr_KR3VR_pal_static' ], -'src/code/z_scene_table_assets.h': [ +'assets/z_scene_table_assets.h': [ 'g_pn_01', 'g_pn_02', 'g_pn_03', @@ -116,13 +121,13 @@ segments = {'src/code/z_vr_box_assets.h': [ 'g_pn_56', 'g_pn_57' ], -'src/code/z_message_PAL_assets.h': [ +'assets/z_message_PAL_assets.h': [ 'nes_message_data_static', 'ger_message_data_static', 'fra_message_data_static', 'staff_message_data_static' ], -'src/code/z_kankyo_assets.h': [ +'assets/z_kankyo_assets.h': [ 'vr_fine0_static', 'vr_fine0_pal_static', 'vr_fine1_static', @@ -141,7 +146,7 @@ segments = {'src/code/z_vr_box_assets.h': [ 'vr_cloud3_pal_static', 'vr_holy0_static', 'vr_holy0_pal_static'], -'src/code/z_scene_assets.h': [ +'assets/z_scene_assets.h': [ 'elf_message_field', 'elf_message_ydan', 'gameplay_keep', @@ -523,7 +528,10 @@ segments = {'src/code/z_vr_box_assets.h': [ 'object_door_killer', 'object_ouke_haka', 'object_timeblock', -'object_zl4'] +'object_zl4'], +'assets/audio/bank.h': ['Audiobank_le'], +'assets/audio/seq.h': ['Audioseq'], +'assets/audio/table.h': ['Audiotable'] } def writeFile(path, buffer): @@ -586,6 +594,30 @@ def serializeU16(name, doswap = True): lst.append(('0x%%%d.%dX' % (n * 2, n * 2)) % b) return 'static const u16 %s[0x%X] = { %s };\n' % (name, len(buffer) // n, ', '.join(lst)) + +def serializeU32(name, doswap = True): + path = os.path.join('baserom', name) + path = os.path.abspath(os.path.join(basedir, path)) + lst = [] + + with open(path, 'rb') as f: + buffer = f.read() + n = 4 + a = [buffer[i:i+n] for i in range(0, len(buffer), n)] + + + if doswap: + for i in range(0, len(a), 4): + swap = a[i] + a[i] = a[i+1] + a[i+1] = swap + + + for b in a: + b = int.from_bytes(b, byteorder='big') + lst.append(('0x%%%d.%dX' % (n * 2, n * 2)) % b) + + return 'static const u32 %s[0x%X] = { %s };\n' % (name, len(buffer) // n, ', '.join(lst)) for output, files in segments.items(): diff --git a/tools/extract_z64_variables.py b/tools/extract_z64_variables.py new file mode 100644 index 000000000..64bcf5ed2 --- /dev/null +++ b/tools/extract_z64_variables.py @@ -0,0 +1,453 @@ +import struct +import json + +def reverse(s): + return s[::-1] + return int.from_bytes(s, byteorder='big').to_bytes(len(s), 'little') + +def readConvert(f, size, swap = True): + pos = f.tell() + r = f.read(size) + + if len(r) != size: + raise IOError('failed to read %d bytes, got %d' % (size, len(r))) + + return r + +def readS8(f, swap = True): + return int.from_bytes(readConvert(f, 1, swap), byteorder='big', signed=True) + +def readU8(f, swap = True): + return int.from_bytes(readConvert(f, 1, swap), byteorder='big', signed=False) + +def readS16(f, swap = True): + return int.from_bytes(readConvert(f, 2, swap), byteorder='big', signed=True) + +def readU32(f, swap = True): + return int.from_bytes(readConvert(f, 4, swap), byteorder='big', signed=False) + +def readS32(f, swap = True): + return int.from_bytes(readConvert(f, 4, swap), byteorder='big', signed=True) + +def readFloat(f, swap = True): + b = readConvert(f, 4, swap) + return float(struct.unpack('>f', b)[0]) + + +class ConvFile: + def __init__(self, path, mode): + self.path = path + self.i = open(path, 'rb') + self.o = open(path + '_le', 'wb') + if True: + self.seek(0) + buffer = self.i.read() + self.o.write(buffer) + else: + self.seek(0) + buffer = self.i.read() + self.o.write(b'\xFF' * len(buffer)) + self.seek(0) + + self.writes = {} + + def __enter__(self): + return self + + def __exit__(self, type, value, tb): + self.close() + + def seek(self, offset): + self.i.seek(offset) + self.o.seek(offset) + self.pos = offset + + def tell(self): + return self.i.tell() + + def close(self): + f = self.o + self.i.close() + self.o.close() + + def read(self, n, swap = True): + if n == 0: + raise IOError('null read') + pos = self.i.tell() + self.seek(pos) + + r = self.i.read(n) + + if len(r) != n: + raise IOError('incomplete read: %d, expected %d' % (len(r), n)) + + if swap: + self.write2(reverse(r), n) + else: + self.write2(r, n) + self.o.flush() + return r + + def write2(self, data, n): + f = self.o + f.seek(self.pos) + f.write(data) + #self.writes[self.pos] = data + self.pos += len(data) + + #def write(self, data): + # self.o.write(data) + # self.i.seek(self.o.tell()) + # return len(data) + + +class Section: + def __init__(self, name, offset, sz, elementSize = 8): + self.name = name + self.offset = offset + self.sz = sz + self.elementSize = elementSize + + def serialize(self, f, z64): + z64.seek(self.offset) + + if self.getSize() == self.getElementSize(): + f.write('u%d %s = ' % (self.getElementSize() * 8, self.name)) + buffer = z64.read(self.getElementSize()) + n = int.from_bytes(buffer, "big") + f.write(('0x%%%d.%dX' % (self.getElementSize() * 2, self.getElementSize() * 2)) % (n)) + f.write(';\n\n') + return + + f.write('u%d %s[0x%X] = {' % (self.getElementSize() * 8, self.name, self.getSize())) + + lst = [] + while z64.tell() < self.offset + self.sz: + buffer = z64.read(self.getElementSize()) + n = int.from_bytes(buffer, "big") + lst.append(('0x%%%d.%dX' % (self.getElementSize() * 2, self.getElementSize() * 2)) % (n)) + + f.write(', '.join(lst)) + + f.write('};\n\n') + + def getSize(self): + return int(self.sz / self.getElementSize()) + + def getElementSize(self): + return self.elementSize + + def includes(self): + return [] + +class Reloc: + def __init__(self, address, size, medium, cachePolicy, shortData1, shortData2, shortData3, dataFile, f): + self.address = address + self.size = size + self.medium = medium + self.cachePolicy = cachePolicy + self.shortData1 = shortData1 + self.shortData2 = shortData2 + self.shortData3 = shortData3 + + self.dataFile = dataFile + self.f = f + + def getDef(self): + return ''; + +def OFFSET(o): + if o > 0x2BDC0: + raise IOError('bad offset: %8.8X' % o) + return o + +class AdpcmLoop: + def __init__(self, f, parent): + self.start = readU32(f) + self.end = readU32(f) + self.count = readU32(f) + self.unk_0C = f.read(4, swap = False) + + self.states = [] + + if self.count > 0: + for i in range(16): + self.states.append(readS16(f)) + +class AdpcmBook: + def __init__(self, f, parent): + self.order = readS32(f) + self.npredictors = readS32(f) + print('order = %d, npred = %d, offset = %8.8X' % (self.order, self.npredictors, f.tell())) + + self.books = [] # TODO LOOP THROUGH: size 8 * order * npredictors. 8-byte aligned + for i in range(self.order * self.npredictors * 8): + self.books.append(readS16(f)) + +def RSHIFT(n, offset, length): + return (n >> offset) & ((0x01 << length) - 1) + +class SoundFontSample: + def __init__(self, f, parent): + self.flags = readU32(f) + self.sampleOffset = readU32(f) + self.loopOffset = readU32(f) + self.bookOffset = readU32(f) + + pos = f.tell() + + + + self.codec = RSHIFT(self.flags, 0, 4) + self.medium = RSHIFT(self.flags, 4, 2) + self.unk_bit26 = RSHIFT(self.flags, 6, 1) + self.unk_bit25 = RSHIFT(self.flags, 7, 1) + self.size = RSHIFT(self.flags, 8, 24) + print('sample flags: %8.8X, size = %d, codec = %d, medium = %d, unk_bit26 = %d, unk_bit25 = %d, sampleOffset = %8.8X' % (self.flags, self.size, self.codec, self.medium, self.unk_bit26, self.unk_bit25, self.sampleOffset)) + + #print('sample flags: %8.8X, size = %d' % (self.flags, RSHIFT(self.flags, 8, 24))) + #exit(0) + #if OFFSET(self.sampleOffset) > 0: + # pass + #print('sample flags: %8.8X' % self.flags) + #exit(0) + #f.seek(self.sampleOffset + parent.address) + + + if OFFSET(self.loopOffset) > 0: + f.seek(self.loopOffset + parent.address) + self.loop = AdpcmLoop(f, parent) + + if OFFSET(self.bookOffset) > 0: + f.seek(self.bookOffset + parent.address) + self.book = AdpcmBook(f, parent) + + f.seek(pos) + +class SoundFontSound: + def __init__(self, f, parent): + + self.sampleOffset = readU32(f) + self.tuning = readFloat(f) + + pos = f.tell() + + if OFFSET(self.sampleOffset) > 0: + f.seek(self.sampleOffset + parent.address) + self.sample = SoundFontSample(f, parent) + + f.seek(pos) + + print('SoundFontSound: %8.8X, tuning: %f' % (self.sampleOffset, self.tuning)) + +class Drum: + def __init__(self, f, parent): + self.releaseRate = readU8(f) + self.pan = readU8(f) + self.loaded = readU8(f) + + readU8(f) # padding + + self.soundFontSound = SoundFontSound(f, parent) + + self.envelopeOffset = readU32(f) + + pos = f.tell() + + if OFFSET(self.envelopeOffset) > 0: + f.seek(self.envelopeOffset + parent.address) + self.adsrEnvelope = AdsrEnvelope(f) + + f.seek(pos) + + print('Drum: releaseRate: %d, pan: %d, envelopeOffset: %8.8X' % (self.releaseRate, self.pan, self.envelopeOffset)) + +class AdsrEnvelope: + def __init__(self, f): + self.delay = readS16(f) + self.arg = readS16(f) + +class Instrument: + def __init__(self, f, parent): + self.loaded = readU8(f) + self.normalRangeLo = readU8(f) + self.normalRangeHi = readU8(f) + self.releaseRate = readU8(f) + + self.envelopeOffset = readU32(f) + self.lowNotesSound = SoundFontSound(f, parent) + self.normalNotesSound = SoundFontSound(f, parent) + self.highNotesSound = SoundFontSound(f, parent) + + pos = f.tell() + + if OFFSET(self.envelopeOffset) > 0: + f.seek(self.envelopeOffset + parent.address) + self.adsrEnvelope = AdsrEnvelope(f) + + f.seek(pos) + + print('Instrument: normalRangeLo: %d, normalRangeHi: %d, releaseRate: %d, envelopeOffset = %8.8X (%8.8X)' % (self.normalRangeLo, self.normalRangeHi, self.releaseRate, self.envelopeOffset, parent.address)) + + + +class FontReloc(Reloc): + def __init__(self, address, size, medium, cachePolicy, shortData1, shortData2, shortData3, dataFile, f): + super(FontReloc, self).__init__(address, size, medium, cachePolicy, shortData1, shortData2, shortData3, dataFile, f) + + self.sampleBankId1 = (shortData1 >> 8) & 0xFF + self.sampleBankId2 = (shortData1) & 0xFF + self.numInstruments = (shortData2 >> 8) & 0xFF + self.numDrums = shortData2 & 0xFF + self.numSfx = shortData3 + + f.seek(address) + self.offsets = [] + self.offsets.append(readU32(f)) # drums + self.offsets.append(readU32(f)) # SoundFontSound + + for i in range(2, self.numInstruments + 2): # instruments + self.offsets.append(readU32(f)) + + print('bankId1 = %d, bankId2 = %d, numInstruments = %d, numDrums = %d, , numSfx = %d' % (self.sampleBankId1, self.sampleBankId2, self.numInstruments, self.numDrums, self.numSfx)) + + def getName(self): + return 'font_%X' % self.address + + def getDef(self): + buf = 'FontReloc %s = {' % self.getName() + r = [] + for offset in self.offsets: + r.append('0x%8.8X' % offset) + + buf += ', '.join(r) + ' }; // data starts at 0x%8.8X\n' % (len(self.offsets) * 4) + + drums = [] + sfxs = [] + instruments = [] + + f = self.f + + if self.offsets[0] > 0: + for i in range(self.numDrums): + f.seek(self.offsets[0] + self.address + (i * 4)) + p = readS32(f) + + if p > 0: + f.seek(p + self.address) + drums.append(Drum(f, self)) + + if self.offsets[1] > 0: + f.seek(self.offsets[1] + self.address) + for i in range(self.numSfx): + sfxs.append(SoundFontSound(f, self)) + + for i in range(2, self.numInstruments + 2): + if self.offsets[i] > 0: + f.seek(self.offsets[i] + self.address) + instruments.append(Instrument(f, self)) + + return buf + + + +class Table(Section): + def __init__(self, name, offset, sz, dataFile): + super(Table, self).__init__(name, offset, sz, 1) + + self.dataFile = dataFile + + + def serialize(self, f, z64): + z64.seek(self.offset) + + numEntries = readS16(z64, swap = False) + unkMediumParam = readS16(z64, swap = False) + address = readU32(z64, swap = False) + + z64.read(8) # padding + + + lst = [] + relocs = [] + + with ConvFile(self.dataFile, 'rb') as x: + while z64.tell() < self.offset + self.sz: + address = readU32(z64, swap = False) + size = readU32(z64, swap = False) + medium = readS8(z64, swap = False) + cachePolicy = readS8(z64, swap = False) + shortData1 = readS16(z64, swap = False) + shortData2 = readS16(z64, swap = False) + shortData3 = readS16(z64, swap = False) + + reloc = self.getReloc(address, size, medium, cachePolicy, shortData1, shortData2, shortData3, f = x) + reloc.getDef() # reverses endian + relocs.append(reloc) + lst.append('{ .romAddr = 0x%8.8X, .size = 0x%8.8X, .medium = 0x%2.2X, .cachePolicy = %d, .shortData1 = 0x%4.4X, .shortData2 = 0x%4.4X, .shortData3 = 0x%4.4X }' % (address, size, medium, cachePolicy, shortData1, shortData2, shortData3)) + + f.write('AudioTableDef %s = {\n.numEntries = 0x%4.4X, .unkMediumParam = 0x%4.4X, .romAddr = 0x%8.8X, {0}, {\n' % (self.name, numEntries, unkMediumParam, address)) + + f.write(',\n'.join(lst)) + + f.write('\n}};\n\n') + + def getReloc(self, address, size, medium, cachePolicy, shortData1, shortData2, shortData3, f): + return Reloc(address, size, medium, cachePolicy, shortData1, shortData2, shortData3, self.dataFile, f = f) + + + def includes(self): + return ['z64audio.h'] + +class FontTable(Table): + def __init__(self, name, offset, sz, dataFile): + super(FontTable, self).__init__(name, offset, sz, dataFile) + + def getReloc(self, address, size, medium, cachePolicy, shortData1, shortData2, shortData3, f): + return FontReloc(address, size, medium, cachePolicy, shortData1, shortData2, shortData3, self.dataFile, f = f) + +sections = {'assets/rsp.h': [ + FontTable('gSoundFontTable', 0xBCC270, 0x270, 'baserom/Audiobank'), + Section('gSequenceFontTable', 0xBCC4E0, 0x1C0, 2), + Table('gSequenceTable', 0xBCC6A0, 0x6F0, 'baserom/Audioseq'), + Table('gSampleBankTable', 0xBCCD90, 0x80, 'baserom/Audiotable'), + Section('rspAspMainDataStart', 0xBCCE10, 0x2E0), + Section('D_80155F50', 0xBCD0F0, 0x1630, 1), + Section('D_80157580', 0xBCE720, 0x420, 1), + Section('D_801579A0', 0xBCEB40, 0x390, 1), + Section('gJpegUCodeData', 0xBCEED0, 0x60), + Section('D_801120C0', 0xB89260, 0xFB0, 8), + Section('D_80113070', 0xB8A210, 0x18C0, 1), + Section('gJpegUCode', 0xB8BAD0, 0xAF0, 8) + ], + 'assets/rsp_boot.h': [ + Section('D_80009320', 0x9F20, 0xD0, 1), + Section('D_800093F0', 0x9FF0, 0x20, 1) + ], + 'assets/code_800F9280.h': [ + Section('sSeqCmdWrPos', 0xBAA5A0, 0x4, 1), + Section('sSeqCmdRdPos', 0xBAA5A4, 0x4, 1), + Section('D_80133408', 0xBAA5A8, 0x1, 1), + Section('D_8013340C', 0xBAA5AC, 0x1, 1), + Section('D_80133410', 0xBAA5B0, 0x4, 1), + Section('gAudioSpecId', 0xBAA5B4, 0x1, 1), + Section('D_80133418', 0xBAA5B8, 0x1, 1), + ] +} + +with open('baserom.z64', 'rb') as z64: + for filename, s in sections.items(): + with open(filename, 'w') as f: + f.write('#include "global.h"\n') + includes = {} + for section in s: + for i in section.includes(): + includes[i] = i + + for i in includes.keys(): + f.write('#include "%s"\n' % i) + + f.write('\n') + + for section in s: + section.serialize(f, z64) \ No newline at end of file