diff --git a/Application.rsf b/Application.rsf deleted file mode 100644 index 40c230e..0000000 --- a/Application.rsf +++ /dev/null @@ -1,89 +0,0 @@ -# Default value for application -BasicInfo: - Title : "Homebrew" - CompanyCode : "00" - MediaSize : 128MB # 128MB / 256MB / 512MB / 1GB / 2GB - MediaFootPadding: false - ProductCode : "CTR-P-HAXX" - ContentType : Application # Application / SystemUpdate / Manual / Child / Trial - Logo : Licensed # Nintendo / Licensed / Distributed - BackupMemoryType: None # None / 128KB / 512KB - -Rom: - # Specifies the root path of the file system to include in the ROM. - #HostRoot: "$(ROMFS_ROOT)" - SaveDataSize: 512KB - DefaultReject: - - .* - File: - - "*" - - -TitleInfo: - UniqueId: 0xff3ff - #TargetCategory: Contents - Category: Application - #DemoIndex: 1 - Version: 0 - -CardInfo: - #WritableAddress: 0x200 - #CardType : S2 # S1 / S2 - #CryptoType : 3 # 0 - 3 - CardDevice : NorFlash # NorFlash(0), None(1), BT(2) - #MediaType : CARD1 # Card1 / Card2 - BackupWriteWaitTime: 0 - -Option: - UseOnSD: true # true if App is to be installed to SD - EnableCompress: true - FreeProductCode: true - EnableCrypt : false - -ExeFs: - ReadOnly: - - .rodata - - RO - ReadWrite: - - .data - - RO - Text: - - .text - - STUP_ENTRY - -PlainRegion: - - .module_id - -AccessControlInfo: - #UseOtherVariationSaveData : true - #UseExtSaveData : true - #ExtSaveDataId: 0xffffffff - SystemSaveDataId1: 0x220 - SystemSaveDataId2: 0x00040010 - #OtherUserSaveDataId1: 0x220 - #OtherUserSaveDataId2: 0x330 - #OtherUserSaveDataId3: 0x440 - UseExtendedSaveDataAccessControl: true - AccessibleSaveDataIds: [0x101, 0x202, 0x303, 0x404, 0x505, 0x606] - FileSystemAccess: - #- CategorySystemApplication #0x1 - #- CategoryHardwareCheck #0x2 - #- CategoryFileSystemTool #0x4 - - Debug #0x8 - #- TwlCardBackup #0x10 - #- TwlNandData #0x20 - #- Boss #0x40 - - DirectSdmc #0x80 - #- Core #0x100 - #- CtrNandRo #0x200 - #- CtrNandRw #0x400 - #- CtrNandRoWrite #0x800 - #- CategorySystemSettings #0x1000 - #- CardBoard #0x2000 - #- ExportImportIvs #0x4000 - - DirectSdmcWrite #0x8000 - -SystemControlInfo: - RemasterVersion: 5 - StackSize: 0x40000 - #JumpId: 0 \ No newline at end of file diff --git a/Application2.rsf b/Application2.rsf deleted file mode 100644 index 0784ef3..0000000 --- a/Application2.rsf +++ /dev/null @@ -1,297 +0,0 @@ -# Default value for application -BasicInfo: - Title : "Homebrew" - CompanyCode : "00" - MediaSize : 128MB # 128MB / 256MB / 512MB / 1GB / 2GB - MediaFootPadding: false - ProductCode : "CTR-P-HAXX" - ContentType : Application # Application / SystemUpdate / Manual / Child / Trial - Logo : Licensed # Nintendo / Licensed / Distributed - BackupMemoryType: None # None / 128KB / 512KB - -Rom: - # Specifies the root path of the file system to include in the ROM. - #HostRoot: "$(ROMFS_ROOT)" - SaveDataSize: 512KB - DefaultReject: - - .* - File: - - "*" - - -TitleInfo: - UniqueId: 0xff3ff - #TargetCategory: Contents - Category: Application - #DemoIndex: 1 - Version: 0 - -CardInfo: - #WritableAddress: 0x200 - #CardType : S2 # S1 / S2 - #CryptoType : 3 # 0 - 3 - CardDevice : NorFlash # NorFlash(0), None(1), BT(2) - #MediaType : CARD1 # Card1 / Card2 - BackupWriteWaitTime: 0 - -Option: - UseOnSD: true # true if App is to be installed to SD - EnableCompress: true - FreeProductCode: true - EnableCrypt : false - -ExeFs: - ReadOnly: - - .rodata - - RO - ReadWrite: - - .data - - RO - Text: - - .text - - STUP_ENTRY - -PlainRegion: - - .module_id - -AccessControlInfo: - MaxCpu: 0x0 # 0x9E - DisableDebug : true - EnableForceDebug : true - CanWriteSharedPage : true - CanUsePrivilegedPriority : true - CanUseNonAlphabetAndNumber : true - PermitMainFunctionArgument : true - CanShareDeviceMemory : true - #UseOtherVariationSaveData : true - #UseExtSaveData : true - RunnableOnSleep : true - SpecialMemoryArrange : true - #ExtSaveDataId: 0xffffffff - SystemSaveDataId1: 0x220 - SystemSaveDataId2: 0x00040010 - #OtherUserSaveDataId1: 0x220 - #OtherUserSaveDataId2: 0x330 - #OtherUserSaveDataId3: 0x440 - UseExtendedSaveDataAccessControl: true - AccessibleSaveDataIds: [0x101, 0x202, 0x303, 0x404, 0x505, 0x606] - IoAccessControl: - - FsMountNand # 0x1 - - FsMountNandRoWrite #0x2 - - FsMountTwln #0x4 - - FsMountWnand # 0x8 - - FsMountCardSpi #0x10 - - UseSdif3 # 0x20 - - CreateSeed # 0x40 - - UseCardSpi # 0x80 - FileSystemAccess: - - CategorySystemApplication #0x1 - - CategoryHardwareCheck #0x2 - - CategoryFileSystemTool #0x4 - - Debug #0x8 - - TwlCardBackup #0x10 - - TwlNandData #0x20 - - Boss #0x40 - - DirectSdmc #0x80 - - Core #0x100 - - CtrNandRo #0x200 - - CtrNandRw #0x400 - - CtrNandRoWrite #0x800 - - CategorySystemSettings #0x1000 - - CardBoard #0x2000 - - ExportImportIvs #0x4000 - - DirectSdmcWrite #0x8000 - InterruptNumbers: - - 0x1 - AffinityMask: 1 - DescVersion: 2 - DisableDebug: false - SystemCallAccess: - ArbitrateAddress: 34 - Break: 60 - CancelTimer: 28 - ClearEvent: 25 - ClearTimer: 29 - CloseHandle: 35 - ConnectToPort: 45 - ControlMemory: 1 - CreateAddressArbiter: 33 - CreateEvent: 23 - CreateMemoryBlock: 30 - CreateMutex: 19 - CreateSemaphore: 21 - CreateThread: 8 - CreateTimer: 26 - DuplicateHandle: 39 - ExitProcess: 3 - ExitThread: 9 - GetCurrentProcessorNumber: 17 - GetHandleInfo: 41 - GetProcessId: 53 - GetProcessIdOfThread: 54 - GetProcessIdealProcessor: 6 - GetProcessInfo: 43 - GetResourceLimit: 56 - GetResourceLimitCurrentValues: 58 - GetResourceLimitLimitValues: 57 - GetSystemInfo: 42 - GetSystemTick: 40 - GetThreadContext: 59 - GetThreadId: 55 - GetThreadIdealProcessor: 15 - GetThreadInfo: 44 - GetThreadPriority: 11 - MapMemoryBlock: 31 - OutputDebugString: 61 - QueryMemory: 2 - ReleaseMutex: 20 - ReleaseSemaphore: 22 - SendSyncRequest1: 46 - SendSyncRequest2: 47 - SendSyncRequest3: 48 - SendSyncRequest4: 49 - SendSyncRequest: 50 - SetThreadPriority: 12 - SetTimer: 27 - SignalEvent: 24 - SleepThread: 10 - UnmapMemoryBlock: 32 - WaitSynchronization1: 36 - WaitSynchronizationN: 37 - HandleTableSize: 512 - IORegisterMapping: - - 1ff50000-1ff57fff - - 1ff70000-1ff77fff - IdealProcessor: 0 - MemoryMapping: - - 1f000000-1f5fffff:r - MemoryType: Application - Priority: 16 - ProgramId: 0x00040000ffffff00L - ReleaseKernelMajor: "02" - ReleaseKernelMinor: "33" - ServiceAccessControl: - - APT:U - - $hioFIO - - $hostio0 - - $hostio1 - - ac:u - - boss:U - - cam:u - - cecd:u - - cfg:u - - dlp:FKCL - - dlp:SRVR - - dsp::DSP - - frd:u - - fs:USER - - gsp::Gpu - - hid:USER - - http:C - - mic:u - - ndm:u - - news:u - - nwm::UDS - - ptm:u - - pxi:dev - - soc:U - - ssl:C - - y2r:u - - ldr:ro - - ir:USER - CoreVersion: 2 - StorageId: - - 0 - -SystemControlInfo: - RemasterVersion: 5 - Dependency: - ac: 0x0004013000002402L - am: 0x0004013000001502L - boss: 0x0004013000003402L - camera: 0x0004013000001602L - cecd: 0x0004013000002602L - cfg: 0x0004013000001702L - codec: 0x0004013000001802L - csnd: 0x0004013000002702L - dlp: 0x0004013000002802L - dsp: 0x0004013000001a02L - friends: 0x0004013000003202L - gpio: 0x0004013000001b02L - gsp: 0x0004013000001c02L - hid: 0x0004013000001d02L - http: 0x0004013000002902L - i2c: 0x0004013000001e02L - ir: 0x0004013000003302L - mcu: 0x0004013000001f02L - mic: 0x0004013000002002L - ndm: 0x0004013000002b02L - news: 0x0004013000003502L - nim: 0x0004013000002c02L - nwm: 0x0004013000002d02L - pdn: 0x0004013000002102L - ps: 0x0004013000003102L - ptm: 0x0004013000002202L - ro: 0x0004013000003702L - socket: 0x0004013000002e02L - spi: 0x0004013000002302L - ssl: 0x0004013000002f02L - StackSize: 0x40000 - -CommonHeaderKey: - D: | - jL2yO86eUQnYbXIrzgFVMm7FVze0LglZ2f5g+c42hWoEdnb5BOotaMQPBfqt - aUyAEmzQPaoi/4l4V+hTJRXQfthVRqIEx27B84l8LA6Tl5Fy9PaQaQ+4yRfP - g6ylH2l0EikrIVjy2uMlFgl0QJCrG+QGKHftxhaGCifdAwFNmiZuyJ/TmktZ - 0RCb66lYcr2h/p2G7SnpKUliS9h9KnpmG+UEgVYQUK+4SCfByUa9PxYGpT0E - nw1UcRz0gsBmdOqcgzwnAd9vVqgb42hVn6uQZyAl+j1RKiMWywZarazIR/k5 - Lmr4+groimSEa+3ajyoIho9WaWTDmFU3mkhA2tUDIQ== - DP: | - pD8c9uymjXDj6oyhx7EmQcrEDizxsj6hTjJ0x3G/PYNv/v2/DA9gp3X30h35 - uRZ1O+SgonWCGVnOJ7Wfjr4w2cOcSzxpzT3PQsS6Gs9z0RvcDsUHRL5f2EiT - 6A1ZPj6xyzmo9Ts6w9yfxCwaHci0f2hP9bq9FimfFKigCoNcFBE= - DQ: | - y+6Pado7N+SIZJgQ7zEGyQ7/SxGHHEy5uW04HHde9IqHD5HFGG2GegF655mM - iI9ja1eTCh/AFs8xjAg0drQEvB5q80TjPNKtwVUT8ghOlN3xTzpdaLwX0d+c - Twy74VY4KPawcdDeLaGFtXknhFOdGmIbx+BInibz7NZ9eLqGwaE= - Exponent: | - AQAB - InverseQ: | - tc9/lcF837g8AdfyeuCyuLyd36Zm1ZmJ1VSSuH8y3/1ZhBYZkOFXxU7EhMvJ - FyAu4qyCA9otzCXM+cqKxE3ZCkSconsXOu8szZTwuINSkwHlt22FtiTfPt+V - /g5kjtkjoZVOGfSvvfel9Smwy1yrFvKfi/yJsjATeNFjiEquV/w= - Modulus: | - z+yySANtuAnjXGxiLKlJ4fT0DGzD5S+dUKArWgDGcgALowRdlEbnABtIhbVh - LMl0yitDE8F4l1wzLwfHhfDa22CWUA98S3rXF53k5cOrb12leDKtBN2Wbtx1 - /8Iv+qLuRonNrmmSpEi8RkfEjIlj4QpNHNxGL1twinzpIpwJC6iXQMoqfYSh - BEou29fQZEOc0HgRQYgz3TFikC0X8sapK5xwq9zTq13a7j1sDoH/9mdaRPms - Bz0jlHVlkyAMxXYdD2UGPSGi8JaAtwpJUzijXcB0PKTZQDaFH4zRLRX57ySp - fp2yHvigcoEXd3OxVn+tBaLSMFr1068PEEpS2AlHlw== - P: | - 6SdD3AiAybNamgUgGJduyFWO1/LeakmoJm+23IEJADyU4nz+reGjxQnMrR+x - syuB8VPGuf1z0SInfRIu9PEjIfW9/H/fZ59GwckQuJbneODjW7KU1jM3cTVX - +AWvaxWDwlCUmVSYD2OySUJlo3szGmBYh/o/tKAq7kElaaOt+cc= - Q: | - 5EyO8bCyfqgLTfipAG/nNLObQbqMyARdQfudxh4eQqHmzblEM3jareuA8eUZ - K8pIaP+U9UfxwWTeFsOulrpsm04j4gS71WGNx3YwOIRPXXOn7zBkxA3AO9qq - K8lMeV3gNsdt4Fz8Zh2F68HSP4avB+ThO2S18SXMyIkcM7Sbw7E= - Signature: | - 3xyLmORvojVswxgXmPPOVH4ULn8e2G3PvClO/jIuwRGtRprGcOruKFUi4TYF - HASKzg8Mg4/I1t4RjurPrZvPgQ3rcROz066DAkwOEFBZPO5gBvuMf8IgJAFi - VYdgD636cy72ZWLS5RBFaXA5A9E57FDB1CU5spARTpXLGevKD7X6x7Di1+Bx - w+VVM55c3E07URENMXiWytcYWO4A6SjyaHbUV/5lsUtJP/amWErH/MS7YbxY - jVVl5gp5OUG4gGH3BcP+1osJgsJfplb57h0OBj6fP/GTmk+i1ZGHiv7Pw/yK - scR46dEa97HTIMuDvgPVyqVeF6aRENS+I9ZLTwOprg== - Descriptor: | - AP///wAABAACAAAAAAAFGJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiIAAAAAAAABBUFQ6VQAAACRo - aW9GSU8AJGhvc3RpbzAkaG9zdGlvMWFjOnUAAAAAYm9zczpVAABjYW06dQAA - AGNlY2Q6dQAAY2ZnOnUAAABkbHA6RktDTGRscDpTUlZSZHNwOjpEU1BmcmQ6 - dQAAAGZzOlVTRVIAZ3NwOjpHcHVoaWQ6VVNFUmh0dHA6QwAAbWljOnUAAABu - ZG06dQAAAG5ld3M6dQAAbndtOjpVRFNwdG06dQAAAHB4aTpkZXYAc29jOlUA - AABzc2w6QwAAAHkycjp1AAAAbGRyOnJvAABpcjpVU0VSAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAABOn/rw/7//8ec/APIA8JH/APaR/1D/gf9Y/4H/cP+B/3j/gf8B - AQD/AAIA/iECAPz///////////////////////////////////////////// - ////////////////////////////////////////AAAAAAAAAAAAAAAAAAAA - AAADAAAAAAAAAAAAAAAAAAI= \ No newline at end of file diff --git a/makerom.h b/Forgot to backup source similarity index 100% rename from makerom.h rename to Forgot to backup source diff --git a/Makefile b/Makefile deleted file mode 100644 index 26672a5..0000000 --- a/Makefile +++ /dev/null @@ -1,58 +0,0 @@ -# Makerom Sources -UTILS_OBJS = utils.o keyset.o titleid.o -CIA_OBJS = cia.o certs.o tik.o tmd.o -NCCH_OBJS = ncch.o exheader.o exefs.o elf.o romfs.o -NCSD_OBJS = ncsd.o -SETTINGS_OBJS = usersettings.o yamlsettings.o -LIB_API_OBJS = crypto.o yaml_ctr.o blz.o - -OBJS = makerom.o $(UTILS_OBJS) $(LIB_API_OBJS) $(SETTINGS_OBJS) $(NCSD_OBJS) $(NCCH_OBJS) $(CIA_OBJS) - -# Libraries -POLAR_OBJS = polarssl/aes.o polarssl/bignum.o polarssl/rsa.o polarssl/sha1.o polarssl/sha2.o polarssl/padlock.o polarssl/md.o polarssl/md_wrap.o polarssl/md2.o polarssl/md4.o polarssl/md5.o polarssl/sha4.o polarssl/base64.o polarssl/cipher.o polarssl/cipher_wrap.o polarssl/camellia.o polarssl/des.o polarssl/blowfish.o -YAML_OBJS = libyaml/api.o libyaml/dumper.o libyaml/emitter.o libyaml/loader.o libyaml/parser.o libyaml/reader.o libyaml/scanner.o libyaml/writer.o - -# Compiler Settings -LIBS = -static-libgcc -static-libstdc++ -CXXFLAGS = -I. -CFLAGS = --std=c99 -Wall -I. -DMAKEROM_VER_MAJOR=$(VER_MAJOR) -DMAKEROM_VER_MINOR=$(VER_MINOR) $(MAKEROM_BUILD_FLAGS) -CC = gcc - -# MAKEROM Build Settings -MAKEROM_BUILD_FLAGS = #-DDEBUG #-DELF_DEBUG -VER_MAJOR = 0 -VER_MINOR = 3 -OUTPUT = makerom - -main: build - -rebuild: clean build - -build: $(OBJS) $(POLAR_OBJS) $(YAML_OBJS) - g++ -o $(OUTPUT) $(LIBS) $(OBJS) $(POLAR_OBJS) $(YAML_OBJS) - -clean: - rm -rf $(OUTPUT) $(OBJS) $(POLAR_OBJS) $(YAML_OBJS) *.cci *.cia *.cxi *.cfa - -# Winfail compatibility -rebuildwin: cleanwin build -cleanwin: - del /Q objs $(OUTPUT).exe *.o polarssl\*.o libyaml\*.o *.cci *.cia *.cxi *.cfa - -#Test Functions - -ccigen_sdk: - ctr_makerom32 -f card -rsf testdata\Application.rsf -o content_test_sdk.cci -content testdata\app_zeroskey.cxi:0 -content testdata\manual_zeroskey.cfa:1 -content testdata\dlp_zeroskey.cfa:2 -content testdata\update_zeroskey.cfa:7 - del content_test_sdk.cci.xml - -ccigen: - $(OUTPUT) -f card -rsf testdata\Application.rsf -o content_test.cci -content testdata\app_zeroskey.cxi:0 -content testdata\manual_zeroskey.cfa:1 -content testdata\dlp_zeroskey.cfa:2 -content testdata\update_zeroskey.cfa:7 - -ciagen_sdk: - ctr_makecia32 -o content_test.cia -i testdata\app_zeroskey.cxi:0 -i testdata\manual_zeroskey.cfa:1 -i testdata\dlp_zeroskey.cfa:2 - -ciagen: - $(OUTPUT) -f cia -o content_test.cia -content testdata\app_zeroskey.cxi:0 -content testdata\manual_zeroskey.cfa:1 -content testdata\dlp_zeroskey.cfa:2 -encryptcia - -pyramids: - $(OUTPUT) -f cxi -accessdesc app -o pyramids.cxi -code pyramids\code.bin -exheader pyramids\exheader.bin -rsf pyramids\app.rsf -desc pyramids\build.desc -icon pyramids\icon.icn -banner pyramids\banner.bnr -romfs pyramids\romfs.bin diff --git a/accessdesc_sig.h b/accessdesc_sig.h deleted file mode 100644 index 8cbe2ee..0000000 --- a/accessdesc_sig.h +++ /dev/null @@ -1,320 +0,0 @@ -#ifndef _ACCESSDESC_SIG_H_ -#define _ACCESSDESC_SIG_H_ - -/* CTR_SDK 1 (1.2.0) */ -// DependencyList -static const unsigned char sdk1_dep_list[0x180] = -{ - 0x02, 0x24, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x15, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x34, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x16, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x26, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x17, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x18, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x27, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x28, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1A, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x32, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x29, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x20, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x35, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x21, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x31, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x22, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x23, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -// APP -static const unsigned char App_sdk1_HdrPubK[0x100] = -{ - 0x9B, 0x82, 0x9C, 0x19, 0x01, 0x73, 0x23, 0x50, 0x89, 0xE3, 0x0B, 0xC8, 0x8F, 0xFB, 0xA5, 0xE4, 0xFD, 0x44, 0xAE, 0x49, 0x32, 0xC7, 0xEF, 0x0A, 0x7E, 0x93, 0x95, 0xBA, 0xA2, 0x48, 0x4D, 0x8E, 0x18, 0x82, 0x34, 0x66, 0xFE, 0xDA, 0x7A, 0x45, 0x4A, 0x7D, 0xD5, 0x3C, 0xC6, 0x5C, 0xE0, 0x71, 0xFC, 0xD0, 0x82, 0xCC, 0xB2, 0xCF, 0x77, 0x0E, 0xAD, 0xCD, 0xD2, 0xAC, 0x1D, 0x66, 0x1B, 0xC1, 0xEA, 0xAC, 0x39, 0x96, 0x2C, 0x52, 0xDE, 0xFF, 0xF2, 0x74, 0xF6, 0xC5, 0xCA, 0x99, 0x31, 0x95, 0x13, 0xBB, 0x3F, 0xED, 0x30, 0xAE, 0x0A, 0xD3, 0x86, 0x0D, 0x0B, 0xF5, 0x56, 0x7D, 0x33, 0xBA, 0xA1, 0x39, 0xA2, 0xF5, 0xB6, 0x47, 0x78, 0x1F, 0xFD, 0x04, 0xA3, 0x49, 0xA9, 0x10, 0xD3, 0x41, 0x2E, 0x92, 0x7D, 0xE1, 0xA4, 0xA8, 0x02, 0x18, 0x01, 0x2C, 0xC2, 0x61, 0xB1, 0xAC, 0xCB, 0xB3, 0x7A, 0x64, 0xB1, 0xC3, 0xE6, 0x3B, 0x50, 0xAD, 0xDD, 0x55, 0xAB, 0x28, 0xDA, 0x59, 0xE7, 0x57, 0x6A, 0x76, 0x4F, 0x6B, 0x08, 0xD1, 0x61, 0x7D, 0x28, 0xD5, 0x88, 0x7B, 0x8E, 0x80, 0x78, 0xF3, 0xFF, 0x50, 0x00, 0xBD, 0x73, 0xFB, 0x62, 0xB3, 0xCA, 0xA8, 0x05, 0x48, 0xE6, 0xE6, 0x71, 0xB5, 0xAC, 0xDA, 0xE9, 0xC6, 0x1F, 0x9B, 0x72, 0x98, 0x2E, 0xFF, 0xB2, 0x9C, 0x36, 0x9F, 0x7E, 0x7D, 0x25, 0x65, 0x6F, 0xB0, 0x60, 0xB1, 0xB5, 0x5F, 0xCF, 0x74, 0x29, 0x91, 0x9D, 0xAB, 0x84, 0x97, 0x1A, 0x27, 0x5D, 0x69, 0x49, 0x16, 0xF8, 0x77, 0x31, 0x26, 0x3E, 0x6F, 0x97, 0x41, 0x4A, 0x26, 0xFD, 0x5B, 0xAB, 0x65, 0x77, 0x45, 0x1C, 0x76, 0x15, 0xDC, 0x1A, 0x63, 0x0F, 0x51, 0x2D, 0xA0, 0x07, 0x6E, 0xE5, 0x29, 0xD3, 0x37, 0x4B, 0xE5, 0x7F, 0xBB, 0x23, 0xD0, 0x2B, 0xB9, 0x76, 0x1F -}; - -static const unsigned char App_sdk1_HdrPrivK[0x100] = -{ - 0x66, 0x9F, 0xB5, 0xC5, 0xA6, 0xB8, 0x45, 0xD8, 0xD3, 0x75, 0xFB, 0x03, 0xBB, 0x48, 0xF5, 0x7C, 0x7D, 0x4B, 0x02, 0xBD, 0x19, 0x7E, 0xE9, 0x98, 0x02, 0x5A, 0x00, 0xD8, 0x6E, 0x59, 0xCA, 0x9C, 0x78, 0x3E, 0x0C, 0xB8, 0xDF, 0x7C, 0x6C, 0x6E, 0x27, 0xAF, 0x8C, 0xB6, 0x13, 0xAD, 0x9D, 0x0C, 0x7C, 0x2B, 0x59, 0xF6, 0x1E, 0x16, 0x5D, 0x5A, 0x59, 0x86, 0x57, 0x7D, 0xEF, 0xD4, 0xBF, 0x82, 0xA4, 0x0C, 0x4D, 0xE0, 0x75, 0x95, 0xA6, 0xC6, 0x3F, 0x49, 0xC2, 0xC4, 0x5A, 0x63, 0xE8, 0x5D, 0x99, 0xEC, 0xDB, 0x4D, 0xFA, 0xEF, 0x10, 0x03, 0xF1, 0x15, 0xD1, 0x0B, 0x71, 0xAD, 0x24, 0x23, 0x08, 0x5C, 0x91, 0xD7, 0x17, 0x18, 0x69, 0x04, 0xAB, 0x23, 0x91, 0x62, 0x7D, 0xE8, 0xB5, 0x90, 0xF1, 0x5C, 0x09, 0x28, 0x8C, 0x51, 0xB7, 0x38, 0x02, 0x26, 0x78, 0x8C, 0xA2, 0x05, 0x07, 0x53, 0x7D, 0x99, 0x46, 0xFD, 0x12, 0x77, 0x32, 0x0E, 0xA8, 0x54, 0xE3, 0x32, 0x0E, 0x93, 0x05, 0x10, 0xFA, 0x59, 0x7A, 0x5D, 0x2E, 0xDE, 0x32, 0xE8, 0xE9, 0xF0, 0x27, 0x4E, 0x08, 0x83, 0x08, 0xD4, 0x92, 0x58, 0x4D, 0x6D, 0x34, 0x9F, 0xD9, 0xAF, 0xA9, 0x01, 0x62, 0xB5, 0x1A, 0x1D, 0x7E, 0x8D, 0xBB, 0x8A, 0x58, 0xBA, 0xFF, 0xB4, 0xD3, 0x75, 0xF3, 0x44, 0xE7, 0x13, 0x05, 0xC6, 0xC5, 0xA4, 0xD2, 0x6B, 0x18, 0x31, 0x9F, 0xBE, 0x42, 0x45, 0x82, 0x2E, 0x47, 0x9B, 0x26, 0x73, 0x28, 0xD7, 0x9A, 0x64, 0xA6, 0x3D, 0x38, 0x9C, 0x11, 0x36, 0x01, 0x5B, 0x82, 0x2F, 0x7E, 0xA8, 0xC4, 0x82, 0x15, 0x6C, 0x0B, 0xBA, 0x1C, 0x58, 0xF5, 0x81, 0xF9, 0x45, 0xA9, 0xC6, 0x05, 0x6A, 0x2C, 0xA6, 0xCF, 0xF5, 0xDF, 0xEB, 0xBB, 0xC0, 0x92, 0xE3, 0xA6, 0x9D, 0x23, 0x09, 0x09, 0x0E, 0x98, 0x39 -}; - -static const unsigned char App_sdk1_AcexData[0x200] = -{ - 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFB, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 -}; - -static const unsigned char App_sdk1_AcexSig[0x100] = -{ - 0x05, 0x90, 0xAF, 0x65, 0x16, 0x9F, 0x18, 0x2C, 0x17, 0x78, 0x9F, 0xDF, 0xB6, 0x37, 0xCF, 0x26, 0x9B, 0x1B, 0x75, 0x51, 0xB8, 0x57, 0xA3, 0x8F, 0xD7, 0x93, 0x19, 0x61, 0x81, 0x0D, 0x3D, 0xBC, 0x36, 0x50, 0x53, 0xDA, 0x7D, 0xA9, 0x7F, 0xAA, 0x3E, 0x51, 0x2C, 0x75, 0xA1, 0xB9, 0xB1, 0x56, 0xEB, 0x2A, 0x46, 0x21, 0xEC, 0x4F, 0xA7, 0x0C, 0xA1, 0xA8, 0xFD, 0xEE, 0xA3, 0x4A, 0xFD, 0x54, 0xB0, 0x3A, 0x49, 0x5C, 0x8F, 0x8D, 0xB2, 0xBC, 0x32, 0x50, 0x7E, 0x2C, 0x50, 0xD2, 0x1A, 0x6B, 0x61, 0xCB, 0x2A, 0xC9, 0x7E, 0x6E, 0x6A, 0xC8, 0xD6, 0x9B, 0x21, 0xE7, 0x3B, 0xB8, 0x39, 0x1C, 0xD7, 0xEB, 0x69, 0x35, 0xF5, 0xBC, 0xB5, 0x23, 0x54, 0x81, 0x4F, 0x73, 0xAB, 0x9C, 0x55, 0xF0, 0x04, 0x0B, 0x4A, 0xEA, 0x54, 0x08, 0xBF, 0x36, 0x28, 0x12, 0x5E, 0x44, 0x41, 0xF5, 0x3D, 0xFE, 0xA7, 0x6B, 0x35, 0xF2, 0x9A, 0xF2, 0x88, 0xCD, 0xD6, 0x2E, 0x7B, 0xF3, 0xF5, 0x0D, 0x06, 0x2E, 0x13, 0x4F, 0x78, 0xEE, 0x27, 0xAB, 0x31, 0x06, 0x62, 0xE9, 0xB2, 0x3E, 0xC6, 0x99, 0xD7, 0xA9, 0xCC, 0x21, 0x70, 0xD7, 0xCD, 0x9F, 0x03, 0x66, 0x91, 0x7E, 0xBD, 0x3E, 0x83, 0xC4, 0xFF, 0xC9, 0xAA, 0x7E, 0x27, 0xAE, 0x5C, 0x37, 0x7D, 0x93, 0x57, 0x60, 0xB9, 0x0B, 0x71, 0x43, 0x8A, 0x2F, 0x43, 0x50, 0x94, 0xF8, 0x0D, 0x40, 0xCC, 0x64, 0x16, 0x09, 0x70, 0xCD, 0x03, 0xCA, 0x95, 0x30, 0x20, 0xE2, 0x85, 0x2F, 0x2A, 0xCF, 0x65, 0xAA, 0xE9, 0xCF, 0x1F, 0x57, 0xC1, 0x8F, 0xD5, 0x46, 0x51, 0x5A, 0x99, 0x60, 0x65, 0x93, 0xA9, 0xBB, 0xEA, 0x5F, 0xA0, 0x47, 0xD7, 0x11, 0x04, 0xC7, 0xB4, 0x82, 0x66, 0x24, 0x17, 0x17, 0x5E, 0x9D, 0xC8, 0x50, 0x80, 0x63, 0x28, 0xB3, 0xF8, 0xE3 -}; - -// DLP -static const unsigned char Dlp_sdk1_HdrPubK[0x100] = -{ - 0xD9, 0xF0, 0xC9, 0x35, 0x1E, 0x55, 0xD8, 0x7E, 0x96, 0x53, 0x33, 0x34, 0xBB, 0x8A, 0xAE, 0x03, 0x92, 0x35, 0xE2, 0x05, 0x58, 0x7C, 0xCC, 0x08, 0xB2, 0xDF, 0x43, 0x41, 0xB7, 0x7A, 0xB5, 0x29, 0xEE, 0x4E, 0xF3, 0xC7, 0x35, 0x3B, 0x7E, 0xC5, 0xEE, 0x74, 0xF0, 0xAA, 0x7E, 0x60, 0xF1, 0x28, 0x35, 0x17, 0xD6, 0xC9, 0x9A, 0xF2, 0x84, 0xFE, 0xC8, 0x93, 0x86, 0xF7, 0xA7, 0x36, 0xA6, 0xB0, 0x28, 0xDC, 0xE8, 0x38, 0x0B, 0x54, 0x42, 0x8D, 0x4E, 0x4B, 0x55, 0x0F, 0x4A, 0x0D, 0x72, 0xA0, 0x23, 0xC9, 0x68, 0x22, 0x37, 0x31, 0x88, 0x2C, 0x05, 0x49, 0x86, 0x80, 0x9A, 0xFC, 0x1D, 0x02, 0xE3, 0x20, 0x15, 0x0C, 0x7E, 0x28, 0x40, 0x57, 0xEF, 0xA7, 0xBC, 0xAA, 0xC5, 0xD6, 0xD7, 0x6F, 0xF9, 0x26, 0x9A, 0x32, 0xB2, 0x9E, 0x10, 0x5F, 0x93, 0xE6, 0xB2, 0xC6, 0xB2, 0x62, 0x34, 0x6A, 0xB0, 0xD9, 0x71, 0x3B, 0x0F, 0x34, 0x6C, 0xB1, 0xFE, 0x3A, 0x39, 0xDE, 0x3D, 0x6A, 0xCB, 0x32, 0x95, 0xFA, 0x18, 0x4F, 0xF4, 0xEB, 0x5F, 0x20, 0xE4, 0xEF, 0x64, 0xC5, 0x06, 0x27, 0xC3, 0x44, 0x2A, 0x39, 0x35, 0xD8, 0x00, 0xDF, 0x00, 0xAD, 0xC4, 0x98, 0x06, 0x52, 0xD8, 0x4A, 0xC5, 0x2A, 0x7F, 0x77, 0x50, 0x62, 0x7E, 0x05, 0x3E, 0x8C, 0x28, 0x0A, 0x26, 0xD2, 0x6C, 0x9B, 0x27, 0x65, 0xE9, 0x77, 0x68, 0xE9, 0xE6, 0xAA, 0xBA, 0xF5, 0x85, 0xFC, 0x75, 0x07, 0x84, 0xB2, 0xCA, 0x35, 0x85, 0x52, 0x10, 0x08, 0xEF, 0x85, 0xD3, 0x70, 0x17, 0x31, 0xE1, 0x44, 0xF6, 0x34, 0xDF, 0x7C, 0x42, 0xF7, 0x74, 0xAA, 0xFC, 0xC3, 0xE4, 0x84, 0x2D, 0xBF, 0x15, 0x1E, 0x84, 0x00, 0xE3, 0x80, 0xD7, 0x89, 0x56, 0xEE, 0x60, 0x09, 0x1F, 0xD3, 0xBF, 0xBF, 0x50, 0x8F, 0xA3, 0x0C, 0x72, 0x3F -}; - -static const unsigned char Dlp_sdk1_HdrPrivK[0x100] = -{ - 0x10, 0x19, 0x3A, 0x33, 0xA3, 0x47, 0x02, 0x13, 0xEF, 0xB4, 0xBB, 0x9E, 0x94, 0x8F, 0xDC, 0xE4, 0xC4, 0xA3, 0x18, 0x4B, 0xFE, 0xCA, 0x51, 0x23, 0xFF, 0x5A, 0x80, 0x94, 0x55, 0x22, 0x4A, 0x49, 0x8B, 0xA1, 0xE7, 0x5D, 0xFA, 0xAF, 0xA7, 0x60, 0xA5, 0x89, 0x9B, 0xD1, 0x6C, 0x3E, 0x6A, 0xF1, 0xE6, 0x62, 0x19, 0x6A, 0x90, 0xF8, 0x83, 0x1C, 0x72, 0xE2, 0x7A, 0xE0, 0xC6, 0x48, 0x42, 0x2D, 0xD7, 0x06, 0xE2, 0x5C, 0x69, 0x71, 0xD2, 0xEC, 0xAF, 0x30, 0xDF, 0x5A, 0x9E, 0xC4, 0xB9, 0x87, 0xDC, 0xBC, 0xDE, 0xE5, 0x50, 0x20, 0x67, 0x87, 0xA0, 0xE8, 0x5A, 0x78, 0x1B, 0x7A, 0xAE, 0x05, 0xED, 0x93, 0x0C, 0x1A, 0xFD, 0x22, 0xAA, 0x06, 0x14, 0xDC, 0xD6, 0x11, 0xE3, 0x45, 0x48, 0x6A, 0xAC, 0x03, 0xCE, 0xF6, 0x19, 0xBD, 0x95, 0x46, 0x0A, 0x1D, 0xCB, 0x6C, 0xE3, 0xF6, 0x5F, 0x1A, 0xB3, 0x81, 0xC7, 0xE2, 0xAB, 0xFE, 0xEF, 0xFB, 0xEC, 0xFE, 0x88, 0x36, 0x26, 0x60, 0x47, 0x43, 0x78, 0x36, 0xA7, 0xC8, 0xC9, 0x40, 0x98, 0x2E, 0xF2, 0x7E, 0xE4, 0x0D, 0x6C, 0x45, 0x88, 0x2A, 0x32, 0x9B, 0xA2, 0x7C, 0x39, 0x20, 0xAA, 0x6B, 0x64, 0x35, 0xC6, 0xA9, 0x20, 0x71, 0x4A, 0x78, 0x6E, 0x55, 0x3C, 0x9B, 0xEA, 0x10, 0x73, 0xBB, 0xA7, 0xD8, 0xFE, 0x69, 0x42, 0xB8, 0xE7, 0xA1, 0xE5, 0xDF, 0x8A, 0xDE, 0x4C, 0x2B, 0x3A, 0x92, 0xB8, 0x3E, 0x5E, 0x2C, 0x29, 0x0D, 0xC1, 0x3D, 0x10, 0x65, 0x1E, 0xF1, 0x95, 0xE5, 0xF6, 0x45, 0x15, 0xBF, 0xE2, 0x30, 0xA6, 0x70, 0x19, 0xA4, 0x11, 0x57, 0x12, 0x1C, 0x81, 0x4B, 0x54, 0x04, 0xBE, 0x67, 0xF5, 0x00, 0x22, 0x06, 0xDA, 0x6B, 0xCE, 0x23, 0x3F, 0x86, 0xE4, 0x70, 0x6A, 0xD1, 0x3E, 0xE5, 0x74, 0x44, 0x86, 0xDA, 0xBE, 0x79 -}; - -static const unsigned char Dlp_sdk1_AcexData[0x200] = -{ - 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFB, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 -}; - -static const unsigned char Dlp_sdk1_AcexSig[0x100] = -{ - 0x13, 0xB2, 0xF4, 0x89, 0xBB, 0xB4, 0xFF, 0x55, 0x7E, 0x3E, 0x9B, 0x90, 0x44, 0x45, 0xC6, 0x8A, 0x17, 0x32, 0x91, 0x77, 0x7D, 0xCB, 0x4A, 0x26, 0x3D, 0xCA, 0xD8, 0x6E, 0x72, 0x27, 0x93, 0x9C, 0xE4, 0x27, 0xFE, 0x54, 0xDC, 0xE7, 0xDC, 0x02, 0x17, 0x9C, 0x82, 0xA8, 0xB0, 0xE8, 0x69, 0x07, 0xE3, 0x34, 0x0E, 0xBF, 0x17, 0x05, 0x58, 0x23, 0x5F, 0x6D, 0xDA, 0xE8, 0xC6, 0xEE, 0x49, 0x29, 0xEF, 0xD7, 0x48, 0x48, 0x41, 0xE2, 0x2A, 0x57, 0x2B, 0x21, 0x13, 0x64, 0xD4, 0x79, 0x5A, 0xE3, 0x84, 0xDA, 0x63, 0x9A, 0x07, 0x39, 0xE2, 0x7E, 0xA7, 0x56, 0x34, 0x1C, 0xE2, 0xAF, 0xCD, 0x65, 0xD1, 0xC0, 0x1B, 0x72, 0xB1, 0x1D, 0xFC, 0xE2, 0x6E, 0x0F, 0xC7, 0xB0, 0xF5, 0x84, 0x0F, 0xA5, 0x2B, 0xDF, 0x3A, 0xCF, 0x43, 0xE8, 0xE4, 0x07, 0x29, 0xC6, 0x41, 0x0E, 0x7B, 0xEE, 0x35, 0xF9, 0xFC, 0xE7, 0x15, 0xF3, 0x8C, 0x3A, 0xB4, 0x77, 0xBD, 0x88, 0x70, 0x83, 0x4A, 0x03, 0x9E, 0x01, 0x9B, 0xBB, 0xD2, 0xE4, 0xA5, 0xBE, 0xF7, 0x80, 0x92, 0x5A, 0x9F, 0x14, 0x9B, 0x49, 0x5D, 0x3D, 0xDC, 0x32, 0x34, 0x7E, 0xC0, 0xD4, 0xAC, 0xDA, 0x8C, 0xF7, 0xA1, 0xE1, 0xCA, 0x29, 0xF5, 0x58, 0x5E, 0xEB, 0x02, 0xB6, 0x67, 0x42, 0x89, 0x46, 0x4C, 0xA6, 0xA8, 0xBD, 0xEB, 0xEB, 0xDD, 0x8F, 0x2E, 0x72, 0x26, 0x49, 0x70, 0x01, 0x7D, 0x5B, 0x03, 0x06, 0x2C, 0x92, 0x1E, 0x55, 0xB2, 0xDA, 0xD7, 0x0D, 0x70, 0x74, 0x42, 0xD5, 0x62, 0x42, 0x3C, 0xC1, 0x70, 0x8E, 0x67, 0xB1, 0xD9, 0xF3, 0x7E, 0xB2, 0xBA, 0x6D, 0x0F, 0x42, 0x65, 0x24, 0x79, 0xE8, 0x8F, 0xB4, 0x4B, 0x32, 0x35, 0xCA, 0x39, 0x70, 0xFE, 0x8E, 0x81, 0x49, 0x73, 0x8D, 0x3C, 0xCD, 0x60, 0xAF, 0xA3, 0x52, 0x45, 0xEE -}; - -/* CTR_SDK 2 (2.3.4) */ -static const unsigned char sdk2_dep_list[0x180] = -{ - 0x02, 0x24, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x15, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x34, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x16, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x26, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x17, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x18, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x27, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x28, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1A, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x32, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x29, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x20, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x35, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x21, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x31, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x22, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x23, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -// APP -static const unsigned char App_sdk2_HdrPubK[0x100] = -{ - 0xE9, 0x45, 0xF0, 0xC6, 0x96, 0xD5, 0x6F, 0x7E, 0xAE, 0x03, 0x92, 0x2E, 0xEA, 0xCB, 0xFD, 0xEA, 0xA4, 0x7A, 0x9F, 0x12, 0xDA, 0x4C, 0x10, 0x0A, 0xBE, 0x08, 0x9D, 0x87, 0xE0, 0x14, 0xAC, 0x7F, 0x39, 0xD2, 0xFE, 0x9D, 0x88, 0xB2, 0x81, 0xF6, 0x1A, 0x9E, 0x15, 0x57, 0xD4, 0xE2, 0x31, 0x08, 0x07, 0xEC, 0x4F, 0x10, 0x00, 0xDE, 0xEF, 0x8B, 0x6F, 0xCF, 0x84, 0xE7, 0x3B, 0x41, 0x08, 0x64, 0x3B, 0x1C, 0x00, 0x7C, 0x73, 0xBB, 0x59, 0x4D, 0xD8, 0xD6, 0xE7, 0x7B, 0xBE, 0xDD, 0x50, 0x98, 0xA1, 0x1A, 0xD5, 0xAA, 0x37, 0x69, 0xB8, 0x25, 0xCB, 0x7B, 0x03, 0x00, 0x90, 0x25, 0xF3, 0x7E, 0x9A, 0x0F, 0xA3, 0xAA, 0xC4, 0xB9, 0x3B, 0x3A, 0x18, 0x2B, 0xBC, 0x9C, 0x11, 0x04, 0x92, 0x16, 0x6E, 0xC3, 0xFA, 0x01, 0xD3, 0x00, 0x02, 0xF3, 0x2E, 0xD5, 0x60, 0xA8, 0xAF, 0xAB, 0xEE, 0x2F, 0x9D, 0x30, 0x3E, 0x0E, 0xDC, 0xB8, 0xEC, 0x87, 0x9E, 0x4A, 0xA9, 0x01, 0x34, 0x69, 0x2C, 0x4C, 0x34, 0xB7, 0x7D, 0xB9, 0x7A, 0x17, 0x74, 0x31, 0xB0, 0x29, 0xC4, 0x7D, 0x27, 0x1F, 0xBA, 0xBA, 0x3F, 0x5B, 0x62, 0xF6, 0x90, 0xB8, 0x37, 0x33, 0xFC, 0x73, 0xD6, 0x19, 0x11, 0xCA, 0x83, 0x2A, 0x58, 0x62, 0x9C, 0xB1, 0x83, 0x43, 0x1D, 0x2C, 0x00, 0xA2, 0xE5, 0x87, 0x97, 0x12, 0x63, 0x31, 0x83, 0x0E, 0xB1, 0x1E, 0x69, 0x99, 0x02, 0xAF, 0xDF, 0xFF, 0x0F, 0xA9, 0x7C, 0x1B, 0x33, 0x9E, 0xFF, 0x9C, 0x14, 0x19, 0xA6, 0xCA, 0xFD, 0xB9, 0x17, 0xE0, 0x22, 0xCF, 0xB5, 0x00, 0x77, 0x2E, 0x31, 0xAD, 0xF7, 0xE5, 0xAD, 0x98, 0x14, 0xDF, 0x19, 0xF0, 0xC9, 0xBE, 0x37, 0xF6, 0xF0, 0x23, 0x66, 0xCF, 0x34, 0xE3, 0xD5, 0x8F, 0xD4, 0x07, 0xBA, 0x06, 0x56, 0x00, 0x66, 0x9A, 0xEB, 0x93 -}; - -static const unsigned char App_sdk2_HdrPrivK[0x100] = -{ - 0xBC, 0x49, 0x29, 0xB9, 0x01, 0x52, 0x31, 0x76, 0x4C, 0xBA, 0xB1, 0x29, 0x91, 0x77, 0x29, 0xF2, 0x54, 0xE4, 0x6C, 0xB5, 0x68, 0xE1, 0xF0, 0x28, 0xDB, 0x8E, 0x54, 0xA8, 0xB1, 0xA3, 0xBE, 0x3F, 0xCA, 0xCA, 0x95, 0x9D, 0x4E, 0x12, 0xD7, 0x77, 0x6F, 0xB0, 0x9D, 0x85, 0x91, 0x5D, 0x29, 0x3A, 0x54, 0x3A, 0xD6, 0xEE, 0x11, 0xE5, 0xDF, 0xEF, 0xEA, 0x45, 0xD3, 0xFE, 0x58, 0x03, 0x7B, 0xE4, 0x7B, 0x19, 0x75, 0x02, 0xFE, 0xDE, 0xFF, 0x8C, 0x28, 0x33, 0xFE, 0x10, 0x11, 0xD4, 0xCD, 0x13, 0x05, 0x26, 0x85, 0xC3, 0xA8, 0x8A, 0x7A, 0x8A, 0x77, 0x1D, 0x49, 0x25, 0x11, 0x34, 0xB0, 0xBF, 0x45, 0x56, 0xCE, 0x42, 0x2E, 0x1B, 0x5C, 0xC4, 0xDD, 0x71, 0xA0, 0x01, 0x50, 0x73, 0x21, 0xFF, 0x5D, 0x54, 0x6D, 0xDD, 0x3F, 0x14, 0x49, 0x4D, 0x44, 0x46, 0x12, 0x88, 0xD5, 0x92, 0xAE, 0xE2, 0xD0, 0xF6, 0x2C, 0x10, 0xD5, 0x67, 0x61, 0x87, 0x7F, 0x2A, 0x17, 0x9D, 0x4F, 0xC6, 0x79, 0xC3, 0xAF, 0x4D, 0x6F, 0xFB, 0x0F, 0x3B, 0x48, 0x5D, 0x46, 0x9A, 0xE8, 0x53, 0xB7, 0xC5, 0x69, 0xEC, 0x31, 0x25, 0xD1, 0xDC, 0x93, 0xAB, 0x2E, 0x53, 0x3B, 0x8E, 0x96, 0x27, 0x59, 0xD4, 0xF7, 0xB3, 0xAB, 0x51, 0x59, 0xAE, 0x6E, 0x26, 0x4F, 0xC2, 0x95, 0xCE, 0x42, 0xC6, 0xAF, 0x46, 0xC6, 0x2E, 0x32, 0x09, 0x7B, 0xAF, 0x67, 0x4E, 0x57, 0xC8, 0x93, 0x5F, 0x8C, 0xD5, 0x66, 0x7B, 0xCC, 0xE9, 0xBE, 0x86, 0xB9, 0xBB, 0xD0, 0xC8, 0xD2, 0xDC, 0x5F, 0x95, 0x83, 0x28, 0x55, 0x21, 0x1E, 0xEE, 0xCF, 0x23, 0xB7, 0x6D, 0xE0, 0x9A, 0x87, 0x99, 0xFB, 0x82, 0x50, 0xD0, 0x2D, 0xC4, 0xFB, 0xA0, 0x11, 0x2F, 0xDD, 0x05, 0x7E, 0x1C, 0xE3, 0xFB, 0x98, 0x69, 0xD4, 0x49, 0x2F, 0x0D, 0xF6, 0x61 -}; - -static const unsigned char App_sdk2_AcexData[0x200] = -{ - 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x6C, 0x64, 0x72, 0x3A, 0x72, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFB, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0x1D, 0x02, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 -}; - -static const unsigned char App_sdk2_AcexSig[0x100] = -{ - 0x62, 0xFE, 0xD9, 0x12, 0x3D, 0x99, 0x53, 0xC4, 0x20, 0x25, 0xDE, 0x59, 0xEA, 0x6E, 0xF3, 0x16, 0x5B, 0x36, 0xBA, 0x1C, 0xB3, 0xB5, 0x48, 0x37, 0xD2, 0xA4, 0x04, 0xE5, 0x14, 0xC6, 0xE7, 0x22, 0x14, 0x40, 0x6F, 0x92, 0x6A, 0x9B, 0xDF, 0xDE, 0xFA, 0xCE, 0x3C, 0xBB, 0x4B, 0xC4, 0x66, 0xA8, 0x86, 0x58, 0xAC, 0xEB, 0x2F, 0xB7, 0xA3, 0xEC, 0xEA, 0x31, 0x23, 0x61, 0xF6, 0x72, 0x1E, 0x26, 0x8A, 0x1D, 0x68, 0x2A, 0x2A, 0x21, 0x5A, 0xA2, 0x6A, 0xBD, 0xCE, 0xC0, 0x19, 0x08, 0x61, 0x64, 0xB3, 0xF6, 0x90, 0xB1, 0x34, 0xF8, 0x50, 0x6F, 0x83, 0xB6, 0x8D, 0x35, 0x12, 0x7F, 0x9C, 0x7B, 0x6E, 0x3C, 0x4E, 0xD1, 0xFD, 0xC3, 0x30, 0xD2, 0xE8, 0x7E, 0x15, 0x1F, 0xAD, 0xDB, 0x1D, 0x92, 0xDA, 0x8C, 0x4E, 0xE9, 0x84, 0x83, 0xFF, 0x1A, 0x09, 0x77, 0x05, 0x5A, 0xCF, 0x5C, 0x8B, 0x4F, 0x68, 0x36, 0xC8, 0xDA, 0x5B, 0x1A, 0x5A, 0x49, 0xF9, 0xA1, 0xF2, 0xC8, 0x02, 0xFD, 0x69, 0x1F, 0x1D, 0xB3, 0xE8, 0xF8, 0xE1, 0x6B, 0x15, 0x9A, 0x5E, 0x41, 0x84, 0x06, 0x1F, 0x2A, 0xB3, 0xB2, 0xA1, 0xDC, 0x63, 0x81, 0xB3, 0x6B, 0x4B, 0x21, 0x67, 0x19, 0x82, 0x52, 0xFE, 0x75, 0x96, 0xA1, 0xDF, 0x02, 0xD4, 0x07, 0x1F, 0x1B, 0x88, 0x12, 0x5A, 0x76, 0x54, 0xC4, 0x06, 0x2D, 0xB1, 0xAA, 0x41, 0x3C, 0x9F, 0x43, 0xA2, 0x75, 0x20, 0x39, 0xB6, 0x06, 0xF9, 0x9C, 0xFC, 0x00, 0xC5, 0xBC, 0x84, 0x13, 0x80, 0xE4, 0x10, 0x1A, 0xCD, 0x95, 0xBB, 0xF2, 0xDC, 0x57, 0x7B, 0xBA, 0x87, 0x05, 0x0B, 0x96, 0xC1, 0xCD, 0x60, 0xC7, 0x10, 0x44, 0x78, 0x0E, 0x0F, 0x2F, 0x91, 0x54, 0x6C, 0xDE, 0xB8, 0x14, 0x46, 0xF3, 0x9C, 0xAC, 0x7B, 0xAA, 0xE7, 0x1B, 0x52, 0xD6, 0xBE, 0x71, 0x97, 0x22 -}; - -// DLP -static const unsigned char Dlp_sdk2_HdrPubK[0x100] = -{ - 0xB9, 0xDE, 0x3D, 0xC0, 0x55, 0xB9, 0xCC, 0x3F, 0x55, 0xE0, 0x61, 0x1D, 0x6F, 0xCF, 0x3E, 0x7F, 0xE2, 0xF7, 0xF5, 0xAD, 0x5C, 0x02, 0x7F, 0x17, 0x5B, 0x44, 0x2F, 0x2D, 0xDC, 0xD4, 0xA6, 0x63, 0xD2, 0xA7, 0x82, 0xD3, 0x00, 0x77, 0xC8, 0x0B, 0x28, 0x09, 0x3D, 0x81, 0x86, 0x93, 0xF5, 0xF6, 0xE4, 0x69, 0x3B, 0x60, 0x4C, 0x7F, 0x8D, 0x72, 0xA3, 0x22, 0x42, 0x86, 0x87, 0x06, 0xD8, 0x29, 0x89, 0x8A, 0x9F, 0x5F, 0x6C, 0x06, 0x0C, 0x96, 0x84, 0x00, 0x24, 0x5D, 0x0B, 0xEA, 0x15, 0xEC, 0xAD, 0x90, 0xA4, 0x0C, 0x7B, 0xAE, 0x0E, 0x85, 0x3E, 0xA2, 0x20, 0x04, 0xE8, 0xD9, 0x59, 0x0F, 0x31, 0x0E, 0xD4, 0x5D, 0xC1, 0x18, 0xED, 0x0E, 0xB4, 0xD2, 0x5E, 0x65, 0xA2, 0x78, 0x0C, 0x76, 0x03, 0x3A, 0x71, 0x18, 0xE4, 0x38, 0x44, 0x14, 0xE0, 0x93, 0x84, 0xFE, 0x34, 0x82, 0xCA, 0x0B, 0xB8, 0xF2, 0x41, 0xAB, 0x63, 0xF3, 0xDE, 0xAE, 0xF4, 0x36, 0x81, 0xA4, 0x78, 0x7B, 0xF9, 0xA8, 0xFB, 0xC9, 0xA7, 0x6E, 0xA4, 0xD5, 0xE2, 0xA9, 0xD8, 0xD9, 0xE8, 0x98, 0x1B, 0x25, 0x75, 0x00, 0x11, 0x51, 0x97, 0x62, 0x0D, 0xF0, 0x0C, 0xE9, 0x6B, 0x0C, 0xEE, 0xCE, 0x25, 0x2C, 0x3F, 0xDF, 0xBE, 0x54, 0xD5, 0xD6, 0x5E, 0xEE, 0x1F, 0x73, 0xFC, 0xE8, 0xEC, 0xB3, 0x8A, 0x48, 0x9F, 0x6A, 0xC1, 0x63, 0x85, 0xE4, 0x94, 0x85, 0x8F, 0x3D, 0x9D, 0x43, 0xB4, 0xA7, 0x4C, 0x82, 0xA3, 0x0B, 0x67, 0x43, 0x12, 0x31, 0x77, 0x89, 0xB0, 0xD5, 0x00, 0x1B, 0x52, 0x29, 0xCE, 0x54, 0xC7, 0xC4, 0x7D, 0xB6, 0x69, 0x7B, 0xFE, 0xDC, 0xDB, 0x4E, 0xD8, 0x58, 0x42, 0x14, 0x34, 0x72, 0x64, 0xBC, 0x09, 0x6D, 0xAC, 0xD3, 0xC4, 0x1B, 0x5C, 0x8E, 0xF9, 0xBE, 0x84, 0xCD, 0x9A, 0x86, 0x4B, 0x17 -}; - -static const unsigned char Dlp_sdk2_HdrPrivK[0x100] = -{ - 0xAA, 0x51, 0x62, 0x58, 0x9A, 0xB5, 0x74, 0xDA, 0x1C, 0xC1, 0x4D, 0x7C, 0x81, 0xF6, 0x70, 0x99, 0x13, 0xCC, 0x90, 0x0D, 0xD9, 0xA0, 0x58, 0x01, 0x79, 0x1A, 0x53, 0xF9, 0x3C, 0xC0, 0x87, 0xF0, 0x35, 0x1A, 0x56, 0xA1, 0x2F, 0x6E, 0x93, 0x9A, 0xD5, 0x87, 0x12, 0x1B, 0x5C, 0xCC, 0xBC, 0xB9, 0x0E, 0xB8, 0xF7, 0x35, 0xD9, 0x23, 0x90, 0xE4, 0x19, 0x64, 0xCD, 0x7D, 0x24, 0xC2, 0x3A, 0xD6, 0x65, 0x38, 0xE7, 0xAD, 0xB2, 0xF9, 0x20, 0x13, 0xD4, 0xC5, 0xA4, 0x8C, 0xB6, 0xDC, 0x3C, 0x56, 0xF2, 0xFC, 0xF5, 0xB6, 0x92, 0xA6, 0xFE, 0x9B, 0x4E, 0xB7, 0x95, 0x8B, 0xAA, 0x2B, 0x70, 0x96, 0xA1, 0x27, 0xAB, 0xA6, 0x75, 0xC9, 0x77, 0x80, 0xE0, 0x65, 0x5D, 0x26, 0xD8, 0xE8, 0x14, 0xD3, 0x17, 0x46, 0x38, 0x58, 0xCC, 0xD8, 0x5A, 0x5A, 0x9F, 0x27, 0xCE, 0xD8, 0x7A, 0x19, 0xD7, 0x35, 0xB2, 0x32, 0xAF, 0x47, 0x2E, 0x9F, 0x4B, 0x64, 0xEC, 0x1F, 0xC6, 0x40, 0xD0, 0x2C, 0x47, 0xD1, 0xEA, 0x33, 0xE5, 0x0E, 0x80, 0xFC, 0x68, 0xEC, 0x8C, 0x12, 0x33, 0xCE, 0x34, 0x28, 0x79, 0xFA, 0x05, 0x5D, 0x70, 0x15, 0xDE, 0xB1, 0x22, 0x85, 0x18, 0x63, 0x15, 0x35, 0x57, 0x04, 0x17, 0x64, 0x20, 0xC8, 0x52, 0x44, 0x64, 0x5E, 0x47, 0x4E, 0x5F, 0x80, 0x21, 0x16, 0x94, 0x4B, 0x18, 0x11, 0x36, 0x67, 0x3B, 0x6C, 0x69, 0x19, 0xCF, 0xC9, 0x05, 0x85, 0x9B, 0x3A, 0xDE, 0x12, 0x1E, 0x0A, 0xC6, 0x22, 0xA8, 0xC7, 0x9A, 0x34, 0x14, 0x98, 0xFD, 0xD9, 0x0F, 0xE8, 0x64, 0xE6, 0x89, 0x63, 0x6E, 0x17, 0x76, 0xD7, 0x1B, 0x6F, 0x92, 0x00, 0xD8, 0xBB, 0xF6, 0xA0, 0x65, 0x9D, 0xAA, 0x7A, 0x0E, 0x4B, 0x56, 0xA5, 0x33, 0xDA, 0x3F, 0x5D, 0xFE, 0xD3, 0xAD, 0x6E, 0x0E, 0xB3, 0xD4, 0x41 -}; - -static const unsigned char Dlp_sdk2_AcexData[0x200] = -{ - 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x6C, 0x64, 0x72, 0x3A, 0x72, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFB, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0x1D, 0x02, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 -}; - -static const unsigned char Dlp_sdk2_AcexSig[0x100] = -{ - 0x97, 0x84, 0x97, 0xEE, 0x4F, 0x35, 0xCC, 0xBE, 0x08, 0xB4, 0x5D, 0x7E, 0x17, 0xC3, 0x94, 0x2B, 0x4D, 0x3A, 0xA5, 0xB5, 0x01, 0xD4, 0xAE, 0x2A, 0x90, 0x26, 0x21, 0x8F, 0x56, 0x05, 0xB9, 0xA2, 0x5E, 0xCE, 0x73, 0xC7, 0x42, 0xDC, 0x99, 0xD2, 0x7C, 0x08, 0x62, 0xBF, 0x10, 0x7A, 0xC1, 0x5D, 0x22, 0x53, 0x8F, 0x63, 0x2D, 0x73, 0xF3, 0x05, 0xDA, 0x9D, 0x6A, 0xF8, 0xB9, 0x5B, 0x80, 0xB4, 0x30, 0xB3, 0x11, 0xF7, 0x96, 0x8A, 0xCF, 0x70, 0xD7, 0x62, 0x6E, 0x99, 0x32, 0xFD, 0x74, 0x34, 0x16, 0xFD, 0x17, 0x1F, 0xB1, 0xEC, 0xA4, 0x0F, 0x52, 0x13, 0x9F, 0x62, 0x0D, 0xE0, 0x50, 0xA6, 0xA0, 0x7B, 0x69, 0x95, 0xE0, 0xE9, 0xBB, 0x38, 0x0C, 0x62, 0xE0, 0xE3, 0xCE, 0x82, 0xE0, 0xB9, 0xE0, 0xF6, 0x61, 0x50, 0xBF, 0xA8, 0x18, 0x15, 0x38, 0xFE, 0xFA, 0x8C, 0xBA, 0xA5, 0xB9, 0x9C, 0x05, 0xA6, 0x91, 0x5C, 0xA7, 0x13, 0x6F, 0x13, 0x3F, 0xF1, 0xF6, 0x68, 0xAF, 0x40, 0xEC, 0x27, 0xE0, 0x33, 0x6B, 0xCF, 0x26, 0x06, 0xF8, 0x6A, 0x13, 0x6C, 0xBC, 0xDB, 0xAF, 0x6F, 0x78, 0xA0, 0x80, 0x10, 0x8F, 0xB6, 0x91, 0x5A, 0x43, 0x2C, 0x5F, 0x1D, 0xBA, 0xB4, 0x5E, 0xBE, 0xAE, 0x53, 0x09, 0x17, 0x5B, 0x6C, 0xC1, 0x5E, 0x0F, 0x72, 0x6E, 0xD6, 0x10, 0x0B, 0xC3, 0x26, 0xDC, 0xAF, 0xCA, 0x28, 0xAB, 0x00, 0x67, 0x04, 0xE3, 0x54, 0xE8, 0x95, 0xC6, 0x23, 0xB6, 0x79, 0x70, 0xA4, 0x87, 0x6D, 0x12, 0x48, 0xCC, 0x11, 0x86, 0xEC, 0x82, 0xF4, 0x30, 0xC9, 0xB1, 0x6D, 0x08, 0xA7, 0xEA, 0x8C, 0x6A, 0x97, 0xAA, 0x89, 0xD5, 0xC5, 0x07, 0xA9, 0xD5, 0xCF, 0x09, 0x08, 0xBC, 0x56, 0x63, 0x8D, 0x70, 0x2F, 0x64, 0xAF, 0x51, 0x9E, 0x22, 0xA4, 0x88, 0xF0, 0xDC, 0x56, 0x72, 0x28 -}; - - -/* CTR_SDK 4/5 (4.2.8) */ -// DependencyList -static const unsigned char sdk4_dep_list[0x180] = -{ - 0x02, 0x24, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x15, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x34, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x16, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x26, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x17, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x18, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x27, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x28, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1A, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x32, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x29, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x33, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x20, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x35, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x21, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x31, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x22, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x37, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x23, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -// APP -static const unsigned char App_sdk4_HdrPubK[0x100] = -{ - 0xCF, 0xEC, 0xB2, 0x48, 0x03, 0x6D, 0xB8, 0x09, 0xE3, 0x5C, 0x6C, 0x62, 0x2C, 0xA9, 0x49, 0xE1, 0xF4, 0xF4, 0x0C, 0x6C, 0xC3, 0xE5, 0x2F, 0x9D, 0x50, 0xA0, 0x2B, 0x5A, 0x00, 0xC6, 0x72, 0x00, 0x0B, 0xA3, 0x04, 0x5D, 0x94, 0x46, 0xE7, 0x00, 0x1B, 0x48, 0x85, 0xB5, 0x61, 0x2C, 0xC9, 0x74, 0xCA, 0x2B, 0x43, 0x13, 0xC1, 0x78, 0x97, 0x5C, 0x33, 0x2F, 0x07, 0xC7, 0x85, 0xF0, 0xDA, 0xDB, 0x60, 0x96, 0x50, 0x0F, 0x7C, 0x4B, 0x7A, 0xD7, 0x17, 0x9D, 0xE4, 0xE5, 0xC3, 0xAB, 0x6F, 0x5D, 0xA5, 0x78, 0x32, 0xAD, 0x04, 0xDD, 0x96, 0x6E, 0xDC, 0x75, 0xFF, 0xC2, 0x2F, 0xFA, 0xA2, 0xEE, 0x46, 0x89, 0xCD, 0xAE, 0x69, 0x92, 0xA4, 0x48, 0xBC, 0x46, 0x47, 0xC4, 0x8C, 0x89, 0x63, 0xE1, 0x0A, 0x4D, 0x1C, 0xDC, 0x46, 0x2F, 0x5B, 0x70, 0x8A, 0x7C, 0xE9, 0x22, 0x9C, 0x09, 0x0B, 0xA8, 0x97, 0x40, 0xCA, 0x2A, 0x7D, 0x84, 0xA1, 0x04, 0x4A, 0x2E, 0xDB, 0xD7, 0xD0, 0x64, 0x43, 0x9C, 0xD0, 0x78, 0x11, 0x41, 0x88, 0x33, 0xDD, 0x31, 0x62, 0x90, 0x2D, 0x17, 0xF2, 0xC6, 0xA9, 0x2B, 0x9C, 0x70, 0xAB, 0xDC, 0xD3, 0xAB, 0x5D, 0xDA, 0xEE, 0x3D, 0x6C, 0x0E, 0x81, 0xFF, 0xF6, 0x67, 0x5A, 0x44, 0xF9, 0xAC, 0x07, 0x3D, 0x23, 0x94, 0x75, 0x65, 0x93, 0x20, 0x0C, 0xC5, 0x76, 0x1D, 0x0F, 0x65, 0x06, 0x3D, 0x21, 0xA2, 0xF0, 0x96, 0x80, 0xB7, 0x0A, 0x49, 0x53, 0x38, 0xA3, 0x5D, 0xC0, 0x74, 0x3C, 0xA4, 0xD9, 0x40, 0x36, 0x85, 0x1F, 0x8C, 0xD1, 0x2D, 0x15, 0xF9, 0xEF, 0x24, 0xA9, 0x7E, 0x9D, 0xB2, 0x1E, 0xF8, 0xA0, 0x72, 0x81, 0x17, 0x77, 0x73, 0xB1, 0x56, 0x7F, 0xAD, 0x05, 0xA2, 0xD2, 0x30, 0x5A, 0xF5, 0xD3, 0xAF, 0x0F, 0x10, 0x4A, 0x52, 0xD8, 0x09, 0x47, 0x97 -}; - -static const unsigned char App_sdk4_HdrPrivK[0x100] = -{ - 0x8C, 0xBD, 0xB2, 0x3B, 0xCE, 0x9E, 0x51, 0x09, 0xD8, 0x6D, 0x72, 0x2B, 0xCE, 0x01, 0x55, 0x32, 0x6E, 0xC5, 0x57, 0x37, 0xB4, 0x2E, 0x09, 0x59, 0xD9, 0xFE, 0x60, 0xF9, 0xCE, 0x36, 0x85, 0x6A, 0x04, 0x76, 0x76, 0xF9, 0x04, 0xEA, 0x2D, 0x68, 0xC4, 0x0F, 0x05, 0xFA, 0xAD, 0x69, 0x4C, 0x80, 0x12, 0x6C, 0xD0, 0x3D, 0xAA, 0x22, 0xFF, 0x89, 0x78, 0x57, 0xE8, 0x53, 0x25, 0x15, 0xD0, 0x7E, 0xD8, 0x55, 0x46, 0xA2, 0x04, 0xC7, 0x6E, 0xC1, 0xF3, 0x89, 0x7C, 0x2C, 0x0E, 0x93, 0x97, 0x91, 0x72, 0xF4, 0xF6, 0x90, 0x69, 0x0F, 0xB8, 0xC9, 0x17, 0xCF, 0x83, 0xAC, 0xA5, 0x1F, 0x69, 0x74, 0x12, 0x29, 0x2B, 0x21, 0x58, 0xF2, 0xDA, 0xE3, 0x25, 0x16, 0x09, 0x74, 0x40, 0x90, 0xAB, 0x1B, 0xE4, 0x06, 0x28, 0x77, 0xED, 0xC6, 0x16, 0x86, 0x0A, 0x27, 0xDD, 0x03, 0x01, 0x4D, 0x9A, 0x26, 0x6E, 0xC8, 0x9F, 0xD3, 0x9A, 0x4B, 0x59, 0xD1, 0x10, 0x9B, 0xEB, 0xA9, 0x58, 0x72, 0xBD, 0xA1, 0xFE, 0x9D, 0x86, 0xED, 0x29, 0xE9, 0x29, 0x49, 0x62, 0x4B, 0xD8, 0x7D, 0x2A, 0x7A, 0x66, 0x1B, 0xE5, 0x04, 0x81, 0x56, 0x10, 0x50, 0xAF, 0xB8, 0x48, 0x27, 0xC1, 0xC9, 0x46, 0xBD, 0x3F, 0x16, 0x06, 0xA5, 0x3D, 0x04, 0x9F, 0x0D, 0x54, 0x71, 0x1C, 0xF4, 0x82, 0xC0, 0x66, 0x74, 0xEA, 0x9C, 0x83, 0x3C, 0x27, 0x01, 0xDF, 0x6F, 0x56, 0xA8, 0x1B, 0xE3, 0x68, 0x55, 0x9F, 0xAB, 0x90, 0x67, 0x20, 0x25, 0xFA, 0x3D, 0x51, 0x2A, 0x23, 0x16, 0xCB, 0x06, 0x5A, 0xAD, 0xAC, 0xC8, 0x47, 0xF9, 0x39, 0x2E, 0x6A, 0xF8, 0xFA, 0x0A, 0xE8, 0x8A, 0x64, 0x84, 0x6B, 0xED, 0xDA, 0x8F, 0x2A, 0x08, 0x86, 0x8F, 0x56, 0x69, 0x64, 0xC3, 0x98, 0x55, 0x37, 0x9A, 0x48, 0x40, 0xDA, 0xD5, 0x03, 0x21 -}; - -static const unsigned char App_sdk4_AcexData[0x200] = -{ - 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6C, 0x64, 0x72, 0x3A, 0x72, 0x6F, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x9F, 0xFA, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0x21, 0x02, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 -}; - -static const unsigned char App_sdk4_AcexSig[0x100] = -{ - 0xDF, 0x1C, 0x8B, 0x98, 0xE4, 0x6F, 0xA2, 0x35, 0x6C, 0xC3, 0x18, 0x17, 0x98, 0xF3, 0xCE, 0x54, 0x7E, 0x14, 0x2E, 0x7F, 0x1E, 0xD8, 0x6D, 0xCF, 0xBC, 0x29, 0x4E, 0xFE, 0x32, 0x2E, 0xC1, 0x11, 0xAD, 0x46, 0x9A, 0xC6, 0x70, 0xEA, 0xEE, 0x28, 0x55, 0x22, 0xE1, 0x36, 0x05, 0x1C, 0x04, 0x8A, 0xCE, 0x0F, 0x0C, 0x83, 0x8F, 0xC8, 0xD6, 0xDE, 0x11, 0x8E, 0xEA, 0xCF, 0xAD, 0x9B, 0xCF, 0x81, 0x0D, 0xEB, 0x71, 0x13, 0xB3, 0xD3, 0xAE, 0x83, 0x02, 0x4C, 0x0E, 0x10, 0x50, 0x59, 0x3C, 0xEE, 0x60, 0x06, 0xFB, 0x8C, 0x7F, 0xC2, 0x20, 0x24, 0x01, 0x62, 0x55, 0x87, 0x60, 0x0F, 0xAD, 0xFA, 0x73, 0x2E, 0xF6, 0x65, 0x62, 0xD2, 0xE5, 0x10, 0x45, 0x69, 0x70, 0x39, 0x03, 0xD1, 0x39, 0xEC, 0x50, 0xC1, 0xD4, 0x25, 0x39, 0xB2, 0x90, 0x11, 0x4E, 0x95, 0xCB, 0x19, 0xEB, 0xCA, 0x0F, 0xB5, 0xFA, 0xC7, 0xB0, 0xE2, 0xD7, 0xE0, 0x71, 0xC3, 0xE5, 0x55, 0x33, 0x9E, 0x5C, 0xDC, 0x4D, 0x3B, 0x51, 0x11, 0x0D, 0x31, 0x78, 0x96, 0xCA, 0xD7, 0x18, 0x58, 0xEE, 0x00, 0xE9, 0x28, 0xF2, 0x68, 0x76, 0xD4, 0x57, 0xFE, 0x65, 0xB1, 0x4B, 0x49, 0x3F, 0xF6, 0xA6, 0x58, 0x4A, 0xC7, 0xFC, 0xC4, 0xBB, 0x61, 0xBC, 0x58, 0x8D, 0x55, 0x65, 0xE6, 0x0A, 0x79, 0x39, 0x41, 0xB8, 0x80, 0x61, 0xF7, 0x05, 0xC3, 0xFE, 0xD6, 0x8B, 0x09, 0x82, 0xC2, 0x5F, 0xA6, 0x56, 0xF9, 0xEE, 0x1D, 0x0E, 0x06, 0x3E, 0x9F, 0x3F, 0xF1, 0x93, 0x9A, 0x4F, 0xA2, 0xD5, 0x91, 0x87, 0x8A, 0xFE, 0xCF, 0xC3, 0xFC, 0x8A, 0xB1, 0xC4, 0x78, 0xE9, 0xD1, 0x1A, 0xF7, 0xB1, 0xD3, 0x20, 0xCB, 0x83, 0xBE, 0x03, 0xD5, 0xCA, 0xA5, 0x5E, 0x17, 0xA6, 0x91, 0x10, 0xD4, 0xBE, 0x23, 0xD6, 0x4B, 0x4F, 0x03, 0xA9, 0xAE -}; - -// DEMO -static const unsigned char Demo_sdk4_HdrPubK[0x100] = -{ - 0xB5, 0x11, 0x8D, 0x9E, 0x2D, 0xDB, 0x70, 0x6D, 0x6E, 0xEE, 0xAA, 0x21, 0xE0, 0x4E, 0x80, 0x0A, 0x96, 0x4A, 0x10, 0xD0, 0x9C, 0xD7, 0xD9, 0xD4, 0x94, 0x87, 0x72, 0xA2, 0xAF, 0x02, 0xA0, 0x05, 0x2E, 0xBF, 0x17, 0xEB, 0xFE, 0x5B, 0x9F, 0xB7, 0x0B, 0x1E, 0x3E, 0xF9, 0xAC, 0xBC, 0x7B, 0xB1, 0x56, 0x10, 0x24, 0x5F, 0x57, 0x2C, 0x08, 0xD0, 0x14, 0x79, 0x83, 0x84, 0x6A, 0x45, 0x25, 0xEB, 0xD9, 0xBE, 0x02, 0x21, 0xF7, 0x35, 0xC2, 0x74, 0x57, 0xC5, 0xAC, 0x34, 0x05, 0xC6, 0x9E, 0x82, 0xB8, 0xED, 0x78, 0xC4, 0x3B, 0xFD, 0x23, 0x59, 0x54, 0xD2, 0x0A, 0x0B, 0x5B, 0x25, 0xC0, 0x71, 0xC3, 0x84, 0x3A, 0xA7, 0xF9, 0x99, 0x86, 0xD8, 0xFE, 0x60, 0x10, 0x85, 0x77, 0x57, 0x76, 0x0C, 0x25, 0xE1, 0x18, 0x18, 0x3B, 0x83, 0xFD, 0x36, 0x7C, 0x84, 0x58, 0xC2, 0xC4, 0x68, 0x4F, 0xD1, 0xD7, 0x0A, 0x88, 0xFD, 0xCA, 0x97, 0xA1, 0xE5, 0xCE, 0x72, 0x63, 0xCF, 0x74, 0xD0, 0x20, 0xD9, 0xDE, 0x3F, 0xBB, 0x11, 0xF9, 0x21, 0xAB, 0x3F, 0x54, 0x41, 0xA7, 0xAA, 0xCA, 0xFC, 0xE1, 0x1A, 0x8C, 0x12, 0xC9, 0x39, 0x13, 0x5A, 0x81, 0x29, 0x49, 0xE8, 0xFB, 0x48, 0xC9, 0x4D, 0x50, 0x87, 0xAE, 0x51, 0xFB, 0x94, 0xFC, 0xF0, 0x9C, 0x70, 0x1C, 0xE8, 0x6E, 0x44, 0x53, 0x1E, 0x2F, 0x27, 0x5C, 0xB8, 0xEC, 0xBE, 0xFC, 0xD9, 0x98, 0x6A, 0x08, 0xD0, 0x5C, 0x4D, 0x78, 0x2D, 0x4D, 0x07, 0xAD, 0x5E, 0xB8, 0x51, 0x40, 0xE2, 0x2A, 0x7F, 0xB1, 0x54, 0x47, 0x5C, 0x99, 0x12, 0xC2, 0x6D, 0x5E, 0xED, 0x25, 0x30, 0x6A, 0x99, 0xC5, 0x0D, 0x65, 0x83, 0x68, 0x3A, 0xFD, 0x82, 0x59, 0x0D, 0xCE, 0x0B, 0x49, 0xBE, 0x17, 0x46, 0x51, 0xA9, 0xB6, 0x54, 0xE1, 0x18, 0xBD, 0x49, 0xE6, 0x7F -}; - -static const unsigned char Demo_sdk4_HdrPrivK[0x100] = -{ - 0x1D, 0x7B, 0x79, 0x32, 0xAB, 0x46, 0xD2, 0xBC, 0x8E, 0xD6, 0x7F, 0x8F, 0x3A, 0x85, 0xAD, 0xA5, 0x8B, 0xA9, 0x0D, 0xA9, 0xDA, 0x0F, 0xEF, 0x61, 0x04, 0xBA, 0x35, 0x39, 0x36, 0x03, 0xD8, 0x68, 0x5F, 0x9F, 0x2F, 0xD6, 0xF6, 0x38, 0x96, 0xFD, 0xE7, 0xEA, 0x89, 0xD8, 0x7F, 0x7E, 0xC5, 0x29, 0x2F, 0xD9, 0x3B, 0x02, 0xE7, 0x1F, 0xBD, 0x63, 0x9C, 0x21, 0xD8, 0xFF, 0x43, 0x8A, 0x74, 0xCD, 0x3D, 0x4C, 0x09, 0xEE, 0xDB, 0xE0, 0xBE, 0x03, 0xD1, 0x92, 0xD7, 0x22, 0x35, 0x5A, 0x8C, 0xCE, 0xBE, 0x2B, 0xB4, 0x81, 0x47, 0x3F, 0x45, 0x75, 0x33, 0x31, 0x6B, 0xFF, 0x43, 0x5D, 0x17, 0x43, 0xAE, 0xD1, 0x25, 0xF7, 0xD9, 0xD5, 0x5C, 0xB6, 0x92, 0x5C, 0xB3, 0xF3, 0xF7, 0x65, 0x9F, 0x4C, 0x05, 0x12, 0xEC, 0xA8, 0x6D, 0x70, 0x65, 0x57, 0x6C, 0xD8, 0xE3, 0xD6, 0xFA, 0xC1, 0xFD, 0x54, 0xE8, 0x34, 0x67, 0x4D, 0x0A, 0x14, 0x2F, 0xA3, 0xD4, 0x81, 0x8C, 0xC3, 0xD0, 0x8B, 0x09, 0x08, 0x90, 0x70, 0x68, 0xA0, 0x0E, 0xD1, 0x0B, 0xAA, 0x71, 0xEC, 0x9A, 0x1A, 0x83, 0xFF, 0xA1, 0x70, 0xEB, 0xAC, 0xF2, 0xE9, 0x80, 0xA1, 0xB8, 0x20, 0x31, 0x83, 0xF5, 0x37, 0x01, 0x72, 0x06, 0x50, 0x05, 0x3F, 0x14, 0xF9, 0x29, 0x48, 0x84, 0xA0, 0x0E, 0xF7, 0xB8, 0x1D, 0xA3, 0x36, 0x5A, 0x78, 0x6D, 0x83, 0x90, 0x27, 0xE3, 0x50, 0x49, 0x2F, 0x65, 0xE5, 0x61, 0xED, 0x65, 0xBE, 0xEA, 0x34, 0xA6, 0x6A, 0xEF, 0x49, 0xB4, 0xE0, 0xBC, 0xC2, 0xA5, 0xB8, 0xEB, 0xA9, 0x2F, 0xBA, 0x26, 0x76, 0xB2, 0x5A, 0x3A, 0x3B, 0xFD, 0xAD, 0xFB, 0xE4, 0x79, 0xE2, 0x85, 0x54, 0x5B, 0xAB, 0x1F, 0x0A, 0xE5, 0x8B, 0x77, 0x3A, 0x10, 0x98, 0x26, 0x74, 0xC8, 0xB0, 0x82, 0xB1, 0xF9, 0x8F, 0x68, 0x59 -}; - -static const unsigned char Demo_sdk4_AcexData[0x200] = -{ - 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6C, 0x64, 0x72, 0x3A, 0x72, 0x6F, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x9F, 0xFA, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0x21, 0x02, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 -}; - -static const unsigned char Demo_sdk4_AcexSig[0x100] = -{ - 0xD3, 0x7D, 0x42, 0xBA, 0x6A, 0x1E, 0xD8, 0x07, 0x3C, 0x4A, 0xC4, 0xCD, 0x8C, 0x68, 0x3D, 0xCD, 0xCD, 0xBD, 0x9D, 0xCE, 0xB5, 0x2A, 0xF9, 0x63, 0x3D, 0xA9, 0x54, 0x0A, 0x2E, 0x4C, 0xE1, 0x60, 0x4B, 0xD0, 0xC9, 0xEB, 0xEF, 0x31, 0x65, 0x70, 0xB9, 0x0E, 0x06, 0x3B, 0x3D, 0x42, 0x4C, 0x6E, 0x8D, 0x2C, 0xD4, 0x71, 0x29, 0x76, 0xB7, 0xDD, 0x8C, 0xDA, 0xE7, 0xE3, 0x96, 0xA7, 0xAA, 0xF8, 0xCA, 0x05, 0xE8, 0xA7, 0x0A, 0xDD, 0x01, 0x49, 0xBD, 0xF1, 0xA5, 0xE8, 0x16, 0x22, 0xEE, 0x47, 0x1F, 0xEF, 0x28, 0x48, 0x87, 0xA9, 0x2D, 0xFC, 0x4E, 0xD5, 0xA5, 0x98, 0xB1, 0xFE, 0x1B, 0xEB, 0xA9, 0x06, 0x3C, 0x76, 0xD9, 0xAA, 0x0E, 0x9C, 0x60, 0xFC, 0xE9, 0x77, 0x9D, 0x7F, 0x67, 0xAC, 0xF5, 0xC7, 0x49, 0x12, 0xFD, 0x76, 0xAC, 0xD2, 0x54, 0xDB, 0x73, 0x41, 0x10, 0x1F, 0x04, 0x3F, 0xD0, 0x6F, 0xE0, 0x80, 0x24, 0xCC, 0xEE, 0xBF, 0x25, 0x9D, 0x0D, 0x5A, 0x2A, 0x1C, 0xC5, 0xD4, 0xE3, 0x5D, 0x3A, 0xC1, 0x86, 0xD3, 0xD4, 0x52, 0x1C, 0x4C, 0xBF, 0x31, 0xEB, 0x54, 0xCA, 0x4C, 0x06, 0x50, 0x52, 0x87, 0xD4, 0x9D, 0x4A, 0x4B, 0x22, 0xE1, 0x4A, 0xE9, 0x4D, 0x05, 0xA8, 0x57, 0xEC, 0xF8, 0x90, 0xF8, 0x58, 0xC3, 0x8B, 0x3A, 0x0F, 0x88, 0x36, 0xF4, 0xE5, 0x44, 0x10, 0x80, 0x68, 0x86, 0x1D, 0xAE, 0x90, 0x20, 0x03, 0x22, 0x2D, 0x44, 0xBF, 0xAB, 0x2B, 0xA1, 0x14, 0xAD, 0x6B, 0x40, 0x57, 0xDB, 0xBB, 0xDA, 0x09, 0x4C, 0x51, 0x26, 0x9B, 0xE3, 0xD9, 0xF9, 0xE1, 0xBC, 0xF1, 0xF1, 0xCD, 0x30, 0xB4, 0xF5, 0x39, 0xD0, 0xBC, 0xF7, 0x98, 0x05, 0xAF, 0xA8, 0x33, 0x4B, 0xC1, 0x16, 0x0F, 0xF2, 0xC2, 0x79, 0x96, 0xEC, 0xBE, 0xA9, 0xF5, 0x55, 0x7C, 0x82, 0x95, 0x73 -}; - -// DLP -static const unsigned char Dlp_sdk4_HdrPubK[0x100] = -{ - 0xB3, 0x16, 0x68, 0xF1, 0xED, 0x59, 0xC8, 0x7F, 0xC6, 0x50, 0x21, 0xFE, 0x36, 0x7C, 0x55, 0xE7, 0x07, 0xF9, 0x1D, 0x1B, 0xF5, 0xB1, 0x2A, 0x6B, 0x3A, 0xDE, 0x2D, 0x4C, 0x51, 0xCD, 0x4C, 0x9F, 0xEE, 0x1D, 0xE4, 0xE8, 0xF0, 0xFD, 0x09, 0x8E, 0x0F, 0x92, 0x5F, 0xDB, 0x9C, 0x5C, 0x15, 0x55, 0x1A, 0x4D, 0x04, 0x8C, 0xB0, 0xA4, 0x88, 0x97, 0xC4, 0xD5, 0x92, 0x04, 0x42, 0x33, 0x84, 0x81, 0x06, 0xD6, 0xF2, 0x17, 0xDE, 0x83, 0x17, 0x50, 0xD0, 0x47, 0x61, 0x14, 0x0D, 0xB7, 0xC7, 0xA0, 0xC1, 0x8B, 0x82, 0x47, 0x13, 0xEE, 0x76, 0xA2, 0xA3, 0x8D, 0xCE, 0x55, 0xC1, 0xF3, 0x7A, 0xEA, 0x91, 0xE1, 0xB9, 0x2F, 0x8F, 0x9B, 0xC3, 0x7B, 0x51, 0x2F, 0xE7, 0xAD, 0x93, 0x9C, 0xFD, 0xDF, 0x19, 0xC8, 0x6C, 0x24, 0xC2, 0xE2, 0x91, 0x97, 0x1F, 0xEB, 0x4B, 0xD4, 0x46, 0x6C, 0x06, 0x93, 0xAF, 0xF5, 0x5E, 0x8F, 0x77, 0x25, 0xC4, 0x28, 0xC0, 0x82, 0x4A, 0x78, 0xE9, 0x14, 0x08, 0xC3, 0xC3, 0x58, 0x24, 0x44, 0x2D, 0x2B, 0xA7, 0xEE, 0x28, 0xEF, 0x1B, 0x6D, 0xAA, 0x9C, 0xED, 0x7F, 0x35, 0xCE, 0x86, 0x5C, 0x6B, 0x8A, 0x23, 0xD3, 0x9D, 0x05, 0x8F, 0xD2, 0x41, 0x93, 0x1D, 0x1D, 0x7E, 0xB0, 0x46, 0x23, 0x63, 0x07, 0xEA, 0x5F, 0x26, 0xE3, 0x81, 0x27, 0xB3, 0x95, 0xB1, 0x93, 0x59, 0xD4, 0x1A, 0xB8, 0x73, 0xD0, 0x09, 0x95, 0x2B, 0xE8, 0x8B, 0xE2, 0x73, 0x5F, 0x34, 0xB9, 0x98, 0x82, 0xF0, 0x11, 0xC6, 0x8F, 0x12, 0x4D, 0x09, 0x57, 0x10, 0x97, 0x22, 0x0E, 0xC8, 0x7D, 0x40, 0xC1, 0x9D, 0x12, 0x1F, 0x71, 0xFE, 0x1E, 0x1A, 0x8C, 0x3F, 0x56, 0xAC, 0x43, 0xC3, 0x66, 0x0C, 0x81, 0xAE, 0xC1, 0x8F, 0x68, 0xFF, 0x87, 0x07, 0x3C, 0xCD, 0x0A, 0x23, 0xDE, 0xBA, 0x9B -}; - -static const unsigned char Dlp_sdk4_HdrPrivK[0x100] = -{ - 0x77, 0xC2, 0x7A, 0xB7, 0x9E, 0x13, 0xB6, 0x62, 0xCC, 0x09, 0x76, 0x51, 0xFB, 0xB9, 0xB5, 0xF0, 0x63, 0x82, 0x91, 0x96, 0xCA, 0xFC, 0x88, 0xF3, 0x60, 0x50, 0x87, 0x56, 0x4C, 0x35, 0xD0, 0x11, 0xFB, 0x38, 0x7E, 0x85, 0xCF, 0xF2, 0x46, 0xDB, 0x7B, 0x4A, 0x55, 0x54, 0x15, 0x01, 0xF7, 0x3A, 0x0B, 0xF6, 0x89, 0x1E, 0x54, 0x5A, 0x13, 0x05, 0xFB, 0x19, 0x1F, 0x26, 0x3D, 0xE7, 0x19, 0xAA, 0xF7, 0x19, 0xF2, 0x97, 0x47, 0xB3, 0xBE, 0x79, 0xCA, 0x6E, 0x91, 0x5A, 0xC9, 0xB9, 0xA6, 0x83, 0xB8, 0x2A, 0x45, 0x1A, 0xA7, 0x17, 0x86, 0xBA, 0x48, 0x49, 0x62, 0x3C, 0x33, 0x11, 0x51, 0x97, 0x5F, 0xAA, 0xE5, 0x1E, 0x0B, 0x19, 0x0C, 0xE6, 0x80, 0x6A, 0x5A, 0xB1, 0xD6, 0xCE, 0xDB, 0x6E, 0xC0, 0x5D, 0x29, 0x04, 0x84, 0x56, 0xE3, 0x29, 0x7E, 0xAC, 0xE8, 0xEE, 0xB1, 0x91, 0x37, 0xEB, 0x98, 0x9C, 0xBD, 0x02, 0x6A, 0x78, 0x61, 0xB0, 0x79, 0x1A, 0x9F, 0x30, 0x86, 0xF6, 0x71, 0x5A, 0x5A, 0x12, 0xA1, 0x9E, 0xA1, 0x68, 0x03, 0xE5, 0x95, 0xA8, 0x38, 0x58, 0x87, 0x08, 0x57, 0x35, 0x32, 0x47, 0x3B, 0xFC, 0x02, 0x6F, 0xCE, 0x55, 0x61, 0xA3, 0x2A, 0x6B, 0x2F, 0xF8, 0xEE, 0x8D, 0xFA, 0x43, 0x33, 0x02, 0x63, 0x47, 0x02, 0x78, 0x5A, 0x7F, 0x64, 0x07, 0x92, 0xB7, 0x7C, 0x09, 0x7C, 0xFE, 0x2D, 0x1C, 0xFC, 0x77, 0x9F, 0x19, 0x20, 0xDD, 0x6D, 0x4C, 0xFE, 0x49, 0x09, 0x47, 0xCA, 0x9B, 0x1C, 0x8C, 0x1F, 0x37, 0xAC, 0x14, 0x85, 0x56, 0xC0, 0xFD, 0xD6, 0x01, 0xB3, 0x40, 0xA3, 0x1A, 0x32, 0x78, 0xA0, 0xDD, 0x21, 0x75, 0xBF, 0x24, 0xD2, 0x93, 0x85, 0xED, 0x22, 0xAD, 0x99, 0x91, 0x87, 0x4A, 0xEC, 0xC0, 0x6C, 0x71, 0x00, 0x76, 0x08, 0x23, 0xA2, 0xF3, 0xCF, 0x61 -}; - -static const unsigned char Dlp_sdk4_AcexData[0x200] = -{ - 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x50, 0x54, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x6C, 0x64, 0x72, 0x3A, 0x72, 0x6F, 0x00, 0x00, 0x69, 0x72, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x9F, 0xFA, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0x21, 0x02, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 -}; - -static const unsigned char Dlp_sdk4_AcexSig[0x100] = -{ - 0xAC, 0xE2, 0xA7, 0xC3, 0x00, 0xDE, 0xE8, 0xE9, 0xE0, 0x03, 0xB3, 0x54, 0x08, 0xA8, 0xF8, 0x3A, 0x2E, 0xD8, 0x10, 0x6B, 0xEC, 0xDC, 0x4E, 0xEE, 0x62, 0x10, 0x71, 0x49, 0xD4, 0x43, 0xB1, 0x0E, 0x6B, 0x8C, 0xD7, 0x54, 0xD5, 0x62, 0x28, 0x3F, 0xAA, 0xDE, 0xA9, 0x7D, 0xED, 0x37, 0x7C, 0xE7, 0x89, 0x0B, 0x02, 0xB2, 0x72, 0x4B, 0x17, 0xDB, 0xE2, 0xD3, 0x7C, 0x94, 0x12, 0x3F, 0x2E, 0xA1, 0x08, 0x99, 0xCC, 0x7F, 0x93, 0xE6, 0x38, 0xC9, 0x37, 0x84, 0xD7, 0x11, 0x9D, 0x02, 0x4D, 0x66, 0xB4, 0x70, 0x9F, 0xD8, 0xC6, 0xDD, 0xD5, 0x13, 0x52, 0xF0, 0xA6, 0x78, 0x8C, 0x8E, 0x15, 0xA0, 0xA1, 0xF3, 0xC4, 0xC3, 0x48, 0x45, 0xA5, 0xBE, 0xC9, 0x7A, 0x8B, 0xD3, 0x95, 0xA5, 0x4C, 0xF1, 0xB3, 0x0C, 0x6C, 0x76, 0xA7, 0x57, 0xA1, 0x77, 0xDF, 0x2F, 0xC8, 0x06, 0xA6, 0x0D, 0x1A, 0x09, 0xE4, 0x38, 0x64, 0x07, 0xBE, 0x6A, 0xD2, 0xA0, 0xC0, 0xEC, 0x09, 0x64, 0x9F, 0x0D, 0x93, 0x0C, 0x89, 0xA2, 0x71, 0xD6, 0xC6, 0xC2, 0x54, 0x79, 0x2A, 0xA4, 0x31, 0x28, 0x24, 0x1A, 0xF3, 0x56, 0x78, 0x63, 0x99, 0x97, 0xA5, 0xCE, 0x8F, 0x52, 0x7A, 0x79, 0x51, 0xEE, 0x4C, 0x8B, 0x00, 0x9D, 0x5C, 0x3E, 0xD5, 0xAA, 0x24, 0x9C, 0x94, 0xC6, 0xA3, 0x99, 0x1B, 0x2D, 0xD4, 0xFF, 0xB4, 0x25, 0x73, 0x13, 0x33, 0x9F, 0x03, 0x6F, 0x1E, 0x75, 0xC4, 0x70, 0xF4, 0x07, 0x4F, 0x18, 0xFE, 0xBD, 0x8F, 0x2C, 0x9B, 0x33, 0xD4, 0x30, 0xA7, 0x18, 0x4A, 0xF1, 0xA4, 0xDD, 0x78, 0x41, 0xA0, 0xB8, 0x02, 0x8D, 0x51, 0x96, 0xBE, 0xE7, 0x17, 0x94, 0x66, 0x65, 0x27, 0xF7, 0x69, 0x48, 0x7E, 0xA9, 0x08, 0x71, 0x20, 0x76, 0xB7, 0x8E, 0xD2, 0xBF, 0x5C, 0x7E, 0x5E, 0x06, 0x45, 0xAB, 0x7E, 0x2E -}; - - -/* SDK 7 (7.1.0) */ -static const unsigned char sdk7_dep_list[0x180] = -{ - 0x02, 0x24, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x38, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x15, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x34, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x16, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x26, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x17, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x18, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x27, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x28, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1A, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x32, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x29, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x33, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x1F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x20, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2B, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x35, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2C, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2D, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x21, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x31, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x22, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x37, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2E, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x23, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x02, 0x2F, 0x00, 0x00, 0x30, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -// APP -static const unsigned char App_sdk7_HdrPubK[0x100] = -{ - 0x9B, 0x3B, 0x52, 0x2D, 0x61, 0xF5, 0x0D, 0x14, - 0x96, 0x09, 0x7A, 0x66, 0xC9, 0x86, 0x4C, 0x51, - 0x61, 0x7D, 0xF8, 0x9B, 0xFD, 0xB0, 0x3E, 0x44, - 0xC5, 0x0D, 0xC2, 0x6B, 0x6C, 0x66, 0x63, 0x3E, - 0xE7, 0xC8, 0x04, 0xCB, 0x06, 0xC8, 0x35, 0xC5, - 0x6D, 0xDB, 0x38, 0x36, 0xC5, 0x54, 0x32, 0xF0, - 0x60, 0x11, 0x44, 0x9F, 0xD9, 0xFA, 0x6A, 0x43, - 0xE1, 0x79, 0x56, 0xBF, 0xCF, 0xDD, 0xA8, 0x35, - 0x15, 0x23, 0x51, 0xF9, 0x4B, 0xDA, 0x1A, 0xD9, - 0x9D, 0x28, 0xF6, 0xCC, 0x1D, 0x53, 0x00, 0xC0, - 0x3C, 0x13, 0x32, 0xBC, 0x7F, 0x75, 0x82, 0xCD, - 0x79, 0xEF, 0x65, 0xBC, 0xCA, 0x98, 0x31, 0x0A, - 0x7B, 0xEF, 0x18, 0xD8, 0xF3, 0x8D, 0x3A, 0x10, - 0x22, 0xA0, 0xF2, 0x8D, 0xA5, 0xA8, 0xBE, 0xA0, - 0x62, 0xEC, 0xE2, 0xC7, 0x6C, 0xCF, 0x06, 0x6B, - 0xA7, 0xB5, 0xB8, 0x8C, 0xD5, 0x8E, 0xEF, 0xE3, - 0x42, 0xC9, 0xAD, 0x44, 0x46, 0x3A, 0x4E, 0x77, - 0x63, 0x02, 0xB4, 0x4E, 0xB4, 0x42, 0x65, 0x1D, - 0x68, 0x98, 0x37, 0x7A, 0x27, 0x87, 0x31, 0xBE, - 0x48, 0xFA, 0x4E, 0xD3, 0x85, 0xA6, 0xD6, 0xD2, - 0x2D, 0xCD, 0x10, 0xC9, 0x13, 0x59, 0x12, 0x48, - 0x14, 0x67, 0x3E, 0x40, 0xD3, 0xF8, 0x60, 0xA0, - 0xBD, 0x77, 0x31, 0x76, 0x78, 0x85, 0x55, 0x53, - 0x16, 0xF1, 0xB9, 0xFF, 0x7F, 0x3D, 0x9A, 0xF1, - 0x33, 0x1E, 0x67, 0x8F, 0x6B, 0x4A, 0x7A, 0x79, - 0x54, 0x8B, 0x43, 0xB5, 0xC2, 0xAF, 0xB8, 0x75, - 0x11, 0xDE, 0x4D, 0x34, 0x6A, 0xD6, 0x5A, 0x3B, - 0x48, 0x1F, 0x41, 0x9D, 0xF4, 0x58, 0x90, 0x67, - 0xA8, 0x71, 0xD4, 0x09, 0x67, 0xF7, 0x55, 0xEF, - 0xD3, 0x7C, 0x7D, 0x2F, 0x76, 0x84, 0x70, 0x6E, - 0xAA, 0x75, 0x7D, 0xA9, 0x95, 0x42, 0xEF, 0x28, - 0x29, 0x48, 0xCD, 0x79, 0xA8, 0x16, 0xB6, 0xB5 -}; - -static const unsigned char App_sdk7_AcexData[0x200] = -{ - 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, - 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x24, 0x68, 0x69, 0x6F, 0x46, 0x49, 0x4F, 0x00, - 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x30, - 0x24, 0x68, 0x6F, 0x73, 0x74, 0x69, 0x6F, 0x31, - 0x63, 0x66, 0x67, 0x3A, 0x75, 0x00, 0x00, 0x00, - 0x66, 0x73, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, - 0x67, 0x73, 0x70, 0x3A, 0x3A, 0x47, 0x70, 0x75, - 0x68, 0x69, 0x64, 0x3A, 0x55, 0x53, 0x45, 0x52, - 0x6E, 0x64, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, - 0x70, 0x78, 0x69, 0x3A, 0x64, 0x65, 0x76, 0x00, - 0x41, 0x50, 0x54, 0x3A, 0x41, 0x00, 0x00, 0x00, - 0x61, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, 0x00, - 0x61, 0x63, 0x74, 0x3A, 0x75, 0x00, 0x00, 0x00, - 0x61, 0x6D, 0x3A, 0x61, 0x70, 0x70, 0x00, 0x00, - 0x62, 0x6F, 0x73, 0x73, 0x3A, 0x55, 0x00, 0x00, - 0x63, 0x61, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, - 0x63, 0x65, 0x63, 0x64, 0x3A, 0x75, 0x00, 0x00, - 0x64, 0x6C, 0x70, 0x3A, 0x46, 0x4B, 0x43, 0x4C, - 0x64, 0x6C, 0x70, 0x3A, 0x53, 0x52, 0x56, 0x52, - 0x64, 0x73, 0x70, 0x3A, 0x3A, 0x44, 0x53, 0x50, - 0x66, 0x72, 0x64, 0x3A, 0x75, 0x00, 0x00, 0x00, - 0x68, 0x74, 0x74, 0x70, 0x3A, 0x43, 0x00, 0x00, - 0x69, 0x72, 0x3A, 0x55, 0x53, 0x45, 0x52, 0x00, - 0x6C, 0x64, 0x72, 0x3A, 0x72, 0x6F, 0x00, 0x00, - 0x6D, 0x69, 0x63, 0x3A, 0x75, 0x00, 0x00, 0x00, - 0x6E, 0x65, 0x77, 0x73, 0x3A, 0x75, 0x00, 0x00, - 0x6E, 0x69, 0x6D, 0x3A, 0x61, 0x6F, 0x63, 0x00, - 0x6E, 0x77, 0x6D, 0x3A, 0x3A, 0x55, 0x44, 0x53, - 0x70, 0x74, 0x6D, 0x3A, 0x75, 0x00, 0x00, 0x00, - 0x73, 0x6F, 0x63, 0x3A, 0x55, 0x00, 0x00, 0x00, - 0x73, 0x73, 0x6C, 0x3A, 0x43, 0x00, 0x00, 0x00, - 0x79, 0x32, 0x72, 0x3A, 0x75, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4E, 0x9F, 0xFA, 0xF0, 0xFF, 0xBF, 0xFF, 0xF1, - 0xE7, 0x3F, 0x00, 0xF2, 0x00, 0xF0, 0x91, 0xFF, - 0x00, 0xF6, 0x91, 0xFF, 0x50, 0xFF, 0x81, 0xFF, - 0x58, 0xFF, 0x81, 0xFF, 0x70, 0xFF, 0x81, 0xFF, - 0x78, 0xFF, 0x81, 0xFF, 0x01, 0x01, 0x00, 0xFF, - 0x00, 0x02, 0x00, 0xFE, 0x27, 0x02, 0x00, 0xFC, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 -}; - -static const unsigned char App_sdk7_AcexSig[0x100] = -{ - 0x06, 0xDD, 0x68, 0x17, 0xAA, 0x40, 0x3A, 0x75, - 0xD2, 0xCF, 0xA2, 0x5A, 0xC8, 0x1B, 0x74, 0x9D, - 0x91, 0xCD, 0x38, 0x4E, 0xCA, 0x19, 0x60, 0x8E, - 0x39, 0x71, 0x6C, 0xB9, 0xF9, 0x9F, 0x68, 0x44, - 0xCF, 0x33, 0x94, 0x54, 0x72, 0xCC, 0xC6, 0x33, - 0x96, 0x9F, 0x12, 0x07, 0xE9, 0x38, 0x87, 0x70, - 0x11, 0x51, 0xFD, 0xBF, 0xD9, 0x2D, 0xFA, 0x3F, - 0x70, 0x42, 0x75, 0x39, 0xE3, 0x97, 0x85, 0xAF, - 0x7B, 0xC5, 0x87, 0x9B, 0x0B, 0xF9, 0xE4, 0x1C, - 0xC5, 0x6B, 0x44, 0x2A, 0x10, 0x14, 0x86, 0xAA, - 0xFE, 0x9E, 0x5B, 0x1D, 0x15, 0xBA, 0x8C, 0x34, - 0xA2, 0xAF, 0x14, 0xD0, 0xD4, 0x0E, 0x7B, 0x3A, - 0xD5, 0x3C, 0x53, 0xDB, 0x7C, 0xBE, 0x44, 0x58, - 0x79, 0x42, 0x23, 0x3A, 0x77, 0xA3, 0x2C, 0xB9, - 0xEB, 0x62, 0x19, 0x94, 0x2B, 0xA0, 0x67, 0x94, - 0xC6, 0xB2, 0x90, 0xC6, 0x61, 0xFD, 0x43, 0xEC, - 0xEA, 0x27, 0x7E, 0xA6, 0xB1, 0xED, 0xA9, 0x67, - 0xED, 0x56, 0x91, 0x90, 0xF9, 0x32, 0x4E, 0xC3, - 0x29, 0x5A, 0x84, 0x4C, 0xAB, 0x99, 0x75, 0x40, - 0x8E, 0x19, 0xD9, 0x12, 0xD1, 0x06, 0x2D, 0xD0, - 0x2C, 0xD9, 0x6C, 0x41, 0x35, 0x64, 0xDB, 0x80, - 0x63, 0xB2, 0x01, 0xF8, 0x29, 0xAB, 0xF5, 0x70, - 0x79, 0x4E, 0x0F, 0xFA, 0x23, 0x20, 0x2E, 0x04, - 0x75, 0x48, 0x15, 0x9B, 0x71, 0xD5, 0x85, 0x09, - 0x67, 0x7D, 0xAC, 0x6A, 0xFA, 0xC0, 0x16, 0xAF, - 0x58, 0x26, 0xCD, 0x6F, 0x1F, 0xB8, 0xF5, 0x8D, - 0xD1, 0x7D, 0x3D, 0x70, 0x2F, 0x08, 0xB8, 0x23, - 0x61, 0x24, 0xAE, 0x94, 0x31, 0xA3, 0xBD, 0x1E, - 0x18, 0xD7, 0x82, 0x92, 0xDD, 0x11, 0x79, 0x7D, - 0x1F, 0xEC, 0x03, 0x08, 0x82, 0xCC, 0x52, 0x62, - 0xC9, 0x27, 0x2D, 0x08, 0xD5, 0x6B, 0x4E, 0x86, - 0x2E, 0x3F, 0x50, 0x5C, 0xA3, 0xC1, 0xDF, 0xF5, -}; - -#endif \ No newline at end of file diff --git a/blz.c b/blz.c deleted file mode 100644 index 8fc2355..0000000 --- a/blz.c +++ /dev/null @@ -1,336 +0,0 @@ -/*----------------------------------------------------------------------------*/ -/*-- blz.c - Bottom LZ coding for Nintendo GBA/DS --*/ -/*-- Copyright (C) 2011 CUE --*/ -/*-- --*/ -/*-- This program is free software: you can redistribute it and/or modify --*/ -/*-- it under the terms of the GNU General Public License as published by --*/ -/*-- the Free Software Foundation, either version 3 of the License, or --*/ -/*-- (at your option) any later version. --*/ -/*-- --*/ -/*-- This program is distributed in the hope that it will be useful, --*/ -/*-- but WITHOUT ANY WARRANTY; without even the implied warranty of --*/ -/*-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --*/ -/*-- GNU General Public License for more details. --*/ -/*-- --*/ -/*-- You should have received a copy of the GNU General Public License --*/ -/*-- along with this program. If not, see . --*/ -/*----------------------------------------------------------------------------*/ - -/*----------------------------------------------------------------------------*/ -#include "lib.h" -#include "blz.h" - -/*----------------------------------------------------------------------------*/ -#define CMD_DECODE 0x00 // decode -#define CMD_ENCODE 0x01 // encode - -#define BLZ_SHIFT 1 // bits to shift -#define BLZ_MASK 0x80 // bits to check: - // ((((1 << BLZ_SHIFT) - 1) << (8 - BLZ_SHIFT) - -#define BLZ_THRESHOLD 2 // max number of bytes to not encode -#define BLZ_N 0x1002 // max offset ((1 << 12) + 2) -#define BLZ_F 0x12 // max coded ((1 << 4) + BLZ_THRESHOLD) - -#define RAW_MINIM 0x00000000 // empty file, 0 bytes -#define RAW_MAXIM 0x00FFFFFF // 3-bytes length, 16MB - 1 - -#define BLZ_MINIM 0x00000004 // header only (empty RAW file) -#define BLZ_MAXIM 0x01400000 // 0x0120000A, padded to 20MB: - // * length, RAW_MAXIM - // * flags, (RAW_MAXIM + 7) / 8 - // * header, 11 - // 0x00FFFFFF + 0x00200000 + 12 + padding - -/*----------------------------------------------------------------------------*/ -#define BREAK(text) { printf(text); return; } -#define EXIT(text) { printf(text); exit(-1); } - -/*----------------------------------------------------------------------------*/ -u8 *Memory(int length, int size); - -u8 *BLZ_Code(u8 *raw_buffer, int raw_len, u32 *new_len, int best); -void BLZ_Invert(u8 *buffer, int length); - -/*----------------------------------------------------------------------------*/ -u8 *Memory(int length, int size) { - u8 *fb; - - fb = (u8 *) calloc(length * size, size); - if (fb == NULL) EXIT("\nMemory error\n"); - - return(fb); -} - -/*----------------------------------------------------------------------------*/ -void BLZ_Decode(char *filename) { - // u8 *pak_buffer, *raw_buffer, *pak, *raw, *pak_end, *raw_end; - // u32 pak_len, raw_len, len, pos, inc_len, hdr_len, enc_len, dec_len; - // u8 flags, mask; - - // printf("- decoding '%s'", filename); - - // // pak_buffer = Load(filename, &pak_len, BLZ_MINIM, BLZ_MAXIM); - - // inc_len = *(u32 *)(pak_buffer + pak_len - 4); - // if (!inc_len) { - // enc_len = 0; - // dec_len = pak_len - 4; - // pak_len = 0; - // raw_len = dec_len; - // } else { - // if (pak_len < 8) EXIT("File has a bad header\n"); - // hdr_len = pak_buffer[pak_len - 5]; - // if ((hdr_len < 0x08) || (hdr_len > 0x0B)) EXIT("Bad header length\n"); - // if (pak_len <= hdr_len) EXIT("Bad length\n"); - // enc_len = *(u32 *)(pak_buffer + pak_len - 8) & 0x00FFFFFF; - // dec_len = pak_len - enc_len; - // pak_len = enc_len - hdr_len; - // raw_len = dec_len + enc_len + inc_len; - // if (raw_len > RAW_MAXIM) EXIT("Bad decoded length\n"); - // } - - // raw_buffer = (u8 *) Memory(raw_len, sizeof(char)); - - // pak = pak_buffer; - // raw = raw_buffer; - // pak_end = pak_buffer + dec_len + pak_len; - // raw_end = raw_buffer + raw_len; - - // for (len = 0; len < dec_len; len++) *(raw++) = *(pak++); - - // BLZ_Invert(pak_buffer + dec_len, pak_len); - - // mask = 0; - - // while (raw < raw_end) { - // if (!(mask >>= BLZ_SHIFT)) { - // if (pak == pak_end) break; - // flags = *pak++; - // mask = BLZ_MASK; - // } - - // if (!(flags & mask)) { - // if (pak == pak_end) break; - // *raw++ = *pak++; - // } else { - // if (pak + 1 >= pak_end) break; - // pos = *pak++ << 8; - // pos |= *pak++; - // len = (pos >> 12) + BLZ_THRESHOLD + 1; - // if (raw + len > raw_end) { - // printf(", WARNING: wrong decoded length!"); - // len = raw_end - raw; - // } - // pos = (pos & 0xFFF) + 3; - // while (len--) *(raw++) = *(raw - pos); - // } - // } - - // BLZ_Invert(raw_buffer + dec_len, raw_len - dec_len); - - // raw_len = raw - raw_buffer; - - // if (raw != raw_end) printf(", WARNING: unexpected end of encoded file!"); - - // // Save(filename, raw_buffer, raw_len); - - // free(raw_buffer); - // free(pak_buffer); - - // printf("\n"); -} - -u8 *Load(char *filename, u32 *length, int min, int max) { - FILE *fp; - int fs; - u8 *fb; - - if ((fp = fopen(filename, "rb")) == NULL) EXIT("\nFile open error\n"); - fseek(fp, 0, SEEK_END); - fs = ftell(fp); - fseek(fp, 0, SEEK_SET); - if ((fs < min) || (fs > max)) EXIT("\nFile size error\n"); - fb = Memory(fs + 3, sizeof(char)); - if (fread(fb, 1, fs, fp) != fs) EXIT("\nFile read error\n"); - if (fclose(fp) == EOF) EXIT("\nFile close error\n"); - - *length = fs; - - return(fb); -} - -/*----------------------------------------------------------------------------*/ -u8* BLZ_Encode(char *filename, u32* pak_len, int mode) { - u8 *raw_buffer, *pak_buffer, *new_buffer; - u32 raw_len, new_len; - - raw_buffer = Load(filename, &raw_len, RAW_MINIM, RAW_MAXIM); - - pak_buffer = NULL; - *pak_len = BLZ_MAXIM + 1; - - new_buffer = BLZ_Code(raw_buffer, raw_len, &new_len, mode); - if (new_len < *pak_len) { - if (pak_buffer != NULL) free(pak_buffer); - pak_buffer = new_buffer; - *pak_len = new_len; - } - - return pak_buffer; -} - -/*----------------------------------------------------------------------------*/ -u8 *BLZ_Code(u8 *raw_buffer, int raw_len, u32 *new_len, int best) { - u8 *pak_buffer, *pak, *raw, *raw_end, *flg, *tmp; - u32 pak_len, inc_len, hdr_len, enc_len, len, pos, max; - u32 len_best, pos_best, len_next, pos_next, len_post, pos_post; - u32 pak_tmp, raw_tmp; - u8 mask; - -#define SEARCH(l,p) { \ - l = BLZ_THRESHOLD; \ - \ - max = raw - raw_buffer >= BLZ_N ? BLZ_N : raw - raw_buffer; \ - for (pos = 3; pos <= max; pos++) { \ - for (len = 0; len < BLZ_F; len++) { \ - if (raw + len == raw_end) break; \ - if (len >= pos) break; \ - if (*(raw + len) != *(raw + len - pos)) break; \ - } \ - \ - if (len > l) { \ - p = pos; \ - if ((l = len) == BLZ_F) break; \ - } \ - } \ -} - - pak_tmp = 0; - raw_tmp = raw_len; - - pak_len = raw_len + ((raw_len + 7) / 8) + 11; - pak_buffer = (u8 *) Memory(pak_len, sizeof(char)); - - BLZ_Invert(raw_buffer, raw_len); - - pak = pak_buffer; - raw = raw_buffer; - raw_end = raw_buffer + raw_len; - - mask = 0; - - while (raw < raw_end) { - if (!(mask >>= BLZ_SHIFT)) { - *(flg = pak++) = 0; - mask = BLZ_MASK; - } - - SEARCH(len_best, pos_best); - - // LZ-CUE optimization start - if (best) { - if (len_best > BLZ_THRESHOLD) { - if (raw + len_best < raw_end) { - raw += len_best; - SEARCH(len_next, pos_next); - raw -= len_best - 1; - SEARCH(len_post, pos_post); - raw--; - - if (len_next <= BLZ_THRESHOLD) len_next = 1; - if (len_post <= BLZ_THRESHOLD) len_post = 1; - - if (len_best + len_next <= 1 + len_post) len_best = 1; - } - } - } - // LZ-CUE optimization end - - *flg <<= 1; - if (len_best > BLZ_THRESHOLD) { - raw += len_best; - *flg |= 1; - *pak++ = ((len_best - (BLZ_THRESHOLD+1)) << 4) | ((pos_best - 3) >> 8); - *pak++ = (pos_best - 3) & 0xFF; - } else { - *pak++ = *raw++; - } - - if (pak - pak_buffer + raw_len - (raw - raw_buffer) < pak_tmp + raw_tmp) { - pak_tmp = pak - pak_buffer; - raw_tmp = raw_len - (raw - raw_buffer); - } - } - - while (mask && (mask != 1)) { - mask >>= BLZ_SHIFT; - *flg <<= 1; - } - - pak_len = pak - pak_buffer; - - BLZ_Invert(raw_buffer, raw_len); - BLZ_Invert(pak_buffer, pak_len); - - if (!pak_tmp || (raw_len + 4 < ((pak_tmp + raw_tmp + 3) & -4) + 8)) { - pak = pak_buffer; - raw = raw_buffer; - raw_end = raw_buffer + raw_len; - - while (raw < raw_end) *pak++ = *raw++; - - while ((pak - pak_buffer) & 3) *pak++ = 0; - - *(u32 *)pak = 0; pak += 4; - } else { - tmp = (u8 *) Memory(raw_tmp + pak_tmp + 11, sizeof(char)); - - for (len = 0; len < raw_tmp; len++) - tmp[len] = raw_buffer[len]; - - for (len = 0; len < pak_tmp; len++) - tmp[raw_tmp + len] = pak_buffer[len + pak_len - pak_tmp]; - - pak = pak_buffer; - pak_buffer = tmp; - - free(pak); - - pak = pak_buffer + raw_tmp + pak_tmp; - - enc_len = pak_tmp; - hdr_len = 8; - inc_len = raw_len - pak_tmp - raw_tmp; - - while ((pak - pak_buffer) & 3) { - *pak++ = 0xFF; - hdr_len++; - } - - *(u32 *)pak = enc_len + hdr_len; pak += 3; - *pak++ = hdr_len; - *(u32 *)pak = inc_len - hdr_len; pak += 4; - } - - *new_len = pak - pak_buffer; - - return(pak_buffer); -} - -/*----------------------------------------------------------------------------*/ -void BLZ_Invert(u8 *buffer, int length) { - u8 *bottom, ch; - - bottom = buffer + length - 1; - - while (buffer < bottom) { - ch = *buffer; - *buffer++ = *bottom; - *bottom-- = ch; - } -} - -/*----------------------------------------------------------------------------*/ -/*-- EOF Copyright (C) 2011 CUE --*/ -/*----------------------------------------------------------------------------*/ diff --git a/blz.h b/blz.h deleted file mode 100644 index d91ab4e..0000000 --- a/blz.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _BLZ_H_ -#define _BLZ_H_ - -#define BLZ_NORMAL 0 // normal mode -#define BLZ_BEST 1 // best mode - -u8 *BLZ_Code(u8 *raw_buffer, int raw_len, u32 *new_len, int best); - -#endif diff --git a/certs.c b/certs.c deleted file mode 100644 index 5cec50a..0000000 --- a/certs.c +++ /dev/null @@ -1,139 +0,0 @@ -#include "lib.h" -#include "certs.h" - -// Cert Sizes - -u32 GetCertSize(u8 *cert) -{ - u32 SigSize = 0; - u32 SigPadding = 0; - GetCertSigSectionSizes(&SigSize,&SigPadding,cert); - if(!SigSize || !SigPadding) return 0; - - Cert_Struct *certcore = (Cert_Struct*)(cert+4+SigSize+SigPadding); - - u32 PubKSectionSize = GetCertPubkSectionSize((pubk_types)u8_to_u32(certcore->KeyType,BE)); - - return (4+SigSize+SigPadding+sizeof(Cert_Struct)+PubKSectionSize); -} - -void GetCertSigSectionSizes(u32 *SigSize, u32 *SigPadding, u8 *cert) -{ - sig_types sig = (sig_types)u8_to_u32(cert,BE); - switch(sig){ - case RSA_4096_SHA1 : - *SigSize = 0x200; - *SigPadding = 0x3C; - break; - case RSA_2048_SHA1 : - *SigSize = 0x100; - *SigPadding = 0x3C; - break; - case ECC_SHA1 : - *SigSize = 0x3C; - *SigPadding = 0x40; - break; - case RSA_4096_SHA256 : - *SigSize = 0x200; - *SigPadding = 0x3C; - break; - case RSA_2048_SHA256 : - *SigSize = 0x100; - *SigPadding = 0x3C; - break; - case ECC_SHA256 : - *SigSize = 0x3C; - *SigPadding = 0x40; - break; - default : - *SigSize = 0; - *SigPadding = 0; - break; - } - return; -} - -u32 GetCertPubkSectionSize(pubk_types type) -{ - switch(type){ - case RSA_4096_PUBK : return sizeof(rsa_4096_pubk_struct); - case RSA_2048_PUBK : return sizeof(rsa_2048_pubk_struct); - case ECC_PUBK : return sizeof(ecc_pubk_struct); - default : return 0; - } -} - -// Issuer/Name Functions -u8 *GetCertIssuer(u8 *cert) -{ - u32 SigSize = 0; - u32 SigPadding = 0; - GetCertSigSectionSizes(&SigSize,&SigPadding,cert); - if(!SigSize || !SigPadding) return 0; - - Cert_Struct *certcore = (Cert_Struct*)(cert+4+SigSize+SigPadding); - return certcore->Issuer; -} -u8 *GetCertName(u8 *cert) -{ - u32 SigSize = 0; - u32 SigPadding = 0; - GetCertSigSectionSizes(&SigSize,&SigPadding,cert); - if(!SigSize || !SigPadding) return 0; - - Cert_Struct *certcore = (Cert_Struct*)(cert+4+SigSize+SigPadding); - return certcore->Name; -} - -int GenCertChildIssuer(u8 *dest, u8 *cert) -{ - u8 *Issuer = GetCertIssuer(cert); - u8 *Name = GetCertName(cert); - - u32 out_size = strlen((char*)Issuer) + strlen((char*)Name) + 1; - if(out_size > 0x40) return MEM_ERROR; - - memcpy(dest,Issuer,strlen((char*)Issuer)); - dest[strlen((char*)Issuer)] = '-'; - memcpy((dest+strlen((char*)Issuer)+1),Name,strlen((char*)Name)); - return 0; -} - -// Pubk -pubk_types GetCertPubkType(u8 *cert) -{ - u32 SigSize = 0; - u32 SigPadding = 0; - GetCertSigSectionSizes(&SigSize,&SigPadding,cert); - if(!SigSize || !SigPadding) return 0; - - Cert_Struct *certcore = (Cert_Struct*)(cert+4+SigSize+SigPadding); - - return (pubk_types)u8_to_u32(certcore->KeyType,BE); -} -u8 *GetCertPubk(u8 *cert) -{ - u32 SigSize = 0; - u32 SigPadding = 0; - GetCertSigSectionSizes(&SigSize,&SigPadding,cert); - if(!SigSize || !SigPadding) return 0; - return (cert+4+SigSize+SigPadding+sizeof(Cert_Struct)); -} - -bool VerifyCert(u8 *cert, u8 *pubk) -{ - u32 SigSize = 0; - u32 SigPadding = 0; - GetCertSigSectionSizes(&SigSize,&SigPadding,cert); - if(!SigSize || !SigPadding) return 0; - - - u8 *signature = (cert+4); - u8 *data = (cert+4+SigSize+SigPadding); - u32 datasize = sizeof(Cert_Struct) + GetCertPubkSectionSize(GetCertPubkType(cert)); - - int result = ctr_sig(data,datasize,signature,pubk,NULL,u8_to_u32(cert,BE),CTR_RSA_VERIFY); - - if(result == 0) return true; - else return false; -} \ No newline at end of file diff --git a/certs.h b/certs.h deleted file mode 100644 index 3d8ef47..0000000 --- a/certs.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef _CERTS_H_ -#define _CERTS_H_ - -typedef struct -{ - u8 Issuer[0x40]; - u8 KeyType[4]; - u8 Name[0x40]; - u8 Unknown[4]; -} Cert_Struct; - -typedef struct -{ - u8 Modulus[0x200]; - u8 PubExponent[4]; - u8 Padding[0x34]; -} rsa_4096_pubk_struct; - -typedef struct -{ - u8 Modulus[0x100]; - u8 PubExponent[4]; - u8 Padding[0x34]; -} rsa_2048_pubk_struct; - -typedef struct -{ - u8 PubK[0x3C]; - u8 Padding[0x3C]; -} ecc_pubk_struct; - -#endif -// Cert Sizes -u32 GetCertSize(u8 *cert); -void GetCertSigSectionSizes(u32 *SigSize, u32 *SigPadding, u8 *cert); -u32 GetCertPubkSectionSize(pubk_types type); - -// Issuer/Name Functions -u8 *GetCertIssuer(u8 *cert); -u8 *GetCertName(u8 *cert); -int GenCertChildIssuer(u8 *dest, u8 *cert); - -// Pubk -pubk_types GetCertPubkType(u8 *cert); -u8 *GetCertPubk(u8 *cert); - -bool VerifyCert(u8 *cert, u8 *pubk); \ No newline at end of file diff --git a/cia.c b/cia.c deleted file mode 100644 index 4879d91..0000000 --- a/cia.c +++ /dev/null @@ -1,617 +0,0 @@ -#include "lib.h" -#include "ncch.h" -#include "exheader.h" -#include "exefs.h" -#include "certs.h" -#include "cia.h" -#include "tik.h" -#include "tmd.h" -#include "titleid.h" -#include "srl.h" -#include "ncsd.h" - -// Private Prototypes -/* cia_settings tools */ -void init_CIASettings(cia_settings *set); -void free_CIASettings(cia_settings *set); -int get_CIASettings(cia_settings *ciaset, user_settings *usrset); - -int GetSettingsFromUsrset(cia_settings *ciaset, user_settings *usrset); -int GetSettingsFromNcch0(cia_settings *ciaset, u32 ncch0_offset); -int GetCIADataFromNcch(cia_settings *ciaset, NCCH_Header *NcchHdr, ExtendedHeader_Struct *ExHeader); -int GetMetaRegion(cia_settings *ciaset, ExtendedHeader_Struct *ExHeader, u8 *ExeFs); -int GetContentFilePtrs(cia_settings *ciaset, user_settings *usrset); -int GetSettingsFromSrl(cia_settings *ciaset); -int GetSettingsFromCci(cia_settings *ciaset); - -u16 SetupVersion(u16 Major, u16 Minor, u16 Micro); - -int BuildCIA_CertChain(cia_settings *ciaset); -int BuildCIA_Header(cia_settings *ciaset); - -int WriteCurrentSectionstoFile(cia_settings *ciaset); -int WriteContentsToFile(cia_settings *ciaset, user_settings *usrset); -int WriteTMDToFile(cia_settings *ciaset); - -int CryptContent(u8 *EncBuffer,u8 *DecBuffer,u64 size,u8 *title_key, u16 index, u8 mode); - - -int build_CIA(user_settings *usrset) -{ - int result = 0; - - // Init Settings - cia_settings *ciaset = malloc(sizeof(cia_settings)); - if(!ciaset) {fprintf(stderr,"[CIA ERROR] MEM ERROR\n"); return MEM_ERROR;} - init_CIASettings(ciaset); - - // Get Settings - result = get_CIASettings(ciaset,usrset); - if(result) goto finish; - - // Create Output File - ciaset->out = fopen(usrset->outfile,"wb"); - if(!ciaset->out){ - fprintf(stderr,"[CIA ERROR] Failed to create '%s'\n",usrset->outfile); - result = FAILED_TO_CREATE_OUTFILE; - goto finish; - } - - // Create CIA Sections - /* Certificate Chain */ - result = BuildCIA_CertChain(ciaset); - if(result) goto finish; - - /* Ticket */ - result = BuildTicket(ciaset); - if(result) goto finish; - - /* CIA Header */ - result = BuildCIA_Header(ciaset); - if(result) goto finish; - /* Write To File Current Sections to File */ - /* Explanation : - In order to conserve memory, only one Content is in memory at a time. - This however has the limitation of only being able to generate TMD after all content - has been processed (, encrypted) and written to file. - */ - result = WriteCurrentSectionstoFile(ciaset); - if(result) goto finish; - - result = WriteContentsToFile(ciaset, usrset); - if(result) goto finish; - - result = BuildTMD(ciaset); - if(result) goto finish; - - result = WriteTMDToFile(ciaset); - -finish: - if(result != FAILED_TO_CREATE_OUTFILE && ciaset->out) fclose(ciaset->out); - free_CIASettings(ciaset); - return result; -} - -void init_CIASettings(cia_settings *set) -{ - memset(set,0,sizeof(cia_settings)); -} - -void free_CIASettings(cia_settings *set) -{ - if(set->content.ContentFilePtrs){ - for(u32 i = 1; i < set->content.ContentCount; i++){ - fclose(set->content.ContentFilePtrs[i]); - } - free(set->content.ContentFilePtrs); - } - free(set->CIA_Sections.CertChain.buffer); - free(set->CIA_Sections.Ticket.buffer); - free(set->CIA_Sections.TitleMetaData.buffer); - free(set->CIA_Sections.CXI_MetaData.buffer); - - memset(set,0,sizeof(cia_settings)); - - free(set); -} - -int get_CIASettings(cia_settings *ciaset, user_settings *usrset) -{ - int result = 0; - - // Transfering data from usrset - result = GetSettingsFromUsrset(ciaset,usrset); - - if(usrset->Content0IsNcch){ - result = GetSettingsFromNcch0(ciaset,0); - if(result) return result; - result = GetContentFilePtrs(ciaset,usrset); - if(result) return result; - } - - else if(usrset->Content0IsSrl){ - result = GetSettingsFromSrl(ciaset); - if(result) return result; - } - - else if(usrset->ConvertCci){ - result = GetSettingsFromCci(ciaset); - if(result) return result; - } - - - return 0; -} - -int GetSettingsFromUsrset(cia_settings *ciaset, user_settings *usrset) -{ - // General Stuff - ciaset->keys = &usrset->keys; - ciaset->content.content0 = usrset->Content0.buffer; - ciaset->content.content0_FileLen = usrset->Content0.size; - u32_to_u8(ciaset->Title_type,TYPE_CTR,BE); - ciaset->content.EncryptContents = usrset->EncryptContents; - if(ciaset->keys->aes.CommonKey[ciaset->keys->aes.CurrentCommonKey] == NULL && ciaset->content.EncryptContents){ - fprintf(stderr,"[CIA WARNING] Common Key could not be loaded, CIA will not be encrypted\n"); - ciaset->content.EncryptContents = false; - } - - ciaset->cert.ca_crl_version = 0; - ciaset->cert.signer_crl_version = 0; - - for(int i = 0; i < 3; i++){ - ciaset->Version[i] = usrset->Version[i]; - } - - // Random Number generator - u8 hash[0x20]; - ctr_sha(ciaset->content.content0,0x100,hash,CTR_SHA_256); - - // Ticket Data - memcpy(ciaset->tik.TicketID,(hash+0x8),8); - if(usrset->RandomTitleKey){ - memcpy(ciaset->tik.TitleKey,(hash+0x10),16); - } - else{ - memcpy(ciaset->tik.TitleKey,usrset->keys.aes.NormalKey,16); - } - - ciaset->tik.ticket_format_ver = 1; - - int result = GenCertChildIssuer(ciaset->tik.TicketIssuer,usrset->keys.certs.tik_cert); - if(result) return result; - - // Tmd Stuff - if(usrset->ContentID[0] > 0xffffffff){ - ciaset->content.ContentId[0] = u8_to_u32(hash,BE); - } - else ciaset->content.ContentId[0] = usrset->ContentID[0]; - ciaset->tmd.tmd_format_ver = 1; - result = GenCertChildIssuer(ciaset->tmd.TMDIssuer,usrset->keys.certs.tmd_cert); - return 0; -} - -int GetSettingsFromNcch0(cia_settings *ciaset, u32 ncch0_offset) -{ - /* Sanity Checks */ - if(!ciaset->content.content0_FileLen) - return CIA_NO_NCCH0; - - u8 *ncch0 = (u8*)(ciaset->content.content0+ncch0_offset); - - if(!IsNCCH(NULL,ncch0)){ - fprintf(stderr,"[CIA ERROR] Content0 is not NCCH\n"); - return CIA_INVALID_NCCH0; - } - - /* Get Ncch0 Header */ - NCCH_Header *hdr = NULL; - hdr = GetNCCH_CommonHDR(hdr,NULL,ncch0); - if(IsCfa(hdr)){ - ciaset->content.IsCfa = true; - } - - ciaset->content.ContentOffset[0] = 0; - ciaset->content.ContentSize[0] = GetNCCH_MediaSize(hdr)*GetNCCH_MediaUnitSize(hdr); - ciaset->content.TotalContentSize = ciaset->content.ContentSize[0]; - - /* Get Ncch0 Import Context */ - NCCH_STRUCT *ncch_ctx = malloc(sizeof(NCCH_STRUCT)); - if(!ncch_ctx){ fprintf(stderr,"[CIA ERROR] MEM ERROR\n"); return MEM_ERROR; } - memset(ncch_ctx,0x0,sizeof(NCCH_STRUCT)); - GetCXIStruct(ncch_ctx,hdr); - - /* Verify Ncch0 (Sig&Hash Checks) */ - int result = VerifyNCCH(ncch0,ciaset->keys,true); - if(result == UNABLE_TO_LOAD_NCCH_KEY){ - ciaset->content.KeyNotFound = true; - if(!ciaset->content.IsCfa){ - fprintf(stderr,"[CIA WARNING] CXI AES Key could not be loaded\n"); - fprintf(stderr," Meta Region, SaveDataSize, Remaster Version cannot be obtained\n"); - } - } - else if(result != 0){ - fprintf(stderr,"[CIA ERROR] Content 0 Is Corrupt (res = %d)\n",result); - return CIA_INVALID_NCCH0; - } - - /* Gen Settings From Ncch0 */ - endian_memcpy(ciaset->TitleID,hdr->title_id,8,LE); - - - /* Getting ExeFs/ExHeader */ - u8 *ExeFs = malloc(ncch_ctx->exefs_size); - if(!ExeFs){ fprintf(stderr,"[CIA ERROR] MEM ERROR\n"); return MEM_ERROR; } - ExtendedHeader_Struct *ExHeader = malloc(ncch_ctx->exheader_size); - if(!ExHeader){ fprintf(stderr,"[CIA ERROR] MEM ERROR\n"); free(ExeFs); return MEM_ERROR; } - - if(!(ciaset->content.IsCfa||ciaset->content.KeyNotFound)) GetNCCHSection(ExeFs, ncch_ctx->exefs_size, 0, ncch0, ncch_ctx, ciaset->keys, ncch_exefs); - if(!(ciaset->content.IsCfa||ciaset->content.KeyNotFound)) GetNCCHSection((u8*)ExHeader, ncch_ctx->exheader_size, 0, ncch0, ncch_ctx, ciaset->keys, ncch_ExHeader); - - result = GetCIADataFromNcch(ciaset,hdr,ExHeader); // Data For TMD - if(result) goto finish; - result = GetMetaRegion(ciaset,ExHeader,ExeFs); // Meta Region - /* Finish */ -finish: - free(ExeFs); - free(ExHeader); - - /* Return */ - free(ncch_ctx); - return result; -} - -int GetCIADataFromNcch(cia_settings *ciaset, NCCH_Header *NcchHdr, ExtendedHeader_Struct *ExHeader) -{ - u16 Category = u8_to_u16((ciaset->TitleID+2),BE); - bool IsPatch = (Category == 0x000E); - if(IsPatch||ciaset->content.IsCfa||ciaset->content.KeyNotFound) u32_to_u8(ciaset->tmd.SaveDataSize,0,LE); - else u32_to_u8(ciaset->tmd.SaveDataSize,(u32)GetSaveDataSize_frm_exhdr(ExHeader),LE); - - - if(ciaset->content.IsCfa||ciaset->content.KeyNotFound){ - if(ciaset->Version[0] == 0xffff){ // '-major' wasn't set - if(ciaset->content.IsCfa){ // Is a CFA and can be decrypted - fprintf(stderr,"[CIA ERROR] Invalid major version. Use '-major' option.\n"); - return CIA_BAD_VERSION; - } - else // CXI which cannot be decrypted - ciaset->Version[0] = 0; - } - } - else{ // Is a CXI and can be decrypted - if(ciaset->Version[0] != 0xffff){ // '-major' was set - fprintf(stderr,"[CIA ERROR] Option '-major' cannot be applied for cxi.\n"); - return CIA_BAD_VERSION; - } - // Setting remaster ver - ciaset->Version[0] = GetRemasterVersion_frm_exhdr(ExHeader); - } - SetupVersion(ciaset->Version[0],ciaset->Version[1],ciaset->Version[2]); - - u16 version = SetupVersion(ciaset->Version[0],ciaset->Version[1],ciaset->Version[2]); - u16_to_u8(ciaset->tik.TicketVersion,version,BE); - u16_to_u8(ciaset->tmd.TitleVersion,version,BE); - return 0; -} - -int GetMetaRegion(cia_settings *ciaset, ExtendedHeader_Struct *ExHeader, u8 *ExeFs) -{ - if(ciaset->content.IsCfa || ciaset->content.KeyNotFound) return 0; - ciaset->CIA_Sections.CXI_MetaData.size = sizeof(MetaData_Struct) + GetExeFsSectionSize("icon",ExeFs); - ciaset->CIA_Sections.CXI_MetaData.buffer = malloc(ciaset->CIA_Sections.CXI_MetaData.size); - if(!ciaset->CIA_Sections.CXI_MetaData.buffer){ fprintf(stderr,"[CIA ERROR] MEM ERROR\n"); return MEM_ERROR; } - MetaData_Struct *hdr = (MetaData_Struct*)ciaset->CIA_Sections.CXI_MetaData.buffer; - memset(hdr,0,sizeof(MetaData_Struct)); - GetDependancyList_frm_exhdr(hdr->DependancyList,ExHeader); - GetCoreVersion_frm_exhdr(hdr->CoreVersion,ExHeader); - if(DoesExeFsSectionExist("icon",ExeFs)){ - u8 *IconDestPos = (ciaset->CIA_Sections.CXI_MetaData.buffer + sizeof(MetaData_Struct)); - memcpy(IconDestPos,GetExeFsSection("icon",ExeFs),GetExeFsSectionSize("icon",ExeFs)); - } - return 0; -} - -int GetContentFilePtrs(cia_settings *ciaset, user_settings *usrset) -{ - ciaset->content.ContentFilePtrs = malloc(sizeof(FILE*)*CIA_MAX_CONTENT); - if(!ciaset->content.ContentFilePtrs){ fprintf(stderr,"[CIA ERROR] MEM ERROR\n"); return MEM_ERROR; } - memset(ciaset->content.ContentFilePtrs,0,sizeof(FILE*)*CIA_MAX_CONTENT); - int j = 1; - NCCH_Header *hdr = malloc(sizeof(NCCH_Header)); - for(int i = 1; i < CIA_MAX_CONTENT; i++){ - if(usrset->ContentPath[i]){ - ciaset->content.ContentFilePtrs[j] = fopen(usrset->ContentPath[i],"rb"); - if(!ciaset->content.ContentFilePtrs[j]){ fprintf(stderr,"[CIA ERROR] Failed to open '%s'\n",usrset->ContentPath[i]); return FAILED_TO_OPEN_FILE; } - if(usrset->ContentID[i] == 0x100000000){ - u8 hash[0x20]; - ctr_sha(usrset->ContentPath[i],strlen(usrset->ContentPath[i]),hash,CTR_SHA_256); - ciaset->content.ContentId[j] = u8_to_u32(hash,BE); - } - else ciaset->content.ContentId[j] = (u32)usrset->ContentID[i]; - ciaset->content.ContentIndex[j] = (u16)i; - - // Get Data from ncch HDR - GetNCCH_CommonHDR(hdr,ciaset->content.ContentFilePtrs[j],NULL); - - // Get TitleID - memcpy(ciaset->content.ContentTitleId[j],hdr->title_id,8); - - // Get Size - ciaset->content.ContentSize[j] = GetNCCH_MediaSize(hdr)*GetNCCH_MediaUnitSize(hdr); - ciaset->content.ContentOffset[j] = ciaset->content.TotalContentSize; - - ciaset->content.TotalContentSize += ciaset->content.ContentSize[j]; - - - // Finish get next content - j++; - } - } - free(hdr); - ciaset->content.ContentCount = j; - - // Check Conflicting IDs - for(int i = 0; i < ciaset->content.ContentCount; i++){ - for(j = i+1; j < ciaset->content.ContentCount; j++){ - if(ciaset->content.ContentId[j] == ciaset->content.ContentId[i]){ - fprintf(stderr,"[CIA ERROR] CIA Content %d and %d, have conflicting IDs\n",ciaset->content.ContentIndex[j],ciaset->content.ContentIndex[i]); - return CIA_CONFILCTING_CONTENT_IDS; - } - } - } - return 0; -} - -int GetSettingsFromSrl(cia_settings *ciaset) -{ - SRL_Header *hdr = (SRL_Header*)ciaset->content.content0; - if(!hdr || ciaset->content.content0_FileLen < sizeof(SRL_Header)) { - fprintf(stderr,"[CIA ERROR] Invalid TWL SRL File\n"); - return FAILED_TO_IMPORT_FILE; - } - - // Check if TWL SRL File - if(u8_to_u16(&hdr->title_id[6],LE) != 0x0003){ - fprintf(stderr,"[CIA ERROR] Invalid TWL SRL File\n"); - return FAILED_TO_IMPORT_FILE; - } - - // Generate and store Converted TitleID - u64_to_u8(ciaset->TitleID,ConvertTwlIdToCtrId(u8_to_u64(hdr->title_id,LE)),BE); - //memdump(stdout,"SRL TID: ",ciaset->TitleID,8); - - // Get TWL Flag - ciaset->tmd.twl_flag = ((hdr->reserved_flags[3] & 6) >> 1); - - // Get Remaster Version - u16 version = SetupVersion(hdr->rom_version,ciaset->Version[1],0); - u16_to_u8(ciaset->tik.TicketVersion,version,BE); - u16_to_u8(ciaset->tmd.TitleVersion,version,BE); - - // Get SaveDataSize (Public and Private) - memcpy(ciaset->tmd.SaveDataSize,hdr->pub_save_data_size,4); - memcpy(ciaset->tmd.PrivSaveDataSize,hdr->priv_save_data_size,4); - - // Setting CIA Content Settings - ciaset->content.ContentCount = 1; - ciaset->content.ContentOffset[0] = 0; - ciaset->content.ContentSize[0] = ciaset->content.content0_FileLen; - ciaset->content.TotalContentSize = ciaset->content.content0_FileLen; - - return 0; -} - - - -int GetSettingsFromCci(cia_settings *ciaset) -{ - int result = 0; - - if(!IsCci(ciaset->content.content0)){ - fprintf(stderr,"[CIA ERROR] Invalid CCI file\n"); - return FAILED_TO_IMPORT_FILE; - } - - u32 ncch0_offset = GetPartitionOffset(ciaset->content.content0,0); - if(!ncch0_offset){ - fprintf(stderr,"[CIA ERROR] Invalid CCI file (invalid ncch0 size)\n"); - return FAILED_TO_IMPORT_FILE; - } - - result = GetSettingsFromNcch0(ciaset, ncch0_offset); - if(result){ - fprintf(stderr,"Import of Ncch 0 failed(%d)\n",result); - return result; - } - ciaset->content.ContentCount = 1; - ciaset->content.CCIContentOffsets[0] = ncch0_offset; - NCCH_Header *hdr = malloc(sizeof(NCCH_Header)); - for(int i = 1; i < 8; i++){ - if(GetPartitionSize(ciaset->content.content0,i)){ - ciaset->content.CCIContentOffsets[ciaset->content.ContentCount] = GetPartitionOffset(ciaset->content.content0,i); - - // Get Data from ncch HDR - GetNCCH_CommonHDR(hdr,NULL,GetPartition(ciaset->content.content0,i)); - - // Get Size - ciaset->content.ContentSize[ciaset->content.ContentCount] = GetPartitionSize(ciaset->content.content0,i); - ciaset->content.ContentOffset[ciaset->content.ContentCount] = ciaset->content.TotalContentSize; - - ciaset->content.TotalContentSize += ciaset->content.ContentSize[ciaset->content.ContentCount]; - - // Get ID - u8 hash[0x20]; - ctr_sha((u8*)hdr,0x200,hash,CTR_SHA_256); - ciaset->content.ContentId[ciaset->content.ContentCount] = u8_to_u32(hash,BE); - - // Get Index - ciaset->content.ContentIndex[ciaset->content.ContentCount] = i; - - // Increment Content Count - ciaset->content.ContentCount++; - } - } - free(hdr); - - return 0; -} - -u16 SetupVersion(u16 Major, u16 Minor, u16 Micro) -{ - return (((Major << 10) & 0xFC00) | ((Minor << 4) & 0x3F0) | (Micro & 0xf)); -} - -int BuildCIA_CertChain(cia_settings *ciaset) -{ - ciaset->CIA_Sections.CertChain.size = GetCertSize(ciaset->keys->certs.ca_cert) + GetCertSize(ciaset->keys->certs.tik_cert) + GetCertSize(ciaset->keys->certs.tmd_cert); - ciaset->CIA_Sections.CertChain.buffer = malloc(ciaset->CIA_Sections.CertChain.size); - if(!ciaset->CIA_Sections.CertChain.buffer) { fprintf(stderr,"[CIA ERROR] MEM ERROR\n"); return MEM_ERROR; } - memcpy(ciaset->CIA_Sections.CertChain.buffer,ciaset->keys->certs.ca_cert,GetCertSize(ciaset->keys->certs.ca_cert)); - memcpy((ciaset->CIA_Sections.CertChain.buffer+GetCertSize(ciaset->keys->certs.ca_cert)),ciaset->keys->certs.tik_cert,GetCertSize(ciaset->keys->certs.tik_cert)); - memcpy((ciaset->CIA_Sections.CertChain.buffer+GetCertSize(ciaset->keys->certs.ca_cert)+GetCertSize(ciaset->keys->certs.tik_cert)),ciaset->keys->certs.tmd_cert,GetCertSize(ciaset->keys->certs.tmd_cert)); - return 0; -} - -int BuildCIA_Header(cia_settings *ciaset) -{ - // Allocating memory for header - ciaset->CIA_Sections.Header.size = sizeof(CIA_Header); - ciaset->CIA_Sections.Header.buffer = malloc(ciaset->CIA_Sections.Header.size); - if(!ciaset->CIA_Sections.Header.buffer){ fprintf(stderr,"[CIA ERROR] MEM ERROR\n"); return MEM_ERROR; } - - CIA_Header *hdr = (CIA_Header*)ciaset->CIA_Sections.Header.buffer; - - // Clearing - memset(hdr,0,sizeof(CIA_Header)); - - // Predict TMD Size - ciaset->CIA_Sections.TitleMetaData.size = PredictTMDSize(ciaset->content.ContentCount); - - // Setting Data - u32_to_u8(hdr->HdrSize,sizeof(CIA_Header),LE); - u16_to_u8(hdr->Type,0x0,LE); - u16_to_u8(hdr->Version,0x0,LE); - u32_to_u8(hdr->CertChainSize,ciaset->CIA_Sections.CertChain.size,LE); - u32_to_u8(hdr->TicketSize,ciaset->CIA_Sections.Ticket.size,LE); - u32_to_u8(hdr->TitleMetaDataSize,ciaset->CIA_Sections.TitleMetaData.size,LE); - u32_to_u8(hdr->CXI_MetaSize,ciaset->CIA_Sections.CXI_MetaData.size,LE); - u64_to_u8(hdr->ContentSize,ciaset->content.TotalContentSize,LE); - - // Recording Offsets - ciaset->CIA_Sections.CertChainOffset = align_value(sizeof(CIA_Header),0x40); - ciaset->CIA_Sections.TicketOffset = align_value(ciaset->CIA_Sections.CertChainOffset+ciaset->CIA_Sections.CertChain.size,0x40); - ciaset->CIA_Sections.TitleMetaDataOffset = align_value(ciaset->CIA_Sections.TicketOffset+ciaset->CIA_Sections.Ticket.size,0x40); - ciaset->CIA_Sections.ContentOffset = align_value(ciaset->CIA_Sections.TitleMetaDataOffset+ciaset->CIA_Sections.TitleMetaData.size,0x40); - ciaset->CIA_Sections.CXI_MetaDataOffset = align_value(ciaset->CIA_Sections.ContentOffset+ciaset->content.TotalContentSize,0x40); - - // SetCIAContentIndex, actually works for all index values now. CIA files generated can now hold, with - // validity, 65536 contents. Or at least have a content with index value of 65535. - for(int i = 0; i < ciaset->content.ContentCount; i++){ - // This works by treating the 0x2000 byte index array as an array of 2048 u32 values - - // Used for determining which u32 chunk to write the value to - u16 section = ciaset->content.ContentIndex[i]/32; - - // Calculating the value added to the u32 - u32 value = 0x80000000/(1<content.ContentIndex[i]); - - // Retrieving current u32 block - u32 cur_content_index_section = u8_to_u32(hdr->ContentIndex+(sizeof(u32)*section),BE); - - // Adding value to block - cur_content_index_section += value; - - // Returning block - u32_to_u8(hdr->ContentIndex+(sizeof(u32)*section),cur_content_index_section,BE); - } - return 0; -} - -int WriteCurrentSectionstoFile(cia_settings *ciaset) -{ - WriteBuffer(ciaset->CIA_Sections.Header.buffer,ciaset->CIA_Sections.Header.size,0,ciaset->out); - WriteBuffer(ciaset->CIA_Sections.CertChain.buffer,ciaset->CIA_Sections.CertChain.size,ciaset->CIA_Sections.CertChainOffset,ciaset->out); - WriteBuffer(ciaset->CIA_Sections.Ticket.buffer,ciaset->CIA_Sections.Ticket.size,ciaset->CIA_Sections.TicketOffset,ciaset->out); - WriteBuffer(ciaset->CIA_Sections.CXI_MetaData.buffer,ciaset->CIA_Sections.CXI_MetaData.size,ciaset->CIA_Sections.CXI_MetaDataOffset,ciaset->out); - return 0; -} - -int WriteContentsToFile(cia_settings *ciaset, user_settings *usrset) -{ - u8 *Content0 = ciaset->content.content0; - if(usrset->ConvertCci) Content0 = (u8*)(ciaset->content.content0+ciaset->content.CCIContentOffsets[0]); - - ctr_sha(Content0,ciaset->content.ContentSize[0],ciaset->content.ContentHash[0],CTR_SHA_256); - if(ciaset->content.EncryptContents) { - ciaset->content.ContentType[0] |= Encrypted; - CryptContent(Content0,Content0,ciaset->content.ContentSize[0],ciaset->tik.TitleKey,ciaset->content.ContentIndex[0],ENC); - } - WriteBuffer(Content0,ciaset->content.ContentSize[0],ciaset->content.ContentOffset[0]+ciaset->CIA_Sections.ContentOffset,ciaset->out); - - // Free Buffer if Not CCI - if(!usrset->ConvertCci){ - free(usrset->Content0.buffer); - usrset->Content0.buffer = NULL; - usrset->Content0.size = 0; - } - - // Add additional contents, recreating them with their new TitleID - if(usrset->Content0IsNcch){ - u8 TitleId[8]; - endian_memcpy(TitleId,ciaset->TitleID,8,LE); - for(int i = 1; i < ciaset->content.ContentCount; i++){ - u8 *ContentBuff = RetargetNCCH(ciaset->content.ContentFilePtrs[i],ciaset->content.ContentSize[i],ciaset->content.ContentTitleId[i],TitleId,ciaset->keys); - if(!ContentBuff){ - fprintf(stderr,"[CIA ERROR] Could not import content %d to CIA\n",i); - return FAILED_TO_IMPORT_FILE; - } - ctr_sha(ContentBuff,ciaset->content.ContentSize[i],ciaset->content.ContentHash[i],CTR_SHA_256); - if(ciaset->content.EncryptContents) { - ciaset->content.ContentType[i] |= Encrypted; - CryptContent(ContentBuff,ContentBuff,ciaset->content.ContentSize[i],ciaset->tik.TitleKey,ciaset->content.ContentIndex[i],ENC); - } - WriteBuffer(ContentBuff,ciaset->content.ContentSize[i],ciaset->content.ContentOffset[i]+ciaset->CIA_Sections.ContentOffset,ciaset->out); - free(ContentBuff); - } - } - else if(usrset->ConvertCci){ - for(int i = 1; i < ciaset->content.ContentCount; i++){ - u8 *ContentBuff = (u8*)(ciaset->content.content0+ciaset->content.CCIContentOffsets[i]); - ctr_sha(ContentBuff,ciaset->content.ContentSize[i],ciaset->content.ContentHash[i],CTR_SHA_256); - if(ciaset->content.EncryptContents) { - ciaset->content.ContentType[i] |= Encrypted; - CryptContent(ContentBuff,ContentBuff,ciaset->content.ContentSize[i],ciaset->tik.TitleKey,ciaset->content.ContentIndex[i],ENC); - } - WriteBuffer(ContentBuff,ciaset->content.ContentSize[i],ciaset->content.ContentOffset[i]+ciaset->CIA_Sections.ContentOffset,ciaset->out); - } - free(usrset->Content0.buffer); - usrset->Content0.buffer = NULL; - usrset->Content0.size = 0; - } - - - return 0; -} - -int WriteTMDToFile(cia_settings *ciaset) -{ - WriteBuffer(ciaset->CIA_Sections.TitleMetaData.buffer,ciaset->CIA_Sections.TitleMetaData.size,ciaset->CIA_Sections.TitleMetaDataOffset,ciaset->out); - return 0; -} - -int CryptContent(u8 *EncBuffer,u8 *DecBuffer,u64 size,u8 *title_key, u16 index, u8 mode) -{ - //generating IV - u8 iv[16]; - memset(&iv,0x0,16); - iv[0] = (index >> 8) & 0xff; - iv[1] = index & 0xff; - //Crypting content - ctr_aes_context ctx; - memset(&ctx,0x0,sizeof(ctr_aes_context)); - ctr_init_aes_cbc(&ctx,title_key,iv,mode); - if(mode == ENC) ctr_aes_cbc(&ctx,DecBuffer,EncBuffer,size,ENC); - else ctr_aes_cbc(&ctx,EncBuffer,DecBuffer,size,DEC); - return 0; -} \ No newline at end of file diff --git a/cia.h b/cia.h deleted file mode 100644 index e932fa7..0000000 --- a/cia.h +++ /dev/null @@ -1,108 +0,0 @@ -// Enums -typedef enum -{ - CIA_NO_NCCH0 = -1, - CIA_INVALID_NCCH0 = -2, - CIA_CONFILCTING_CONTENT_IDS = -3, - CIA_BAD_VERSION = -4, -} cia_errors; - -// Structs -typedef struct -{ - u8 HdrSize[4]; - u8 Type[2]; - u8 Version[2]; - u8 CertChainSize[4]; - u8 TicketSize[4]; - u8 TitleMetaDataSize[4]; - u8 CXI_MetaSize[4]; - u8 ContentSize[8]; - u8 ContentIndex[0x2000]; -} CIA_Header; - -typedef struct -{ - u8 DependancyList[0x30*0x8]; - u8 Reserved0[0x180]; - u8 CoreVersion[4]; - u8 Reserved1[0xfc]; -} MetaData_Struct; - -typedef struct -{ - FILE *out; - - u8 TitleID[8]; - u8 Title_type[4]; - u16 Version[3]; - - keys_struct *keys; - - struct{ - u8 ca_crl_version; - u8 signer_crl_version; - } cert; - - struct{ - u8 TicketIssuer[0x40]; - u8 ticket_format_ver; - u8 TicketID[8]; - u8 DeviceID[8]; - u8 TicketVersion[3]; - u8 TitleKey[16]; - } tik; - - struct{ - u8 TMDIssuer[0x40]; - u8 tmd_format_ver; - u8 TitleVersion[3]; - u8 SaveDataSize[4]; - u8 PrivSaveDataSize[4]; - u8 twl_flag; - } tmd; - - struct{ - u8 *content0; - u64 content0_FileLen; - bool IsCfa; - bool KeyNotFound; - bool EncryptContents; - - FILE **ContentFilePtrs; - u64 CCIContentOffsets[CCI_MAX_CONTENT]; - u16 ContentCount; - u64 ContentSize[CIA_MAX_CONTENT]; - u64 ContentOffset[CIA_MAX_CONTENT]; - u16 ContentIndex[CIA_MAX_CONTENT]; - u16 ContentType[CIA_MAX_CONTENT]; - u32 ContentId[CIA_MAX_CONTENT]; - u8 ContentHash[CIA_MAX_CONTENT][0x20]; - - u8 ContentTitleId[CIA_MAX_CONTENT][8]; - u64 TotalContentSize; - } content; - - struct{ - COMPONENT_STRUCT Header; - - u32 CertChainOffset; - COMPONENT_STRUCT CertChain; - - u32 TicketOffset; - COMPONENT_STRUCT Ticket; - - u32 TitleMetaDataOffset; - COMPONENT_STRUCT TitleMetaData; - - u32 CXI_MetaDataOffset; - COMPONENT_STRUCT CXI_MetaData; - - u64 ContentOffset; - } CIA_Sections; - - // Finish CIA data req. -} cia_settings; - -// Public Prototypes -int build_CIA(user_settings *usrset); \ No newline at end of file diff --git a/cia_certificates.h b/cia_certificates.h deleted file mode 100644 index ec5016a..0000000 --- a/cia_certificates.h +++ /dev/null @@ -1,670 +0,0 @@ -#ifndef _CIA_CERTS_H_ -#define _CIA_CERTS_H_ - -//RetailCerts -static const unsigned char ca3_dpki_cert[0x400] = -{ - 0x00, 0x01, 0x00, 0x03, 0x70, 0x41, 0x38, 0xEF, - 0xBB, 0xBD, 0xA1, 0x6A, 0x98, 0x7D, 0xD9, 0x01, - 0x32, 0x6D, 0x1C, 0x94, 0x59, 0x48, 0x4C, 0x88, - 0xA2, 0x86, 0x1B, 0x91, 0xA3, 0x12, 0x58, 0x7A, - 0xE7, 0x0E, 0xF6, 0x23, 0x7E, 0xC5, 0x0E, 0x10, - 0x32, 0xDC, 0x39, 0xDD, 0xE8, 0x9A, 0x96, 0xA8, - 0xE8, 0x59, 0xD7, 0x6A, 0x98, 0xA6, 0xE7, 0xE3, - 0x6A, 0x0C, 0xFE, 0x35, 0x2C, 0xA8, 0x93, 0x05, - 0x82, 0x34, 0xFF, 0x83, 0x3F, 0xCB, 0x3B, 0x03, - 0x81, 0x1E, 0x9F, 0x0D, 0xC0, 0xD9, 0xA5, 0x2F, - 0x80, 0x45, 0xB4, 0xB2, 0xF9, 0x41, 0x1B, 0x67, - 0xA5, 0x1C, 0x44, 0xB5, 0xEF, 0x8C, 0xE7, 0x7B, - 0xD6, 0xD5, 0x6B, 0xA7, 0x57, 0x34, 0xA1, 0x85, - 0x6D, 0xE6, 0xD4, 0xBE, 0xD6, 0xD3, 0xA2, 0x42, - 0xC7, 0xC8, 0x79, 0x1B, 0x34, 0x22, 0x37, 0x5E, - 0x5C, 0x77, 0x9A, 0xBF, 0x07, 0x2F, 0x76, 0x95, - 0xEF, 0xA0, 0xF7, 0x5B, 0xCB, 0x83, 0x78, 0x9F, - 0xC3, 0x0E, 0x3F, 0xE4, 0xCC, 0x83, 0x92, 0x20, - 0x78, 0x40, 0x63, 0x89, 0x49, 0xC7, 0xF6, 0x88, - 0x56, 0x5F, 0x64, 0x9B, 0x74, 0xD6, 0x3D, 0x8D, - 0x58, 0xFF, 0xAD, 0xDA, 0x57, 0x1E, 0x95, 0x54, - 0x42, 0x6B, 0x13, 0x18, 0xFC, 0x46, 0x89, 0x83, - 0xD4, 0xC8, 0xA5, 0x62, 0x8B, 0x06, 0xB6, 0xFC, - 0x5D, 0x50, 0x7C, 0x13, 0xE7, 0xA1, 0x8A, 0xC1, - 0x51, 0x1E, 0xB6, 0xD6, 0x2E, 0xA5, 0x44, 0x8F, - 0x83, 0x50, 0x14, 0x47, 0xA9, 0xAF, 0xB3, 0xEC, - 0xC2, 0x90, 0x3C, 0x9D, 0xD5, 0x2F, 0x92, 0x2A, - 0xC9, 0xAC, 0xDB, 0xEF, 0x58, 0xC6, 0x02, 0x18, - 0x48, 0xD9, 0x6E, 0x20, 0x87, 0x32, 0xD3, 0xD1, - 0xD9, 0xD9, 0xEA, 0x44, 0x0D, 0x91, 0x62, 0x1C, - 0x7A, 0x99, 0xDB, 0x88, 0x43, 0xC5, 0x9C, 0x1F, - 0x2E, 0x2C, 0x7D, 0x9B, 0x57, 0x7D, 0x51, 0x2C, - 0x16, 0x6D, 0x6F, 0x7E, 0x1A, 0xAD, 0x4A, 0x77, - 0x4A, 0x37, 0x44, 0x7E, 0x78, 0xFE, 0x20, 0x21, - 0xE1, 0x4A, 0x95, 0xD1, 0x12, 0xA0, 0x68, 0xAD, - 0xA0, 0x19, 0xF4, 0x63, 0xC7, 0xA5, 0x56, 0x85, - 0xAA, 0xBB, 0x68, 0x88, 0xB9, 0x24, 0x64, 0x83, - 0xD1, 0x8B, 0x9C, 0x80, 0x6F, 0x47, 0x49, 0x18, - 0x33, 0x17, 0x82, 0x34, 0x4A, 0x4B, 0x85, 0x31, - 0x33, 0x4B, 0x26, 0x30, 0x32, 0x63, 0xD9, 0xD2, - 0xEB, 0x4F, 0x4B, 0xB9, 0x96, 0x02, 0xB3, 0x52, - 0xF6, 0xAE, 0x40, 0x46, 0xC6, 0x9A, 0x5E, 0x7E, - 0x8E, 0x4A, 0x18, 0xEF, 0x9B, 0xC0, 0xA2, 0xDE, - 0xD6, 0x13, 0x10, 0x41, 0x70, 0x12, 0xFD, 0x82, - 0x4C, 0xC1, 0x16, 0xCF, 0xB7, 0xC4, 0xC1, 0xF7, - 0xEC, 0x71, 0x77, 0xA1, 0x74, 0x46, 0xCB, 0xDE, - 0x96, 0xF3, 0xED, 0xD8, 0x8F, 0xCD, 0x05, 0x2F, - 0x0B, 0x88, 0x8A, 0x45, 0xFD, 0xAF, 0x2B, 0x63, - 0x13, 0x54, 0xF4, 0x0D, 0x16, 0xE5, 0xFA, 0x9C, - 0x2C, 0x4E, 0xDA, 0x98, 0xE7, 0x98, 0xD1, 0x5E, - 0x60, 0x46, 0xDC, 0x53, 0x63, 0xF3, 0x09, 0x6B, - 0x2C, 0x60, 0x7A, 0x9D, 0x8D, 0xD5, 0x5B, 0x15, - 0x02, 0xA6, 0xAC, 0x7D, 0x3C, 0xC8, 0xD8, 0xC5, - 0x75, 0x99, 0x8E, 0x7D, 0x79, 0x69, 0x10, 0xC8, - 0x04, 0xC4, 0x95, 0x23, 0x50, 0x57, 0xE9, 0x1E, - 0xCD, 0x26, 0x37, 0xC9, 0xC1, 0x84, 0x51, 0x51, - 0xAC, 0x6B, 0x9A, 0x04, 0x90, 0xAE, 0x3E, 0xC6, - 0xF4, 0x77, 0x40, 0xA0, 0xDB, 0x0B, 0xA3, 0x6D, - 0x07, 0x59, 0x56, 0xCE, 0xE7, 0x35, 0x4E, 0xA3, - 0xE9, 0xA4, 0xF2, 0x72, 0x0B, 0x26, 0x55, 0x0C, - 0x7D, 0x39, 0x43, 0x24, 0xBC, 0x0C, 0xB7, 0xE9, - 0x31, 0x7D, 0x8A, 0x86, 0x61, 0xF4, 0x21, 0x91, - 0xFF, 0x10, 0xB0, 0x82, 0x56, 0xCE, 0x3F, 0xD2, - 0x5B, 0x74, 0x5E, 0x51, 0x94, 0x90, 0x6B, 0x4D, - 0x61, 0xCB, 0x4C, 0x2E, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x6F, 0x6F, 0x74, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 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, 0x43, 0x41, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x33, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7B, 0xE8, 0xEF, 0x6C, - 0xB2, 0x79, 0xC9, 0xE2, 0xEE, 0xE1, 0x21, 0xC6, - 0xEA, 0xF4, 0x4F, 0xF6, 0x39, 0xF8, 0x8F, 0x07, - 0x8B, 0x4B, 0x77, 0xED, 0x9F, 0x95, 0x60, 0xB0, - 0x35, 0x82, 0x81, 0xB5, 0x0E, 0x55, 0xAB, 0x72, - 0x11, 0x15, 0xA1, 0x77, 0x70, 0x3C, 0x7A, 0x30, - 0xFE, 0x3A, 0xE9, 0xEF, 0x1C, 0x60, 0xBC, 0x1D, - 0x97, 0x46, 0x76, 0xB2, 0x3A, 0x68, 0xCC, 0x04, - 0xB1, 0x98, 0x52, 0x5B, 0xC9, 0x68, 0xF1, 0x1D, - 0xE2, 0xDB, 0x50, 0xE4, 0xD9, 0xE7, 0xF0, 0x71, - 0xE5, 0x62, 0xDA, 0xE2, 0x09, 0x22, 0x33, 0xE9, - 0xD3, 0x63, 0xF6, 0x1D, 0xD7, 0xC1, 0x9F, 0xF3, - 0xA4, 0xA9, 0x1E, 0x8F, 0x65, 0x53, 0xD4, 0x71, - 0xDD, 0x7B, 0x84, 0xB9, 0xF1, 0xB8, 0xCE, 0x73, - 0x35, 0xF0, 0xF5, 0x54, 0x05, 0x63, 0xA1, 0xEA, - 0xB8, 0x39, 0x63, 0xE0, 0x9B, 0xE9, 0x01, 0x01, - 0x1F, 0x99, 0x54, 0x63, 0x61, 0x28, 0x70, 0x20, - 0xE9, 0xCC, 0x0D, 0xAB, 0x48, 0x7F, 0x14, 0x0D, - 0x66, 0x26, 0xA1, 0x83, 0x6D, 0x27, 0x11, 0x1F, - 0x20, 0x68, 0xDE, 0x47, 0x72, 0x14, 0x91, 0x51, - 0xCF, 0x69, 0xC6, 0x1B, 0xA6, 0x0E, 0xF9, 0xD9, - 0x49, 0xA0, 0xF7, 0x1F, 0x54, 0x99, 0xF2, 0xD3, - 0x9A, 0xD2, 0x8C, 0x70, 0x05, 0x34, 0x82, 0x93, - 0xC4, 0x31, 0xFF, 0xBD, 0x33, 0xF6, 0xBC, 0xA6, - 0x0D, 0xC7, 0x19, 0x5E, 0xA2, 0xBC, 0xC5, 0x6D, - 0x20, 0x0B, 0xAF, 0x6D, 0x06, 0xD0, 0x9C, 0x41, - 0xDB, 0x8D, 0xE9, 0xC7, 0x20, 0x15, 0x4C, 0xA4, - 0x83, 0x2B, 0x69, 0xC0, 0x8C, 0x69, 0xCD, 0x3B, - 0x07, 0x3A, 0x00, 0x63, 0x60, 0x2F, 0x46, 0x2D, - 0x33, 0x80, 0x61, 0xA5, 0xEA, 0x6C, 0x91, 0x5C, - 0xD5, 0x62, 0x35, 0x79, 0xC3, 0xEB, 0x64, 0xCE, - 0x44, 0xEF, 0x58, 0x6D, 0x14, 0xBA, 0xAA, 0x88, - 0x34, 0x01, 0x9B, 0x3E, 0xEB, 0xEE, 0xD3, 0x79, - 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static const unsigned char xsC_dpki_cert[0x300] = -{ - 0x00, 0x01, 0x00, 0x04, 0x91, 0x9E, 0xBE, 0x46, - 0x4A, 0xD0, 0xF5, 0x52, 0xCD, 0x1B, 0x72, 0xE7, - 0x88, 0x49, 0x10, 0xCF, 0x55, 0xA9, 0xF0, 0x2E, - 0x50, 0x78, 0x96, 0x41, 0xD8, 0x96, 0x68, 0x3D, - 0xC0, 0x05, 0xBD, 0x0A, 0xEA, 0x87, 0x07, 0x9D, - 0x8A, 0xC2, 0x84, 0xC6, 0x75, 0x06, 0x5F, 0x74, - 0xC8, 0xBF, 0x37, 0xC8, 0x80, 0x44, 0x40, 0x95, - 0x02, 0xA0, 0x22, 0x98, 0x0B, 0xB8, 0xAD, 0x48, - 0x38, 0x3F, 0x6D, 0x28, 0xA7, 0x9D, 0xE3, 0x96, - 0x26, 0xCC, 0xB2, 0xB2, 0x2A, 0x0F, 0x19, 0xE4, - 0x10, 0x32, 0xF0, 0x94, 0xB3, 0x9F, 0xF0, 0x13, - 0x31, 0x46, 0xDE, 0xC8, 0xF6, 0xC1, 0xA9, 0xD5, - 0x5C, 0xD2, 0x8D, 0x9E, 0x1C, 0x47, 0xB3, 0xD1, - 0x1F, 0x4F, 0x54, 0x26, 0xC2, 0xC7, 0x80, 0x13, - 0x5A, 0x27, 0x75, 0xD3, 0xCA, 0x67, 0x9B, 0xC7, - 0xE8, 0x34, 0xF0, 0xE0, 0xFB, 0x58, 0xE6, 0x88, - 0x60, 0xA7, 0x13, 0x30, 0xFC, 0x95, 0x79, 0x17, - 0x93, 0xC8, 0xFB, 0xA9, 0x35, 0xA7, 0xA6, 0x90, - 0x8F, 0x22, 0x9D, 0xEE, 0x2A, 0x0C, 0xA6, 0xB9, - 0xB2, 0x3B, 0x12, 0xD4, 0x95, 0xA6, 0xFE, 0x19, - 0xD0, 0xD7, 0x26, 0x48, 0x21, 0x68, 0x78, 0x60, - 0x5A, 0x66, 0x53, 0x8D, 0xBF, 0x37, 0x68, 0x99, - 0x90, 0x5D, 0x34, 0x45, 0xFC, 0x5C, 0x72, 0x7A, - 0x0E, 0x13, 0xE0, 0xE2, 0xC8, 0x97, 0x1C, 0x9C, - 0xFA, 0x6C, 0x60, 0x67, 0x88, 0x75, 0x73, 0x2A, - 0x4E, 0x75, 0x52, 0x3D, 0x2F, 0x56, 0x2F, 0x12, - 0xAA, 0xBD, 0x15, 0x73, 0xBF, 0x06, 0xC9, 0x40, - 0x54, 0xAE, 0xFA, 0x81, 0xA7, 0x14, 0x17, 0xAF, - 0x9A, 0x4A, 0x06, 0x6D, 0x0F, 0xFC, 0x5A, 0xD6, - 0x4B, 0xAB, 0x28, 0xB1, 0xFF, 0x60, 0x66, 0x1F, - 0x44, 0x37, 0xD4, 0x9E, 0x1E, 0x0D, 0x94, 0x12, - 0xEB, 0x4B, 0xCA, 0xCF, 0x4C, 0xFD, 0x6A, 0x34, - 0x08, 0x84, 0x79, 0x82, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x6F, 0x6F, 0x74, 0x2D, 0x43, 0x41, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x33, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 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, 0x58, 0x53, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x63, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x13, 0x7A, 0x08, 0x94, - 0xAD, 0x50, 0x5B, 0xB6, 0xC6, 0x7E, 0x2E, 0x5B, - 0xDD, 0x6A, 0x3B, 0xEC, 0x43, 0xD9, 0x10, 0xC7, - 0x72, 0xE9, 0xCC, 0x29, 0x0D, 0xA5, 0x85, 0x88, - 0xB7, 0x7D, 0xCC, 0x11, 0x68, 0x0B, 0xB3, 0xE2, - 0x9F, 0x4E, 0xAB, 0xBB, 0x26, 0xE9, 0x8C, 0x26, - 0x01, 0x98, 0x5C, 0x04, 0x1B, 0xB1, 0x43, 0x78, - 0xE6, 0x89, 0x18, 0x1A, 0xAD, 0x77, 0x05, 0x68, - 0xE9, 0x28, 0xA2, 0xB9, 0x81, 0x67, 0xEE, 0x3E, - 0x10, 0xD0, 0x72, 0xBE, 0xEF, 0x1F, 0xA2, 0x2F, - 0xA2, 0xAA, 0x3E, 0x13, 0xF1, 0x1E, 0x18, 0x36, - 0xA9, 0x2A, 0x42, 0x81, 0xEF, 0x70, 0xAA, 0xF4, - 0xE4, 0x62, 0x99, 0x82, 0x21, 0xC6, 0xFB, 0xB9, - 0xBD, 0xD0, 0x17, 0xE6, 0xAC, 0x59, 0x04, 0x94, - 0xE9, 0xCE, 0xA9, 0x85, 0x9C, 0xEB, 0x2D, 0x2A, - 0x4C, 0x17, 0x66, 0xF2, 0xC3, 0x39, 0x12, 0xC5, - 0x8F, 0x14, 0xA8, 0x03, 0xE3, 0x6F, 0xCC, 0xDC, - 0xCC, 0xDC, 0x13, 0xFD, 0x7A, 0xE7, 0x7C, 0x7A, - 0x78, 0xD9, 0x97, 0xE6, 0xAC, 0xC3, 0x55, 0x57, - 0xE0, 0xD3, 0xE9, 0xEB, 0x64, 0xB4, 0x3C, 0x92, - 0xF4, 0xC5, 0x0D, 0x67, 0xA6, 0x02, 0xDE, 0xB3, - 0x91, 0xB0, 0x66, 0x61, 0xCD, 0x32, 0x88, 0x0B, - 0xD6, 0x49, 0x12, 0xAF, 0x1C, 0xBC, 0xB7, 0x16, - 0x2A, 0x06, 0xF0, 0x25, 0x65, 0xD3, 0xB0, 0xEC, - 0xE4, 0xFC, 0xEC, 0xDD, 0xAE, 0x8A, 0x49, 0x34, - 0xDB, 0x8E, 0xE6, 0x7F, 0x30, 0x17, 0x98, 0x62, - 0x21, 0x15, 0x5D, 0x13, 0x1C, 0x6C, 0x3F, 0x09, - 0xAB, 0x19, 0x45, 0xC2, 0x06, 0xAC, 0x70, 0xC9, - 0x42, 0xB3, 0x6F, 0x49, 0xA1, 0x18, 0x3B, 0xCD, - 0x78, 0xB6, 0xE4, 0xB4, 0x7C, 0x6C, 0x5C, 0xAC, - 0x0F, 0x8D, 0x62, 0xF8, 0x97, 0xC6, 0x95, 0x3D, - 0xD1, 0x2F, 0x28, 0xB7, 0x0C, 0x5B, 0x7D, 0xF7, - 0x51, 0x81, 0x9A, 0x98, 0x34, 0x65, 0x26, 0x25, - 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static const unsigned char cpB_dpki_cert[0x300] = -{ - 0x00, 0x01, 0x00, 0x04, 0x2E, 0xA6, 0x6C, 0x66, - 0xCF, 0xF3, 0x35, 0x79, 0x7D, 0x04, 0x97, 0xB7, - 0x7A, 0x19, 0x7F, 0x9F, 0xE5, 0x1A, 0xB5, 0xA4, - 0x13, 0x75, 0xDC, 0x73, 0xFD, 0x9E, 0x0B, 0x10, - 0x66, 0x9B, 0x1B, 0x9A, 0x5B, 0x7E, 0x8A, 0xB2, - 0x8F, 0x01, 0xB6, 0x7B, 0x62, 0x54, 0xC1, 0x4A, - 0xA1, 0x33, 0x14, 0x18, 0xF2, 0x5B, 0xA5, 0x49, - 0x00, 0x4C, 0x37, 0x8D, 0xD7, 0x2F, 0x0C, 0xE6, - 0x3B, 0x1F, 0x70, 0x91, 0xAA, 0xFE, 0x38, 0x09, - 0xB7, 0xAC, 0x6C, 0x28, 0x76, 0xA6, 0x1D, 0x60, - 0x51, 0x6C, 0x43, 0xA6, 0x37, 0x29, 0x16, 0x2D, - 0x28, 0x0B, 0xE2, 0x1B, 0xE8, 0xE2, 0xFE, 0x05, - 0x7D, 0x8E, 0xB6, 0xE2, 0x04, 0x24, 0x22, 0x45, - 0x73, 0x1A, 0xB6, 0xFE, 0xE3, 0x0E, 0x53, 0x35, - 0x37, 0x3E, 0xEB, 0xA9, 0x70, 0xD5, 0x31, 0xBB, - 0xA2, 0xCB, 0x22, 0x2D, 0x96, 0x84, 0x38, 0x7D, - 0x5F, 0x2A, 0x1B, 0xF7, 0x52, 0x00, 0xCE, 0x06, - 0x56, 0xE3, 0x90, 0xCE, 0x19, 0x13, 0x5B, 0x59, - 0xE1, 0x4F, 0x0F, 0xA5, 0xC1, 0x28, 0x1A, 0x73, - 0x86, 0xCC, 0xD1, 0xC8, 0xEC, 0x3F, 0xAD, 0x70, - 0xFB, 0xCE, 0x74, 0xDE, 0xEE, 0x1F, 0xD0, 0x5F, - 0x46, 0x33, 0x0B, 0x51, 0xF9, 0xB7, 0x9E, 0x1D, - 0xDB, 0xF4, 0xE3, 0x3F, 0x14, 0x88, 0x9D, 0x05, - 0x28, 0x29, 0x24, 0xC5, 0xF5, 0xDC, 0x27, 0x66, - 0xEF, 0x06, 0x27, 0xD7, 0xEE, 0xDC, 0x73, 0x6E, - 0x67, 0xC2, 0xE5, 0xB9, 0x38, 0x34, 0x66, 0x80, - 0x72, 0x21, 0x6D, 0x1C, 0x78, 0xB8, 0x23, 0xA0, - 0x72, 0xD3, 0x4F, 0xF3, 0xEC, 0xF9, 0xBD, 0x11, - 0xA2, 0x9A, 0xF1, 0x6C, 0x33, 0xBD, 0x09, 0xAF, - 0xB2, 0xD7, 0x4D, 0x53, 0x4E, 0x02, 0x7C, 0x19, - 0x24, 0x0D, 0x59, 0x5A, 0x68, 0xEB, 0xB3, 0x05, - 0xAC, 0xC4, 0x4A, 0xB3, 0x8A, 0xB8, 0x20, 0xC6, - 0xD4, 0x26, 0x56, 0x0C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x6F, 0x6F, 0x74, 0x2D, 0x43, 0x41, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x33, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 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, 0x43, 0x50, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x62, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x13, 0x7A, 0x08, 0x0B, - 0xA6, 0x89, 0xC5, 0x90, 0xFD, 0x0B, 0x2F, 0x0D, - 0x4F, 0x56, 0xB6, 0x32, 0xFB, 0x93, 0x4E, 0xD0, - 0x73, 0x95, 0x17, 0xB3, 0x3A, 0x79, 0xDE, 0x04, - 0x0E, 0xE9, 0x2D, 0xC3, 0x1D, 0x37, 0xC7, 0xF7, - 0x3B, 0xF0, 0x4B, 0xD3, 0xE4, 0x4E, 0x20, 0xAB, - 0x5A, 0x6F, 0xEA, 0xF5, 0x98, 0x4C, 0xC1, 0xF6, - 0x06, 0x2E, 0x9A, 0x9F, 0xE5, 0x6C, 0x32, 0x85, - 0xDC, 0x6F, 0x25, 0xDD, 0xD5, 0xD0, 0xBF, 0x9F, - 0xE2, 0xEF, 0xE8, 0x35, 0xDF, 0x26, 0x34, 0xED, - 0x93, 0x7F, 0xAB, 0x02, 0x14, 0xD1, 0x04, 0x80, - 0x9C, 0xF7, 0x4B, 0x86, 0x0E, 0x6B, 0x04, 0x83, - 0xF4, 0xCD, 0x2D, 0xAB, 0x2A, 0x96, 0x02, 0xBC, - 0x56, 0xF0, 0xD6, 0xBD, 0x94, 0x6A, 0xED, 0x6E, - 0x0B, 0xE4, 0xF0, 0x8F, 0x26, 0x68, 0x6B, 0xD0, - 0x9E, 0xF7, 0xDB, 0x32, 0x5F, 0x82, 0xB1, 0x8F, - 0x6A, 0xF2, 0xED, 0x52, 0x5B, 0xFD, 0x82, 0x8B, - 0x65, 0x3F, 0xEE, 0x6E, 0xCE, 0x40, 0x0D, 0x5A, - 0x48, 0xFF, 0xE2, 0x2D, 0x53, 0x8B, 0xB5, 0x33, - 0x5B, 0x41, 0x53, 0x34, 0x2D, 0x43, 0x35, 0xAC, - 0xF5, 0x90, 0xD0, 0xD3, 0x0A, 0xE2, 0x04, 0x3C, - 0x7F, 0x5A, 0xD2, 0x14, 0xFC, 0x9C, 0x0F, 0xE6, - 0xFA, 0x40, 0xA5, 0xC8, 0x65, 0x06, 0xCA, 0x63, - 0x69, 0xBC, 0xEE, 0x44, 0xA3, 0x2D, 0x9E, 0x69, - 0x5C, 0xF0, 0x0B, 0x4F, 0xD7, 0x9A, 0xDB, 0x56, - 0x8D, 0x14, 0x9C, 0x20, 0x28, 0xA1, 0x4C, 0x9D, - 0x71, 0xB8, 0x50, 0xCA, 0x36, 0x5B, 0x37, 0xF7, - 0x0B, 0x65, 0x77, 0x91, 0xFC, 0x5D, 0x72, 0x8C, - 0x4E, 0x18, 0xFD, 0x22, 0x55, 0x7C, 0x40, 0x62, - 0xD7, 0x47, 0x71, 0x53, 0x3C, 0x70, 0x17, 0x9D, - 0x3D, 0xAE, 0x8F, 0x92, 0xB1, 0x17, 0xE4, 0x5C, - 0xB3, 0x32, 0xF3, 0xB3, 0xC2, 0xA2, 0x2E, 0x70, - 0x5C, 0xFE, 0xC6, 0x6F, 0x6D, 0xA3, 0x77, 0x2B, - 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -//DevCerts -static const unsigned char ca4_dpki_cert[0x400] = -{ - 0x00, 0x01, 0x00, 0x03, 0x19, 0x49, 0x42, 0x9D, - 0x1E, 0x58, 0xA6, 0x2E, 0x7E, 0x8B, 0x56, 0xD1, - 0xB7, 0x6A, 0xE3, 0x02, 0xFD, 0x8B, 0x97, 0x49, - 0x1F, 0x77, 0x87, 0x45, 0xF7, 0x53, 0x88, 0xC4, - 0xDD, 0x0B, 0xEB, 0x1D, 0xF1, 0x22, 0xFB, 0x96, - 0x42, 0x15, 0x14, 0x97, 0x76, 0x4A, 0x53, 0xCF, - 0x78, 0x15, 0x18, 0x45, 0xE4, 0x2C, 0xA8, 0xFD, - 0xE4, 0x86, 0xFD, 0x2A, 0x4F, 0x53, 0xF8, 0xA1, - 0xBA, 0x00, 0x8A, 0x74, 0x85, 0xFF, 0x73, 0xB3, - 0xBF, 0x7E, 0x3C, 0x98, 0x07, 0x29, 0xD0, 0x65, - 0x6B, 0x69, 0x32, 0x19, 0xAD, 0xE8, 0x35, 0xEB, - 0x5F, 0xFF, 0xFC, 0xCB, 0x7C, 0xBB, 0x5E, 0x30, - 0x7F, 0xE0, 0x68, 0x8B, 0x88, 0x8E, 0xF2, 0xD2, - 0x05, 0x3F, 0xB7, 0xE7, 0x91, 0xE9, 0x85, 0xFD, - 0x15, 0xEF, 0x10, 0xD7, 0x9C, 0xCA, 0x88, 0xD6, - 0xBB, 0x15, 0xE8, 0xE4, 0x71, 0x4A, 0x98, 0xEE, - 0x09, 0xBF, 0x7B, 0x8A, 0xF0, 0x53, 0x23, 0x2B, - 0x64, 0x50, 0xE6, 0xD5, 0xFD, 0xFF, 0xC2, 0x0A, - 0x6D, 0x1E, 0xA6, 0xA2, 0x38, 0x12, 0xE1, 0x01, - 0x45, 0x25, 0xD5, 0x6D, 0x40, 0x82, 0x70, 0x3B, - 0x86, 0x98, 0x69, 0x59, 0xA7, 0x3C, 0xD1, 0xA1, - 0x43, 0x64, 0xD2, 0xC2, 0xDA, 0xEA, 0x96, 0xB0, - 0x95, 0xF7, 0x6C, 0x46, 0xE4, 0xFF, 0x41, 0x55, - 0x46, 0x5E, 0x70, 0xEF, 0x1E, 0xD3, 0x10, 0x53, - 0xD9, 0x70, 0x11, 0xE0, 0x10, 0xCC, 0x93, 0xE7, - 0x91, 0x40, 0x13, 0x68, 0x7F, 0xA3, 0xA8, 0x02, - 0x99, 0x6D, 0x1E, 0x55, 0x7B, 0x1C, 0xCC, 0x7A, - 0x7E, 0x8F, 0x58, 0x65, 0xC1, 0x74, 0x2E, 0x28, - 0xE2, 0x6D, 0xEF, 0x38, 0xA9, 0x3A, 0xB5, 0xD8, - 0x2D, 0x43, 0xEC, 0xCC, 0xBF, 0x0B, 0xEF, 0x22, - 0xE1, 0xFD, 0x57, 0xE2, 0x86, 0x43, 0x33, 0x58, - 0x2F, 0xED, 0xEA, 0xBC, 0x01, 0x2F, 0x98, 0x6D, - 0xDF, 0xC3, 0xE9, 0x44, 0x79, 0x73, 0x47, 0x03, - 0x08, 0x45, 0x5B, 0xDC, 0x57, 0xAA, 0x17, 0x0B, - 0x84, 0x42, 0x7F, 0x73, 0xA2, 0x9B, 0x48, 0xF6, - 0xDA, 0x13, 0x5F, 0x66, 0xC7, 0x45, 0xC1, 0x42, - 0xA8, 0x4A, 0xFB, 0x0E, 0x6A, 0x5E, 0xED, 0x85, - 0xD7, 0xB9, 0x71, 0x99, 0x36, 0xF8, 0xCE, 0x2B, - 0x62, 0x1F, 0x39, 0x5F, 0x40, 0xDC, 0x03, 0xBE, - 0xF8, 0x85, 0x4C, 0x11, 0x17, 0xFF, 0x0C, 0x12, - 0x86, 0x41, 0xCC, 0x78, 0x43, 0xB9, 0x7B, 0x43, - 0x46, 0xDB, 0x22, 0x6F, 0x60, 0x26, 0xAC, 0xB5, - 0x6C, 0x27, 0x8B, 0x8E, 0x0E, 0xA7, 0x9A, 0x2D, - 0x65, 0xEF, 0x79, 0x8E, 0x10, 0x78, 0xAD, 0x80, - 0xED, 0x4B, 0x96, 0x04, 0xD2, 0xF0, 0x8B, 0x2C, - 0xD6, 0x4A, 0x23, 0xA3, 0xDB, 0x27, 0x08, 0x33, - 0xB4, 0x02, 0xF8, 0x08, 0x51, 0xF3, 0x5B, 0xED, - 0x3E, 0xE4, 0x57, 0x7C, 0x66, 0x60, 0xFB, 0xF1, - 0x6D, 0x94, 0x13, 0xE0, 0x9C, 0x91, 0x7A, 0x49, - 0xD4, 0x2C, 0x6D, 0xA3, 0x75, 0xBC, 0x27, 0xF0, - 0x23, 0x0D, 0xB9, 0x8F, 0x89, 0x73, 0xAB, 0x02, - 0x7B, 0x52, 0x2C, 0xD5, 0x7E, 0xC0, 0x3D, 0x25, - 0xE8, 0xB3, 0xFC, 0x34, 0x94, 0xC9, 0x7F, 0xB1, - 0x08, 0xFE, 0x18, 0xC6, 0x8A, 0x43, 0x36, 0xE4, - 0x6C, 0x26, 0xB6, 0xF2, 0x80, 0xD2, 0x7E, 0x34, - 0xBE, 0x28, 0x7C, 0x3E, 0x46, 0x87, 0xBC, 0x9D, - 0x77, 0x6B, 0x76, 0xD9, 0x28, 0xD1, 0xB6, 0x35, - 0x2E, 0xC0, 0x34, 0x7D, 0x72, 0x94, 0xAA, 0x93, - 0x60, 0x26, 0x8D, 0x26, 0xF5, 0xF6, 0x52, 0x06, - 0x4A, 0xF2, 0x40, 0xD7, 0xD0, 0x0C, 0x7C, 0x5E, - 0xA3, 0xC3, 0x2D, 0xE6, 0x2D, 0x9B, 0x5C, 0x4B, - 0x4C, 0xAB, 0x6F, 0xD7, 0xBD, 0x37, 0x1D, 0x57, - 0xC2, 0x16, 0x60, 0x95, 0x91, 0x0E, 0x4A, 0xD8, - 0xE9, 0xED, 0x18, 0x1E, 0xF7, 0x61, 0x93, 0x61, - 0x53, 0x89, 0x2D, 0x77, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x6F, 0x6F, 0x74, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 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, 0x43, 0x41, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x34, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x81, 0x12, 0x2A, 0x46, - 0xC9, 0xCC, 0x2D, 0xC4, 0xDF, 0x29, 0x30, 0xE4, - 0xDF, 0x3F, 0x8C, 0x70, 0xA0, 0x78, 0x94, 0x87, - 0x75, 0xAD, 0x5E, 0x9A, 0xA6, 0x04, 0xC5, 0xB4, - 0xD8, 0xEA, 0xFF, 0x2A, 0xA1, 0xD2, 0x14, 0x67, - 0x65, 0x64, 0xEF, 0xCA, 0x28, 0xCC, 0x00, 0x15, - 0x45, 0x54, 0xA1, 0xA3, 0xEA, 0x13, 0x79, 0xE9, - 0xE6, 0xCA, 0xAC, 0xED, 0x15, 0x93, 0xFE, 0x88, - 0xD8, 0x9A, 0xC6, 0xB8, 0xAC, 0xCC, 0xAB, 0x6E, - 0x20, 0x7C, 0xEB, 0x7C, 0xCA, 0x29, 0x80, 0x9E, - 0x29, 0x80, 0x44, 0x06, 0x62, 0xB7, 0xD4, 0x38, - 0x2A, 0x15, 0xDA, 0x43, 0x08, 0x57, 0x45, 0xA9, - 0xAA, 0xE5, 0x9A, 0xA0, 0x5B, 0xDB, 0x32, 0xF6, - 0x68, 0x69, 0xA2, 0xDD, 0x42, 0x95, 0x38, 0x6C, - 0x87, 0xEC, 0xDD, 0x35, 0x08, 0xA2, 0xCF, 0x60, - 0xD0, 0x1E, 0x23, 0xEC, 0x2F, 0xE6, 0x98, 0xF4, - 0x70, 0xD6, 0x00, 0x15, 0x49, 0xA2, 0xF0, 0x67, - 0x59, 0x13, 0x1E, 0x53, 0x4C, 0x70, 0x06, 0x05, - 0x7D, 0xEF, 0x1D, 0x18, 0xA8, 0x3F, 0x0A, 0xC7, - 0x9C, 0xFE, 0x80, 0xFF, 0x5A, 0x91, 0xF2, 0xBE, - 0xD4, 0xA0, 0x83, 0x70, 0x61, 0x19, 0x0A, 0x03, - 0x29, 0x90, 0x21, 0x65, 0x40, 0x3C, 0x9A, 0x90, - 0x8F, 0xB6, 0x15, 0x73, 0x9F, 0x3C, 0xE3, 0x3B, - 0xF1, 0xBA, 0xEA, 0x16, 0xC2, 0x5B, 0xCE, 0xD7, - 0x96, 0x3F, 0xAC, 0xC9, 0xD2, 0x4D, 0x9C, 0x0A, - 0xD7, 0x6F, 0xC0, 0x20, 0xB2, 0xC4, 0xB8, 0x4C, - 0x10, 0xA7, 0x41, 0xA2, 0xCC, 0x7D, 0x9B, 0xAC, - 0x3A, 0xAC, 0xCC, 0xA3, 0x52, 0x9B, 0xAC, 0x31, - 0x6A, 0x9A, 0xA7, 0x5D, 0x2A, 0x26, 0xC7, 0xD7, - 0xD2, 0x88, 0xCB, 0xA4, 0x66, 0xC5, 0xFE, 0x5F, - 0x45, 0x4A, 0xE6, 0x79, 0x74, 0x4A, 0x90, 0xA1, - 0x57, 0x72, 0xDB, 0x3B, 0x0E, 0x47, 0xA4, 0x9A, - 0xF0, 0x31, 0xD1, 0x6D, 0xBE, 0xAB, 0x33, 0x2B, - 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static const unsigned char xs9_dpki_cert[0x300] = -{ - 0x00, 0x01, 0x00, 0x04, 0x63, 0x80, 0x5A, 0x35, - 0x1A, 0x43, 0x7B, 0xA2, 0x43, 0x19, 0xBB, 0x3A, - 0x77, 0x7B, 0x7A, 0xF3, 0x5E, 0x72, 0x4B, 0x15, - 0x0A, 0x06, 0x39, 0x6C, 0x5F, 0xEC, 0x38, 0x45, - 0xB1, 0x88, 0x76, 0x26, 0x8D, 0x5E, 0xDA, 0xE6, - 0x2F, 0x14, 0xBA, 0x02, 0xFA, 0xD6, 0xFC, 0x3B, - 0x2B, 0xBE, 0x87, 0x07, 0x63, 0x8E, 0x55, 0xBF, - 0x05, 0x5A, 0xFC, 0xFC, 0xB3, 0x47, 0x69, 0x11, - 0x89, 0xDB, 0x1C, 0xAF, 0x4B, 0x43, 0x76, 0x62, - 0x3E, 0x30, 0x89, 0x0A, 0x9D, 0x3B, 0xBB, 0x3E, - 0x50, 0xBD, 0xF7, 0xA6, 0xC0, 0xF7, 0xF8, 0xBB, - 0x0D, 0xB5, 0x6A, 0xBB, 0xC6, 0xC3, 0x50, 0xC8, - 0x88, 0xBB, 0x9D, 0xF0, 0x9B, 0xD1, 0x30, 0x64, - 0x60, 0x69, 0xDD, 0x34, 0x67, 0xA7, 0x00, 0xEB, - 0xDC, 0xF9, 0x8C, 0xB0, 0xF7, 0x93, 0x0E, 0x81, - 0xFE, 0x98, 0xD9, 0x72, 0x45, 0x8B, 0x94, 0x7E, - 0x59, 0xE2, 0xBE, 0x4E, 0x91, 0x2D, 0x75, 0xCA, - 0x1B, 0x8E, 0x2E, 0xF4, 0x6D, 0x73, 0xB1, 0x6B, - 0x35, 0xB5, 0x67, 0x0D, 0x63, 0x2D, 0x51, 0x38, - 0x53, 0x28, 0x19, 0x1D, 0x9D, 0xAE, 0x8D, 0xC6, - 0x61, 0xCC, 0xEF, 0xA4, 0xAB, 0xE2, 0xF3, 0xB0, - 0x4C, 0x7B, 0xE2, 0x71, 0xB5, 0xF9, 0x2C, 0xFA, - 0x55, 0xCD, 0x88, 0x8B, 0x72, 0xCC, 0xBE, 0x67, - 0xFA, 0xDF, 0xEF, 0x6B, 0x53, 0x3C, 0x45, 0xD8, - 0xCB, 0xDF, 0xB2, 0x76, 0x41, 0x46, 0xD6, 0xC2, - 0x6F, 0x27, 0x16, 0xC5, 0x07, 0xF3, 0xF4, 0x44, - 0x66, 0xA3, 0x15, 0xD2, 0x77, 0xF2, 0x89, 0xDA, - 0xFD, 0xD5, 0x50, 0xCF, 0xA4, 0x9B, 0xEA, 0xCA, - 0xC9, 0x7B, 0xE5, 0x46, 0x0E, 0xED, 0x9B, 0xFB, - 0x04, 0xA9, 0xDA, 0x19, 0x58, 0xD9, 0x2A, 0x20, - 0x8A, 0xAC, 0xC1, 0xF4, 0x8E, 0xE9, 0x14, 0xD8, - 0x8A, 0xD7, 0x41, 0xD5, 0x5B, 0x9B, 0x64, 0x22, - 0xD8, 0xAF, 0xAE, 0xC7, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x6F, 0x6F, 0x74, 0x2D, 0x43, 0x41, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x34, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 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, 0x58, 0x53, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x39, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0xA3, 0x47, 0xA4, - 0xC0, 0x84, 0x4C, 0xEB, 0x7E, 0xB0, 0xCF, 0xF0, - 0xAE, 0xB7, 0x77, 0x69, 0x85, 0x93, 0xE4, 0x99, - 0x5A, 0x95, 0x4E, 0x58, 0x17, 0x38, 0xCE, 0xD6, - 0x81, 0xB0, 0xBD, 0x77, 0x09, 0xE7, 0xF8, 0x9A, - 0xDF, 0xAD, 0x05, 0x48, 0x83, 0xF6, 0xC3, 0xFD, - 0xDF, 0x7B, 0x83, 0xE0, 0x0C, 0x26, 0x81, 0x54, - 0x43, 0x29, 0xEA, 0x82, 0x6C, 0x89, 0xF0, 0xA6, - 0x74, 0x42, 0x86, 0x4D, 0x32, 0x60, 0x32, 0x7D, - 0xA7, 0x7A, 0x13, 0x40, 0x66, 0x59, 0xDA, 0x3E, - 0x41, 0x6B, 0x27, 0x94, 0x03, 0x4F, 0xAA, 0x22, - 0x9D, 0xD5, 0x54, 0x52, 0xDB, 0x27, 0x0A, 0x6A, - 0xA2, 0x3D, 0x19, 0xB1, 0x66, 0x1B, 0x19, 0x7D, - 0xAB, 0xC7, 0x0E, 0x88, 0x17, 0x91, 0xA1, 0x2A, - 0xB4, 0x3C, 0x6C, 0xCB, 0xF5, 0xAA, 0x7C, 0x3A, - 0xDD, 0x36, 0xFB, 0x35, 0x71, 0x7B, 0x20, 0x01, - 0x59, 0x00, 0xD6, 0xF6, 0x90, 0x39, 0x35, 0x41, - 0x31, 0xF8, 0xC1, 0xC0, 0x57, 0x3A, 0x35, 0x18, - 0x58, 0x90, 0xB1, 0xAD, 0x9A, 0x0E, 0xEC, 0xE0, - 0xF4, 0x7A, 0x7D, 0xA5, 0x27, 0x48, 0xC9, 0x72, - 0xAB, 0x0D, 0x08, 0x7B, 0x62, 0x35, 0x40, 0x91, - 0x14, 0x2B, 0xB1, 0x1D, 0x1A, 0xFA, 0xF9, 0xCD, - 0x5C, 0x17, 0x13, 0x53, 0x52, 0x71, 0xCA, 0xE2, - 0x2A, 0x78, 0xB1, 0x7F, 0x4A, 0xCD, 0x59, 0xD8, - 0xBA, 0x1D, 0x7D, 0x70, 0x5F, 0x78, 0x1B, 0x9F, - 0x9D, 0x37, 0x18, 0x8E, 0xD7, 0xCD, 0x0D, 0x49, - 0x57, 0x74, 0x69, 0x88, 0x3A, 0x6B, 0x8E, 0x4E, - 0x1B, 0x85, 0xDD, 0xBE, 0x39, 0x45, 0x05, 0x89, - 0x56, 0x12, 0x97, 0x59, 0x9A, 0x09, 0xA4, 0xC8, - 0x2D, 0x2F, 0xF5, 0xCF, 0xB4, 0x73, 0x70, 0xDB, - 0x58, 0x1E, 0xB2, 0x4E, 0x77, 0x6F, 0xA4, 0x7E, - 0x62, 0xDF, 0xB7, 0x05, 0xE8, 0x80, 0x42, 0x5C, - 0xB8, 0x78, 0x87, 0x97, 0x7F, 0x66, 0x2C, 0x5F, - 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static const unsigned char cpA_dpki_cert[0x300] = -{ - 0x00, 0x01, 0x00, 0x04, 0x50, 0x05, 0xD7, 0x5E, - 0x6D, 0xDE, 0xB8, 0x78, 0x3C, 0x81, 0xE9, 0xEF, - 0x0D, 0x17, 0xCD, 0x58, 0xF5, 0x94, 0x26, 0xA3, - 0xFD, 0x6F, 0x69, 0x90, 0xE8, 0xF8, 0x32, 0x87, - 0x12, 0x2E, 0xC2, 0x5C, 0xA1, 0x4B, 0x99, 0x24, - 0x23, 0x37, 0xBA, 0x91, 0xA7, 0x5B, 0x0F, 0x7C, - 0x59, 0xFB, 0xF7, 0xD1, 0x89, 0x27, 0x22, 0xC4, - 0xE6, 0xAF, 0xC7, 0xDE, 0xC7, 0x4A, 0x6E, 0x00, - 0x7F, 0x43, 0x4A, 0x88, 0x8A, 0x82, 0x15, 0xE8, - 0xDF, 0x2B, 0x52, 0xED, 0x42, 0x00, 0xBC, 0x69, - 0xB4, 0xDA, 0x7F, 0xEB, 0x74, 0x6C, 0x7A, 0x2D, - 0x96, 0x56, 0x5B, 0x45, 0x59, 0x7B, 0x8F, 0xAE, - 0xB1, 0x6B, 0xDC, 0x76, 0xC1, 0xC8, 0x0C, 0x47, - 0xF5, 0x0D, 0xA9, 0xC3, 0xE1, 0xFE, 0x28, 0x50, - 0x1C, 0x26, 0xA2, 0xD1, 0x54, 0x4B, 0xD1, 0x60, - 0x4A, 0x9E, 0x8F, 0x32, 0x2A, 0xEF, 0x31, 0x5F, - 0xEA, 0x48, 0x22, 0x67, 0x22, 0xB7, 0xCB, 0x37, - 0x2F, 0xF3, 0x5F, 0x5E, 0x61, 0x6A, 0x53, 0x44, - 0xA5, 0x85, 0xE5, 0xA0, 0x8A, 0x2E, 0x17, 0x77, - 0x57, 0x2B, 0x7A, 0x9A, 0xF7, 0xD2, 0xD8, 0xC4, - 0x9C, 0xD0, 0xA0, 0x54, 0xBF, 0x8A, 0x9D, 0xB4, - 0x9F, 0xC6, 0x60, 0x61, 0x7C, 0xB8, 0x35, 0x4E, - 0x25, 0x7F, 0x68, 0x68, 0x2F, 0x94, 0xB3, 0xCC, - 0x53, 0x8C, 0x42, 0x6F, 0x88, 0xC5, 0x48, 0x5C, - 0xBE, 0xC1, 0xD0, 0x48, 0x04, 0x74, 0x96, 0x5A, - 0x7E, 0x82, 0x59, 0xAA, 0x9F, 0xB6, 0x61, 0x46, - 0xCE, 0x59, 0x21, 0xC6, 0xF0, 0xC1, 0x75, 0x1F, - 0x21, 0x91, 0x7F, 0x24, 0x96, 0xCB, 0x0C, 0x70, - 0x15, 0x7A, 0xB7, 0xBB, 0x3A, 0x9F, 0x57, 0x56, - 0x56, 0x5C, 0x38, 0x92, 0x2E, 0xFD, 0xC8, 0xF1, - 0x70, 0xB9, 0xAE, 0xA1, 0xAE, 0x36, 0xF5, 0x5E, - 0x35, 0x26, 0x63, 0x0A, 0xBA, 0xB2, 0x05, 0x0F, - 0xF0, 0x0C, 0xDC, 0xBB, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x6F, 0x6F, 0x74, 0x2D, 0x43, 0x41, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x34, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 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, 0x43, 0x50, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x61, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0xA3, 0x4D, 0x5B, - 0xAA, 0x7F, 0x93, 0x80, 0x28, 0x9B, 0xE8, 0x98, - 0x63, 0x10, 0x7A, 0xE1, 0x0C, 0x59, 0x2C, 0x2F, - 0x7C, 0xFF, 0xBD, 0xAA, 0xDD, 0x74, 0xF4, 0xA2, - 0xFB, 0xAC, 0xD7, 0x6F, 0x00, 0x93, 0x42, 0x06, - 0x34, 0x71, 0x56, 0xD8, 0x40, 0x49, 0x72, 0x9F, - 0x3E, 0x24, 0xFA, 0x5E, 0x19, 0xD1, 0x5B, 0x63, - 0x5C, 0xD2, 0xEF, 0x09, 0xDE, 0x32, 0xEE, 0x6B, - 0x6F, 0xC8, 0xFA, 0x32, 0x8E, 0x2E, 0x96, 0xB9, - 0x94, 0x41, 0x04, 0x7D, 0x07, 0x62, 0x95, 0xDA, - 0x0D, 0x91, 0xD8, 0x09, 0x35, 0xD0, 0xDE, 0x8E, - 0x6B, 0xC6, 0xAB, 0x14, 0x27, 0x01, 0x9C, 0xFE, - 0x49, 0x96, 0xFC, 0x9B, 0x54, 0x79, 0x4D, 0xEB, - 0xD7, 0xC6, 0x66, 0x73, 0xA6, 0xDD, 0x3A, 0x77, - 0x65, 0x47, 0x94, 0xEC, 0x1C, 0x87, 0xAA, 0x46, - 0xD9, 0x78, 0xA9, 0x7D, 0xDB, 0x11, 0x22, 0x6E, - 0xD4, 0x12, 0xC2, 0x78, 0x4B, 0x21, 0x83, 0x92, - 0xC7, 0x10, 0xC7, 0x74, 0x19, 0xFF, 0xAA, 0xF6, - 0x0B, 0x75, 0xD8, 0x23, 0xDD, 0x33, 0xC3, 0xA1, - 0x5B, 0xA7, 0x2D, 0x30, 0xA5, 0xA4, 0xD8, 0xF8, - 0x0F, 0xD6, 0x73, 0xFD, 0x26, 0xCB, 0x29, 0xA6, - 0xEF, 0x50, 0x39, 0xE2, 0x5F, 0x59, 0x61, 0x84, - 0x6B, 0xDA, 0x2E, 0xC7, 0xCB, 0xE4, 0x38, 0x4B, - 0x28, 0xFB, 0x0D, 0xD5, 0x8E, 0x7C, 0xAA, 0x7D, - 0x4B, 0x37, 0x3A, 0xD7, 0x81, 0xDD, 0x73, 0xE3, - 0x09, 0x93, 0xBD, 0xBD, 0x7E, 0x08, 0x55, 0x4A, - 0x8C, 0xA5, 0xC9, 0x84, 0x2D, 0x71, 0x01, 0xA2, - 0x2A, 0x01, 0xB0, 0x15, 0xFB, 0x30, 0x78, 0xB9, - 0x13, 0xF4, 0xC7, 0x3F, 0xB5, 0xA6, 0xF1, 0xA2, - 0x5E, 0x22, 0xB0, 0x02, 0xB6, 0xE0, 0x09, 0x54, - 0x7F, 0x0F, 0xBD, 0xF0, 0xFE, 0xA5, 0x50, 0x1D, - 0x93, 0x15, 0xF9, 0x3D, 0x83, 0x0F, 0x0F, 0x0E, - 0x3D, 0xE2, 0x3D, 0x96, 0xE7, 0x09, 0xD9, 0x77, - 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -#endif \ No newline at end of file diff --git a/crypto.c b/crypto.c deleted file mode 100644 index 90dc016..0000000 --- a/crypto.c +++ /dev/null @@ -1,423 +0,0 @@ -#include "lib.h" -#include "crypto.h" - -// API for polarssl adapted/copied from CTRTOOL by neimod -void ctr_sha(void *data, u64 size, u8 *hash, int mode) -{ - switch(mode){ - case(CTR_SHA_1): sha1((u8*)data, size, hash); break; - case(CTR_SHA_256): sha2((u8*)data, size, hash, 0); break; - } -} - -void ctr_add_counter(ctr_aes_context* ctx, u32 carry) -{ - u32 counter[4]; - u32 sum; - int i; - - for(i=0; i<4; i++) - counter[i] = (ctx->ctr[i*4+0]<<24) | (ctx->ctr[i*4+1]<<16) | (ctx->ctr[i*4+2]<<8) | (ctx->ctr[i*4+3]<<0); - - for(i=3; i>=0; i--) - { - sum = counter[i] + carry; - - if (sum < counter[i]) - carry = 1; - else - carry = 0; - - counter[i] = sum; - } - - for(i=0; i<4; i++) - { - ctx->ctr[i*4+0] = counter[i]>>24; - ctx->ctr[i*4+1] = counter[i]>>16; - ctx->ctr[i*4+2] = counter[i]>>8; - ctx->ctr[i*4+3] = counter[i]>>0; - } -} - -void ctr_init_counter(ctr_aes_context* ctx, u8 key[16], u8 ctr[16]) -{ - aes_setkey_enc(&ctx->aes, key, 128); - memcpy(ctx->ctr, ctr, 16); -} - -void ctr_crypt_counter_block(ctr_aes_context* ctx, u8 input[16], u8 output[16]) -{ - int i; - u8 stream[16]; - - - aes_crypt_ecb(&ctx->aes, AES_ENCRYPT, ctx->ctr, stream); - - - if (input) - { - for(i=0; i<16; i++) - { - output[i] = stream[i] ^ input[i]; - } - } - else - { - for(i=0; i<16; i++) - output[i] = stream[i]; - } - - ctr_add_counter(ctx, 1); -} - -void ctr_crypt_counter(ctr_aes_context* ctx, u8* input, u8* output, u32 size) -{ - u8 stream[16]; - u32 i; - - while(size >= 16) - { - ctr_crypt_counter_block(ctx, input, output); - - if (input) - input += 16; - if (output) - output += 16; - - size -= 16; - } - - if (size) - { - memset(stream, 0, 16); - ctr_crypt_counter_block(ctx, stream, stream); - - if (input) - { - for(i=0; iaes, key, 128); break; - case(DEC): aes_setkey_dec(&ctx->aes, key, 128); break; - } - memcpy(ctx->iv, iv, 16); -} - -void ctr_aes_cbc(ctr_aes_context* ctx,u8* input,u8* output,u32 size,u8 mode) -{ - switch(mode){ - case(ENC): aes_crypt_cbc(&ctx->aes, AES_ENCRYPT, size, ctx->iv, input, output); break; - case(DEC): aes_crypt_cbc(&ctx->aes, AES_DECRYPT, size, ctx->iv, input, output); break; - } -} - -void ctr_rsa_free(ctr_rsa_context* ctx) -{ - rsa_free(&ctx->rsa); -} - -int ctr_rsa_init(ctr_rsa_context* ctx, u8 *modulus, u8 *private_exp, u8 *exponent, u8 rsa_type, u8 mode) -{ - // Sanity Check - if(ctx == NULL || modulus == NULL ||(private_exp == NULL && mode == RSAKEY_PRIV) || (exponent == NULL && mode == RSAKEY_PUB)) - return Fail; - rsa_init(&ctx->rsa, RSA_PKCS_V15, 0); - u16 n_size = 0; - u16 d_size = 0; - u16 e_size = 0; - switch(rsa_type){ - case RSA_2048: - ctx->rsa.len = 0x100; - n_size = 0x100; - d_size = 0x100; - e_size = 3; - break; - case RSA_4096: - ctx->rsa.len = 0x200; - n_size = 0x200; - d_size = 0x200; - e_size = 3; - break; - default: return Fail; - } - - switch(mode){ - case(RSAKEY_PUB): - if (mpi_read_binary(&ctx->rsa.N, modulus, n_size)) - goto clean; - if (mpi_read_binary(&ctx->rsa.E, exponent, e_size)) - goto clean; - break; - case(RSAKEY_PRIV): - if (mpi_read_binary(&ctx->rsa.N, modulus, n_size)) - goto clean; - if (mpi_read_binary(&ctx->rsa.D, private_exp, d_size)) - goto clean; - break; - default: return Fail; - } - - return Good; -clean: - ctr_rsa_free(ctx); - return Fail; -} - -int ctr_sig(void *data, u64 size, u8 *signature, u8 *modulus, u8 *private_exp, u32 type, u8 mode) -{ - int result = 0; - int hashtype, hashlen, sigtype; - if(data == NULL || signature == NULL || modulus == NULL ||(private_exp == NULL && mode == CTR_RSA_SIGN)) - return Fail; - - switch(type){ - case RSA_4096_SHA1: - hashtype = CTR_SHA_1; - hashlen = 0x14; - sigtype = RSA_4096; - case RSA_4096_SHA256: - hashtype = CTR_SHA_256; - hashlen = 0x20; - sigtype = RSA_4096; - break; - case RSA_2048_SHA1: - hashtype = CTR_SHA_1; - hashlen = 0x14; - sigtype = RSA_2048; - case RSA_2048_SHA256: - hashtype = CTR_SHA_256; - hashlen = 0x20; - sigtype = RSA_2048; - break; - case ECC_SHA1: - hashtype = CTR_SHA_1; - hashlen = 0x14; - sigtype = ECC; - case ECC_SHA256: - hashtype = CTR_SHA_256; - hashlen = 0x20; - sigtype = ECC; - break; - default: return Fail; - } - - u8 hash[hashlen]; - memset(hash,0,hashlen); - ctr_sha(data,size,hash,hashtype); - //memdump(stdout,"Data: ",data,size); - //memdump(stdout,"HashFor Sig: ",hash,hashlen); - - if(sigtype == RSA_2048 || sigtype == RSA_4096) - result = ctr_rsa(hash,signature,modulus,private_exp,type,mode); - else if(sigtype == ECC){ - printf("[!] ECC is not yet implemented\n"); - result = Fail; - } - return result; -} - -int ctr_rsa(u8 *hash, u8 *signature, u8 *modulus, u8 *private_exp, u32 type, u8 mode) -{ - int result = 0; - // Sanity Check - if(hash == NULL || signature == NULL || modulus == NULL ||(private_exp == NULL && mode == CTR_RSA_SIGN)) - return Fail; - - // Getting details from sig type - int hashtype; - int hashlen; - int sigtype; - switch(type){ - case RSA_4096_SHA1: - hashtype = SIG_RSA_SHA1; - hashlen = 0x14; - sigtype = RSA_4096; - break; - case RSA_4096_SHA256: - hashtype = SIG_RSA_SHA256; - hashlen = 0x14; - sigtype = RSA_4096; - break; - case RSA_2048_SHA1: - hashtype = SIG_RSA_SHA1; - hashlen = 0x20; - sigtype = RSA_2048; - break; - case RSA_2048_SHA256: - hashtype = SIG_RSA_SHA256; - hashlen = 0x20; - sigtype = RSA_2048; - break; - default: return Fail; - } - - // Setting up - ctr_rsa_context ctx; - u8 exponent[3] = {0x01,0x00,0x01}; - switch(mode){ - case CTR_RSA_VERIFY: - result = ctr_rsa_init(&ctx,modulus,NULL,(u8*)exponent,sigtype,RSAKEY_PUB); - break; - case CTR_RSA_SIGN: - result = ctr_rsa_init(&ctx,modulus,private_exp,NULL,sigtype,RSAKEY_PRIV); - break; - } - if(result)return result; - - switch(mode){ - case CTR_RSA_VERIFY: - return rsa_pkcs1_verify(&ctx.rsa,RSA_PUBLIC,hashtype,hashlen,hash,signature); - case CTR_RSA_SIGN: - return ctr_rsa_rsassa_pkcs1_v15_sign(&ctx.rsa,RSA_PRIVATE,hashtype,hashlen,hash,signature); - } - return Fail; -} - - -/** -* Hacked from rsa.c, polarssl doesn't like generating signatures when only D and N are present -**/ -int ctr_rsa_rsassa_pkcs1_v15_sign( rsa_context *ctx, - int mode, - int hash_id, - unsigned int hashlen, - const unsigned char *hash, - unsigned char *sig ) -{ - size_t nb_pad, olen, ret; - unsigned char *p = sig; - - if( ctx->padding != RSA_PKCS_V15 ) - return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); - - olen = ctx->len; - - switch( hash_id ) - { - case SIG_RSA_RAW: - nb_pad = olen - 3 - hashlen; - break; - - case SIG_RSA_MD2: - case SIG_RSA_MD4: - case SIG_RSA_MD5: - nb_pad = olen - 3 - 34; - break; - - case SIG_RSA_SHA1: - nb_pad = olen - 3 - 35; - break; - - case SIG_RSA_SHA224: - nb_pad = olen - 3 - 47; - break; - - case SIG_RSA_SHA256: - nb_pad = olen - 3 - 51; - break; - - case SIG_RSA_SHA384: - nb_pad = olen - 3 - 67; - break; - - case SIG_RSA_SHA512: - nb_pad = olen - 3 - 83; - break; - - - default: - return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); - } - - if( ( nb_pad < 8 ) || ( nb_pad > olen ) ) - return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); - - *p++ = 0; - *p++ = RSA_SIGN; - memset( p, 0xFF, nb_pad ); - p += nb_pad; - *p++ = 0; - - switch( hash_id ) - { - case SIG_RSA_RAW: - memcpy( p, hash, hashlen ); - break; - - case SIG_RSA_MD2: - memcpy( p, ASN1_HASH_MDX, 18 ); - memcpy( p + 18, hash, 16 ); - p[13] = 2; break; - - case SIG_RSA_MD4: - memcpy( p, ASN1_HASH_MDX, 18 ); - memcpy( p + 18, hash, 16 ); - p[13] = 4; break; - - case SIG_RSA_MD5: - memcpy( p, ASN1_HASH_MDX, 18 ); - memcpy( p + 18, hash, 16 ); - p[13] = 5; break; - - case SIG_RSA_SHA1: - memcpy( p, ASN1_HASH_SHA1, 15 ); - memcpy( p + 15, hash, 20 ); - break; - - case SIG_RSA_SHA224: - memcpy( p, ASN1_HASH_SHA2X, 19 ); - memcpy( p + 19, hash, 28 ); - p[1] += 28; p[14] = 4; p[18] += 28; break; - - case SIG_RSA_SHA256: - memcpy( p, ASN1_HASH_SHA2X, 19 ); - memcpy( p + 19, hash, 32 ); - p[1] += 32; p[14] = 1; p[18] += 32; break; - - case SIG_RSA_SHA384: - memcpy( p, ASN1_HASH_SHA2X, 19 ); - memcpy( p + 19, hash, 48 ); - p[1] += 48; p[14] = 2; p[18] += 48; break; - - case SIG_RSA_SHA512: - memcpy( p, ASN1_HASH_SHA2X, 19 ); - memcpy( p + 19, hash, 64 ); - p[1] += 64; p[14] = 3; p[18] += 64; break; - - default: - return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); - } - - mpi T, T1, T2; - - mpi_init( &T ); mpi_init( &T1 ); mpi_init( &T2 ); - - MPI_CHK( mpi_read_binary( &T, sig, ctx->len ) ); - - if( mpi_cmp_mpi( &T, &ctx->N ) >= 0 ) - { - mpi_free( &T ); - return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); - } - - MPI_CHK( mpi_exp_mod( &T, &T, &ctx->D, &ctx->N, &ctx->RN ) ); - - MPI_CHK( mpi_write_binary( &T, sig, olen ) ); - -cleanup: - - mpi_free( &T ); mpi_free( &T1 ); mpi_free( &T2 ); - - return( 0 ); -} \ No newline at end of file diff --git a/crypto.h b/crypto.h deleted file mode 100644 index 1380d1b..0000000 --- a/crypto.h +++ /dev/null @@ -1,101 +0,0 @@ -#ifndef _CTR_CRYPTO_H_ -#define _CTR_CRYPTO_H_ - -#include "polarssl/config.h" -#include "polarssl/aes.h" -#include "polarssl/rsa.h" -#include "polarssl/sha1.h" -#include "polarssl/sha2.h" - -typedef enum -{ - RSA_4096_SHA1 = 0x00010000, - RSA_2048_SHA1 = 0x00010001, - ECC_SHA1 = 0x00010002, - RSA_4096_SHA256 = 0x00010003, - RSA_2048_SHA256 = 0x00010004, - ECC_SHA256 = 0x00010005 -} sig_types; - -typedef enum -{ - RSA_2048 = 0, - RSA_4096 = 1, - ECC = 2, -} ctr_sig_types; - -typedef enum -{ - CTR_RSA_VERIFY = 0, - CTR_RSA_SIGN = 1, -} ctr_rsa_functions; - -typedef enum -{ - CTR_SHA_1 = 1, - CTR_SHA_256 = 256, -} ctr_sha_modes; - -typedef enum -{ - RSA_4096_PUBK = 0, - RSA_2048_PUBK, - ECC_PUBK -} pubk_types; - -typedef enum -{ - ENC, - DEC -} aescbcmode; - -typedef enum -{ - RSAKEY_INVALID, - RSAKEY_PRIV, - RSAKEY_PUB -} rsakeytype; - -typedef struct -{ - u8 ctr[16]; - u8 iv[16]; - aes_context aes; -} ctr_aes_context; - -typedef struct -{ - rsa_context rsa; -} ctr_rsa_context; - -#ifdef __cplusplus -extern "C" { -#endif -// SHA -void ctr_sha(void *data, u64 size, u8 *hash, int mode); -// AES -void ctr_add_counter(ctr_aes_context* ctx, u32 carry); -void ctr_init_counter(ctr_aes_context* ctx, u8 key[16],u8 ctr[16]); -void ctr_crypt_counter_block(ctr_aes_context* ctx, u8 input[16], u8 output[16]); -void ctr_crypt_counter(ctr_aes_context* ctx, u8* input, u8* output, u32 size); -void ctr_init_aes_cbc(ctr_aes_context* ctx,u8 key[16],u8 iv[16], u8 mode); -void ctr_aes_cbc(ctr_aes_context* ctx,u8* input,u8* output,u32 size,u8 mode); -// RSA -void ctr_rsa_free(ctr_rsa_context* ctx); -int ctr_rsa_init(ctr_rsa_context* ctx, u8 *modulus, u8 *private_exp, u8 *exponent, u8 rsa_type, u8 mode); -int ctr_rsa(u8 *hash, u8 *signature, u8 *modulus, u8 *private_exp, u32 type, u8 mode); -int ctr_rsa_rsassa_pkcs1_v15_sign( rsa_context *ctx, - int mode, - int hash_id, - unsigned int hashlen, - const unsigned char *hash, - unsigned char *sig ); - -// Signature Functions -int ctr_sig(void *data, u64 size, u8 *signature, u8 *modulus, u8 *private_exp, u32 type, u8 mode); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/elf.c b/elf.c deleted file mode 100644 index 63f7e8f..0000000 --- a/elf.c +++ /dev/null @@ -1,977 +0,0 @@ -#include "lib.h" -#include "ncch.h" -#include "elf_hdr.h" -#include "elf.h" -#include "blz.h" - -int ImportPlainRegionFromFile(ncch_settings *ncchset); -int ImportExeFsCodeBinaryFromFile(ncch_settings *ncchset); - -u32 GetPageSize(ncch_settings *ncchset); -u32 SizeToPage(u32 memorySize, ElfContext *elf); - -int GetBSS_SizeFromElf(ElfContext *elf, u8 *ElfFile, ncch_settings *ncchset); -int ImportPlainRegionFromElf(ElfContext *elf, u8 *ElfFile, ncch_settings *ncchset); -int CreateExeFsCode(ElfContext *elf, u8 *ElfFile, ncch_settings *ncchset); -int CreateCodeSegmentFromElf(CodeSegment *out, ElfContext *elf, u8 *ElfFile, char **Names, u32 NameNum); -ElfSegment** GetContinuousSegments(u16 *ContinuousSegmentNum, ElfContext *elf, char **Names, u32 NameNum); -ElfSegment** GetSegments(u16 *SegmentNum, ElfContext *elf, char **Names, u32 NameNum); - -// ELF Functions -int GetElfContext(ElfContext *elf, u8 *ElfFile); -int GetElfSectionEntries(ElfContext *elf, u8 *ElfFile); -int GetElfProgramEntries(ElfContext *elf, u8 *ElfFile); -void PrintElfContext(ElfContext *elf, u8 *ElfFile); -int ReadElfHdr(ElfContext *elf, u8 *ElfFile); - -int CreateElfSegments(ElfContext *elf, u8 *ElfFile); -bool IsIgnoreSection(ElfSectionEntry info); - -/* ELF Section Entry Functions */ -u8* GetELFSectionHeader(u16 Index, ElfContext *elf, u8 *ElfFile); -u8* GetELFSectionEntry(u16 Index, ElfContext *elf, u8 *ElfFile); -char* GetELFSectionEntryName(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFSectionEntryType(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFSectionEntryFlags(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFSectionEntryAddress(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFSectionEntryFileOffset(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFSectionEntrySize(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFSectionEntryAlignment(u16 Index, ElfContext *elf, u8 *ElfFile); - -u16 GetElfSectionIndexFromName(char *Name, ElfContext *elf, u8 *ElfFile); - -bool IsBss(ElfSectionEntry *Section); -bool IsData(ElfSectionEntry *Section); -bool IsRO(ElfSectionEntry *Section); -bool IsText(ElfSectionEntry *Section); - -/* ELF Program Entry Functions */ -u8* GetELFProgramHeader(u16 Index, ElfContext *elf, u8 *ElfFile); -u8* GetELFProgramEntry(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFProgramEntryType(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFProgramEntryFlags(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFProgramEntryFileSize(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFProgramEntryFileOffset(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFProgramEntryMemorySize(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFProgramEntryVAddress(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFProgramEntryPAddress(u16 Index, ElfContext *elf, u8 *ElfFile); -u64 GetELFProgramEntryAlignment(u16 Index, ElfContext *elf, u8 *ElfFile); - - -int BuildExeFsCode(ncch_settings *ncchset) -{ - int result = 0; - if(ncchset->ComponentFilePtrs.plainregion){ // Import PlainRegion from file - result = ImportPlainRegionFromFile(ncchset); - if(result) return result; - } - if(!ncchset->Options.IsBuildingCodeSection){ // Import ExeFs Code from file and return - result = ImportExeFsCodeBinaryFromFile(ncchset); - return result; - } - -#ifdef DEBUG - printf("[DEBUG] Import ELF\n"); -#endif - /* Import ELF */ - u8 *ElfFile = malloc(ncchset->ComponentFilePtrs.elf_size); - if(!ElfFile) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); return MEM_ERROR;} - ReadFile_64(ElfFile,ncchset->ComponentFilePtrs.elf_size,0,ncchset->ComponentFilePtrs.elf); - -#ifdef DEBUG - printf("[DEBUG] Create ELF Context\n"); -#endif - /* Create ELF Context */ - ElfContext *elf = malloc(sizeof(ElfContext)); - if(!elf) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); free(ElfFile); return MEM_ERROR;} - memset(elf,0,sizeof(ElfContext)); - - result = GetElfContext(elf,ElfFile); - if(result) goto finish; - - /* Setting Page Size */ - elf->PageSize = GetPageSize(ncchset); - - if(!ncchset->ComponentFilePtrs.plainregion){ - result = ImportPlainRegionFromElf(elf,ElfFile,ncchset); - if(result) goto finish; - } - -#ifdef ELF_DEBUG - PrintElfContext(elf,ElfFile); -#endif - -#ifdef DEBUG - PrintElfContext(elf,ElfFile); -#endif - -#ifdef DEBUG - printf("[DEBUG] Create ExeFs Code\n"); -#endif - result = CreateExeFsCode(elf,ElfFile,ncchset); - if(result) goto finish; -#ifdef DEBUG - printf("[DEBUG] Get BSS Size\n"); -#endif - result = GetBSS_SizeFromElf(elf,ElfFile,ncchset); - if(result) goto finish; - -finish: - if(result){ - if(result == NOT_ELF_FILE) fprintf(stderr,"[ELF ERROR] Not ELF File\n"); - else if(result == NOT_ARM_ELF) fprintf(stderr,"[ELF ERROR] Not ARM ELF\n"); - else if(result == NON_EXECUTABLE_ELF) fprintf(stderr,"[ELF ERROR] Not Executeable ELF\n"); - else if(result == NOT_FIND_BSS_SIZE) fprintf(stderr,"[ELF ERROR] BSS Size Could not be found\n"); - else if(result == NOT_FIND_CODE_SECTIONS) fprintf(stderr,"[ELF ERROR] Failed to retrieve code sections from ELF\n"); - else fprintf(stderr,"[ELF ERROR] Failed to process ELF file (%d)\n",result); - } -#ifdef DEBUG - printf("[DEBUG] Free Segment Header/Sections\n"); -#endif - for(int i = 0; i < elf->ActiveSegments; i++){ -#ifdef DEBUG - printf("[DEBUG] %d\n",i); -#endif - free(elf->Segments[i].Sections); - } -#ifdef DEBUG - printf("[DEBUG] Free others\n"); -#endif - free(ElfFile); - free(elf->Sections); - free(elf->ProgramHeaders); - free(elf->Segments); - free(elf); - return result; -} - -int ImportPlainRegionFromFile(ncch_settings *ncchset) -{ - ncchset->Sections.PlainRegion.size = align_value(ncchset->ComponentFilePtrs.plainregion_size,ncchset->Options.MediaSize); - ncchset->Sections.PlainRegion.buffer = malloc(ncchset->Sections.PlainRegion.size); - if(!ncchset->Sections.PlainRegion.buffer) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); return MEM_ERROR;} - ReadFile_64(ncchset->Sections.PlainRegion.buffer,ncchset->ComponentFilePtrs.plainregion_size,0,ncchset->ComponentFilePtrs.plainregion); - return 0; -} - -int ImportExeFsCodeBinaryFromFile(ncch_settings *ncchset) -{ - u32 size = ncchset->ComponentFilePtrs.code_size; - u8 *buffer = malloc(size); - if(!buffer) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); return MEM_ERROR;} - ReadFile_64(buffer,size,0,ncchset->ComponentFilePtrs.code); - - ncchset->ExeFs_Sections.Code.size = ncchset->ComponentFilePtrs.code_size; - ncchset->ExeFs_Sections.Code.buffer = malloc(ncchset->ExeFs_Sections.Code.size); - if(!ncchset->ExeFs_Sections.Code.buffer) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); return MEM_ERROR;} - ReadFile_64(ncchset->ExeFs_Sections.Code.buffer,ncchset->ExeFs_Sections.Code.size,0,ncchset->ComponentFilePtrs.code); - if(ncchset->Options.CompressCode){ - u32 new_len; - ncchset->ExeFs_Sections.Code.buffer = BLZ_Code(buffer,size,&new_len,BLZ_NORMAL); - ncchset->ExeFs_Sections.Code.size = new_len; - free(buffer); - } - else{ - ncchset->ExeFs_Sections.Code.size = size; - ncchset->ExeFs_Sections.Code.buffer = buffer; - } - return 0; -} - -u32 GetPageSize(ncch_settings *ncchset) -{ - if(ncchset->yaml_set->Option.PageSize) - return strtoul(ncchset->yaml_set->Option.PageSize,NULL,10); - return 0x1000; -} - -u32 SizeToPage(u32 memorySize, ElfContext *elf) -{ - return align_value(memorySize,elf->PageSize)/elf->PageSize; -} - - -int GetBSS_SizeFromElf(ElfContext *elf, u8 *ElfFile, ncch_settings *ncchset) -{ - for(int i = 0; i < elf->SectionTableEntryCount; i++){ - if(IsBss(&elf->Sections[i])) { - ncchset->CodeDetails.BSS_Size = elf->Sections[i].Size; - return 0; - } - } - return NOT_FIND_BSS_SIZE; -} - -int ImportPlainRegionFromElf(ElfContext *elf, u8 *ElfFile, ncch_settings *ncchset) // Doesn't work same as N makerom -{ - if(!ncchset->yaml_set->PlainRegionNum) return 0; - u16 *Index = malloc(sizeof(u16)*ncchset->yaml_set->PlainRegionNum); - - /* Getting Index Values for each section */ - for(int i = 0; i < ncchset->yaml_set->PlainRegionNum; i++){ - Index[i] = GetElfSectionIndexFromName(ncchset->yaml_set->PlainRegion[i],elf,ElfFile); - } - - // Eliminating Duplicated Sections - for(int i = ncchset->yaml_set->PlainRegionNum - 1; i >= 0; i--){ - for(int j = i-1; j >= 0; j--){ - if(Index[i] == Index[j]) Index[i] = 0; - } - } - - /* Calculating Total Size of Data */ - u64 TotalSize = 0; - for(int i = 0; i < ncchset->yaml_set->PlainRegionNum; i++){ - TotalSize += elf->Sections[Index[i]].Size; - } - - /* Creating Output Buffer */ - ncchset->Sections.PlainRegion.size = align_value(TotalSize,ncchset->Options.MediaSize); - ncchset->Sections.PlainRegion.buffer = malloc(ncchset->Sections.PlainRegion.size); - if(!ncchset->Sections.PlainRegion.buffer) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); return MEM_ERROR;} - memset(ncchset->Sections.PlainRegion.buffer,0,ncchset->Sections.PlainRegion.size); - - /* Storing Sections */ - u64 pos = 0; - for(int i = 0; i < ncchset->yaml_set->PlainRegionNum; i++){ - memcpy((ncchset->Sections.PlainRegion.buffer+pos),elf->Sections[Index[i]].Ptr,elf->Sections[Index[i]].Size); - pos += elf->Sections[Index[i]].Size; - } - return 0; -} - -int CreateExeFsCode(ElfContext *elf, u8 *ElfFile, ncch_settings *ncchset) -{ - /* Getting Code Segments */ - CodeSegment Text; - memset(&Text,0,sizeof(CodeSegment)); - CodeSegment RO; - memset(&RO,0,sizeof(CodeSegment)); - CodeSegment Data; - memset(&Data,0,sizeof(CodeSegment)); - - int result = CreateCodeSegmentFromElf(&Text,elf,ElfFile,ncchset->yaml_set->ExeFs.Text,ncchset->yaml_set->ExeFs.TextNum); - if(result) return result; - result = CreateCodeSegmentFromElf(&RO,elf,ElfFile,ncchset->yaml_set->ExeFs.ReadOnly,ncchset->yaml_set->ExeFs.ReadOnlyNum); - if(result) return result; - result = CreateCodeSegmentFromElf(&Data,elf,ElfFile,ncchset->yaml_set->ExeFs.ReadWrite,ncchset->yaml_set->ExeFs.ReadWriteNum); - if(result) return result; - - /* Allocating Buffer for ExeFs Code */ - u32 size = (Text.MaxPageNum + RO.MaxPageNum + Data.MaxPageNum)*elf->PageSize; - u8 *code = malloc(size); - - /* Writing Code into Buffer */ - u8 *TextPos = (code + 0); - u8 *ROPos = (code + Text.MaxPageNum*elf->PageSize); - u8 *DataPos = (code + (Text.MaxPageNum + RO.MaxPageNum)*elf->PageSize); - if(Text.Size) memcpy(TextPos,Text.Data,Text.Size); - if(RO.Size) memcpy(ROPos,RO.Data,RO.Size); - if(Data.Size) memcpy(DataPos,Data.Data,Data.Size); - - - /* Compressing If needed */ - if(ncchset->Options.CompressCode){ - u32 new_len; - ncchset->ExeFs_Sections.Code.buffer = BLZ_Code(code,size,&new_len,BLZ_NORMAL); - ncchset->ExeFs_Sections.Code.size = new_len; - free(code); - } - else{ - ncchset->ExeFs_Sections.Code.size = size; - ncchset->ExeFs_Sections.Code.buffer = code; - } - - /* Setting CodeSegment Data and freeing original buffers */ - ncchset->CodeDetails.TextAddress = Text.Address; - ncchset->CodeDetails.TextMaxPages = Text.MaxPageNum; - ncchset->CodeDetails.TextSize = Text.Size; - if(Text.Size) free(Text.Data); - - ncchset->CodeDetails.ROAddress = RO.Address; - ncchset->CodeDetails.ROMaxPages = RO.MaxPageNum; - ncchset->CodeDetails.ROSize = RO.Size; - if(RO.Size) free(RO.Data); - - ncchset->CodeDetails.DataAddress = Data.Address; - ncchset->CodeDetails.DataMaxPages = Data.MaxPageNum; - ncchset->CodeDetails.DataSize = Data.Size; - if(Data.Size) free(Data.Data); - - /* Return */ - return 0; -} - -int CreateCodeSegmentFromElf(CodeSegment *out, ElfContext *elf, u8 *ElfFile, char **Names, u32 NameNum) -{ - u16 ContinuousSegmentNum = 0; - memset(out,0,sizeof(CodeSegment)); - ElfSegment **ContinuousSegments = GetContinuousSegments(&ContinuousSegmentNum,elf,Names,NameNum); - if (ContinuousSegments == NULL){ - if(!ContinuousSegmentNum) // Nothing Was Found - return 0; - else // Error with found segments - return ELF_SEGMENTS_NOT_CONTINUOUS; - } - - /* Getting Segment Size/Settings */ - u32 vAddr = 0; - u32 memorySize = 0; - for(int i = 0; i < ContinuousSegmentNum; i++){ - if (i==0){ - vAddr = ContinuousSegments[i]->VAddr; - } - else{ // Add rounded size from previous segment - u32 num = ContinuousSegments[i]->VAddr - (vAddr + memorySize); - memorySize += num; - } - - memorySize += ContinuousSegments[i]->Header->SizeInMemory; - for (int j = 0; j < ContinuousSegments[i]->SectionNum; j++){ - ElfSectionEntry *Section = &ContinuousSegments[i]->Sections[j]; - if (IsBss(Section) && j == (ContinuousSegments[i]->SectionNum-1)) - memorySize -= Section->Size; - } - } - - // For Check -#ifdef ELF_DEBUG - printf("Address: 0x%x\n",vAddr); - printf("Size: 0x%x\n",memorySize); -#endif - - out->Address = vAddr; - out->Size = memorySize; - out->MaxPageNum = SizeToPage(memorySize,elf); - out->Data = malloc(memorySize); - - /* Writing Segment to Buffer */ - vAddr = 0; - memorySize = 0; - for(int i = 0; i < ContinuousSegmentNum; i++){ - if (i==0){ - vAddr = ContinuousSegments[i]->VAddr; - } - else{ - u32 num = ContinuousSegments[i]->VAddr - (vAddr + memorySize); - memorySize += num; - } - u32 size = 0; - for (int j = 0; j < ContinuousSegments[i]->SectionNum; j++){ - ElfSectionEntry *Section = &ContinuousSegments[i]->Sections[j]; - if (!IsBss(Section)){ - u8 *pos = (out->Data + memorySize + size); - memcpy(pos,Section->Ptr,Section->Size); - size += Section->Size; - } - - else if (j == (ContinuousSegments[i]->SectionNum-1)) - memorySize -= Section->Size; - else - size += Section->Size; - } - } - - free(ContinuousSegments); - return 0; -} - - -ElfSegment** GetContinuousSegments(u16 *ContinuousSegmentNum, ElfContext *elf, char **Names, u32 NameNum) -{ - u16 SegmentNum = 0; - ElfSegment **Segments = GetSegments(&SegmentNum, elf, Names, NameNum); - if (Segments == NULL || SegmentNum == 0){ // No Segments for the names were found - //printf("Not Found Segment\n"); - return NULL; - } - - if (SegmentNum == 1){ //Return as there is no need to check - *ContinuousSegmentNum = SegmentNum; - return Segments; - } - - u32 vAddr = Segments[0]->VAddr + Segments[0]->Header->SizeInMemory; - for (int i = 1; i < SegmentNum; i++){ - if (Segments[i]->VAddr != (u32)align_value(vAddr,Segments[i]->Header->Alignment)){ //Each Segment must start after each other - fprintf(stderr,"[ELF ERROR] %s segment and %s segment are not continuous\n", Segments[i]->Name, Segments[i - 1]->Name); - free(Segments); - *ContinuousSegmentNum = 0xffff; // Signify to function that an error occured - return NULL; - } - } - *ContinuousSegmentNum = SegmentNum; - return Segments; -} - - -ElfSegment** GetSegments(u16 *SegmentNum, ElfContext *elf, char **Names, u32 NameNum) -{ - if (Names == NULL) - { - return NULL; - } - - ElfSegment **Segments = malloc(sizeof(ElfSegment*)*NameNum); - *SegmentNum = 0; // There can be a max of NameNum Segments, however, they might not all exist - for (int i = 0; i < NameNum; i++){ - for(int j = 0; j < elf->ActiveSegments; j++){ - if(strcmp(Names[i],elf->Segments[j].Name) == 0){ // If there is a match, store Segment data pointer & increment index - Segments[*SegmentNum] = &elf->Segments[j]; - *SegmentNum = *SegmentNum + 1; - } - } - } - return Segments; -} - -// ELF Functions - -int GetElfContext(ElfContext *elf, u8 *ElfFile) -{ - if(u8_to_u32(ElfFile,BE) != ELF_MAGIC) return NOT_ELF_FILE; - - elf->Is64bit = (ElfFile[4] == elf_64_bit); - elf->IsLittleEndian = (ElfFile[5] == elf_little_endian); - - int result = ReadElfHdr(elf,ElfFile); - if(result) return result; - - result = GetElfSectionEntries(elf,ElfFile); - if(result) return result; - - result = GetElfProgramEntries(elf,ElfFile); - if(result) return result; - - result = CreateElfSegments(elf,ElfFile); - if(result) return result; - - return 0; -} - -int GetElfSectionEntries(ElfContext *elf, u8 *ElfFile) -{ - elf->Sections = malloc(sizeof(ElfSectionEntry)*elf->SectionTableEntryCount); - if(!elf->Sections) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); return MEM_ERROR;} - - for(int i = 0; i < elf->SectionTableEntryCount; i++){ - elf->Sections[i].Name = GetELFSectionEntryName(i,elf,ElfFile); - elf->Sections[i].Type = GetELFSectionEntryType(i,elf,ElfFile); - elf->Sections[i].Flags = GetELFSectionEntryFlags(i,elf,ElfFile); - elf->Sections[i].Ptr = GetELFSectionEntry(i,elf,ElfFile); - elf->Sections[i].OffsetInFile = GetELFSectionEntryFileOffset(i,elf,ElfFile); - elf->Sections[i].Size = GetELFSectionEntrySize(i,elf,ElfFile); - elf->Sections[i].Address = GetELFSectionEntryAddress(i,elf,ElfFile); - elf->Sections[i].Alignment = GetELFSectionEntryAlignment(i,elf,ElfFile); - } - return 0; -} - -int GetElfProgramEntries(ElfContext *elf, u8 *ElfFile) -{ - elf->ProgramHeaders = malloc(sizeof(ElfProgramEntry)*elf->ProgramTableEntryCount); - if(!elf->ProgramHeaders) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); return MEM_ERROR;} - - for(int i = 0; i < elf->ProgramTableEntryCount; i++){ - elf->ProgramHeaders[i].Type = GetELFProgramEntryType(i,elf,ElfFile); - elf->ProgramHeaders[i].Flags = GetELFProgramEntryFlags(i,elf,ElfFile); - elf->ProgramHeaders[i].Ptr = GetELFProgramEntry(i,elf,ElfFile); - elf->ProgramHeaders[i].OffsetInFile = GetELFProgramEntryFileOffset(i,elf,ElfFile); - elf->ProgramHeaders[i].SizeInFile = GetELFProgramEntryFileSize(i,elf,ElfFile); - elf->ProgramHeaders[i].PhysicalAddress = GetELFProgramEntryPAddress(i,elf,ElfFile); - elf->ProgramHeaders[i].VirtualAddress = GetELFProgramEntryVAddress(i,elf,ElfFile); - elf->ProgramHeaders[i].SizeInMemory = GetELFProgramEntryMemorySize(i,elf,ElfFile); - elf->ProgramHeaders[i].Alignment = GetELFProgramEntryAlignment(i,elf,ElfFile); - } - - return 0; -} - -void PrintElfContext(ElfContext *elf, u8 *ElfFile) -{ - printf("[+] Basic Details\n"); - printf(" Class: %s\n",elf->Is64bit ? "64-bit" : "32-bit"); - printf(" Data: %s\n",elf->IsLittleEndian ? "Little Endian" : "Big Endian"); - printf("\n[+] Program Table Data\n"); - printf(" Offset: 0x%lx\n",elf->ProgramTableOffset); - printf(" Size: 0x%x\n",elf->ProgramTableEntrySize); - printf(" Count: 0x%x\n",elf->ProgramTableEntryCount); - printf("\n[+] Section Table Data\n"); - printf(" Offset: 0x%lx\n",elf->SectionTableOffset); - printf(" Size: 0x%x\n",elf->SectionTableEntrySize); - printf(" Count: 0x%x\n",elf->SectionTableEntryCount); - printf(" Lable Index: 0x%x\n",elf->SectionHeaderNameEntryIndex); - for(int i = 0; i < elf->ActiveSegments; i++){ - printf(" Segment [%d][%s]\n",i,elf->Segments[i].Name); - printf(" > Size : 0x%x\n",elf->Segments[i].Header->SizeInFile); - printf(" > Address : 0x%x\n",elf->Segments[i].VAddr); - printf(" > Sections : %d\n",elf->Segments[i].SectionNum); - for(int j = 0; j < elf->Segments[i].SectionNum; j++){ - printf(" > Section [%d][%s]\n",j,elf->Segments[i].Sections[j].Name); - } - - /* - char outpath[100]; - memset(&outpath,0,100); - sprintf(outpath,"%s.bin",elf->Sections[i].Name); - chdir("elfsections"); - FILE *tmp = fopen(outpath,"wb"); - WriteBuffer(elf->Sections[i].Ptr,elf->Sections[i].Size,0,tmp); - fclose(tmp); - chdir(".."); - */ - } - -} - -int ReadElfHdr(ElfContext *elf, u8 *ElfFile) -{ - if(elf->Is64bit){ - elf_64_hdr *hdr = (elf_64_hdr*)ElfFile; - - u16 Architecture = u8_to_u16(hdr->TargetArchitecture,elf->IsLittleEndian); - u16 Type = u8_to_u16(hdr->Type,elf->IsLittleEndian); - if(Architecture != elf_arm) return NOT_ARM_ELF; - if(Type != elf_executeable) return NON_EXECUTABLE_ELF; - - elf->ProgramTableOffset = u8_to_u64(hdr->ProgramHeaderTableOffset,elf->IsLittleEndian); - elf->ProgramTableEntrySize = u8_to_u16(hdr->ProgramHeaderEntrySize,elf->IsLittleEndian); - elf->ProgramTableEntryCount = u8_to_u16(hdr->ProgramHeaderEntryCount,elf->IsLittleEndian); - - elf->SectionTableOffset = u8_to_u64(hdr->SectionHeaderTableOffset,elf->IsLittleEndian); - elf->SectionTableEntrySize = u8_to_u16(hdr->SectionTableEntrySize,elf->IsLittleEndian); - elf->SectionTableEntryCount = u8_to_u16(hdr->SectionHeaderEntryCount,elf->IsLittleEndian); - - elf->SectionHeaderNameEntryIndex = u8_to_u16(hdr->SectionHeaderNameEntryIndex,elf->IsLittleEndian); - } - else{ - elf_32_hdr *hdr = (elf_32_hdr*)ElfFile; - - u16 Architecture = u8_to_u16(hdr->TargetArchitecture,elf->IsLittleEndian); - u16 Type = u8_to_u16(hdr->Type,elf->IsLittleEndian); - if(Architecture != elf_arm) return NOT_ARM_ELF; - if(Type != elf_executeable) return NON_EXECUTABLE_ELF; - - elf->ProgramTableOffset = u8_to_u32(hdr->ProgramHeaderTableOffset,elf->IsLittleEndian); - elf->ProgramTableEntrySize = u8_to_u16(hdr->ProgramHeaderEntrySize,elf->IsLittleEndian); - elf->ProgramTableEntryCount = u8_to_u16(hdr->ProgramHeaderEntryCount,elf->IsLittleEndian); - - elf->SectionTableOffset = u8_to_u32(hdr->SectionHeaderTableOffset,elf->IsLittleEndian); - elf->SectionTableEntrySize = u8_to_u16(hdr->SectionTableEntrySize,elf->IsLittleEndian); - elf->SectionTableEntryCount = u8_to_u16(hdr->SectionHeaderEntryCount,elf->IsLittleEndian); - - elf->SectionHeaderNameEntryIndex = u8_to_u16(hdr->SectionHeaderNameEntryIndex,elf->IsLittleEndian); - } - return 0; -} - -/* Section Hdr Functions */ - -u8* GetELFSectionHeader(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->SectionTableEntryCount) return NULL; - - return (ElfFile + elf->SectionTableOffset + elf->SectionTableEntrySize*Index); -} - -u8* GetELFSectionEntry(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->SectionTableEntryCount) return NULL; - - return (u8*) (ElfFile + GetELFSectionEntryFileOffset(Index,elf,ElfFile)); -} - -char* GetELFSectionEntryName(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->SectionTableEntryCount) return 0; - - u64 NameIndex = 0; - if(elf->Is64bit){ - elf_64_shdr *shdr = (elf_64_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - NameIndex = u8_to_u64(shdr->sh_name,elf->IsLittleEndian); - } - else{ - elf_32_shdr *shdr = (elf_32_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - NameIndex = u8_to_u32(shdr->sh_name,elf->IsLittleEndian); - } - - u8 *NameTable = GetELFSectionEntry(elf->SectionHeaderNameEntryIndex,elf,ElfFile); - - return (char*)(NameTable+NameIndex); -} - -u64 GetELFSectionEntryType(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->SectionTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_shdr *shdr = (elf_64_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - return u8_to_u64(shdr->sh_type,elf->IsLittleEndian); - } - else{ - elf_32_shdr *shdr = (elf_32_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - return u8_to_u32(shdr->sh_type,elf->IsLittleEndian); - } - - return 0; -} - -u64 GetELFSectionEntryFlags(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->SectionTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_shdr *shdr = (elf_64_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - return u8_to_u64(shdr->sh_flags,elf->IsLittleEndian); - } - else{ - elf_32_shdr *shdr = (elf_32_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - return u8_to_u32(shdr->sh_flags,elf->IsLittleEndian); - } - - return 0; -} - -u64 GetELFSectionEntryAddress(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->SectionTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_shdr *shdr = (elf_64_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - return u8_to_u64(shdr->sh_addr,elf->IsLittleEndian); - } - else{ - elf_32_shdr *shdr = (elf_32_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - return u8_to_u32(shdr->sh_addr,elf->IsLittleEndian); - } - - return 0; -} - -u64 GetELFSectionEntryFileOffset(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->SectionTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_shdr *shdr = (elf_64_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - return u8_to_u64(shdr->sh_offset,elf->IsLittleEndian); - } - else{ - elf_32_shdr *shdr = (elf_32_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - return u8_to_u32(shdr->sh_offset,elf->IsLittleEndian); - } - - return 0; -} - -u64 GetELFSectionEntrySize(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->SectionTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_shdr *shdr = (elf_64_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - return u8_to_u64(shdr->sh_size,elf->IsLittleEndian); - } - else{ - elf_32_shdr *shdr = (elf_32_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - return u8_to_u32(shdr->sh_size,elf->IsLittleEndian); - } - - return 0; -} - -u64 GetELFSectionEntryAlignment(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->SectionTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_shdr *shdr = (elf_64_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - return u8_to_u64(shdr->sh_addralign,elf->IsLittleEndian); - } - else{ - elf_32_shdr *shdr = (elf_32_shdr*)GetELFSectionHeader(Index,elf,ElfFile); - return u8_to_u32(shdr->sh_addralign,elf->IsLittleEndian); - } - - return 0; -} - - -u16 GetElfSectionIndexFromName(char *Name, ElfContext *elf, u8 *ElfFile) -{ - for(int i = 0; i < elf->SectionTableEntryCount; i++){ - if(strcmp(Name,elf->Sections[i].Name) == 0) return i; - } - return 0; // Assuming 0 is always empty -} - -bool IsBss(ElfSectionEntry *Section) -{ - if(Section->Type == 8 && Section->Flags == 3) - return true; - return false; -} - -bool IsData(ElfSectionEntry *Section) -{ - if(Section->Type == 1 && Section->Flags == 3) - return true; - return false; -} - -bool IsRO(ElfSectionEntry *Section) -{ - if(Section->Type == 1 && Section->Flags == 2) - return true; - return false; -} - -bool IsText(ElfSectionEntry *Section) -{ - if(Section->Type == 1 && Section->Flags == 6) - return true; - return false; -} - -/* ProgramHeader Functions */ - -u8* GetELFProgramHeader(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->ProgramTableEntryCount) return NULL; - - return (ElfFile + elf->ProgramTableOffset + elf->ProgramTableEntrySize*Index); -} - -u8* GetELFProgramEntry(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->ProgramTableEntryCount) return NULL; - - return (u8*) (ElfFile + GetELFProgramEntryFileOffset(Index,elf,ElfFile)); - - return NULL; -} - -u64 GetELFProgramEntryType(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->ProgramTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_phdr *phdr = (elf_64_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u64(phdr->p_type,elf->IsLittleEndian); - } - else{ - elf_32_phdr *phdr = (elf_32_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u32(phdr->p_type,elf->IsLittleEndian); - } - - return 0; -} - -u64 GetELFProgramEntryFlags(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->ProgramTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_phdr *phdr = (elf_64_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u64(phdr->p_flags,elf->IsLittleEndian); - } - else{ - elf_32_phdr *phdr = (elf_32_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u32(phdr->p_flags,elf->IsLittleEndian); - } - - return 0; -} - -u64 GetELFProgramEntryFileSize(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->ProgramTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_phdr *phdr = (elf_64_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u64(phdr->p_filesz,elf->IsLittleEndian); - } - else{ - elf_32_phdr *phdr = (elf_32_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u32(phdr->p_filesz,elf->IsLittleEndian); - } - - return 0; -} - -u64 GetELFProgramEntryFileOffset(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->ProgramTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_phdr *phdr = (elf_64_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u64(phdr->p_offset,elf->IsLittleEndian); - } - else{ - elf_32_phdr *phdr = (elf_32_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u32(phdr->p_offset,elf->IsLittleEndian); - } - - return 0; -} - -u64 GetELFProgramEntryMemorySize(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->ProgramTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_phdr *phdr = (elf_64_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u64(phdr->p_memsz,elf->IsLittleEndian); - } - else{ - elf_32_phdr *phdr = (elf_32_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u32(phdr->p_memsz,elf->IsLittleEndian); - } - - return 0; -} - -u64 GetELFProgramEntryVAddress(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->ProgramTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_phdr *phdr = (elf_64_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u64(phdr->p_vaddr,elf->IsLittleEndian); - } - else{ - elf_32_phdr *phdr = (elf_32_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u32(phdr->p_vaddr,elf->IsLittleEndian); - } - - return 0; -} - -u64 GetELFProgramEntryPAddress(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->ProgramTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_phdr *phdr = (elf_64_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u64(phdr->p_paddr,elf->IsLittleEndian); - } - else{ - elf_32_phdr *phdr = (elf_32_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u32(phdr->p_paddr,elf->IsLittleEndian); - } - - return 0; -} - - -u64 GetELFProgramEntryAlignment(u16 Index, ElfContext *elf, u8 *ElfFile) -{ - if(Index >= elf->ProgramTableEntryCount) return 0; - - if(elf->Is64bit){ - elf_64_phdr *phdr = (elf_64_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u64(phdr->p_align,elf->IsLittleEndian); - } - else{ - elf_32_phdr *phdr = (elf_32_phdr*)GetELFProgramHeader(Index,elf,ElfFile); - return u8_to_u32(phdr->p_align,elf->IsLittleEndian); - } - - return 0; -} - - -int CreateElfSegments(ElfContext *elf, u8 *ElfFile) -{ - int num = 0; - // Interate through Each Program Header - elf->ActiveSegments = 0; - elf->Segments = malloc(sizeof(ElfSegment)*elf->ProgramTableEntryCount); - ElfSegment *segment = malloc(sizeof(ElfSegment)); // Temporary Buffer - for (int i = 0; i < elf->ProgramTableEntryCount; i++){ - if (elf->ProgramHeaders[i].SizeInMemory != 0 && elf->ProgramHeaders[i].Type == 1){ - memset(segment,0,sizeof(ElfSegment)); - - bool flag = false; - u32 size = 0; - u32 vAddr = elf->ProgramHeaders[i].VirtualAddress; - u32 memorySize = elf->ProgramHeaders[i].SizeInMemory; - - u16 SectionInfoCapacity = 10; - segment->SectionNum = 0; - segment->Sections = malloc(sizeof(ElfSectionEntry)*SectionInfoCapacity); - - // Itterate Through Section Headers - for (int j = num; j < elf->SectionTableEntryCount; j++){ - if (!flag){ - if (elf->Sections[j].Address != vAddr) - goto Skip; - - while (j < (int)elf->Sections[j].Size && elf->Sections[j].Address == vAddr && !IsIgnoreSection(elf->Sections[j])) - j++; - - j--; - - flag = true; - segment->VAddr = elf->Sections[j].Address; - segment->Name = elf->Sections[j].Name; - } - - if(segment->SectionNum < SectionInfoCapacity) - memcpy(&segment->Sections[segment->SectionNum],&elf->Sections[j],sizeof(ElfSectionEntry)); - else{ - SectionInfoCapacity = SectionInfoCapacity*2; - ElfSectionEntry *tmp = malloc(sizeof(ElfSectionEntry)*SectionInfoCapacity); - for(int k = 0; k < segment->SectionNum; k++) - memcpy(&tmp[k],&segment->Sections[k],sizeof(ElfSectionEntry)); - free(segment->Sections); - segment->Sections = tmp; - memcpy(&segment->Sections[segment->SectionNum],&elf->Sections[j],sizeof(ElfSectionEntry)); - } - segment->SectionNum++; - - size += elf->Sections[j].Size; - - if (size == memorySize) - break; - - if (size > memorySize){ - fprintf(stderr,"[ELF ERROR] Too large section size.\n Segment size = 0x%x\n Section Size = 0x%x\n", memorySize, size); - return ELF_SEGMENT_SECTION_SIZE_MISMATCH; - } - Skip: ; - } - if(segment->SectionNum){ - segment->Header = &elf->ProgramHeaders[i]; - memcpy(&elf->Segments[elf->ActiveSegments],segment,sizeof(ElfSegment)); - elf->ActiveSegments++; - } - else{ - free(segment->Sections); - free(segment); - fprintf(stderr,"[ELF ERROR] Program Header Has no corresponding Sections, ELF Cannot be proccessed\n"); - return ELF_SEGMENTS_NOT_FOUND; - } - } - } - - free(segment); - return 0; -} - -bool IsIgnoreSection(ElfSectionEntry info) -{ - if (info.Address) - return false; - - if (info.Type != 1 && info.Type != 0) - return true; - - char IgnoreSectionNames[7][20] = { ".debug_abbrev", ".debug_frame", ".debug_info", ".debug_line", ".debug_loc", ".debug_pubnames", ".comment" }; - for (int i = 0; i < 7; i++){ - if (strcmp(IgnoreSectionNames[i],info.Name) == 0) - return true; - } - return false; - -} diff --git a/elf.h b/elf.h deleted file mode 100644 index ece978c..0000000 --- a/elf.h +++ /dev/null @@ -1,87 +0,0 @@ -#ifndef _ELF_H_ -#define _ELF_H_ - -typedef enum -{ - NOT_ELF_FILE = -10, - NOT_ARM_ELF = -11, - NON_EXECUTABLE_ELF = -12, - ELF_SECTION_NOT_FOUND = -13, - NOT_FIND_BSS_SIZE = -14, - NOT_FIND_CODE_SECTIONS = -15, - ELF_SEGMENT_SECTION_SIZE_MISMATCH = -16, - ELF_SEGMENTS_NOT_CONTINUOUS = -17, - ELF_SEGMENTS_NOT_FOUND = -18, -} elf_errors; - -typedef struct -{ - char *Name; - u64 Type; - u64 Flags; - u8 *Ptr; - u64 OffsetInFile; - u64 Size; - u64 Address; - u64 Alignment; -} ElfSectionEntry; - -typedef struct -{ - u64 Type; - u64 Flags; - u8 *Ptr; - u64 OffsetInFile; - u64 SizeInFile; - u64 VirtualAddress; - u64 PhysicalAddress; - u64 SizeInMemory; - u64 Alignment; - -} ElfProgramEntry; - -typedef struct -{ - char *Name; - u64 VAddr; - - ElfProgramEntry *Header; - u32 SectionNum; - ElfSectionEntry *Sections; -} ElfSegment; - -typedef struct -{ - u32 Address; - u32 Size; - u32 MaxPageNum; - u8 *Data; -} CodeSegment; - -typedef struct -{ - u32 PageSize; - bool IsLittleEndian; - bool Is64bit; - - u64 ProgramTableOffset; - u16 ProgramTableEntrySize; - u16 ProgramTableEntryCount; - - u64 SectionTableOffset; - u16 SectionTableEntrySize; - u16 SectionTableEntryCount; - - u16 SectionHeaderNameEntryIndex; - - ElfSectionEntry *Sections; - ElfProgramEntry *ProgramHeaders; - - u16 ActiveSegments; - ElfSegment *Segments; - -} ElfContext; - -#endif - -int BuildExeFsCode(ncch_settings *ncchset); \ No newline at end of file diff --git a/elf_hdr.h b/elf_hdr.h deleted file mode 100644 index 260f420..0000000 --- a/elf_hdr.h +++ /dev/null @@ -1,177 +0,0 @@ -#ifndef _ELF_HDR_H_ -#define _ELF_HDR_H_ - -static const u32 ELF_MAGIC = 0x7f454c46; - -typedef enum -{ - elf_32_bit = 1, - elf_64_bit = 2, -} elf_bit_format_types; - -typedef enum -{ - elf_little_endian = 1, - elf_big_endian = 2, -} elf_endianness; - -typedef enum -{ - elf_relocatable = 1, - elf_executeable = 2, - elf_shared = 3, - elf_core = 4, -} elf_type; - -typedef enum -{ - elf_arm = 0x28, -} elf_target_architecture; - -typedef struct -{ - u8 Magic[4]; - u8 BitFormat; - u8 Endianness; - u8 ELF_Version; - u8 OS; - u8 Padding_0[8]; - u8 Type[2]; - u8 TargetArchitecture[2]; - u8 Version[4]; - u8 EntryPoint[4]; - u8 ProgramHeaderTableOffset[4]; - u8 SectionHeaderTableOffset[4]; - u8 Flags[4]; - u8 HeaderSize[2]; - u8 ProgramHeaderEntrySize[2]; - u8 ProgramHeaderEntryCount[2]; - u8 SectionTableEntrySize[2]; - u8 SectionHeaderEntryCount[2]; - u8 SectionHeaderNameEntryIndex[2]; -} elf_32_hdr; - -typedef struct -{ - u8 Magic[4]; - u8 BitFormat; - u8 Endianness; - u8 ELF_Version; - u8 OS; - u8 Padding_0[8]; - u8 Type[2]; - u8 TargetArchitecture[2]; - u8 Version[4]; - u8 EntryPoint[8]; - u8 ProgramHeaderTableOffset[8]; - u8 SectionHeaderTableOffset[8]; - u8 Flags[4]; - u8 HeaderSize[2]; - u8 ProgramHeaderEntrySize[2]; - u8 ProgramHeaderEntryCount[2]; - u8 SectionTableEntrySize[2]; - u8 SectionHeaderEntryCount[2]; - u8 SectionHeaderNameEntryIndex[2]; -} elf_64_hdr; - - -/* Section header. */ - -/* Legal values for sh_type (section type). */ - -#define SHT_NULL 0 /* Section header table entry unused */ -#define SHT_PROGBITS 1 /* Program data */ -#define SHT_SYMTAB 2 /* Symbol table */ -#define SHT_STRTAB 3 /* String table */ -#define SHT_RELA 4 /* Relocation entries with addends */ -#define SHT_HASH 5 /* Symbol hash table */ -#define SHT_DYNAMIC 6 /* Dynamic linking information */ -#define SHT_NOTE 7 /* Notes */ -#define SHT_NOBITS 8 /* Program space with no data (bss) */ -#define SHT_REL 9 /* Relocation entries, no addends */ -#define SHT_SHLIB 10 /* Reserved */ -#define SHT_DYNSYM 11 /* Dynamic linker symbol table */ -#define SHT_NUM 12 /* Number of defined types. */ -#define SHT_LOOS 0x60000000 /* Start OS-specific */ -#define SHT_LOSUNW 0x6ffffffb /* Sun-specific low bound. */ -#define SHT_SUNW_COMDAT 0x6ffffffb -#define SHT_SUNW_syminfo 0x6ffffffc -#define SHT_GNU_verdef 0x6ffffffd /* Version definition section. */ -#define SHT_GNU_verneed 0x6ffffffe /* Version needs section. */ -#define SHT_GNU_versym 0x6fffffff /* Version symbol table. */ -#define SHT_HISUNW 0x6fffffff /* Sun-specific high bound. */ -#define SHT_HIOS 0x6fffffff /* End OS-specific type */ -#define SHT_LOPROC 0x70000000 /* Start of processor-specific */ -#define SHT_HIPROC 0x7fffffff /* End of processor-specific */ -#define SHT_LOUSER 0x80000000 /* Start of application-specific */ -#define SHT_HIUSER 0x8fffffff /* End of application-specific */ - - -typedef struct -{ - u8 sh_name[4]; /* Section name (string tbl index) */ - u8 sh_type[4]; /* Section type */ - u8 sh_flags[4]; /* Section flags */ - u8 sh_addr[4]; /* Section virtual addr at execution */ - u8 sh_offset[4]; /* Section file offset */ - u8 sh_size[4]; /* Section size in bytes */ - u8 sh_link[4]; /* Link to another section */ - u8 sh_info[4]; /* Additional section information */ - u8 sh_addralign[4]; /* Section alignment */ - u8 sh_entsize[4]; /* Entry size if section holds table */ -} elf_32_shdr; - -typedef struct -{ - u8 sh_name[8]; /* Section name (string tbl index) */ - u8 sh_type[8]; /* Section type */ - u8 sh_flags[8]; /* Section flags */ - u8 sh_addr[8]; /* Section virtual addr at execution */ - u8 sh_offset[8]; /* Section file offset */ - u8 sh_size[8]; /* Section size in bytes */ - u8 sh_link[8]; /* Link to another section */ - u8 sh_info[8]; /* Additional section information */ - u8 sh_addralign[8]; /* Section alignment */ - u8 sh_entsize[8]; /* Entry size if section holds table */ -} elf_64_shdr; - -/* Program segment header. */ - -/* p_type legal values */ -#define PT_NULL 0 /* Program header table entry unused */ -#define PT_LOAD 1 /* Loadable program segment */ -#define PT_DYNAMIC 2 /* Dynamic linking information */ -#define PT_INTERP 3 /* Program interpreter */ -#define PT_NOTE 4 /* Auxiliary information */ -#define PT_SHLIB 5 /* Reserved */ -#define PT_PHDR 6 /* Entry for header table itself */ -#define PT_NUM 7 /* Number of defined types. */ -#define PT_LOOS 0x60000000 /* Start of OS-specific */ -#define PT_HIOS 0x6fffffff /* End of OS-specific */ -#define PT_LOPROC 0x70000000 /* Start of processor-specific */ -#define PT_HIPROC 0x7fffffff /* End of processor-specific */ - -typedef struct -{ - u8 p_type[4]; /* Segment type */ - u8 p_offset[4]; /* Segment file offset */ - u8 p_vaddr[4]; /* Segment virtual address */ - u8 p_paddr[4]; /* Segment physical address */ - u8 p_filesz[4]; /* Segment size in file */ - u8 p_memsz[4]; /* Segment size in memory */ - u8 p_flags[4]; /* Segment flags */ - u8 p_align[4]; /* Segment alignment */ -} elf_32_phdr; - -typedef struct -{ - u8 p_type[8]; /* Segment type */ - u8 p_flags[8]; /* Segment flags */ - u8 p_offset[8]; /* Segment file offset */ - u8 p_vaddr[8]; /* Segment virtual address */ - u8 p_paddr[8]; /* Segment physical address */ - u8 p_filesz[8]; /* Segment size in file */ - u8 p_memsz[8]; /* Segment size in memory */ - u8 p_align[8]; /* Segment alignment */ -} elf_64_phdr; -#endif \ No newline at end of file diff --git a/exefs.c b/exefs.c deleted file mode 100644 index 15dd4ae..0000000 --- a/exefs.c +++ /dev/null @@ -1,179 +0,0 @@ -#include "lib.h" -#include "ncch.h" -#include "exefs.h" - -// Private Prototypes -u32 PredictExeFS_Size(ExeFs_BuildContext *ctx); -int GenerateExeFS_Header(ExeFs_BuildContext *ctx, u8 *outbuff); -void InitialiseExeFSContext(ExeFs_BuildContext *ctx); -void FreeExeFSContext(ExeFs_BuildContext *ctx); -int ImportDatatoExeFS(ExeFs_BuildContext *ctx, u8 *outbuff); -int ImportToExeFSContext(ExeFs_BuildContext *ctx, char *lable, u8 *buffer, u32 size); - -// ExeFs Build Functions -int BuildExeFs(ncch_settings *ncchset) -{ - /* Intialising ExeFs Build Context */ - ExeFs_BuildContext *ctx = malloc(sizeof(ExeFs_BuildContext)); - if(!ctx) {fprintf(stderr,"[EXEFS ERROR] MEM ERROR\n"); return MEM_ERROR;} - InitialiseExeFSContext(ctx); - ctx->media_unit = ncchset->Options.MediaSize; - - /* Importing ExeFs */ - if(ncchset->ExeFs_Sections.Code.size) - ImportToExeFSContext(ctx,".code",ncchset->ExeFs_Sections.Code.buffer,ncchset->ExeFs_Sections.Code.size); - if(ncchset->ExeFs_Sections.Banner.size) - ImportToExeFSContext(ctx,"banner",ncchset->ExeFs_Sections.Banner.buffer,ncchset->ExeFs_Sections.Banner.size); - if(ncchset->ExeFs_Sections.Icon.size) - ImportToExeFSContext(ctx,"icon",ncchset->ExeFs_Sections.Icon.buffer,ncchset->ExeFs_Sections.Icon.size); - if(ncchset->Sections.Logo.size && ncchset->Options.IncludeExeFsLogo) - ImportToExeFSContext(ctx,"logo",ncchset->Sections.Logo.buffer,ncchset->Sections.Logo.size); - - /* Allocating Memory for ExeFs */ - ncchset->Sections.ExeFs.size = PredictExeFS_Size(ctx); - ncchset->Sections.ExeFs.buffer = malloc(ncchset->Sections.ExeFs.size); - if(!ncchset->Sections.ExeFs.buffer){ - printf("[EXEFS ERROR] Could Not Allocate Memory for ExeFS\n"); - return Fail; - } - memset(ncchset->Sections.ExeFs.buffer,0,ncchset->Sections.ExeFs.size); - - /* Generating Header, and writing sections to buffer */ - GenerateExeFS_Header(ctx,ncchset->Sections.ExeFs.buffer); - ImportDatatoExeFS(ctx,ncchset->Sections.ExeFs.buffer); - - /* Finish */ - FreeExeFSContext(ctx); - return 0; -} - -u32 PredictExeFS_Size(ExeFs_BuildContext *ctx) -{ - u32 exefs_size = 0x200; // Size of header - for(int i = 0; i < ctx->section_count; i++){ - exefs_size += align_value(ctx->section_size[i],ctx->media_unit); - } - //exefs_size = align_value(ctx->exefs_size,ctx->media_unit); - return exefs_size; -} - -int GenerateExeFS_Header(ExeFs_BuildContext *ctx, u8 *outbuff) -{ - for(int i = 0; i < ctx->section_count; i++){ - if(i == 0) - ctx->section_offset[i] = 0; - else - ctx->section_offset[i] = align_value((ctx->section_offset[i-1]+ctx->section_size[i-1]),ctx->media_unit); - - memcpy(ctx->file_header[i].name,ctx->lable[i],8); - u32_to_u8(ctx->file_header[i].offset,ctx->section_offset[i],LE); - u32_to_u8(ctx->file_header[i].size,ctx->section_size[i],LE); - ctr_sha(ctx->section[i],ctx->section_size[i],ctx->file_hashes[9-i],CTR_SHA_256); - } - memcpy(outbuff,ctx->file_header,sizeof(ExeFs_FileHeader)*10); - memcpy(outbuff+0xc0,ctx->file_hashes,0x20*10); - return 0; -} - -void InitialiseExeFSContext(ExeFs_BuildContext *ctx) -{ - memset(ctx,0,sizeof(ExeFs_BuildContext)); -} - -void FreeExeFSContext(ExeFs_BuildContext *ctx) -{ - /* - if(ctx->outbuff != NULL) - free(ctx->outbuff); - for(int i = 0; i < 10; i++){ - if(ctx->section[i] != NULL) - free(ctx->section[i]); - } - */ - memset(ctx,0,sizeof(ExeFs_BuildContext)); - free(ctx); -} - -int ImportDatatoExeFS(ExeFs_BuildContext *ctx, u8 *outbuff) -{ - for(int i = 0; i < ctx->section_count; i++){ - memcpy(outbuff+ctx->section_offset[i]+0x200,ctx->section[i],ctx->section_size[i]); - } - return 0; -} - -int ImportToExeFSContext(ExeFs_BuildContext *ctx, char *lable, u8 *buffer, u32 size) -{ - if(ctx == NULL || lable == NULL || buffer == NULL){ - printf("[!] PTR ERROR\n"); - return PTR_ERROR; - } - if(ctx->section_count >= 10){ - printf("[!] Maximum ExeFS Capacity Reached\n"); - return EXEFS_MAX_REACHED; - } - if(strlen(lable) > 8){ - printf("[!] ExeFS Section Name: '%s' is too large\n",lable); - return EXEFS_SECTION_NAME_ERROR; - } - - ctx->section_count++; - ctx->section[ctx->section_count - 1] = buffer; - ctx->section_size[ctx->section_count - 1] = size; - strcpy(ctx->lable[ctx->section_count - 1],lable); - return 0; -} - -// ExeFs Read Functions -bool DoesExeFsSectionExist(char *section, u8 *ExeFs) -{ - ExeFs_Header *hdr = (ExeFs_Header*) ExeFs; - for(int i = 0; i < MAX_EXEFS_SECTIONS; i++){ - if(strncmp(hdr->SectionHdr[i].name,section,8) == 0) return true; - } - return false; -} -u8* GetExeFsSection(char *section, u8 *ExeFs) -{ - ExeFs_Header *hdr = (ExeFs_Header*) ExeFs; - for(int i = 0; i < MAX_EXEFS_SECTIONS; i++){ - if(strncmp(hdr->SectionHdr[i].name,section,8) == 0){ - u32 offset = u8_to_u32(hdr->SectionHdr[i].offset,LE) + sizeof(ExeFs_Header); - return (u8*)(ExeFs+offset); - } - } - return NULL; -} - -u8* GetExeFsSectionHash(char *section, u8 *ExeFs) -{ - ExeFs_Header *hdr = (ExeFs_Header*) ExeFs; - for(int i = 0; i < MAX_EXEFS_SECTIONS; i++){ - if(strncmp(hdr->SectionHdr[i].name,section,8) == 0){ - return (u8*)(hdr->SectionHashes[MAX_EXEFS_SECTIONS-1-i]); - } - } - return NULL; -} - -u32 GetExeFsSectionSize(char *section, u8 *ExeFs) -{ - ExeFs_Header *hdr = (ExeFs_Header*) ExeFs; - for(int i = 0; i < MAX_EXEFS_SECTIONS; i++){ - if(strncmp(hdr->SectionHdr[i].name,section,8) == 0){ - return u8_to_u32(hdr->SectionHdr[i].size,LE); - } - } - return 0; -} - -u32 GetExeFsSectionOffset(char *section, u8 *ExeFs) -{ - ExeFs_Header *hdr = (ExeFs_Header*) ExeFs; - for(int i = 0; i < MAX_EXEFS_SECTIONS; i++){ - if(strncmp(hdr->SectionHdr[i].name,section,8) == 0){ - return u8_to_u32(hdr->SectionHdr[i].offset,LE) + sizeof(ExeFs_Header); - } - } - return 0; -} \ No newline at end of file diff --git a/exefs.h b/exefs.h deleted file mode 100644 index 4564fc5..0000000 --- a/exefs.h +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef _EXEFS_H_ -#define _EXEFS_H_ - -#define MAX_EXEFS_SECTIONS 10 // DO NOT CHANGE - -typedef enum -{ - PTR_ERROR = -10, - EXEFS_MAX_REACHED = -11, - EXEFS_SECTION_NAME_ERROR = -12, - -} exefs_errors; - -typedef struct -{ - char name[8]; - u8 offset[4]; - u8 size[4]; -} ExeFs_FileHeader; - -typedef struct -{ - //Input - int section_count; - u8 *section[10]; - u32 section_size[10]; - u32 section_offset[10]; - char lable[10][8]; - u32 media_unit; - - //Working Data - ExeFs_FileHeader file_header[10]; - u8 file_hashes[10][0x20]; - -} ExeFs_BuildContext; - -typedef struct -{ - ExeFs_FileHeader SectionHdr[MAX_EXEFS_SECTIONS]; - u8 Reserved[0x20]; - u8 SectionHashes[MAX_EXEFS_SECTIONS][0x20]; -} ExeFs_Header; - -#endif - -/* ExeFs Build Functions */ -int BuildExeFs(ncch_settings *ncchset); - -/* ExeFs Read Functions */ -bool DoesExeFsSectionExist(char *section, u8 *ExeFs); -u8* GetExeFsSection(char *section, u8 *ExeFs); -u8* GetExeFsSectionHash(char *section, u8 *ExeFs); -u32 GetExeFsSectionSize(char *section, u8 *ExeFs); -u32 GetExeFsSectionOffset(char *section, u8 *ExeFs); diff --git a/exheader.c b/exheader.c deleted file mode 100644 index 22e948c..0000000 --- a/exheader.c +++ /dev/null @@ -1,1522 +0,0 @@ -#include "lib.h" -#include "ncch.h" -#include "exheader.h" - -#include "titleid.h" -#include "polarssl/base64.h" - -#include "accessdesc_sig.h" // For AccessDesc Presets - -/* Prototypes */ -void init_ExHeaderSettings(exheader_settings *exhdrset); -void free_ExHeaderSettings(exheader_settings *exhdrset); -int get_ExHeaderSettingsFromNcchset(exheader_settings *exhdrset, ncch_settings *ncchset); -int get_ExHeaderSettingsFromYaml(exheader_settings *exhdrset); - -int get_ExHeaderCodeSetInfo(exhdr_CodeSetInfo *CodeSetInfo, rsf_settings *yaml); -int get_ExHeaderDependencyList(u8 *DependencyList, rsf_settings *yaml); -int get_ExHeaderSystemInfo(exhdr_SystemInfo *SystemInfo, rsf_settings *yaml); -int get_ExHeaderARM11SystemLocalInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml, bool UseAccessDescPreset); -int SetARM11SystemLocalInfoFlags(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml); -int GetAppType(int *AppType, rsf_settings *yaml); -int SetARM11ResLimitDesc(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml); -int SetARM11StorageInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml); -int SetARM11StorageInfoSystemSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml); -int SetARM11StorageInfoExtSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml); -int SetARM11StorageInfoOtherUserSaveData(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml); -bool CheckCondiditionsForNewAccessibleSaveDataIds(rsf_settings *yaml); -int SetARM11StorageInfoAccessibleSaveDataIds(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml); -int SetARM11ServiceAccessControl(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml); -int get_ExHeaderARM11KernelInfo(exhdr_ARM11KernelCapabilities *arm11, rsf_settings *yaml); -int SetARM11KernelDescSysCallControl(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); -int GetARM11SysCalls(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); -void EnableSystemCall(ARM11KernelCapabilityDescriptor *desc, int SysCall); -void DisableSystemCall(ARM11KernelCapabilityDescriptor *desc, int SysCall); -int SetARM11KernelDescInteruptNumList(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); -int GetARM11Interupts(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); -void EnableInterupt(ARM11KernelCapabilityDescriptor *desc, int Interrupt, int i); -int SetARM11KernelDescAddressMapping(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); -int GetARM11IOMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); -int GetARM11StaticMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); -bool IsEndAddress(u32 Address); -bool IsStartAddress(u32 Address); -u32 GetIOMappingDesc(u32 Address); -u32 GetStaticMappingDesc(u32 Address, bool IsReadOnly); -u32 GetMappingDesc(u32 Address, u32 PrefixVal, s32 numPrefixBits, bool IsRO); -int SetARM11KernelDescOtherCapabilities(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); -int SetARM11KernelDescHandleTableSize(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); -int SetARM11KernelDescReleaseKernelVersion(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml); -void SetARM11KernelDescValue(ARM11KernelCapabilityDescriptor *desc, u16 Index, u32 Value); -void SetARM11KernelDescBitmask(ARM11KernelCapabilityDescriptor *desc, u32 Bitmask); -void AllocateARM11KernelDescMemory(ARM11KernelCapabilityDescriptor *desc, u16 Num); -u32 GetDescPrefixMask(int numPrefixBits); -u32 GetDescPrefixBits(int numPrefixBits, u32 PrefixVal); -int get_ExHeaderARM9AccessControlInfo(exhdr_ARM9AccessControlInfo *arm9, rsf_settings *yaml); -int set_AccessDesc(exheader_settings *exhdrset, ncch_settings *ncchset); -int accessdesc_SignWithKey(exheader_settings *exhdrset, ncch_settings *ncchset); -int accessdesc_GetSignFromRsf(exheader_settings *exhdrset, ncch_settings *ncchset); -int accessdesc_GetSignFromPreset(exheader_settings *exhdrset, ncch_settings *ncchset); - -/* ExHeader Signature Functions */ -int SignAccessDesc(ExtendedHeader_Struct *ExHdr, keys_struct *keys) -{ - u8 *AccessDesc = (u8*) &ExHdr->AccessDescriptor.ncchpubkeymodulus; - u8 *Signature = (u8*) &ExHdr->AccessDescriptor.signature; - return ctr_sig(AccessDesc,0x300,Signature,keys->rsa.AccessDesc_Pub,keys->rsa.AccessDesc_Priv,RSA_2048_SHA256,CTR_RSA_SIGN); -} - -int CheckAccessDescSignature(ExtendedHeader_Struct *ExHdr, keys_struct *keys) -{ - u8 *AccessDesc = (u8*) &ExHdr->AccessDescriptor.ncchpubkeymodulus; - u8 *Signature = (u8*) &ExHdr->AccessDescriptor.signature; - return ctr_sig(AccessDesc,0x300,Signature,keys->rsa.AccessDesc_Pub,NULL,RSA_2048_SHA256,CTR_RSA_VERIFY); -} - -/* ExHeader Build Functions */ -int BuildExHeader(ncch_settings *ncchset) -{ - int result = 0; - - exheader_settings *exhdrset = malloc(sizeof(exheader_settings)); - if(!exhdrset) {fprintf(stderr,"[EXHEADER ERROR] MEM ERROR\n"); return MEM_ERROR;} - init_ExHeaderSettings(exhdrset); - - // Get Settings - result = get_ExHeaderSettingsFromNcchset(exhdrset,ncchset); - if(result) goto finish; - - result = get_ExHeaderSettingsFromYaml(exhdrset); - if(result) goto finish; - - result = set_AccessDesc(exhdrset,ncchset); - if(result) goto finish; - - exhdrset->ExHdr->AccessDescriptor.ARM11SystemLocalCapabilities.Flags[6] = 5; - -finish: - if(result) fprintf(stderr,"[EXHEADER ERROR] Failed to create ExHeader\n"); - free_ExHeaderSettings(exhdrset); - return result; -} - - -void init_ExHeaderSettings(exheader_settings *exhdrset) -{ - memset(exhdrset,0,sizeof(exheader_settings)); -} - -void free_ExHeaderSettings(exheader_settings *exhdrset) -{ - free(exhdrset); -} - -int get_ExHeaderSettingsFromNcchset(exheader_settings *exhdrset, ncch_settings *ncchset) -{ - /* Transfer settings */ - exhdrset->keys = ncchset->keys; - exhdrset->yaml = ncchset->yaml_set; - exhdrset->UseAccessDescPreset = ncchset->keys->AccessDescSign.PresetType != not_preset; - - /* Creating Output Buffer */ - ncchset->Sections.ExHeader.size = 0x800; - ncchset->Sections.ExHeader.buffer = malloc(ncchset->Sections.ExHeader.size); - if(!ncchset->Sections.ExHeader.buffer) {fprintf(stderr,"[EXHEADER ERROR] MEM ERROR\n"); return MEM_ERROR;} - memset(ncchset->Sections.ExHeader.buffer,0,ncchset->Sections.ExHeader.size); - - /* Import ExHeader Code Section template */ - if(ncchset->ComponentFilePtrs.exheader_size){ - u32 import_size = 0x30; min_u64(0x30,ncchset->ComponentFilePtrs.exheader_size); - u32 import_offset = 0x10; - if((import_size+import_offset) > ncchset->ComponentFilePtrs.exheader_size){ - fprintf(stderr,"[EXHEADER ERROR] Exheader Template is too small\n"); - } - ReadFile_64((ncchset->Sections.ExHeader.buffer+import_offset),import_size,import_offset,ncchset->ComponentFilePtrs.exheader); - } - - /* Create ExHeader Struct for output */ - exhdrset->ExHdr = (ExtendedHeader_Struct*)ncchset->Sections.ExHeader.buffer; - - /* Set Code Info if Code Section was built not imported */ - if(ncchset->Options.IsBuildingCodeSection){ - /* BSS Size */ - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.BssSize,ncchset->CodeDetails.BSS_Size,LE); - /* Data */ - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.DataSectionInfo.Address,ncchset->CodeDetails.DataAddress,LE); - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.DataSectionInfo.CodeSize,ncchset->CodeDetails.DataSize,LE); - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.DataSectionInfo.NumMaxPages,ncchset->CodeDetails.DataMaxPages,LE); - /* RO */ - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.ReadOnlySectionInfo.Address,ncchset->CodeDetails.ROAddress,LE); - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.ReadOnlySectionInfo.CodeSize,ncchset->CodeDetails.ROSize,LE); - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.ReadOnlySectionInfo.NumMaxPages,ncchset->CodeDetails.ROMaxPages,LE); - /* Text */ - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.TextSectionInfo.Address,ncchset->CodeDetails.TextAddress,LE); - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.TextSectionInfo.CodeSize,ncchset->CodeDetails.TextSize,LE); - u32_to_u8(exhdrset->ExHdr->CodeSetInfo.TextSectionInfo.NumMaxPages,ncchset->CodeDetails.TextMaxPages,LE); - } - - /* Set Simple Flags */ - if(ncchset->Options.CompressCode) - exhdrset->ExHdr->CodeSetInfo.Flags.flag |= ExeFsCodeCompress; - if(ncchset->Options.UseOnSD) - exhdrset->ExHdr->CodeSetInfo.Flags.flag |= RetailSDAppFlag; - if(!ncchset->Options.UseRomFS) // Move this later - exhdrset->ExHdr->ARM11SystemLocalCapabilities.StorageInfo.OtherAttributes |= 1 << attribute_NOT_USE_ROMFS; - - return 0; -} - -int get_ExHeaderSettingsFromYaml(exheader_settings *exhdrset) -{ - int result = 0; - result = get_ExHeaderCodeSetInfo(&exhdrset->ExHdr->CodeSetInfo, exhdrset->yaml); - if(result) goto finish; - - if(!exhdrset->UseAccessDescPreset){ - result = get_ExHeaderDependencyList((u8*)&exhdrset->ExHdr->DependencyList[0], exhdrset->yaml); - if(result) goto finish; - } - - result = get_ExHeaderSystemInfo(&exhdrset->ExHdr->SystemInfo, exhdrset->yaml); - if(result) goto finish; - - result = get_ExHeaderARM11SystemLocalInfo(&exhdrset->ExHdr->ARM11SystemLocalCapabilities, exhdrset->yaml, exhdrset->UseAccessDescPreset); - if(result) goto finish; - - if(!exhdrset->UseAccessDescPreset){ - result = get_ExHeaderARM11KernelInfo(&exhdrset->ExHdr->ARM11KernelCapabilities, exhdrset->yaml); - if(result) goto finish; - - result = get_ExHeaderARM9AccessControlInfo(&exhdrset->ExHdr->ARM9AccessControlInfo, exhdrset->yaml); - if(result) goto finish; - } - -finish: - return result; -} - -int get_ExHeaderCodeSetInfo(exhdr_CodeSetInfo *CodeSetInfo, rsf_settings *yaml) -{ - /* Name */ - if(yaml->BasicInfo.Title){ - if(strlen(yaml->BasicInfo.Title) > 8){ - fprintf(stderr,"[EXHEADER ERROR] Parameter Too Long 'BasicInfo/Title'\n"); - return EXHDR_BAD_YAML_OPT; - } - strcpy((char*)CodeSetInfo->Name,yaml->BasicInfo.Title); - } - else{ - fprintf(stderr,"[EXHEADER ERROR] Parameter Not Found: 'BasicInfo/Title'\n"); - return EXHDR_BAD_YAML_OPT; - } - /* Stack Size */ - if(yaml->SystemControlInfo.StackSize){ - u32 StackSize = strtoul(yaml->SystemControlInfo.StackSize,NULL,0); - u32_to_u8(CodeSetInfo->StackSize,StackSize,LE); - } - else{ - fprintf(stderr,"[EXHEADER ERROR] Parameter Not Found: 'SystemControlInfo/StackSize'\n"); - return EXHDR_BAD_YAML_OPT; - } - /* Remaster Version */ - if(yaml->SystemControlInfo.RemasterVersion){ - u16 RemasterVersion = strtol(yaml->SystemControlInfo.RemasterVersion,NULL,0); - u16_to_u8(CodeSetInfo->Flags.remasterVersion,RemasterVersion,LE); - } - else{ - u16_to_u8(CodeSetInfo->Flags.remasterVersion,0,LE); - } - return 0; -} - -int get_ExHeaderDependencyList(u8 *DependencyList, rsf_settings *yaml) -{ - if(yaml->SystemControlInfo.DependencyNum > 0x30){ - fprintf(stderr,"[EXHEADER ERROR] Too Many Dependency IDs\n"); - return EXHDR_BAD_YAML_OPT; - } - for(int i = 0; i < yaml->SystemControlInfo.DependencyNum; i++){ - u8 *pos = (DependencyList + 0x8*i); - u64 TitleID = strtoull(yaml->SystemControlInfo.Dependency[i],NULL,0); - u64_to_u8(pos,TitleID,LE); - } - return 0; -} - -int get_ExHeaderSystemInfo(exhdr_SystemInfo *SystemInfo, rsf_settings *yaml) -{ - /* SaveDataSize */ - if(yaml->Rom.SaveDataSize){ - u64 SaveDataSize = strtoull(yaml->Rom.SaveDataSize,NULL,10); - if(strstr(yaml->Rom.SaveDataSize,"K")){ - char *str = strstr(yaml->Rom.SaveDataSize,"K"); - if(strcmp(str,"K") == 0 || strcmp(str,"KB") == 0 ){ - SaveDataSize *= KB; - } - } - else if(strstr(yaml->Rom.SaveDataSize,"M")){ - char *str = strstr(yaml->Rom.SaveDataSize,"M"); - if(strcmp(str,"M") == 0 || strcmp(str,"MB") == 0 ){ - SaveDataSize *= MB; - } - } - else if(strstr(yaml->Rom.SaveDataSize,"G")){ - char *str = strstr(yaml->Rom.SaveDataSize,"G"); - if(strcmp(str,"G") == 0 || strcmp(str,"GB") == 0 ){ - SaveDataSize *= GB; - } - } - else{ - fprintf(stderr,"[EXHEADER ERROR] Invalid save data size format.\n"); - return EXHDR_BAD_YAML_OPT; - } - if((SaveDataSize & 65536) != 0){ - fprintf(stderr,"[EXHEADER ERROR] Save data size must be aligned to 64K.\n"); - return EXHDR_BAD_YAML_OPT; - } - u64_to_u8(SystemInfo->SaveDataSize,SaveDataSize,LE); - } - else{ - u64_to_u8(SystemInfo->SaveDataSize,0,LE); - } - /* Jump Id */ - if(yaml->SystemControlInfo.JumpId){ - u64 JumpId = strtoull(yaml->SystemControlInfo.JumpId,NULL,0); - u64_to_u8(SystemInfo->JumpId,JumpId,LE); - } - else{ - u64 JumpId = 0; - int result = GetProgramID(&JumpId,yaml,false); - if(result) return result; - u64_to_u8(SystemInfo->JumpId,JumpId,LE); - } - return 0; -} - -int get_ExHeaderARM11SystemLocalInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml, bool UseAccessDescPreset) -{ - /* Program Id */ - u64 ProgramId = 0; - int result = GetProgramID(&ProgramId,yaml,true); - if(result) return result; - u64_to_u8(arm11->ProgramId,ProgramId,LE); - - if(!UseAccessDescPreset){ - /* Flags */ - result = SetARM11SystemLocalInfoFlags(arm11, yaml); - if(result) return result; - - /* Resource Limit Descriptors */ - result = SetARM11ResLimitDesc(arm11, yaml); - if(result) return result; - } - - /* Storage Info */ - result = SetARM11StorageInfo(arm11, yaml); - if(result) return result; - - if(!UseAccessDescPreset){ - /* Service Access Control */ - result = SetARM11ServiceAccessControl(arm11, yaml); - if(result) return result; - - /* Resource Limit Category */ - if(yaml->AccessControlInfo.ResourceLimitCategory){ - if(strcasecmp(yaml->AccessControlInfo.ResourceLimitCategory,"application") == 0) arm11->ResourceLimitCategory = resrc_limit_APPLICATION; - else if(strcasecmp(yaml->AccessControlInfo.ResourceLimitCategory,"sysapplet") == 0) arm11->ResourceLimitCategory = resrc_limit_SYS_APPLET; - else if(strcasecmp(yaml->AccessControlInfo.ResourceLimitCategory,"libapplet") == 0) arm11->ResourceLimitCategory = resrc_limit_LIB_APPLET; - else if(strcasecmp(yaml->AccessControlInfo.ResourceLimitCategory,"other") == 0) arm11->ResourceLimitCategory = resrc_limit_OTHER; - } - } - /* Finish */ - return 0; -} - -int SetARM11SystemLocalInfoFlags(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml) -{ - /* Core Version */ - if(yaml->AccessControlInfo.CoreVersion){ - u32 Version = strtoul(yaml->AccessControlInfo.CoreVersion,NULL,0); - u32_to_u8(&arm11->Flags[0],Version,LE); - } - else{ - fprintf(stderr,"[EXHEADER ERROR] Parameter Not Found: 'AccessControlInfo/CoreVersion'\n"); - return EXHDR_BAD_YAML_OPT; - } - - /* Byte[6] */ - u8 AffinityMask = 0; - u8 IdealProcessor = 0; - u8 SystemMode = 0; - if(yaml->AccessControlInfo.AffinityMask){ - AffinityMask = strtol(yaml->AccessControlInfo.AffinityMask,NULL,0); - if(AffinityMask > 1){ - fprintf(stderr,"[EXHEADER ERROR] Unexpected AffinityMask: %d. Expected range: 0x0 - 0x1\n",AffinityMask); - return EXHDR_BAD_YAML_OPT; - } - } - if(yaml->AccessControlInfo.IdealProcessor){ - IdealProcessor = strtol(yaml->AccessControlInfo.IdealProcessor,NULL,0); - if(IdealProcessor > 1){ - fprintf(stderr,"[EXHEADER ERROR] Unexpected IdealProcessor: %d. Expected range: 0x0 - 0x1\n",IdealProcessor); - return EXHDR_BAD_YAML_OPT; - } - } - if(yaml->AccessControlInfo.SystemMode){ - SystemMode = strtol(yaml->AccessControlInfo.SystemMode,NULL,0); - if(SystemMode > 15){ - fprintf(stderr,"[EXHEADER ERROR] Unexpected SystemMode: 0x%x. Expected range: 0x0 - 0xf\n",SystemMode); - return EXHDR_BAD_YAML_OPT; - } - } - arm11->Flags[6] = (u8)(SystemMode << 4 | AffinityMask << 2 | IdealProcessor); - - /* Thread Priority */ - if(yaml->AccessControlInfo.Priority){ - u8 Priority = strtoul(yaml->AccessControlInfo.Priority,NULL,0); - int ProccessType = 0; - GetAppType(&ProccessType,yaml); - if(ProccessType == processtype_APPLICATION || ProccessType == processtype_DEFAULT){ - Priority += 32; - } - if(Priority > 127){ - fprintf(stderr,"[EXHEADER ERROR] Invalid Priority: %d\n",Priority); - return EXHDR_BAD_YAML_OPT; - } - arm11->Flags[7] = Priority; - } - else{ - fprintf(stderr,"[EXHEADER ERROR] Parameter Not Found: 'AccessControlInfo/Priority'\n"); - return EXHDR_BAD_YAML_OPT; - } - - return 0; -} - -int GetAppType(int *AppType, rsf_settings *yaml) -{ - *AppType = processtype_DEFAULT; - if(yaml->SystemControlInfo.AppType){ - if(strcasecmp(yaml->SystemControlInfo.AppType,"application") == 0) *AppType = processtype_APPLICATION; - else if(strcasecmp(yaml->SystemControlInfo.AppType,"system") == 0) *AppType = processtype_SYSTEM; - } - return 0; -} - -int SetARM11ResLimitDesc(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml) -{ - for(int i = 0; i < 16; i++){ - if(i == 0){ - /* MaxCpu */ - // N's makerom actually reads this from the pre-made accessdesc. Damn cheaters. But we can improvise - if(yaml->AccessControlInfo.MaxCpu){ - arm11->ResourceLimitDescriptor[i][0] = strtol(yaml->AccessControlInfo.MaxCpu,NULL,0); - } - } - } - - return 0; -} - -int SetARM11StorageInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml) -{ - if(yaml->AccessControlInfo.UseExtendedSaveDataAccessControl || yaml->AccessControlInfo.AccessibleSaveDataIds){ - /* Accessible SaveData IDs */ - if(!CheckCondiditionsForNewAccessibleSaveDataIds(yaml)) - return EXHDR_BAD_YAML_OPT; - SetARM11StorageInfoAccessibleSaveDataIds(arm11,yaml); - } - else{ - /* Extdata Id */ - int ret = SetARM11StorageInfoExtSaveDataId(arm11,yaml); - if(ret) return ret; - /* OtherUserSaveData */ - SetARM11StorageInfoOtherUserSaveData(arm11,yaml); - } - - /* System Savedata Id */ - SetARM11StorageInfoSystemSaveDataId(arm11,yaml); - - /* FileSystem Access Info */ - u32 AccessInfo = 0; - for(int i = 0; i < yaml->AccessControlInfo.FileSystemAccessNum; i++){ - if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CategorySystemApplication") == 0) - AccessInfo |= 1 << fsaccess_CATEGORY_SYSTEM_APPLICATION; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CategoryHardwareCheck") == 0) - AccessInfo |= 1 << fsaccess_CATEGORY_HARDWARE_CHECK; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CategoryFileSystemTool") == 0) - AccessInfo |= 1 << fsaccess_CATEGORY_FILE_SYSTEM_TOOL; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"Debug") == 0) - AccessInfo |= 1 << fsaccess_DEBUG; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"TwlCardBackup") == 0) - AccessInfo |= 1 << fsaccess_TWL_CARD_BACKUP; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"TwlNandData") == 0) - AccessInfo |= 1 << fsaccess_TWL_NAND_DATA; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"Boss") == 0) - AccessInfo |= 1 << fsaccess_BOSS; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"DirectSdmc") == 0) - AccessInfo |= 1 << fsaccess_DIRECT_SDMC; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"Core") == 0) - AccessInfo |= 1 << fsaccess_CORE; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CtrNandRo") == 0) - AccessInfo |= 1 << fsaccess_CTR_NAND_RO; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CtrNandRw") == 0) - AccessInfo |= 1 << fsaccess_CTR_NAND_RW; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CtrNandRoWrite") == 0) - AccessInfo |= 1 << fsaccess_CTR_NAND_RO_WRITE; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CategorySystemSettings") == 0) - AccessInfo |= 1 << fsaccess_CATEGORY_SYSTEM_SETTINGS; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CardBoard") == 0) - AccessInfo |= 1 << fsaccess_CARD_BOARD; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"ExportImportIvs") == 0) - AccessInfo |= 1 << fsaccess_EXPORT_IMPORT_IVS; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"DirectSdmcWrite") == 0) - AccessInfo |= 1 << fsaccess_DIRECT_SDMC_WRITE; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"SwitchCleanup") == 0) - AccessInfo |= 1 << fsaccess_SWITCH_CLEANUP; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"SaveDataMove") == 0) - AccessInfo |= 1 << fsaccess_SAVE_DATA_MOVE; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"Shop") == 0) - AccessInfo |= 1 << fsaccess_SHOP; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"Shell") == 0) - AccessInfo |= 1 << fsaccess_SHELL; - else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CategoryHomeMenu") == 0) - AccessInfo |= 1 << fsaccess_CATEGORY_HOME_MENU; - else{ - fprintf(stderr,"[EXHEADER ERROR] Invalid FileSystemAccess Name: '%s'\n",yaml->AccessControlInfo.FileSystemAccess[i]); - return EXHDR_BAD_YAML_OPT; - } - } - u32_to_u8(arm11->StorageInfo.AccessInfo,AccessInfo,LE); - return 0; -} - -int SetARM11StorageInfoSystemSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml) -{ - if(yaml->AccessControlInfo.SystemSaveDataId1){ - u32 SaveId = strtoul(yaml->AccessControlInfo.SystemSaveDataId1,NULL,0); - u32_to_u8(arm11->StorageInfo.SystemSaveDataId,SaveId,LE); - } - if(yaml->AccessControlInfo.SystemSaveDataId2){ - u32 SaveId = strtoul(yaml->AccessControlInfo.SystemSaveDataId2,NULL,0); - u32_to_u8(&arm11->StorageInfo.SystemSaveDataId[4],SaveId,LE); - } - return 0; -} - -int SetARM11StorageInfoExtSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml) -{ - if(yaml->AccessControlInfo.ExtSaveDataId){ - if(!yaml->AccessControlInfo.UseExtSaveData){ - fprintf(stderr,"[EXHEADER ERROR] Failed to set ExtSaveDataId. UseExtSaveData must be true.\n"); - return EXHDR_BAD_YAML_OPT; - } - u64 ExtdataId = strtoull(yaml->AccessControlInfo.ExtSaveDataId,NULL,0); - u64_to_u8(arm11->StorageInfo.ExtSaveDataId,ExtdataId,LE); - } - return 0; -} - -int SetARM11StorageInfoOtherUserSaveData(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml) -{ - u64 Value = 0; - if(yaml->AccessControlInfo.OtherUserSaveDataId1) - Value = 0xffffff & strtoul(yaml->AccessControlInfo.OtherUserSaveDataId1,NULL,0); - Value = Value << 20; - if(yaml->AccessControlInfo.OtherUserSaveDataId2) - Value |= 0xffffff & strtoul(yaml->AccessControlInfo.OtherUserSaveDataId2,NULL,0); - Value = Value << 20; - if(yaml->AccessControlInfo.OtherUserSaveDataId3) - Value |= 0xffffff & strtoul(yaml->AccessControlInfo.OtherUserSaveDataId3,NULL,0); - - /* UseOtherVariationSaveData Flag */ - if(yaml->AccessControlInfo.UseOtherVariationSaveData){ - Value |= 0x1000000000000000; - } - u64_to_u8(arm11->StorageInfo.StorageAccessableUniqueIds,Value,LE); - return 0; -} - -bool CheckCondiditionsForNewAccessibleSaveDataIds(rsf_settings *yaml) -{ - if(!yaml->AccessControlInfo.UseExtendedSaveDataAccessControl){ - if(yaml->AccessControlInfo.AccessibleSaveDataIds) - fprintf(stderr,"[EXHEADER ERROR] AccessibleSaveDataIds is unavailable if UseExtendedSaveDataAccessControl is false.\n"); - return false; - } - - /* - if(yaml->AccessControlInfo.AccessibleSaveDataIdsNum == 0){ - fprintf(stderr,"[EXHEADER ERROR] AccessibleSaveDataIds must be specified if UseExtendedSaveDataAccessControl is true.\n"); - return false; - } - */ - - if(yaml->AccessControlInfo.AccessibleSaveDataIdsNum > 6){ - fprintf(stderr,"[EXHEADER ERROR] Too many UniqueId in \"AccessibleSaveDataIds\".\n"); - return false; - } - - if(yaml->AccessControlInfo.UseExtSaveData){ - fprintf(stderr,"[EXHEADER ERROR] UseExtSaveData must be false if AccessibleSaveDataIds is specified.\n"); - return false; - } - if (yaml->AccessControlInfo.ExtSaveDataId){ - fprintf(stderr,"[EXHEADER ERROR] ExtSaveDataId is unavailable if AccessibleSaveDataIds is specified.\n"); - return false; - } - if (yaml->AccessControlInfo.OtherUserSaveDataId1){ - if(strtoul(yaml->AccessControlInfo.OtherUserSaveDataId1,NULL,0) > 0){ - fprintf(stderr,"[EXHEADER ERROR] OtherUserSaveDataId1 must be 0 if AccessibleSaveDataIds is specified.\n"); - return false; - } - } - if (yaml->AccessControlInfo.OtherUserSaveDataId2){ - if(strtoul(yaml->AccessControlInfo.OtherUserSaveDataId2,NULL,0) > 0){ - fprintf(stderr,"[EXHEADER ERROR] OtherUserSaveDataId2 must be 0 if AccessibleSaveDataIds is specified.\n"); - return false; - } - } - if (yaml->AccessControlInfo.OtherUserSaveDataId3){ - if(strtoul(yaml->AccessControlInfo.OtherUserSaveDataId3,NULL,0) > 0){ - fprintf(stderr,"[EXHEADER ERROR] OtherUserSaveDataId3 must be 0 if AccessibleSaveDataIds is specified.\n"); - return false; - } - } - return true; -} - -int SetARM11StorageInfoAccessibleSaveDataIds(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml) -{ - u64 RegionExtSaveDataId = 0; - u64 RegionOtherUseSaveData = 0; - - if(yaml->AccessControlInfo.AccessibleSaveDataIdsNum > 0){ - u32 Max = yaml->AccessControlInfo.AccessibleSaveDataIdsNum < 3 ? yaml->AccessControlInfo.AccessibleSaveDataIdsNum : 3; - for(int i = 0; i < Max; i++){ - u32 UniqueID = 0xffffff & strtoul(yaml->AccessControlInfo.AccessibleSaveDataIds[i],NULL,0); - RegionOtherUseSaveData = RegionOtherUseSaveData << 20; - RegionOtherUseSaveData |= UniqueID; - } - } - if(yaml->AccessControlInfo.AccessibleSaveDataIdsNum > 3){ - for(int i = 3; i < yaml->AccessControlInfo.AccessibleSaveDataIdsNum; i++){ - u32 UniqueID = 0xffffff & strtoul(yaml->AccessControlInfo.AccessibleSaveDataIds[i],NULL,0); - RegionExtSaveDataId = RegionExtSaveDataId << 20; - RegionExtSaveDataId |= UniqueID; - } - } - - arm11->StorageInfo.OtherAttributes |= 1 << attribute_USE_EXTENDED_SAVEDATA_ACCESS_CONTROL; - - /* UseOtherVariationSaveData Flag */ - if(yaml->AccessControlInfo.UseOtherVariationSaveData){ - RegionOtherUseSaveData |= 0x1000000000000000; - } - - u64_to_u8(arm11->StorageInfo.ExtSaveDataId,RegionExtSaveDataId,LE); - u64_to_u8(arm11->StorageInfo.StorageAccessableUniqueIds,RegionOtherUseSaveData,LE); - return 0; -} - -int SetARM11ServiceAccessControl(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *yaml) -{ - if(yaml->AccessControlInfo.ServiceAccessControl){ - if(yaml->AccessControlInfo.ServiceAccessControlNum > 32){ - fprintf(stderr,"[EXHEADER ERROR] Too Many Service Names, maximum is 32\n"); - return EXHDR_BAD_YAML_OPT; - } - for(int i = 0; i < yaml->AccessControlInfo.ServiceAccessControlNum; i++){ - int svc_handle_len = strlen(yaml->AccessControlInfo.ServiceAccessControl[i]); - if(svc_handle_len > 8){ - fprintf(stderr,"[EXHEADER ERROR] Service Name: \"%s\" is too long\n",yaml->AccessControlInfo.ServiceAccessControl[i]); - return EXHDR_BAD_YAML_OPT; - } - memcpy(arm11->ServiceAccessControl[i],yaml->AccessControlInfo.ServiceAccessControl[i],svc_handle_len); - } - } - else{ - fprintf(stderr,"[EXHEADER ERROR] Parameter Not Found: \"AccessControlInfo/ServiceAccessControl\"\n"); - return EXHDR_BAD_YAML_OPT; - } - return 0; -} - -int get_ExHeaderARM11KernelInfo(exhdr_ARM11KernelCapabilities *arm11, rsf_settings *yaml) -{ - int result = 0; - ARM11KernelCapabilityDescriptor desc[6]; - memset(&desc,0,sizeof(ARM11KernelCapabilityDescriptor)*6); - - /* Get Descriptors */ - result = SetARM11KernelDescSysCallControl(&desc[0],yaml); - if(result) goto finish; - result = SetARM11KernelDescInteruptNumList(&desc[1],yaml); - if(result) goto finish; - result = SetARM11KernelDescAddressMapping(&desc[2],yaml); - if(result) goto finish; - result = SetARM11KernelDescOtherCapabilities(&desc[3],yaml); - if(result) goto finish; - result = SetARM11KernelDescHandleTableSize(&desc[4],yaml); - if(result) goto finish; - result = SetARM11KernelDescReleaseKernelVersion(&desc[5],yaml); - - /* Write Descriptors To Exheader */ - u16 TotalDesc = 0; - for(int i = 0; i < 6; i++){ - TotalDesc += desc[i].num; - } - if(TotalDesc >= 28){ - fprintf(stderr,"[EXHEADER ERROR] Too many Kernel Capabilities.\n"); - result = EXHDR_BAD_YAML_OPT; - goto finish; - } - u16 DescIndex = 0; - for(int i = 0; i < 6; i++){ - for(int j = 0; j < desc[i].num; j++){ - u32_to_u8(arm11->descriptors[DescIndex],desc[i].Data[j],LE); - DescIndex++; - } - } - - /* Fill Remaining Descriptors with 0xffffffff */ - for(int i = DescIndex; i < 28; i++){ - u32_to_u8(arm11->descriptors[i],0xffffffff,LE); - } - -finish: - for(int i = 0; i < 6; i++){ - free(desc[i].Data); - } - return result; -} - -int SetARM11KernelDescSysCallControl(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) -{ - int ret = 0; - - // Create Temporary Descriptor - ARM11KernelCapabilityDescriptor tmp; - memset(&tmp,0,sizeof(ARM11KernelCapabilityDescriptor)); - - AllocateARM11KernelDescMemory(&tmp,8); - for(int i = 0; i < 8; i++) - SetARM11KernelDescValue(&tmp,i,desc_SysCallControl | (i << 24)); - - // Get SysCalls - ret = GetARM11SysCalls(&tmp,yaml); - if(ret) goto finish; - - // Count Active Syscall Descs - u16 ActiveSysCallDesc = 0; - for(int i = 0; i < 8; i++) - if((tmp.Data[i] & 0x00ffffff) != 0) - ActiveSysCallDesc++; - - // Transfer Active Syscall Descs to out Descriptor - AllocateARM11KernelDescMemory(desc,ActiveSysCallDesc); - u16 SysCallDescPos = 0; - for(int i = 0; i < 8; i++){ - if((tmp.Data[i] & 0x00ffffff) != 0) { - SetARM11KernelDescValue(desc,SysCallDescPos,tmp.Data[i]); - SysCallDescPos++; - } - } - -finish: - // Free data in Temporary Descriptor - free(tmp.Data); - return ret; -} - -int GetARM11SysCalls(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) -{ - if(!yaml->AccessControlInfo.SystemCallAccess){ - fprintf(stderr,"[EXHEADER ERROR] Parameter not found: 'AccessControlInfo/SystemCallAccess'\n"); - return EXHDR_BAD_YAML_OPT; - } - for(int i = 0; i < yaml->AccessControlInfo.SystemCallAccessNum; i++){ - int SysCall = strtoul(yaml->AccessControlInfo.SystemCallAccess[i],NULL,0); - if(SysCall > 184){ - fprintf(stderr,"[EXHEADER ERROR] Unexpected Syscall: 0x%02x. Expected Range: 0x00 - 0xB8\n",SysCall); - return EXHDR_BAD_YAML_OPT; - } - EnableSystemCall(desc,SysCall); - } - - return 0; -} - -void EnableSystemCall(ARM11KernelCapabilityDescriptor *desc, int SysCall) -{ - int num = SysCall / 24; - int num1 = SysCall % 24; - desc->Data[num] |= 1 << (num1 & 31); -} - -void DisableSystemCall(ARM11KernelCapabilityDescriptor *desc, int SysCall) -{ - int num = SysCall / 24; - int num1 = SysCall % 24; - desc->Data[num] = desc->Data[num] & ~(1 << (num1 & 31)); -} - -int SetARM11KernelDescInteruptNumList(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) -{ - int ret = 0; - - // Create Temporary Descriptor - ARM11KernelCapabilityDescriptor tmp; - memset(&tmp,0,sizeof(ARM11KernelCapabilityDescriptor)); - - AllocateARM11KernelDescMemory(&tmp,8); - - // Get Interupts - ret = GetARM11Interupts(&tmp,yaml); - if(ret) goto finish; - - // Count Active Interupt Descs - u16 ActiveInteruptDesc = 0; - for(int i = 0; i < 8; i++) - if(tmp.Data[i]) - ActiveInteruptDesc++; - - // Transfer Active Interupt Descs to output Descriptor - AllocateARM11KernelDescMemory(desc,ActiveInteruptDesc); - u16 InteruptDescPos = 0; - for(int i = 0; i < 8; i++){ - if(tmp.Data[i]) { - SetARM11KernelDescValue(desc,InteruptDescPos,(tmp.Data[i] & 0x0fffffff) | desc_InteruptNumList); - InteruptDescPos++; - } - } - -finish: - // Free data in Temporary Descriptor - free(tmp.Data); - return ret; -} - -int GetARM11Interupts(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) -{ - if(!yaml->AccessControlInfo.InterruptNumbers){ - return 0; - } - if(yaml->AccessControlInfo.InterruptNumbersNum > 32){ - fprintf(stderr,"[EXHEADER ERROR] Too many Interupts. Maximum is 32\n"); - return EXHDR_BAD_YAML_OPT; - } - for(int i = 0; i < yaml->AccessControlInfo.InterruptNumbersNum; i++){ - int Interrupt = strtoul(yaml->AccessControlInfo.InterruptNumbers[i],NULL,0); - if(Interrupt > 0x7f){ - fprintf(stderr,"[EXHEADER ERROR] Unexpected Interupt: 0x%02x. Expected Range: 0x00 - 0x7f\n",Interrupt); - return EXHDR_BAD_YAML_OPT; - } - EnableInterupt(desc,Interrupt,i); - } - - return 0; -} - -void EnableInterupt(ARM11KernelCapabilityDescriptor *desc, int Interrupt, int i) -{ - int num = i / 4; - if(num*4 == i) desc->Data[num] |= 0xffffffff; - desc->Data[num] = desc->Data[num] << 7; - desc->Data[num] |= Interrupt; -} - -int SetARM11KernelDescAddressMapping(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) -{ - int ret = 0; - // Create Temporary Descriptors - ARM11KernelCapabilityDescriptor io_tmp; - memset(&io_tmp,0,sizeof(ARM11KernelCapabilityDescriptor)); - ARM11KernelCapabilityDescriptor static_tmp; - memset(&static_tmp,0,sizeof(ARM11KernelCapabilityDescriptor)); - - // Getting IO Mapping - ret = GetARM11IOMappings(&io_tmp,yaml); - if(ret) goto finish; - - // Getting Static Mapping - ret = GetARM11StaticMappings(&static_tmp,yaml); - if(ret) goto finish; - - - // Creating Output Descriptor and Combining the two MemMap Descriptors - AllocateARM11KernelDescMemory(desc,io_tmp.num+static_tmp.num); - u16 MemMapDescPos = 0; - for(int i = 0; i < io_tmp.num; i++){ - SetARM11KernelDescValue(desc,MemMapDescPos,io_tmp.Data[i]); - MemMapDescPos++; - } - for(int i = 0; i < static_tmp.num; i++){ - SetARM11KernelDescValue(desc,MemMapDescPos,static_tmp.Data[i]); - MemMapDescPos++; - } - -finish: - free(io_tmp.Data); - free(static_tmp.Data); - return ret; -} - -int GetARM11IOMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) -{ - if(!yaml->AccessControlInfo.IORegisterMapping) - return 0; - - AllocateARM11KernelDescMemory(desc,yaml->AccessControlInfo.IORegisterMappingNum*2); - u16 DescUsed = 0; - for(int i = 0; i < yaml->AccessControlInfo.IORegisterMappingNum; i++){ - if(strlen(yaml->AccessControlInfo.IORegisterMapping[i])){ - // Parse Address String - char *AddressStartStr = yaml->AccessControlInfo.IORegisterMapping[i]; - char *AddressEndStr = strstr(AddressStartStr,"-"); - if(AddressEndStr){ - if(strlen(AddressEndStr) > 1) // if not just '-' - AddressEndStr = (AddressEndStr+1); // Setting the str to the expected start of address string - else - AddressEndStr = NULL; - } - - - u32 AddressStart = strtoul(AddressStartStr,NULL,16); - if(!IsStartAddress(AddressStart)){ - fprintf(stderr,"[EXHEADER ERROR] Address 0x%x is not valid mapping start address.\n",AddressStart); - return EXHDR_BAD_YAML_OPT; - } - if(!AddressEndStr){ // No End Addr Was Specified - SetARM11KernelDescValue(desc,DescUsed,GetIOMappingDesc(AddressStart)); - DescUsed++; - goto skip; - } - - u32 AddressEnd = strtoul(AddressEndStr,NULL,16); - if(!IsEndAddress(AddressEnd)){ - fprintf(stderr,"[EXHEADER ERROR] Address 0x%x is not valid mapping end address.\n",AddressEnd); - return EXHDR_BAD_YAML_OPT; - } - - u32 DescStartAddr = GetStaticMappingDesc(AddressStart,false); - u32 DescEndAddr = GetStaticMappingDesc(AddressEnd+0x1000,false); - if(DescStartAddr != DescEndAddr){ - SetARM11KernelDescValue(desc,DescUsed,DescStartAddr); - SetARM11KernelDescValue(desc,DescUsed+1,DescEndAddr); - DescUsed += 2; - goto skip; - } - else{ - SetARM11KernelDescValue(desc,DescUsed,GetIOMappingDesc(AddressStart)); - DescUsed++; - goto skip; - } - } - - skip: ; - } - desc->num = DescUsed; - return 0; -} - -int GetARM11StaticMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) -{ - if(!yaml->AccessControlInfo.MemoryMapping) - return 0; - - AllocateARM11KernelDescMemory(desc,yaml->AccessControlInfo.MemoryMappingNum*2); - u16 DescUsed = 0; - for(int i = 0; i < yaml->AccessControlInfo.MemoryMappingNum; i++){ - if(strlen(yaml->AccessControlInfo.MemoryMapping[i])){ - char *AddressStartStr = yaml->AccessControlInfo.MemoryMapping[i]; - char *AddressEndStr = strstr(AddressStartStr,"-"); - char *ROFlagStr = strstr(AddressStartStr,":"); - bool IsRO = false; - if(ROFlagStr) - IsRO = strcasecmp(ROFlagStr,":r") == 0 ? true : false; - - if(AddressEndStr){ - if(strlen(AddressEndStr) > 1) { - AddressEndStr = (AddressEndStr+1); - if(AddressEndStr == ROFlagStr) - AddressEndStr = NULL; - } - else - AddressEndStr = NULL; - } - u32 AddressStart = strtoul(AddressStartStr,NULL,16); - if(!IsStartAddress(AddressStart)){ - fprintf(stderr,"[EXHEADER ERROR] Address 0x%x (%s) is not valid mapping start address.\n",AddressStart,AddressStartStr); - return EXHDR_BAD_YAML_OPT; - } - if(!AddressEndStr){ // No End Addr Was Specified - SetARM11KernelDescValue(desc,DescUsed,GetStaticMappingDesc(AddressStart,IsRO)); - SetARM11KernelDescValue(desc,DescUsed+1,GetStaticMappingDesc(AddressStart+0x1000, true)); - DescUsed += 2; - goto skip; - } - - u32 AddressEnd = strtoul(AddressEndStr,NULL,16); - if(!IsEndAddress(AddressEnd)){ - fprintf(stderr,"[EXHEADER ERROR] Address 0x%x (%s) is not valid mapping end address.\n",AddressEnd,AddressEndStr); - return EXHDR_BAD_YAML_OPT; - } - - u32 DescStartAddr = GetStaticMappingDesc(AddressStart,IsRO); - u32 DescEndAddr = GetStaticMappingDesc(AddressEnd+0x1000,true); - if(DescStartAddr != DescEndAddr){ - SetARM11KernelDescValue(desc,DescUsed,DescStartAddr); - SetARM11KernelDescValue(desc,DescUsed+1,DescEndAddr); - DescUsed += 2; - goto skip; - } - else{ - SetARM11KernelDescValue(desc,DescUsed,GetStaticMappingDesc(AddressStart,IsRO)); - SetARM11KernelDescValue(desc,DescUsed+1,GetStaticMappingDesc(AddressStart+0x1000, true)); - DescUsed += 2; - goto skip; - } - } - - skip: ; - } - desc->num = DescUsed; - return 0; -} - -bool IsEndAddress(u32 Address) -{ - return (Address & 0x0fff) == 0x0fff; -} - -bool IsStartAddress(u32 Address) -{ - return (Address & 0x0fff) == 0; -} - -u32 GetIOMappingDesc(u32 Address) -{ - return GetMappingDesc(Address,0xFFE,0xC,false); -} - -u32 GetStaticMappingDesc(u32 Address, bool IsReadOnly) -{ - return GetMappingDesc(Address,0x7FC,0xB,IsReadOnly); -} - -u32 GetMappingDesc(u32 Address, u32 PrefixVal, s32 numPrefixBits, bool IsRO) -{ - u32 PrefixMask = GetDescPrefixMask(numPrefixBits); - u32 PrefixBits = GetDescPrefixBits(numPrefixBits,PrefixVal); - u32 Desc = (Address >> 12 & ~PrefixMask) | PrefixBits; - if (IsRO) - Desc |= 0x100000; - return Desc; -} - -int SetARM11KernelDescOtherCapabilities(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) -{ - u32 OtherCapabilities = 0; - - if(!yaml->AccessControlInfo.DisableDebug) - OtherCapabilities |= 1 << othcap_PERMIT_DEBUG; - if(yaml->AccessControlInfo.EnableForceDebug) - OtherCapabilities |= 1 << othcap_FORCE_DEBUG; - if(yaml->AccessControlInfo.CanUseNonAlphabetAndNumber) - OtherCapabilities |= 1 << othcap_CAN_USE_NON_ALPHABET_AND_NUMBER; - if(yaml->AccessControlInfo.CanWriteSharedPage) - OtherCapabilities |= 1 << othcap_CAN_WRITE_SHARED_PAGE; - if(yaml->AccessControlInfo.CanUsePrivilegedPriority) - OtherCapabilities |= 1 << othcap_CAN_USE_PRIVILEGE_PRIORITY; - if(yaml->AccessControlInfo.PermitMainFunctionArgument) - OtherCapabilities |= 1 << othcap_PERMIT_MAIN_FUNCTION_ARGUMENT; - if(yaml->AccessControlInfo.CanShareDeviceMemory) - OtherCapabilities |= 1 << othcap_CAN_SHARE_DEVICE_MEMORY; - if(yaml->AccessControlInfo.RunnableOnSleep) - OtherCapabilities |= 1 << othcap_RUNNABLE_ON_SLEEP; - if(yaml->AccessControlInfo.SpecialMemoryArrange) - OtherCapabilities |= 1 << othcap_SPECIAL_MEMORY_ARRANGE; - - if(yaml->AccessControlInfo.MemoryType){ - u32 MemType = 0; - if(strcasecmp(yaml->AccessControlInfo.MemoryType,"application") == 0) - MemType = memtype_APPLICATION; - else if(strcasecmp(yaml->AccessControlInfo.MemoryType,"system") == 0) - MemType = memtype_SYSTEM; - else if(strcasecmp(yaml->AccessControlInfo.MemoryType,"base") == 0) - MemType = memtype_BASE; - else{ - fprintf(stderr,"[EXHEADER ERROR] Invalid memory type: '%s'\n",yaml->AccessControlInfo.MemoryType); - return EXHDR_BAD_YAML_OPT; - } - OtherCapabilities = (OtherCapabilities & 0xffffff0f) | MemType << 8; - } - - if(OtherCapabilities){ - AllocateARM11KernelDescMemory(desc,1); - SetARM11KernelDescBitmask(desc,desc_OtherCapabilities); - SetARM11KernelDescValue(desc,0,OtherCapabilities); - } - return 0; -} - -int SetARM11KernelDescHandleTableSize(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) -{ - if(yaml->AccessControlInfo.HandleTableSize){ - u16 HandleTableSize = strtoul(yaml->AccessControlInfo.HandleTableSize,NULL,0); - if(HandleTableSize > 1023){ - fprintf(stderr,"[EXHEADER ERROR] Too large handle table size\n"); - return EXHDR_BAD_YAML_OPT; - } - AllocateARM11KernelDescMemory(desc,1); - SetARM11KernelDescBitmask(desc,desc_HandleTableSize); - SetARM11KernelDescValue(desc,0,HandleTableSize); - } - else{ - fprintf(stderr,"[EXHEADER ERROR] Parameter Not Found: 'AccessControlInfo/HandleTableSize'\n"); - return EXHDR_BAD_YAML_OPT; - } - return 0; -} - -int SetARM11KernelDescReleaseKernelVersion(ARM11KernelCapabilityDescriptor *desc, rsf_settings *yaml) -{ - if(yaml->AccessControlInfo.ReleaseKernelMajor && yaml->AccessControlInfo.ReleaseKernelMinor){ - u32 releaseKernelMajor = strtoul(yaml->AccessControlInfo.ReleaseKernelMajor,NULL,0); - u32 releaseKernelMinor = strtoul(yaml->AccessControlInfo.ReleaseKernelMinor,NULL,0); - if (releaseKernelMajor > 255 || releaseKernelMinor > 255){ - fprintf(stderr,"[EXHEADER ERROR] Invalid release kernel version"); - } - AllocateARM11KernelDescMemory(desc,1); - SetARM11KernelDescBitmask(desc,desc_KernelReleaseVersion); - SetARM11KernelDescValue(desc,0,(releaseKernelMajor << 8 | releaseKernelMinor)); - } - return 0; -} - -void SetARM11KernelDescValue(ARM11KernelCapabilityDescriptor *desc, u16 Index, u32 Value) -{ - if(Index >= desc->num) return; - desc->Data[Index] |= Value; -} - -void SetARM11KernelDescBitmask(ARM11KernelCapabilityDescriptor *desc, u32 Bitmask) -{ - for(int i = 0; i < desc->num; i++) - SetARM11KernelDescValue(desc,i,Bitmask); -} - -void AllocateARM11KernelDescMemory(ARM11KernelCapabilityDescriptor *desc, u16 Num) -{ - if(Num == 0) return; - desc->num = Num; - desc->Data = malloc(sizeof(u32)*Num); - memset(desc->Data,0,sizeof(u32)*Num); - return; -} - -u32 GetDescPrefixMask(int numPrefixBits) -{ - return (u32)(~((1 << (32 - (numPrefixBits & 31))) - 1)); -} - -u32 GetDescPrefixBits(int numPrefixBits, u32 PrefixVal) -{ - return PrefixVal << (32 - (numPrefixBits & 31)); -} - -int get_ExHeaderARM9AccessControlInfo(exhdr_ARM9AccessControlInfo *arm9, rsf_settings *yaml) -{ - u32 Arm9AccessControl = 0; - for(int i = 0; i < yaml->AccessControlInfo.IoAccessControlNum; i++){ - if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"FsMountNand") == 0) - Arm9AccessControl |= 1 << arm9cap_FS_MOUNT_NAND; - else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"FsMountNandRoWrite") == 0) - Arm9AccessControl |= 1 << arm9cap_FS_MOUNT_NAND_RO_WRITE; - else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"FsMountTwln") == 0) - Arm9AccessControl |= 1 << arm9cap_FS_MOUNT_TWLN; - else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"FsMountWnand") == 0) - Arm9AccessControl |= 1 << arm9cap_FS_MOUNT_WNAND; - else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"FsMountCardSpi") == 0) - Arm9AccessControl |= 1 << arm9cap_FS_MOUNT_CARD_SPI; - else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"UseSdif3") == 0) - Arm9AccessControl |= 1 << arm9cap_USE_SDIF3; - else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"CreateSeed") == 0) - Arm9AccessControl |= 1 << arm9cap_CREATE_SEED; - else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"UseCardSpi") == 0) - Arm9AccessControl |= 1 << arm9cap_USE_CARD_SPI; - else{ - fprintf(stderr,"[EXHEADER ERROR] Invalid IoAccessControl Name: '%s'\n",yaml->AccessControlInfo.IoAccessControl[i]); - return EXHDR_BAD_YAML_OPT; - } - } - - for(int i = 0; i < yaml->AccessControlInfo.FileSystemAccessNum; i++){ - if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"DirectSdmc") == 0) - Arm9AccessControl |= 1 << arm9cap_USE_DIRECT_SDMC; - } - - if(yaml->Option.UseOnSD) - Arm9AccessControl |= 1 << arm9cap_SD_APPLICATION; - - u32_to_u8(arm9->descriptors,Arm9AccessControl,LE); - - if(yaml->AccessControlInfo.DescVersion){ - arm9->descriptors[15] = strtol(yaml->AccessControlInfo.DescVersion,NULL,0); - } - else{ - fprintf(stderr,"[EXHEADER ERROR] Parameter Not Found: 'AccessControlInfo/DescVersion'\n"); - return EXHDR_BAD_YAML_OPT; - } - - return 0; -} - - - -int set_AccessDesc(exheader_settings *exhdrset, ncch_settings *ncchset) -{ - if(ncchset->keys->AccessDescSign.PresetType == not_preset){ - if(ncchset->yaml_set->CommonHeaderKey.Found) - return accessdesc_GetSignFromRsf(exhdrset,ncchset); - else if(!ncchset->keys->rsa.RequiresPresignedDesc) - return accessdesc_SignWithKey(exhdrset,ncchset); - else{ - fprintf(stderr,"[EXHEADER ERROR] Current keyset cannot sign AccessDesc, please appropriatly setup RSF, or specify a preset with -accessdesc\n"); - return CANNOT_SIGN_ACCESSDESC; - } - } - return accessdesc_GetSignFromPreset(exhdrset,ncchset); -} - -int accessdesc_SignWithKey(exheader_settings *exhdrset, ncch_settings *ncchset) -{ - /* Set RSA Keys */ - memcpy(ncchset->CxiRsaKey.PrivK,exhdrset->keys->rsa.CFA_Priv,0x100); - memcpy(ncchset->CxiRsaKey.PubK,exhdrset->keys->rsa.CFA_Pub,0x100); - memcpy(&exhdrset->ExHdr->AccessDescriptor.ncchpubkeymodulus,exhdrset->keys->rsa.CFA_Pub,0x100); - /* Copy Data From ExHeader */ - memcpy(&exhdrset->ExHdr->AccessDescriptor.ARM11SystemLocalCapabilities,&exhdrset->ExHdr->ARM11SystemLocalCapabilities,sizeof(exhdr_ARM11SystemLocalCapabilities)); - u8 *byte6 = &exhdrset->ExHdr->AccessDescriptor.ARM11SystemLocalCapabilities.Flags[6]; - u8 SystemMode = (*byte6>>4)&0xF; - u8 AffinityMask = (*byte6>>2)&0x3; - u8 IdealProcessor = ((*byte6>>0)&0x3)+1; - *byte6 = (u8)(SystemMode << 4 | AffinityMask << 2 | IdealProcessor); - - memcpy(&exhdrset->ExHdr->AccessDescriptor.ARM11KernelCapabilities,&exhdrset->ExHdr->ARM11KernelCapabilities,sizeof(exhdr_ARM11KernelCapabilities)); - memcpy(&exhdrset->ExHdr->AccessDescriptor.ARM9AccessControlInfo,&exhdrset->ExHdr->ARM9AccessControlInfo,sizeof(exhdr_ARM9AccessControlInfo)); - /* Sign AccessDesc */ - return SignAccessDesc(exhdrset->ExHdr,exhdrset->keys); -} - -int accessdesc_GetSignFromRsf(exheader_settings *exhdrset, ncch_settings *ncchset) -{ - /* Yaml Option Sanity Checks */ - if(!exhdrset->yaml->CommonHeaderKey.Found){ - fprintf(stderr,"[EXHEADER ERROR] RSF Section 'CommonHeaderKey' not found\n"); - return COMMON_HEADER_KEY_NOT_FOUND; - } - if(!exhdrset->yaml->CommonHeaderKey.D){ - fprintf(stderr,"[EXHEADER ERROR] 'CommonHeaderKey/D' not found\n"); - return COMMON_HEADER_KEY_NOT_FOUND; - } - if(strlen(exhdrset->yaml->CommonHeaderKey.D) != 350){ - fprintf(stderr,"[EXHEADER ERROR] 'CommonHeaderKey/D' has invalid length (%d)\n",strlen(exhdrset->yaml->CommonHeaderKey.D)); - return COMMON_HEADER_KEY_NOT_FOUND; - } - if(!exhdrset->yaml->CommonHeaderKey.Modulus){ - fprintf(stderr,"[EXHEADER ERROR] 'CommonHeaderKey/Modulus' not found\n"); - return COMMON_HEADER_KEY_NOT_FOUND; - } - if(strlen(exhdrset->yaml->CommonHeaderKey.Modulus) != 350){ - fprintf(stderr,"[EXHEADER ERROR] 'CommonHeaderKey/Modulus' has invalid length (%d)\n",strlen(exhdrset->yaml->CommonHeaderKey.Modulus)); - return COMMON_HEADER_KEY_NOT_FOUND; - } - if(!exhdrset->yaml->CommonHeaderKey.AccCtlDescSign){ - fprintf(stderr,"[EXHEADER ERROR] 'CommonHeaderKey/Signature' not found\n"); - return COMMON_HEADER_KEY_NOT_FOUND; - } - if(strlen(exhdrset->yaml->CommonHeaderKey.AccCtlDescSign) != 350){ - fprintf(stderr,"[EXHEADER ERROR] 'CommonHeaderKey/Signature' has invalid length (%d)\n",strlen(exhdrset->yaml->CommonHeaderKey.AccCtlDescSign)); - return COMMON_HEADER_KEY_NOT_FOUND; - } - if(!exhdrset->yaml->CommonHeaderKey.AccCtlDescBin){ - fprintf(stderr,"[EXHEADER ERROR] 'CommonHeaderKey/Descriptor' not found\n"); - return COMMON_HEADER_KEY_NOT_FOUND; - } - if(strlen(exhdrset->yaml->CommonHeaderKey.AccCtlDescBin) != 695){ - fprintf(stderr,"[EXHEADER ERROR] 'CommonHeaderKey/Descriptor' has invalid length (%d)\n",strlen(exhdrset->yaml->CommonHeaderKey.AccCtlDescBin)); - return COMMON_HEADER_KEY_NOT_FOUND; - } - /* Set RSA Keys */ - int result = 0; - u32 out = 0x500; - u8 *tmp = malloc(0x500); - result = base64_decode(tmp,&out,(const u8*)exhdrset->yaml->CommonHeaderKey.Modulus,strlen(exhdrset->yaml->CommonHeaderKey.Modulus)); - if(result) goto finish; - memcpy(ncchset->CxiRsaKey.PubK,tmp,0x100); - out = 0x500; - result = base64_decode(tmp,&out,(const u8*)exhdrset->yaml->CommonHeaderKey.D,strlen(exhdrset->yaml->CommonHeaderKey.D)); - if(result) goto finish; - memcpy(ncchset->CxiRsaKey.PrivK,tmp,0x100); - /* Set AccessDesc */ - out = 0x500; - result = base64_decode(tmp,&out,(const u8*)exhdrset->yaml->CommonHeaderKey.AccCtlDescSign,strlen(exhdrset->yaml->CommonHeaderKey.AccCtlDescSign)); - if(result) goto finish; - memcpy(exhdrset->ExHdr->AccessDescriptor.signature,tmp,0x100); - memcpy(exhdrset->ExHdr->AccessDescriptor.ncchpubkeymodulus,ncchset->CxiRsaKey.PubK,0x100); - out = 0x500; - result = base64_decode(tmp,&out,(const u8*)exhdrset->yaml->CommonHeaderKey.AccCtlDescBin,strlen(exhdrset->yaml->CommonHeaderKey.AccCtlDescBin)); - if(result) goto finish; - memcpy(&exhdrset->ExHdr->AccessDescriptor.ARM11SystemLocalCapabilities,tmp,0x200); -finish: - free(tmp); - return result; -} - -int accessdesc_GetSignFromPreset(exheader_settings *exhdrset, ncch_settings *ncchset) -{ - u8 *AccessDescSig = NULL; - u8 *AccessDescData = NULL; - u8 *DepList = NULL; - - u8 *CXI_Pubk = NULL; - u8 *CXI_Privk = NULL; - - if(ncchset->keys->AccessDescSign.PresetType == app){ - switch(ncchset->keys->AccessDescSign.TargetFirmware){ - case 1: - AccessDescSig = (u8*)App_sdk1_AcexSig; - AccessDescData = (u8*)App_sdk1_AcexData; - DepList = (u8*)sdk1_dep_list; - CXI_Pubk = (u8*)App_sdk1_HdrPubK; - CXI_Privk = (u8*)App_sdk1_HdrPrivK; - break; - case 2: - AccessDescSig = (u8*)App_sdk2_AcexSig; - AccessDescData = (u8*)App_sdk2_AcexData; - DepList = (u8*)sdk2_dep_list; - CXI_Pubk = (u8*)App_sdk2_HdrPubK; - CXI_Privk = (u8*)App_sdk2_HdrPrivK; - break; - case 4: - case 5: - AccessDescSig = (u8*)App_sdk4_AcexSig; - AccessDescData = (u8*)App_sdk4_AcexData; - DepList = (u8*)sdk4_dep_list; - CXI_Pubk = (u8*)App_sdk4_HdrPubK; - CXI_Privk = (u8*)App_sdk4_HdrPrivK; - break; - case 7: - AccessDescSig = NULL; - AccessDescData = (u8*)App_sdk7_AcexData; - DepList = (u8*)sdk7_dep_list; - CXI_Pubk = NULL; - CXI_Privk = NULL; - break; - - } - } - else if(ncchset->keys->AccessDescSign.PresetType == dlp){ - switch(ncchset->keys->AccessDescSign.TargetFirmware){ - case 1: - AccessDescSig = (u8*)Dlp_sdk1_AcexSig; - AccessDescData = (u8*)Dlp_sdk1_AcexData; - DepList = (u8*)sdk1_dep_list; - CXI_Pubk = (u8*)Dlp_sdk1_HdrPubK; - CXI_Privk = (u8*)Dlp_sdk1_HdrPrivK; - break; - case 2: - AccessDescSig = (u8*)Dlp_sdk2_AcexSig; - AccessDescData = (u8*)Dlp_sdk2_AcexData; - DepList = (u8*)sdk2_dep_list; - CXI_Pubk = (u8*)Dlp_sdk2_HdrPubK; - CXI_Privk = (u8*)Dlp_sdk2_HdrPrivK; - break; - case 4: - case 5: - AccessDescSig = (u8*)Dlp_sdk4_AcexSig; - AccessDescData = (u8*)Dlp_sdk4_AcexData; - DepList = (u8*)sdk4_dep_list; - CXI_Pubk = (u8*)Dlp_sdk4_HdrPubK; - CXI_Privk = (u8*)Dlp_sdk4_HdrPrivK; - break; - } - } - else if(ncchset->keys->AccessDescSign.PresetType == demo){ - switch(ncchset->keys->AccessDescSign.TargetFirmware){ - case 4: - case 5: - AccessDescSig = (u8*)Demo_sdk4_AcexSig; - AccessDescData = (u8*)Demo_sdk4_AcexData; - DepList = (u8*)sdk4_dep_list; - CXI_Pubk = (u8*)Demo_sdk4_HdrPubK; - CXI_Privk = (u8*)Demo_sdk4_HdrPrivK; - break; - } - } - - // Error Checking - if(!AccessDescData || !DepList){ - fprintf(stderr,"[EXHEADER ERROR] AccessDesc preset is unavailable, please configure RSF file\n"); - return CANNOT_SIGN_ACCESSDESC; - } - - if((!CXI_Pubk || !CXI_Privk || !AccessDescSig) && ncchset->keys->rsa.RequiresPresignedDesc){ - fprintf(stderr,"[EXHEADER ERROR] This AccessDesc preset needs to be signed, the current keyset is incapable of doing so. Please configure RSF file with the appropriate signature data.\n"); - return CANNOT_SIGN_ACCESSDESC; - } - - // Setting data in Exheader - // Dependency List - memcpy(exhdrset->ExHdr->DependencyList,DepList,0x180); - - // ARM11 Local Capabilities - exhdr_ARM11SystemLocalCapabilities *arm11local = (exhdr_ARM11SystemLocalCapabilities*)(AccessDescData); - // Backing Up Non Preset Details - u8 ProgramID[8]; - memcpy(ProgramID,exhdrset->ExHdr->ARM11SystemLocalCapabilities.ProgramId,8); - exhdr_StorageInfo StorageInfoBackup; - memcpy(&StorageInfoBackup,&exhdrset->ExHdr->ARM11SystemLocalCapabilities.StorageInfo,sizeof(exhdr_StorageInfo)); - - // Setting Preset Data - memcpy(&exhdrset->ExHdr->ARM11SystemLocalCapabilities,arm11local,sizeof(exhdr_ARM11SystemLocalCapabilities)); - - // Restoring Non Preset Data - memcpy(exhdrset->ExHdr->ARM11SystemLocalCapabilities.ProgramId,ProgramID,8); - memcpy(&exhdrset->ExHdr->ARM11SystemLocalCapabilities.StorageInfo,&StorageInfoBackup,sizeof(exhdr_StorageInfo)); - - // Adjusting flags to prevent errors - u8 *byte6 = &exhdrset->ExHdr->ARM11SystemLocalCapabilities.Flags[6]; - u8 SystemMode = (*byte6>>4)&0xF; - u8 AffinityMask = (*byte6>>2)&0x3; - u8 IdealProcessor = ((*byte6>>0)&0x3)-1; - *byte6 = (u8)(SystemMode << 4 | AffinityMask << 2 | IdealProcessor); - exhdrset->ExHdr->ARM11SystemLocalCapabilities.Flags[7] = 0x30; - - // ARM11 Kernel Capabilities - exhdr_ARM11KernelCapabilities *arm11kernel = (exhdr_ARM11KernelCapabilities*)(AccessDescData+sizeof(exhdr_ARM11SystemLocalCapabilities)); - memcpy(&exhdrset->ExHdr->ARM11KernelCapabilities,arm11kernel,(sizeof(exhdr_ARM11KernelCapabilities))); - - // ARM9 Access Control - exhdr_ARM9AccessControlInfo *arm9 = (exhdr_ARM9AccessControlInfo*)(AccessDescData+sizeof(exhdr_ARM11SystemLocalCapabilities)+sizeof(exhdr_ARM11KernelCapabilities)); - memcpy(&exhdrset->ExHdr->ARM9AccessControlInfo,arm9,(sizeof(exhdr_ARM9AccessControlInfo))); - - // Setting AccessDesc Area - // Signing normally if possible - if(!ncchset->keys->rsa.RequiresPresignedDesc) - return accessdesc_SignWithKey(exhdrset,ncchset); - - // Otherwise set static data & ncch hdr sig info - memcpy(ncchset->CxiRsaKey.PubK,CXI_Pubk,0x100); - memcpy(ncchset->CxiRsaKey.PrivK,CXI_Privk,0x100); - memcpy(&exhdrset->ExHdr->AccessDescriptor.signature,AccessDescSig,0x100); - memcpy(&exhdrset->ExHdr->AccessDescriptor.ncchpubkeymodulus,CXI_Pubk,0x100); - memcpy(&exhdrset->ExHdr->AccessDescriptor.ARM11SystemLocalCapabilities,AccessDescData,0x200); - - return 0; -} - -/* ExHeader Binary Print Functions */ -void exhdr_Print_ServiceAccessControl(ExtendedHeader_Struct *hdr) -{ - printf("[+] Service Access Control\n"); - for(int i = 0; i < 32; i ++){ - char *SVC_Handle = (char*)hdr->ARM11SystemLocalCapabilities.ServiceAccessControl[i]; - if(SVC_Handle[0] == 0) break; - printf("%.8s\n",hdr->ARM11SystemLocalCapabilities.ServiceAccessControl[i]); - } -} - -/* ExHeader Binary Read Functions */ -u8* GetAccessDescSig_frm_exhdr(ExtendedHeader_Struct *hdr) -{ - if(!hdr) return NULL; - return hdr->AccessDescriptor.signature ; -} - -u8* GetNcchHdrPubKey_frm_exhdr(ExtendedHeader_Struct *hdr) -{ - if(!hdr) return NULL; - return hdr->AccessDescriptor.ncchpubkeymodulus; -} - -u8* GetAccessDesc_frm_exhdr(ExtendedHeader_Struct *hdr) -{ - if(!hdr) return NULL; - return hdr->AccessDescriptor.ncchpubkeymodulus; -} - -u16 GetRemasterVersion_frm_exhdr(ExtendedHeader_Struct *hdr) -{ - return u8_to_u16(hdr->CodeSetInfo.Flags.remasterVersion,LE); -} - -u64 GetSaveDataSize_frm_exhdr(ExtendedHeader_Struct *hdr) -{ - return u8_to_u64(hdr->SystemInfo.SaveDataSize,LE); -} - -int GetCoreVersion_frm_exhdr(u8 *Dest, ExtendedHeader_Struct *hdr) -{ - return (int) memcpy(Dest,hdr->ARM11SystemLocalCapabilities.Flags,4); -} - -int GetDependancyList_frm_exhdr(u8 *Dest,ExtendedHeader_Struct *hdr) -{ - if(!Dest) return -1; - for(int i = 0; i < 0x30; i++){ - memcpy(Dest,hdr->DependencyList,0x30*8); - } - return 0; -} - -/* ExHeader Settings Read from Yaml */ -int GetSaveDataSize_yaml(u64 *SaveDataSize, user_settings *usrset) -{ - - if(usrset->yaml_set.Rom.SaveDataSize){ - *SaveDataSize = strtoull(usrset->yaml_set.Rom.SaveDataSize,NULL,10); - if(strstr(usrset->yaml_set.Rom.SaveDataSize,"K")){ - char *str = strstr(usrset->yaml_set.Rom.SaveDataSize,"K"); - if(strcmp(str,"K") == 0 || strcmp(str,"KB") == 0 ){ - *SaveDataSize = *SaveDataSize*KB; - } - } - else if(strstr(usrset->yaml_set.Rom.SaveDataSize,"M")){ - char *str = strstr(usrset->yaml_set.Rom.SaveDataSize,"M"); - if(strcmp(str,"M") == 0 || strcmp(str,"MB") == 0 ){ - *SaveDataSize = *SaveDataSize*MB; - } - } - else if(strstr(usrset->yaml_set.Rom.SaveDataSize,"G")){ - char *str = strstr(usrset->yaml_set.Rom.SaveDataSize,"G"); - if(strcmp(str,"G") == 0 || strcmp(str,"GB") == 0 ){ - *SaveDataSize = *SaveDataSize*GB; - } - } - else{ - fprintf(stderr,"[EXHEADER ERROR] Invalid save data size format.\n"); - return EXHDR_BAD_YAML_OPT; - } - if((*SaveDataSize & 65536) != 0){ - fprintf(stderr,"[EXHEADER ERROR] Save data size must be aligned to 64K.\n"); - return EXHDR_BAD_YAML_OPT; - } - } - else{ - *SaveDataSize = 0; - } - return 0; -} - -int GetRemasterVersion_yaml(u16 *RemasterVersion, user_settings *usrset) -{ - char *Str = usrset->yaml_set.SystemControlInfo.RemasterVersion; - if(!Str){ - *RemasterVersion = 0; - return 0; - } - *RemasterVersion = strtol(Str,NULL,0); - return 0; -} diff --git a/exheader.h b/exheader.h deleted file mode 100644 index d606995..0000000 --- a/exheader.h +++ /dev/null @@ -1,233 +0,0 @@ -#ifndef _EXHEADER_H_ -#define _EXHEADER_H_ - -typedef enum -{ - COMMON_HEADER_KEY_NOT_FOUND = -10, - EXHDR_BAD_YAML_OPT = -11, - CANNOT_SIGN_ACCESSDESC = -12 -} exheader_errors; - -typedef enum -{ - ExeFsCodeCompress = 1, - RetailSDAppFlag = 2, -} SystemInfoFlags_Flagbitmask; - -typedef enum -{ - memtype_APPLICATION = 1, - memtype_SYSTEM = 2, - memtype_BASE = 3 -} MemoryTypeName; - -typedef enum -{ - processtype_DEFAULT = -1, - processtype_SYSTEM = 0, - processtype_APPLICATION = 1 -} ProcessTypeName; - -typedef enum -{ - resrc_limit_APPLICATION, - resrc_limit_SYS_APPLET, - resrc_limit_LIB_APPLET, - resrc_limit_OTHER -} ResourceLimitCategoryName; - -typedef enum -{ - othcap_PERMIT_DEBUG, - othcap_FORCE_DEBUG, - othcap_CAN_USE_NON_ALPHABET_AND_NUMBER, - othcap_CAN_WRITE_SHARED_PAGE, - othcap_CAN_USE_PRIVILEGE_PRIORITY, - othcap_PERMIT_MAIN_FUNCTION_ARGUMENT, - othcap_CAN_SHARE_DEVICE_MEMORY, - othcap_RUNNABLE_ON_SLEEP, - othcap_SPECIAL_MEMORY_ARRANGE = 12, -} OtherCapabilities_Flagbitmask; - -typedef enum -{ - fsaccess_CATEGORY_SYSTEM_APPLICATION, - fsaccess_CATEGORY_HARDWARE_CHECK, - fsaccess_CATEGORY_FILE_SYSTEM_TOOL, - fsaccess_DEBUG, - fsaccess_TWL_CARD_BACKUP, - fsaccess_TWL_NAND_DATA, - fsaccess_BOSS, - fsaccess_DIRECT_SDMC, - fsaccess_CORE, - fsaccess_CTR_NAND_RO, - fsaccess_CTR_NAND_RW, - fsaccess_CTR_NAND_RO_WRITE, - fsaccess_CATEGORY_SYSTEM_SETTINGS, - fsaccess_CARD_BOARD, - fsaccess_EXPORT_IMPORT_IVS, - fsaccess_DIRECT_SDMC_WRITE, - fsaccess_SWITCH_CLEANUP, - fsaccess_SAVE_DATA_MOVE, - fsaccess_SHOP, - fsaccess_SHELL, - fsaccess_CATEGORY_HOME_MENU -} FileSystemAccess; - -typedef enum -{ - attribute_NOT_USE_ROMFS, - attribute_USE_EXTENDED_SAVEDATA_ACCESS_CONTROL -} AttributeName; - -typedef enum -{ - arm9cap_FS_MOUNT_NAND, - arm9cap_FS_MOUNT_NAND_RO_WRITE, - arm9cap_FS_MOUNT_TWLN, - arm9cap_FS_MOUNT_WNAND, - arm9cap_FS_MOUNT_CARD_SPI, - arm9cap_USE_SDIF3, - arm9cap_CREATE_SEED, - arm9cap_USE_CARD_SPI, - arm9cap_SD_APPLICATION, - arm9cap_USE_DIRECT_SDMC -} Arm9Capability; - -typedef struct -{ - u8 reserved[5]; - u8 flag; - u8 remasterVersion[2]; // le u16 -} exhdr_SystemInfoFlags; - -typedef struct -{ - u8 Address[4]; // le u32 - u8 NumMaxPages[4]; // le u32 - u8 CodeSize[4]; // le u32 -} exhdr_CodeSegmentInfo; - -typedef struct -{ - u8 Name[8]; - exhdr_SystemInfoFlags Flags; - exhdr_CodeSegmentInfo TextSectionInfo; - u8 StackSize[4]; // le u32 - exhdr_CodeSegmentInfo ReadOnlySectionInfo; - u8 Reserved[4]; - exhdr_CodeSegmentInfo DataSectionInfo; - u8 BssSize[4]; // le u32 -} exhdr_CodeSetInfo; - -typedef struct -{ - u8 SaveDataSize[8]; - u8 JumpId[8]; - u8 Reserved[0x30]; -} exhdr_SystemInfo; - -typedef struct -{ - u8 ExtSaveDataId[8]; - u8 SystemSaveDataId[8]; - u8 StorageAccessableUniqueIds[8]; - u8 AccessInfo[7]; - u8 OtherAttributes; -} exhdr_StorageInfo; - -typedef struct -{ - u8 ProgramId[8]; - u8 Flags[8]; - u8 ResourceLimitDescriptor[16][2]; - exhdr_StorageInfo StorageInfo; - u8 ServiceAccessControl[32][8]; // Those char[8] svc handles - u8 Reserved1[0x1f]; - u8 ResourceLimitCategory; -} exhdr_ARM11SystemLocalCapabilities; - -typedef struct -{ - u16 num; - u32 *Data; -} ARM11KernelCapabilityDescriptor; - -typedef enum -{ - desc_InteruptNumList = 0xe0000000, - desc_SysCallControl = 0xf0000000, - desc_KernelReleaseVersion = 0xfc000000, - desc_HandleTableSize = 0xfe000000, - desc_OtherCapabilities = 0xff000000, - desc_MappingStatic = 0xff800000, - desc_MappingIO = 0xffc00000, -} ARM11KernelCapabilityDescriptorBitmask; - -typedef struct -{ - u8 descriptors[28][4];// Descripters are a collection of u32s, with bitmask idents so they can be identified, 'no matter the pos' - u8 reserved[0x10]; -} exhdr_ARM11KernelCapabilities; - -typedef struct -{ - u8 descriptors[16]; //descriptors[15] = DescVersion -} exhdr_ARM9AccessControlInfo; - -typedef struct -{ - // systemcontrol info { - // coreinfo { - exhdr_CodeSetInfo CodeSetInfo; - u8 DependencyList[0x30][8]; - // } - exhdr_SystemInfo SystemInfo; - // } - // accesscontrolinfo { - exhdr_ARM11SystemLocalCapabilities ARM11SystemLocalCapabilities; - exhdr_ARM11KernelCapabilities ARM11KernelCapabilities; - exhdr_ARM9AccessControlInfo ARM9AccessControlInfo; - // } - struct { - u8 signature[0x100]; - u8 ncchpubkeymodulus[0x100]; - exhdr_ARM11SystemLocalCapabilities ARM11SystemLocalCapabilities; - exhdr_ARM11KernelCapabilities ARM11KernelCapabilities; - exhdr_ARM9AccessControlInfo ARM9AccessControlInfo; - } AccessDescriptor; -} ExtendedHeader_Struct; - -typedef struct -{ - keys_struct *keys; - rsf_settings *yaml; - bool UseAccessDescPreset; - - /* Output */ - ExtendedHeader_Struct *ExHdr; // is the exheader output buffer ptr(in ncchset) cast as exheader struct ptr; -} exheader_settings; - -#endif -/* ExHeader Signature Functions */ -int SignAccessDesc(ExtendedHeader_Struct *ExHdr, keys_struct *keys); -int CheckAccessDescSignature(ExtendedHeader_Struct *ExHdr, keys_struct *keys); - -/* ExHeader Build Functions */ -int BuildExHeader(ncch_settings *ncchset); - -/* ExHeader Binary Print Functions */ -void exhdr_Print_ServiceAccessControl(ExtendedHeader_Struct *hdr); - -/* ExHeader Binary Read Functions */ -u8* GetAccessDescSig_frm_exhdr(ExtendedHeader_Struct *hdr); -u8* GetNcchHdrPubKey_frm_exhdr(ExtendedHeader_Struct *hdr); -u8* GetAccessDesc_frm_exhdr(ExtendedHeader_Struct *hdr); -u16 GetRemasterVersion_frm_exhdr(ExtendedHeader_Struct *hdr); -u64 GetSaveDataSize_frm_exhdr(ExtendedHeader_Struct *hdr); -int GetDependancyList_frm_exhdr(u8 *Dest,ExtendedHeader_Struct *hdr); -int GetCoreVersion_frm_exhdr(u8 *Dest, ExtendedHeader_Struct *hdr); - -/* ExHeader Settings Read from Yaml */ -int GetSaveDataSize_yaml(u64 *SaveDataSize, user_settings *usrset); -int GetRemasterVersion_yaml(u16 *RemasterVersion, user_settings *usrset); \ No newline at end of file diff --git a/keys_common.h b/keys_common.h deleted file mode 100644 index 2a83f1e..0000000 --- a/keys_common.h +++ /dev/null @@ -1,83 +0,0 @@ -#ifndef _KEYS_COMMON_H_ -#define _KEYS_COMMON_H_ - -// AES KEYS -static const unsigned char zeros_fixed_aesKey[16] = //zeros_fixed_aesKey -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -// RSA KEYS -static const unsigned char Dummy_rsa_privExp[256] = //Dummy_rsa_privExp -{ - 0xE3, 0xC6, 0x76, 0x57, 0x2E, 0xCB, 0xA5, 0xE6, - 0x0C, 0x01, 0xBD, 0x5C, 0x32, 0x2D, 0x90, 0xE0, - 0xFF, 0x9A, 0x80, 0xE8, 0x66, 0x8D, 0x84, 0xDC, - 0xF7, 0x75, 0x5F, 0x3F, 0x98, 0x7C, 0x97, 0x40, - 0x20, 0x21, 0xB7, 0x24, 0xC0, 0x61, 0x2D, 0x83, - 0xB0, 0x91, 0x8E, 0xE3, 0xC2, 0xD0, 0x2C, 0xA1, - 0x2C, 0x99, 0x4F, 0x48, 0xF7, 0x4E, 0x13, 0xD3, - 0x01, 0x71, 0x25, 0x9B, 0x3C, 0x75, 0x7C, 0xC4, - 0xE5, 0x89, 0x7E, 0xDA, 0xF9, 0x99, 0x5C, 0x83, - 0xE4, 0xDD, 0x36, 0x62, 0x5B, 0x0E, 0x12, 0x91, - 0xD6, 0x39, 0x45, 0x69, 0x62, 0x20, 0xCA, 0xF4, - 0xBA, 0x6B, 0x28, 0x1A, 0x7C, 0xBF, 0xB9, 0x97, - 0x37, 0x46, 0xC2, 0x7A, 0xCF, 0x10, 0x68, 0xC2, - 0xC9, 0xF1, 0x48, 0xDA, 0x8A, 0x2F, 0x4C, 0xBC, - 0x3B, 0x1C, 0xB8, 0x8F, 0x04, 0x7F, 0xFD, 0x9D, - 0xE2, 0x0A, 0xD2, 0x09, 0x39, 0xC7, 0xD9, 0x81, - 0x59, 0x17, 0x73, 0xB2, 0xEC, 0xEB, 0x36, 0x67, - 0xA5, 0xA8, 0xD5, 0x71, 0xD9, 0x38, 0x6A, 0xD1, - 0x28, 0xB9, 0x46, 0x85, 0x3A, 0x81, 0x85, 0x4E, - 0x55, 0xA7, 0x74, 0x79, 0xBB, 0xC5, 0x97, 0xF7, - 0xEF, 0xE0, 0x81, 0x20, 0xE0, 0xEA, 0x45, 0x8F, - 0xED, 0x70, 0x8E, 0xD6, 0xFF, 0x49, 0xCF, 0x7F, - 0xF2, 0xFF, 0x22, 0x20, 0x3F, 0xE9, 0x92, 0x99, - 0xDE, 0x81, 0xD6, 0x27, 0xF7, 0xB8, 0x3A, 0x1D, - 0x4F, 0xA2, 0x50, 0xFB, 0xA5, 0xE7, 0x98, 0x08, - 0xB5, 0x2B, 0xA2, 0x94, 0xA9, 0x17, 0x1A, 0xA8, - 0x34, 0xF6, 0x5E, 0x24, 0x2D, 0x40, 0x2F, 0xCB, - 0x3C, 0xB0, 0xF8, 0x7E, 0x84, 0xB4, 0x87, 0x82, - 0x19, 0xAF, 0x87, 0xB6, 0xFA, 0xA9, 0x67, 0x27, - 0x07, 0x28, 0xBA, 0x2E, 0xA5, 0x8E, 0xDD, 0xE5, - 0xD4, 0xFD, 0x06, 0x09, 0xDF, 0xBD, 0x87, 0x95, - 0x95, 0x25, 0x05, 0x5E, 0xB2, 0x00, 0x18, 0x41 -}; - -static const unsigned char Dummy_rsa_pubMod[256] = //Dummy_rsa_pubMod -{ - 0xE6, 0x64, 0x06, 0x6C, 0x49, 0x6B, 0xEC, 0xEE, - 0x59, 0xAE, 0x11, 0x92, 0xF1, 0x03, 0x43, 0x87, - 0x8E, 0xEB, 0x4D, 0x70, 0xA9, 0x71, 0xB4, 0x6D, - 0x25, 0x19, 0x02, 0x4A, 0x9E, 0x4D, 0xA3, 0x10, - 0xFD, 0xB2, 0x27, 0x56, 0xA3, 0xFB, 0xDD, 0xE5, - 0xE4, 0x4E, 0xE0, 0x62, 0x8F, 0xC3, 0x2E, 0xEE, - 0x8F, 0x9D, 0x4D, 0x6E, 0x00, 0xDB, 0x88, 0x49, - 0xA2, 0xFC, 0x30, 0xFE, 0x94, 0xF3, 0x06, 0x92, - 0x75, 0x61, 0x11, 0x1D, 0x24, 0x07, 0xE9, 0x12, - 0xB6, 0xB1, 0x57, 0xF5, 0xDC, 0x01, 0xF7, 0x54, - 0xBF, 0xC3, 0xAC, 0x8C, 0x73, 0x2C, 0x73, 0x17, - 0x8E, 0xBF, 0x2F, 0x68, 0x3C, 0x61, 0x75, 0x32, - 0x15, 0x39, 0x93, 0xDD, 0xBA, 0x12, 0x42, 0xD3, - 0x25, 0x85, 0xFA, 0xA6, 0x4B, 0xAF, 0x81, 0x4B, - 0xCA, 0xD2, 0x9C, 0xF1, 0x3D, 0x37, 0xAE, 0xB9, - 0xFD, 0x77, 0x59, 0x78, 0xB9, 0x32, 0x95, 0x19, - 0xD1, 0x47, 0xE1, 0xC6, 0xE1, 0x16, 0x13, 0x5D, - 0xCC, 0x99, 0x31, 0x63, 0xAD, 0xBB, 0xA5, 0x4F, - 0xE4, 0x41, 0x67, 0xFD, 0x7F, 0x1E, 0xA8, 0x9A, - 0x35, 0x65, 0xEB, 0xC4, 0x4D, 0xD4, 0xC4, 0x29, - 0x0F, 0x40, 0x95, 0xFD, 0x8A, 0x30, 0x67, 0x79, - 0xFB, 0xD4, 0x76, 0x6F, 0xD1, 0xDE, 0x8C, 0x72, - 0x32, 0x05, 0x97, 0x5A, 0x26, 0x0D, 0x37, 0xCA, - 0x12, 0x2C, 0xDC, 0x14, 0x3F, 0xD3, 0x59, 0x00, - 0x66, 0xD2, 0x8E, 0xF5, 0x6E, 0x22, 0x08, 0x63, - 0x59, 0xB5, 0x3F, 0xBB, 0x3A, 0x4D, 0xD4, 0xD1, - 0xC1, 0x21, 0xA7, 0x4D, 0x02, 0x96, 0x08, 0xF5, - 0x2B, 0x11, 0xE5, 0x85, 0xD2, 0x6E, 0x91, 0xD6, - 0x8F, 0x77, 0x72, 0xEF, 0x37, 0xE3, 0x79, 0x19, - 0xA9, 0xEE, 0x58, 0x5D, 0x52, 0x9B, 0x2D, 0x47, - 0x7D, 0x27, 0xB8, 0xC3, 0x76, 0xCA, 0xDA, 0xC2, - 0xF4, 0xFC, 0xF4, 0x53, 0x7C, 0xD8, 0x43, 0x87 -}; -#endif \ No newline at end of file diff --git a/keys_debug.h b/keys_debug.h deleted file mode 100644 index ee5ba02..0000000 --- a/keys_debug.h +++ /dev/null @@ -1,805 +0,0 @@ -#ifndef _KEYS_DEBUG_H_ -#define _KEYS_DEBUG_H_ - -static const unsigned char system_fixed_aesKey[16] = //system_fixed_aesKey -{ - 0x52, 0x7C, 0xE6, 0x30, 0xA9, 0xCA, 0x30, 0x5F, - 0x36, 0x96, 0xF3, 0xCD, 0xE9, 0x54, 0x19, 0x4B -}; - -static const unsigned char ctr_aes_common_key_dev0[16] = //ctr_aes_common_key_dev0 -{ - 0x55, 0xA3, 0xF8, 0x72, 0xBD, 0xC8, 0x0C, 0x55, - 0x5A, 0x65, 0x43, 0x81, 0x13, 0x9E, 0x15, 0x3B -}; - -static const unsigned char ctr_aes_common_key_dev1[16] = //ctr_aes_common_key_dev1 -{ - 0x44, 0x34, 0xED, 0x14, 0x82, 0x0C, 0xA1, 0xEB, - 0xAB, 0x82, 0xC1, 0x6E, 0x7B, 0xEF, 0x0C, 0x25 -}; - -static const unsigned char common_dpki_aesKey[16] = //common_dpki_aesKey a.k.a. DSi DevCommonKey -{ - 0xA1, 0x60, 0x4A, 0x6A, 0x71, 0x23, 0xB5, 0x29, - 0xAE, 0x8B, 0xEC, 0x32, 0xC8, 0x16, 0xFC, 0xAA -}; - -//ECC Keys - -static const unsigned char xs_dpki_eccPubKey[60] = //xs_dpki_eccPubKey -{ - 0x01, 0xD5, 0xA2, 0x3C, 0xE8, 0xE9, 0xDF, 0x8C, - 0x0A, 0xA5, 0xAA, 0xE1, 0x76, 0xE1, 0x24, 0x7C, - 0x90, 0x97, 0xA6, 0xFE, 0x2A, 0xD3, 0x8C, 0xB4, - 0xDE, 0x74, 0x32, 0xDE, 0x5B, 0x84, 0x01, 0xAC, - 0xB2, 0x13, 0x71, 0x9D, 0x4B, 0x9C, 0xEB, 0xD4, - 0x13, 0xC2, 0x27, 0x66, 0xC5, 0x5F, 0x83, 0x97, - 0xC4, 0x83, 0xA3, 0x9E, 0x3B, 0xFC, 0xE8, 0xA9, - 0xB5, 0x10, 0x3A, 0x7B -}; - -//RSA Keys - -static const unsigned char dev_cert_root_rsa_pubk[0x200] = -{ - 0xD0, 0x1F, 0xE1, 0x00, 0xD4, 0x35, 0x56, 0xB2, - 0x4B, 0x56, 0xDA, 0xE9, 0x71, 0xB5, 0xA5, 0xD3, - 0x84, 0xB9, 0x30, 0x03, 0xBE, 0x1B, 0xBF, 0x28, - 0xA2, 0x30, 0x5B, 0x06, 0x06, 0x45, 0x46, 0x7D, - 0x5B, 0x02, 0x51, 0xD2, 0x56, 0x1A, 0x27, 0x4F, - 0x9E, 0x9F, 0x9C, 0xEC, 0x64, 0x61, 0x50, 0xAB, - 0x3D, 0x2A, 0xE3, 0x36, 0x68, 0x66, 0xAC, 0xA4, - 0xBA, 0xE8, 0x1A, 0xE3, 0xD7, 0x9A, 0xA6, 0xB0, - 0x4A, 0x8B, 0xCB, 0xA7, 0xE6, 0xFB, 0x64, 0x89, - 0x45, 0xEB, 0xDF, 0xDB, 0x85, 0xBA, 0x09, 0x1F, - 0xD7, 0xD1, 0x14, 0xB5, 0xA3, 0xA7, 0x80, 0xE3, - 0xA2, 0x2E, 0x6E, 0xCD, 0x87, 0xB5, 0xA4, 0xC6, - 0xF9, 0x10, 0xE4, 0x03, 0x22, 0x08, 0x81, 0x4B, - 0x0C, 0xEE, 0xA1, 0xA1, 0x7D, 0xF7, 0x39, 0x69, - 0x5F, 0x61, 0x7E, 0xF6, 0x35, 0x28, 0xDB, 0x94, - 0x96, 0x37, 0xA0, 0x56, 0x03, 0x7F, 0x7B, 0x32, - 0x41, 0x38, 0x95, 0xC0, 0xA8, 0xF1, 0x98, 0x2E, - 0x15, 0x65, 0xE3, 0x8E, 0xED, 0xC2, 0x2E, 0x59, - 0x0E, 0xE2, 0x67, 0x7B, 0x86, 0x09, 0xF4, 0x8C, - 0x2E, 0x30, 0x3F, 0xBC, 0x40, 0x5C, 0xAC, 0x18, - 0x04, 0x2F, 0x82, 0x20, 0x84, 0xE4, 0x93, 0x68, - 0x03, 0xDA, 0x7F, 0x41, 0x34, 0x92, 0x48, 0x56, - 0x2B, 0x8E, 0xE1, 0x2F, 0x78, 0xF8, 0x03, 0x24, - 0x63, 0x30, 0xBC, 0x7B, 0xE7, 0xEE, 0x72, 0x4A, - 0xF4, 0x58, 0xA4, 0x72, 0xE7, 0xAB, 0x46, 0xA1, - 0xA7, 0xC1, 0x0C, 0x2F, 0x18, 0xFA, 0x07, 0xC3, - 0xDD, 0xD8, 0x98, 0x06, 0xA1, 0x1C, 0x9C, 0xC1, - 0x30, 0xB2, 0x47, 0xA3, 0x3C, 0x8D, 0x47, 0xDE, - 0x67, 0xF2, 0x9E, 0x55, 0x77, 0xB1, 0x1C, 0x43, - 0x49, 0x3D, 0x5B, 0xBA, 0x76, 0x34, 0xA7, 0xE4, - 0xE7, 0x15, 0x31, 0xB7, 0xDF, 0x59, 0x81, 0xFE, - 0x24, 0xA1, 0x14, 0x55, 0x4C, 0xBD, 0x8F, 0x00, - 0x5C, 0xE1, 0xDB, 0x35, 0x08, 0x5C, 0xCF, 0xC7, - 0x78, 0x06, 0xB6, 0xDE, 0x25, 0x40, 0x68, 0xA2, - 0x6C, 0xB5, 0x49, 0x2D, 0x45, 0x80, 0x43, 0x8F, - 0xE1, 0xE5, 0xA9, 0xED, 0x75, 0xC5, 0xED, 0x45, - 0x1D, 0xCE, 0x78, 0x94, 0x39, 0xCC, 0xC3, 0xBA, - 0x28, 0xA2, 0x31, 0x2A, 0x1B, 0x87, 0x19, 0xEF, - 0x0F, 0x73, 0xB7, 0x13, 0x95, 0x0C, 0x02, 0x59, - 0x1A, 0x74, 0x62, 0xA6, 0x07, 0xF3, 0x7C, 0x0A, - 0xA7, 0xA1, 0x8F, 0xA9, 0x43, 0xA3, 0x6D, 0x75, - 0x2A, 0x5F, 0x41, 0x92, 0xF0, 0x13, 0x61, 0x00, - 0xAA, 0x9C, 0xB4, 0x1B, 0xBE, 0x14, 0xBE, 0xB1, - 0xF9, 0xFC, 0x69, 0x2F, 0xDF, 0xA0, 0x94, 0x46, - 0xDE, 0x5A, 0x9D, 0xDE, 0x2C, 0xA5, 0xF6, 0x8C, - 0x1C, 0x0C, 0x21, 0x42, 0x92, 0x87, 0xCB, 0x2D, - 0xAA, 0xA3, 0xD2, 0x63, 0x75, 0x2F, 0x73, 0xE0, - 0x9F, 0xAF, 0x44, 0x79, 0xD2, 0x81, 0x74, 0x29, - 0xF6, 0x98, 0x00, 0xAF, 0xDE, 0x6B, 0x59, 0x2D, - 0xC1, 0x98, 0x82, 0xBD, 0xF5, 0x81, 0xCC, 0xAB, - 0xF2, 0xCB, 0x91, 0x02, 0x9E, 0xF3, 0x5C, 0x4C, - 0xFD, 0xBB, 0xFF, 0x49, 0xC1, 0xFA, 0x1B, 0x2F, - 0xE3, 0x1D, 0xE7, 0xA5, 0x60, 0xEC, 0xB4, 0x7E, - 0xBC, 0xFE, 0x32, 0x42, 0x5B, 0x95, 0x6F, 0x81, - 0xB6, 0x99, 0x17, 0x48, 0x7E, 0x3B, 0x78, 0x91, - 0x51, 0xDB, 0x2E, 0x78, 0xB1, 0xFD, 0x2E, 0xBE, - 0x7E, 0x62, 0x6B, 0x3E, 0xA1, 0x65, 0xB4, 0xFB, - 0x00, 0xCC, 0xB7, 0x51, 0xAF, 0x50, 0x73, 0x29, - 0xC4, 0xA3, 0x93, 0x9E, 0xA6, 0xDD, 0x9C, 0x50, - 0xA0, 0xE7, 0x38, 0x6B, 0x01, 0x45, 0x79, 0x6B, - 0x41, 0xAF, 0x61, 0xF7, 0x85, 0x55, 0x94, 0x4F, - 0x3B, 0xC2, 0x2D, 0xC3, 0xBD, 0x0D, 0x00, 0xF8, - 0x79, 0x8A, 0x42, 0xB1, 0xAA, 0xA0, 0x83, 0x20, - 0x65, 0x9A, 0xC7, 0x39, 0x5A, 0xB4, 0xF3, 0x29 -}; - -static const unsigned char cpA_dpki_rsa_privExp[256] = //cpA_dpki_rsa_privExp -{ - 0x28, 0xCE, 0xDC, 0x39, 0x02, 0x7F, 0x3E, 0x8E, - 0xAA, 0xB7, 0x59, 0x11, 0xE0, 0x68, 0xBF, 0x80, - 0xA6, 0x44, 0x77, 0xDB, 0x1B, 0xA2, 0x50, 0xA3, - 0x69, 0xE5, 0x96, 0xB2, 0xC4, 0xCA, 0x7A, 0x35, - 0x0D, 0xFC, 0x4A, 0xB2, 0xFB, 0xC0, 0x18, 0xA5, - 0x30, 0xB4, 0x9D, 0x10, 0x44, 0xD1, 0xAD, 0x33, - 0xFD, 0x15, 0xA7, 0x8D, 0x0F, 0x17, 0xD5, 0xA4, - 0xF5, 0x5E, 0x7F, 0x33, 0xF6, 0x80, 0x04, 0x27, - 0x6A, 0xEA, 0x9C, 0xEE, 0x68, 0x04, 0x1A, 0xA5, - 0xD4, 0x35, 0xA2, 0x25, 0xA2, 0x31, 0xD9, 0xF2, - 0xF0, 0xAC, 0xDE, 0x69, 0xB6, 0x64, 0x56, 0x75, - 0x2E, 0x9B, 0xEA, 0xDE, 0x2A, 0xBB, 0xD6, 0x00, - 0xAA, 0xE6, 0x9B, 0xC2, 0xF6, 0x9F, 0x60, 0xCD, - 0x0E, 0xFA, 0xB1, 0x14, 0x4A, 0x47, 0xD6, 0x63, - 0x9A, 0xCD, 0x9C, 0x93, 0xB9, 0x09, 0x42, 0xDA, - 0x8F, 0xFB, 0xE5, 0x7B, 0xF1, 0x4F, 0x96, 0x33, - 0xF9, 0x45, 0x5B, 0xCC, 0x84, 0xAB, 0xC2, 0xD8, - 0xC4, 0x0C, 0x85, 0xFA, 0x51, 0x28, 0xB9, 0x97, - 0x95, 0x23, 0x8C, 0xB3, 0x1D, 0x4E, 0xB6, 0x1C, - 0xCC, 0x60, 0x41, 0xFB, 0x26, 0xC7, 0xD6, 0xCB, - 0x77, 0x18, 0xF7, 0xEA, 0xCD, 0x10, 0x3C, 0x5B, - 0xA3, 0xC0, 0x77, 0x4C, 0x11, 0xF3, 0x74, 0x50, - 0xEE, 0x23, 0x80, 0xC4, 0x5D, 0xDD, 0x57, 0xF5, - 0x7D, 0x49, 0x57, 0x4A, 0xBA, 0x62, 0xBF, 0x06, - 0xD9, 0xD1, 0x7F, 0x91, 0x10, 0x89, 0x6F, 0x49, - 0x09, 0xD7, 0xE9, 0xAF, 0x4C, 0x9F, 0x67, 0x9D, - 0x89, 0x82, 0xE4, 0xD5, 0xC1, 0x9A, 0xDC, 0x55, - 0x79, 0xE7, 0xE9, 0x2D, 0x81, 0x42, 0x14, 0x55, - 0x61, 0x47, 0x9B, 0xED, 0x76, 0x92, 0x1D, 0x2F, - 0xB5, 0x7C, 0x28, 0x4B, 0xFF, 0x7B, 0xC2, 0x3B, - 0x36, 0x73, 0x99, 0xA6, 0x21, 0x43, 0x0E, 0xA1, - 0x1F, 0x82, 0xB8, 0x91, 0x71, 0x11, 0xB2, 0xC1 -}; - -static const unsigned char cpA_dpki_rsa_pubMod[256] = //cpA_dpki_rsa_pubMod -{ - 0xAA, 0x7F, 0x93, 0x80, 0x28, 0x9B, 0xE8, 0x98, - 0x63, 0x10, 0x7A, 0xE1, 0x0C, 0x59, 0x2C, 0x2F, - 0x7C, 0xFF, 0xBD, 0xAA, 0xDD, 0x74, 0xF4, 0xA2, - 0xFB, 0xAC, 0xD7, 0x6F, 0x00, 0x93, 0x42, 0x06, - 0x34, 0x71, 0x56, 0xD8, 0x40, 0x49, 0x72, 0x9F, - 0x3E, 0x24, 0xFA, 0x5E, 0x19, 0xD1, 0x5B, 0x63, - 0x5C, 0xD2, 0xEF, 0x09, 0xDE, 0x32, 0xEE, 0x6B, - 0x6F, 0xC8, 0xFA, 0x32, 0x8E, 0x2E, 0x96, 0xB9, - 0x94, 0x41, 0x04, 0x7D, 0x07, 0x62, 0x95, 0xDA, - 0x0D, 0x91, 0xD8, 0x09, 0x35, 0xD0, 0xDE, 0x8E, - 0x6B, 0xC6, 0xAB, 0x14, 0x27, 0x01, 0x9C, 0xFE, - 0x49, 0x96, 0xFC, 0x9B, 0x54, 0x79, 0x4D, 0xEB, - 0xD7, 0xC6, 0x66, 0x73, 0xA6, 0xDD, 0x3A, 0x77, - 0x65, 0x47, 0x94, 0xEC, 0x1C, 0x87, 0xAA, 0x46, - 0xD9, 0x78, 0xA9, 0x7D, 0xDB, 0x11, 0x22, 0x6E, - 0xD4, 0x12, 0xC2, 0x78, 0x4B, 0x21, 0x83, 0x92, - 0xC7, 0x10, 0xC7, 0x74, 0x19, 0xFF, 0xAA, 0xF6, - 0x0B, 0x75, 0xD8, 0x23, 0xDD, 0x33, 0xC3, 0xA1, - 0x5B, 0xA7, 0x2D, 0x30, 0xA5, 0xA4, 0xD8, 0xF8, - 0x0F, 0xD6, 0x73, 0xFD, 0x26, 0xCB, 0x29, 0xA6, - 0xEF, 0x50, 0x39, 0xE2, 0x5F, 0x59, 0x61, 0x84, - 0x6B, 0xDA, 0x2E, 0xC7, 0xCB, 0xE4, 0x38, 0x4B, - 0x28, 0xFB, 0x0D, 0xD5, 0x8E, 0x7C, 0xAA, 0x7D, - 0x4B, 0x37, 0x3A, 0xD7, 0x81, 0xDD, 0x73, 0xE3, - 0x09, 0x93, 0xBD, 0xBD, 0x7E, 0x08, 0x55, 0x4A, - 0x8C, 0xA5, 0xC9, 0x84, 0x2D, 0x71, 0x01, 0xA2, - 0x2A, 0x01, 0xB0, 0x15, 0xFB, 0x30, 0x78, 0xB9, - 0x13, 0xF4, 0xC7, 0x3F, 0xB5, 0xA6, 0xF1, 0xA2, - 0x5E, 0x22, 0xB0, 0x02, 0xB6, 0xE0, 0x09, 0x54, - 0x7F, 0x0F, 0xBD, 0xF0, 0xFE, 0xA5, 0x50, 0x1D, - 0x93, 0x15, 0xF9, 0x3D, 0x83, 0x0F, 0x0F, 0x0E, - 0x3D, 0xE2, 0x3D, 0x96, 0xE7, 0x09, 0xD9, 0x77 -}; - -static const unsigned char xs9_dpki_rsa_privExp[256] = //xs9_dpki_rsa_privExp -{ - 0x74, 0xCB, 0xCF, 0x1E, 0xD0, 0x2D, 0xD4, 0xF9, - 0xE0, 0x05, 0xCE, 0x9C, 0x66, 0x3D, 0xE3, 0x62, - 0x66, 0x62, 0x4E, 0xB5, 0x82, 0xE1, 0x24, 0x1B, - 0x5F, 0x73, 0x2A, 0x7F, 0x1D, 0xB3, 0x6E, 0x50, - 0x07, 0x83, 0xA0, 0xC0, 0xED, 0xCE, 0xB7, 0xF9, - 0x3D, 0xAC, 0x61, 0xC5, 0x7B, 0x99, 0xA0, 0xBC, - 0xCE, 0x42, 0x8F, 0xD3, 0xB0, 0xA5, 0xBF, 0x2A, - 0x3D, 0x3E, 0x5E, 0xDC, 0x56, 0xC3, 0xA5, 0xDE, - 0x35, 0xCD, 0x0A, 0x00, 0xF8, 0x17, 0x6B, 0x20, - 0x79, 0xEF, 0xD8, 0x83, 0x23, 0xBF, 0x21, 0x28, - 0xFF, 0x38, 0x7D, 0x80, 0x07, 0x15, 0x18, 0x6C, - 0xB9, 0x20, 0xF8, 0x85, 0x77, 0xBC, 0xD9, 0x2A, - 0x35, 0x1C, 0xFE, 0xE3, 0xF1, 0xE8, 0x98, 0x2E, - 0xA0, 0x4A, 0x48, 0x77, 0x35, 0x03, 0xC9, 0x7A, - 0xAC, 0xDA, 0xBE, 0x6D, 0x1D, 0xFB, 0xE4, 0xDE, - 0xEC, 0x70, 0x65, 0xFA, 0x10, 0x65, 0xA4, 0xB8, - 0x6A, 0xDF, 0x32, 0x6B, 0x8E, 0x28, 0x79, 0x25, - 0x87, 0x72, 0xC0, 0x7C, 0x5B, 0x81, 0xBC, 0x81, - 0x92, 0x44, 0x7D, 0xEA, 0x61, 0xBD, 0x3C, 0x48, - 0xF3, 0x0E, 0x18, 0xDC, 0x8D, 0x89, 0xA0, 0x34, - 0xC3, 0xAE, 0x9C, 0x57, 0x72, 0xA6, 0xD7, 0x7C, - 0x79, 0xF7, 0xE9, 0x14, 0x6E, 0x15, 0xAC, 0x01, - 0xFA, 0xFF, 0xC8, 0xA2, 0x2A, 0x3A, 0xAB, 0x24, - 0x3C, 0x7E, 0x2E, 0xC5, 0xDA, 0x83, 0xD5, 0x9D, - 0x24, 0x10, 0x83, 0x7A, 0xF4, 0xBB, 0xA3, 0x6F, - 0x88, 0xCE, 0xEC, 0x24, 0x1B, 0xF4, 0x36, 0x2E, - 0x96, 0xC9, 0x6D, 0x19, 0x02, 0xFE, 0xAA, 0x21, - 0x3E, 0x95, 0xA7, 0xFE, 0x83, 0xC8, 0x99, 0x7F, - 0xD1, 0xCB, 0x7C, 0x1F, 0x91, 0x30, 0xDB, 0xA4, - 0xD3, 0xDD, 0xDA, 0x9B, 0x12, 0x4E, 0x24, 0xD1, - 0xA5, 0x6F, 0x15, 0xFC, 0x2C, 0x72, 0x98, 0x2C, - 0x89, 0xC5, 0x7D, 0x89, 0xDE, 0x2B, 0x4E, 0x01 -}; - -static const unsigned char xs9_dpki_rsa_pubMod[256] = //xs9_dpki_rsa_pubMod -{ - 0xC0, 0x84, 0x4C, 0xEB, 0x7E, 0xB0, 0xCF, 0xF0, - 0xAE, 0xB7, 0x77, 0x69, 0x85, 0x93, 0xE4, 0x99, - 0x5A, 0x95, 0x4E, 0x58, 0x17, 0x38, 0xCE, 0xD6, - 0x81, 0xB0, 0xBD, 0x77, 0x09, 0xE7, 0xF8, 0x9A, - 0xDF, 0xAD, 0x05, 0x48, 0x83, 0xF6, 0xC3, 0xFD, - 0xDF, 0x7B, 0x83, 0xE0, 0x0C, 0x26, 0x81, 0x54, - 0x43, 0x29, 0xEA, 0x82, 0x6C, 0x89, 0xF0, 0xA6, - 0x74, 0x42, 0x86, 0x4D, 0x32, 0x60, 0x32, 0x7D, - 0xA7, 0x7A, 0x13, 0x40, 0x66, 0x59, 0xDA, 0x3E, - 0x41, 0x6B, 0x27, 0x94, 0x03, 0x4F, 0xAA, 0x22, - 0x9D, 0xD5, 0x54, 0x52, 0xDB, 0x27, 0x0A, 0x6A, - 0xA2, 0x3D, 0x19, 0xB1, 0x66, 0x1B, 0x19, 0x7D, - 0xAB, 0xC7, 0x0E, 0x88, 0x17, 0x91, 0xA1, 0x2A, - 0xB4, 0x3C, 0x6C, 0xCB, 0xF5, 0xAA, 0x7C, 0x3A, - 0xDD, 0x36, 0xFB, 0x35, 0x71, 0x7B, 0x20, 0x01, - 0x59, 0x00, 0xD6, 0xF6, 0x90, 0x39, 0x35, 0x41, - 0x31, 0xF8, 0xC1, 0xC0, 0x57, 0x3A, 0x35, 0x18, - 0x58, 0x90, 0xB1, 0xAD, 0x9A, 0x0E, 0xEC, 0xE0, - 0xF4, 0x7A, 0x7D, 0xA5, 0x27, 0x48, 0xC9, 0x72, - 0xAB, 0x0D, 0x08, 0x7B, 0x62, 0x35, 0x40, 0x91, - 0x14, 0x2B, 0xB1, 0x1D, 0x1A, 0xFA, 0xF9, 0xCD, - 0x5C, 0x17, 0x13, 0x53, 0x52, 0x71, 0xCA, 0xE2, - 0x2A, 0x78, 0xB1, 0x7F, 0x4A, 0xCD, 0x59, 0xD8, - 0xBA, 0x1D, 0x7D, 0x70, 0x5F, 0x78, 0x1B, 0x9F, - 0x9D, 0x37, 0x18, 0x8E, 0xD7, 0xCD, 0x0D, 0x49, - 0x57, 0x74, 0x69, 0x88, 0x3A, 0x6B, 0x8E, 0x4E, - 0x1B, 0x85, 0xDD, 0xBE, 0x39, 0x45, 0x05, 0x89, - 0x56, 0x12, 0x97, 0x59, 0x9A, 0x09, 0xA4, 0xC8, - 0x2D, 0x2F, 0xF5, 0xCF, 0xB4, 0x73, 0x70, 0xDB, - 0x58, 0x1E, 0xB2, 0x4E, 0x77, 0x6F, 0xA4, 0x7E, - 0x62, 0xDF, 0xB7, 0x05, 0xE8, 0x80, 0x42, 0x5C, - 0xB8, 0x78, 0x87, 0x97, 0x7F, 0x66, 0x2C, 0x5F -}; - -static const unsigned char DevNcsdCfa_privExp[256] = //DevNcsdCfa_privExp -{ - 0x32, 0x36, 0x43, 0xC2, 0xB3, 0x1A, 0x7E, 0x13, - 0xAB, 0xA2, 0xB6, 0x8B, 0x4F, 0x05, 0xA7, 0xA6, - 0xCD, 0xE7, 0xA6, 0x74, 0x47, 0x49, 0xE6, 0x51, - 0xE4, 0x71, 0x74, 0x15, 0x76, 0x91, 0xF7, 0x92, - 0xB1, 0x4E, 0xF6, 0x99, 0x73, 0x1E, 0xCF, 0xB5, - 0x1D, 0x7C, 0xAF, 0xC5, 0xEA, 0x57, 0x01, 0xE5, - 0x5C, 0x10, 0x47, 0xEA, 0x3A, 0x54, 0x86, 0x03, - 0x2A, 0x76, 0x05, 0x72, 0x53, 0x16, 0xC2, 0xAE, - 0x2D, 0xBE, 0x71, 0xF7, 0x17, 0x6B, 0x23, 0xDD, - 0x2C, 0xB8, 0x8D, 0x13, 0x14, 0xE5, 0xDA, 0x3B, - 0xC7, 0x33, 0x7A, 0xBA, 0xE5, 0x2A, 0x2B, 0x7D, - 0x5A, 0x12, 0x27, 0x38, 0x56, 0xDF, 0xED, 0x70, - 0x03, 0x0E, 0xED, 0x64, 0xC7, 0xF6, 0x54, 0xAC, - 0xFE, 0x1D, 0x77, 0xA4, 0xE4, 0xBC, 0xEB, 0xB9, - 0xA6, 0xC5, 0xFE, 0x3A, 0xAF, 0x58, 0x81, 0xE4, - 0x3F, 0xA0, 0xE6, 0x93, 0x13, 0x2D, 0x98, 0x7D, - 0xB3, 0xE2, 0xC9, 0xC8, 0xD6, 0x31, 0x91, 0x73, - 0x9D, 0xCA, 0xC9, 0x44, 0xEF, 0xD0, 0x39, 0xBF, - 0x38, 0xFD, 0x1C, 0x91, 0x72, 0x93, 0x40, 0xA9, - 0x8A, 0x0D, 0x3E, 0x32, 0xC4, 0x59, 0x4B, 0x0C, - 0xC7, 0xEA, 0x50, 0x41, 0x9F, 0xF5, 0xE2, 0xB7, - 0x50, 0x7C, 0xE3, 0xC9, 0xEC, 0x46, 0x18, 0xAC, - 0xB4, 0x91, 0x2A, 0x32, 0xE0, 0xD8, 0x10, 0x6F, - 0xFC, 0x81, 0xB3, 0x95, 0xF3, 0xFC, 0x78, 0xC0, - 0xEF, 0xE5, 0x7B, 0x8D, 0x14, 0xD4, 0x36, 0x26, - 0x5F, 0xC6, 0x32, 0xC0, 0x19, 0x87, 0x5C, 0x77, - 0x26, 0x37, 0xD8, 0xAE, 0x66, 0xD6, 0x0B, 0x28, - 0x26, 0x43, 0x7C, 0x25, 0xDB, 0x6D, 0x5C, 0xE8, - 0x94, 0x8F, 0xA9, 0x77, 0x07, 0xB2, 0xC0, 0x85, - 0xCD, 0x41, 0xBA, 0x48, 0x88, 0x73, 0x34, 0xD5, - 0x20, 0x8A, 0x0F, 0xE3, 0x9E, 0x99, 0xF0, 0xC8, - 0xE8, 0xD9, 0x2C, 0x2A, 0x21, 0x69, 0xE4, 0xC1 -}; - -static const unsigned char DevNcsdCfa_pubMod[256] = //DevNcsdCfa_pubMod -{ - 0xB9, 0x0C, 0xC4, 0xC6, 0x78, 0xF8, 0x6E, 0x30, - 0x05, 0x28, 0xC1, 0xCB, 0xD2, 0xCF, 0xA7, 0x80, - 0x5C, 0x57, 0x4D, 0x16, 0x9C, 0xAF, 0xA6, 0xCD, - 0x01, 0xBB, 0x83, 0x33, 0xAD, 0x03, 0xBB, 0x06, - 0x63, 0xD8, 0x17, 0xF5, 0xE3, 0xDF, 0xDA, 0x0D, - 0x3B, 0x86, 0x0E, 0xA2, 0x80, 0x47, 0x94, 0x44, - 0x6F, 0xD9, 0x97, 0x7E, 0x78, 0x6A, 0xC3, 0x93, - 0x93, 0xEF, 0x02, 0xFC, 0x22, 0x9F, 0x80, 0x77, - 0x8C, 0x70, 0x92, 0x1C, 0x43, 0xB1, 0x37, 0x4C, - 0x76, 0xE0, 0x57, 0x3B, 0xAB, 0x89, 0xFF, 0xEF, - 0xE5, 0xBB, 0x3E, 0xAB, 0x91, 0x39, 0xB8, 0xD9, - 0x66, 0x0B, 0x64, 0x28, 0x91, 0x92, 0xE9, 0xD0, - 0xB3, 0xDF, 0xD1, 0x4B, 0xC1, 0x73, 0xB5, 0x3F, - 0x56, 0xA0, 0x40, 0x10, 0xFE, 0x15, 0x2B, 0x1F, - 0xA2, 0x7A, 0xDE, 0x31, 0xB0, 0x26, 0x40, 0xC3, - 0x57, 0xFD, 0x35, 0xCB, 0xF0, 0xFA, 0xFF, 0xFB, - 0x6F, 0xDB, 0xCD, 0x34, 0x1D, 0x51, 0x2D, 0x2D, - 0x81, 0x18, 0xFF, 0x0C, 0x08, 0x51, 0xD5, 0xB4, - 0x4B, 0x56, 0x16, 0x02, 0x9F, 0x4E, 0x6A, 0xDF, - 0x06, 0x6E, 0xCB, 0x72, 0x85, 0xE9, 0x2E, 0x43, - 0xA2, 0x08, 0x78, 0x0C, 0x38, 0x9C, 0x19, 0xBD, - 0x7B, 0x74, 0x74, 0x68, 0xC4, 0x2D, 0xC1, 0x35, - 0x9E, 0x65, 0x3B, 0xD8, 0x99, 0x04, 0x1C, 0x8B, - 0x93, 0x8E, 0x7E, 0x92, 0x7C, 0xBB, 0xDD, 0x60, - 0xEC, 0xE7, 0xFE, 0x0E, 0x9D, 0x4F, 0x36, 0x46, - 0xE6, 0xF1, 0x5C, 0x94, 0x70, 0xEE, 0x67, 0x5F, - 0x36, 0x2B, 0x70, 0x44, 0x8D, 0xCA, 0x09, 0xB9, - 0x58, 0x67, 0xD2, 0x9F, 0xAD, 0x1F, 0x13, 0x54, - 0x74, 0xAD, 0xA6, 0x84, 0x44, 0x28, 0xF3, 0xDE, - 0x7E, 0x4C, 0x20, 0x2B, 0xC5, 0xE9, 0x12, 0xE9, - 0x5E, 0xFB, 0x8D, 0x77, 0xA9, 0xA4, 0xD2, 0x0D, - 0x3C, 0x38, 0x24, 0xBE, 0xF5, 0x8A, 0xB5, 0xF5 -}; - -static const unsigned char AccessDesc_privExp[256] = //AccessDesc_privExp -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static const unsigned char AccessDesc_pubMod[256] = //AccessDesc_pubMod -{ - 0xF4, 0x3C, 0x45, 0x82, 0xFB, 0xF8, 0x90, 0x5D, - 0x07, 0x02, 0x9F, 0x2A, 0x98, 0x8B, 0x63, 0xB7, - 0xD3, 0x8F, 0x3C, 0xE2, 0xE0, 0xE0, 0x93, 0xBF, - 0xDF, 0x32, 0x43, 0x4D, 0xBE, 0xF4, 0xD1, 0x7A, - 0x3A, 0x4E, 0x54, 0x31, 0xD7, 0x73, 0xAE, 0x99, - 0x4C, 0xC4, 0x1F, 0x3C, 0x3E, 0xF0, 0x57, 0x05, - 0xA3, 0x8A, 0x45, 0x54, 0x60, 0xD8, 0x8F, 0xD9, - 0x1D, 0x68, 0x0D, 0x0E, 0x2E, 0xEF, 0xC8, 0xE8, - 0x3D, 0xC9, 0x19, 0xF3, 0x73, 0x1E, 0x2D, 0xDA, - 0x77, 0x88, 0x3E, 0xCA, 0x5E, 0x25, 0x70, 0x4B, - 0xF7, 0x70, 0x95, 0x83, 0x54, 0x24, 0xE0, 0xC3, - 0x1A, 0x75, 0xDF, 0x61, 0x3D, 0xD1, 0x42, 0xEC, - 0x35, 0x1B, 0x38, 0xD6, 0xC1, 0xF6, 0x7E, 0x18, - 0x2A, 0x84, 0x85, 0xDD, 0x57, 0x74, 0x1F, 0x0A, - 0x2E, 0xF6, 0xB2, 0x94, 0xA2, 0x3E, 0xE9, 0xA1, - 0xD0, 0x09, 0xF7, 0x3A, 0x99, 0x80, 0x05, 0xAF, - 0x57, 0x55, 0xEF, 0x52, 0xFA, 0x24, 0x3E, 0x7F, - 0xD4, 0x7C, 0x41, 0x44, 0x7B, 0x06, 0x7F, 0xB9, - 0x5B, 0x2E, 0x8E, 0x96, 0xAE, 0x46, 0x12, 0x4D, - 0x64, 0x21, 0xE5, 0x0F, 0x85, 0xCC, 0xEB, 0x92, - 0xE5, 0xF0, 0xF5, 0xA7, 0x42, 0x27, 0x3B, 0xEC, - 0xF8, 0xE7, 0x81, 0x75, 0x6F, 0x63, 0x0A, 0x8B, - 0x0D, 0x77, 0x38, 0x51, 0xE6, 0x66, 0x33, 0xBA, - 0x79, 0xDC, 0x2F, 0x2C, 0x8F, 0xC3, 0x28, 0x06, - 0xBB, 0x03, 0x9C, 0xDB, 0xD1, 0x64, 0x0A, 0x66, - 0xF0, 0xF8, 0xC1, 0x2A, 0x49, 0x1D, 0x0C, 0x6E, - 0x35, 0xBB, 0xEA, 0xB3, 0x5C, 0x0D, 0xE9, 0x95, - 0x7C, 0x67, 0xBE, 0x65, 0x77, 0xEC, 0x07, 0xC0, - 0x23, 0x05, 0x0A, 0x72, 0x48, 0x86, 0xE9, 0x9E, - 0xFC, 0x25, 0x15, 0xE7, 0xC8, 0x21, 0x65, 0xE0, - 0x1B, 0xD5, 0xD5, 0x0E, 0xD3, 0x11, 0x54, 0xBB, - 0x29, 0x78, 0xBF, 0x2A, 0x3C, 0x3B, 0xB6, 0xB1 -}; - -static const unsigned char CrrDevKey_privExp[256] = //CrrDevKey_privExp -{ - 0x8D, 0x27, 0x29, 0x6B, 0xC7, 0xA7, 0xED, 0xCD, - 0x94, 0x2D, 0x36, 0x5E, 0x86, 0xA8, 0x26, 0xE7, - 0x43, 0x9E, 0x64, 0xC8, 0xAA, 0x9A, 0x58, 0x21, - 0x07, 0xF7, 0xB3, 0xFB, 0xCF, 0x8D, 0x3E, 0x53, - 0xF0, 0x02, 0x25, 0x7B, 0x80, 0x18, 0x2E, 0x0D, - 0x84, 0x7D, 0x6C, 0xE0, 0xDA, 0xC0, 0x17, 0xA6, - 0xA5, 0x13, 0xE6, 0xFD, 0xBF, 0x98, 0xFC, 0x87, - 0x9A, 0x9E, 0x0E, 0x13, 0x87, 0x66, 0x24, 0x8D, - 0xA5, 0x6C, 0x58, 0x86, 0x10, 0x80, 0x90, 0x89, - 0xEE, 0xFD, 0x40, 0x94, 0xCB, 0x1F, 0x26, 0xAB, - 0xD1, 0xD3, 0xFF, 0xE9, 0x7B, 0x76, 0xDC, 0x65, - 0xC0, 0x15, 0xD8, 0x9B, 0xF6, 0x29, 0xE1, 0x49, - 0xE9, 0xDC, 0xBE, 0x24, 0x17, 0xFF, 0x09, 0x2C, - 0xD6, 0xC4, 0x6D, 0x50, 0x33, 0xDC, 0xA0, 0x9D, - 0x9D, 0xCC, 0xDD, 0x6E, 0x7B, 0xDF, 0x42, 0x22, - 0x4D, 0x80, 0xC7, 0xEB, 0xCB, 0xB1, 0x60, 0x2F, - 0x04, 0xEE, 0x04, 0x0E, 0x4C, 0x76, 0x49, 0x55, - 0x92, 0xA5, 0xC1, 0x13, 0x60, 0x0A, 0x80, 0x15, - 0x3D, 0x1C, 0xC6, 0x46, 0x57, 0x2E, 0x7C, 0xB0, - 0x3D, 0x87, 0x06, 0x87, 0xFD, 0x31, 0xF8, 0xE7, - 0x14, 0x97, 0x2A, 0x57, 0x40, 0xAC, 0x94, 0x61, - 0xCD, 0xCF, 0xDE, 0x8C, 0x40, 0x46, 0x95, 0xA0, - 0xD6, 0xF9, 0x2C, 0x08, 0x9B, 0x12, 0xBF, 0xF1, - 0x88, 0x9C, 0x5D, 0x40, 0x32, 0x6D, 0x9D, 0x99, - 0xA4, 0x80, 0xA6, 0xC2, 0x45, 0x5A, 0xD3, 0x22, - 0xFE, 0xFA, 0x17, 0x54, 0x11, 0xEA, 0x41, 0xB4, - 0xBD, 0x68, 0x1E, 0xDD, 0x3F, 0xE5, 0x92, 0xCB, - 0x9E, 0xF8, 0xC0, 0x0A, 0x8B, 0xF5, 0x89, 0xA4, - 0x03, 0x68, 0xF8, 0xF8, 0x99, 0x7C, 0xFE, 0xAD, - 0x32, 0xDD, 0x5C, 0xB4, 0x06, 0x29, 0xDA, 0x96, - 0x8B, 0xBA, 0xCB, 0x15, 0xDE, 0x38, 0x0D, 0xCA, - 0xF7, 0x01, 0x65, 0xF6, 0x2D, 0x36, 0x6E, 0x71 -}; - -static const unsigned char CrrDevKey_pubMod[256] = //CrrDevKey_pubMod -{ - 0xE2, 0xAD, 0xA6, 0xEA, 0xCA, 0xA3, 0xE8, 0xCC, - 0xA9, 0x70, 0x1D, 0x2E, 0x23, 0x4B, 0xC6, 0x55, - 0xCE, 0x13, 0xD9, 0xA7, 0x58, 0xB4, 0xC7, 0x73, - 0x96, 0x1D, 0xE8, 0xC3, 0x09, 0x4D, 0x9B, 0xC3, - 0xEB, 0x69, 0xA2, 0x37, 0x83, 0x5D, 0xD8, 0x37, - 0x04, 0x72, 0x7A, 0x4F, 0xEA, 0x53, 0x98, 0x9D, - 0x0E, 0x01, 0x34, 0x70, 0x9A, 0x82, 0x06, 0xE7, - 0x6A, 0xC9, 0xF8, 0x0E, 0x49, 0x5A, 0xA4, 0xE7, - 0x0E, 0xFA, 0xD4, 0xAB, 0x3B, 0xC5, 0xD7, 0xF1, - 0xA4, 0xFC, 0x92, 0x7F, 0xD0, 0xF3, 0xCD, 0xD5, - 0xB9, 0x2A, 0x1A, 0x41, 0x62, 0xB3, 0x7B, 0x3E, - 0x1E, 0x35, 0x46, 0x41, 0x8E, 0xB2, 0x53, 0x1A, - 0x60, 0xF8, 0xC2, 0xD1, 0x94, 0xB3, 0x9D, 0x76, - 0x9F, 0x1D, 0x98, 0xAC, 0xF0, 0xCF, 0xE3, 0xA9, - 0x05, 0x85, 0xF2, 0xBF, 0x55, 0x76, 0x1B, 0x89, - 0x1C, 0xC3, 0x19, 0x2E, 0xEE, 0x94, 0xBE, 0x75, - 0x0F, 0xA3, 0x76, 0x8B, 0x24, 0x24, 0x97, 0xFA, - 0xC0, 0x53, 0x24, 0xF5, 0x85, 0x02, 0x19, 0x9D, - 0xC5, 0x11, 0x2E, 0x6B, 0xA3, 0x26, 0xFE, 0xF7, - 0x55, 0xD4, 0x23, 0x0A, 0x73, 0x3F, 0x37, 0x53, - 0xEA, 0xC2, 0xB7, 0xC1, 0xC9, 0xD8, 0xF3, 0x2F, - 0x78, 0x76, 0x4A, 0xA0, 0x69, 0x60, 0x91, 0xC2, - 0x7D, 0x11, 0x74, 0xEF, 0x96, 0xD9, 0x74, 0x53, - 0xB1, 0x1C, 0xB0, 0xC4, 0x32, 0x16, 0x82, 0x3B, - 0xAF, 0x61, 0xB2, 0xDE, 0x38, 0x87, 0x3E, 0x37, - 0x4B, 0xA3, 0x95, 0x88, 0x8E, 0xE0, 0x27, 0x9A, - 0x1F, 0x7D, 0xB8, 0x23, 0xC3, 0x63, 0xE8, 0x68, - 0x51, 0xD9, 0x8C, 0x4C, 0xC2, 0x59, 0x86, 0x49, - 0xF7, 0x46, 0x9E, 0x3C, 0xD7, 0x9F, 0x89, 0x23, - 0xB4, 0x73, 0x35, 0x2F, 0x18, 0x23, 0x76, 0xA3, - 0x9F, 0x40, 0x0B, 0x76, 0x90, 0x85, 0xC8, 0x89, - 0xDA, 0x65, 0xE7, 0x6E, 0xEF, 0x2E, 0xF5, 0x67 -}; - -//Certificates -static const unsigned char ca4_dpki_cert[0x400] = -{ - 0x00, 0x01, 0x00, 0x03, 0x19, 0x49, 0x42, 0x9D, - 0x1E, 0x58, 0xA6, 0x2E, 0x7E, 0x8B, 0x56, 0xD1, - 0xB7, 0x6A, 0xE3, 0x02, 0xFD, 0x8B, 0x97, 0x49, - 0x1F, 0x77, 0x87, 0x45, 0xF7, 0x53, 0x88, 0xC4, - 0xDD, 0x0B, 0xEB, 0x1D, 0xF1, 0x22, 0xFB, 0x96, - 0x42, 0x15, 0x14, 0x97, 0x76, 0x4A, 0x53, 0xCF, - 0x78, 0x15, 0x18, 0x45, 0xE4, 0x2C, 0xA8, 0xFD, - 0xE4, 0x86, 0xFD, 0x2A, 0x4F, 0x53, 0xF8, 0xA1, - 0xBA, 0x00, 0x8A, 0x74, 0x85, 0xFF, 0x73, 0xB3, - 0xBF, 0x7E, 0x3C, 0x98, 0x07, 0x29, 0xD0, 0x65, - 0x6B, 0x69, 0x32, 0x19, 0xAD, 0xE8, 0x35, 0xEB, - 0x5F, 0xFF, 0xFC, 0xCB, 0x7C, 0xBB, 0x5E, 0x30, - 0x7F, 0xE0, 0x68, 0x8B, 0x88, 0x8E, 0xF2, 0xD2, - 0x05, 0x3F, 0xB7, 0xE7, 0x91, 0xE9, 0x85, 0xFD, - 0x15, 0xEF, 0x10, 0xD7, 0x9C, 0xCA, 0x88, 0xD6, - 0xBB, 0x15, 0xE8, 0xE4, 0x71, 0x4A, 0x98, 0xEE, - 0x09, 0xBF, 0x7B, 0x8A, 0xF0, 0x53, 0x23, 0x2B, - 0x64, 0x50, 0xE6, 0xD5, 0xFD, 0xFF, 0xC2, 0x0A, - 0x6D, 0x1E, 0xA6, 0xA2, 0x38, 0x12, 0xE1, 0x01, - 0x45, 0x25, 0xD5, 0x6D, 0x40, 0x82, 0x70, 0x3B, - 0x86, 0x98, 0x69, 0x59, 0xA7, 0x3C, 0xD1, 0xA1, - 0x43, 0x64, 0xD2, 0xC2, 0xDA, 0xEA, 0x96, 0xB0, - 0x95, 0xF7, 0x6C, 0x46, 0xE4, 0xFF, 0x41, 0x55, - 0x46, 0x5E, 0x70, 0xEF, 0x1E, 0xD3, 0x10, 0x53, - 0xD9, 0x70, 0x11, 0xE0, 0x10, 0xCC, 0x93, 0xE7, - 0x91, 0x40, 0x13, 0x68, 0x7F, 0xA3, 0xA8, 0x02, - 0x99, 0x6D, 0x1E, 0x55, 0x7B, 0x1C, 0xCC, 0x7A, - 0x7E, 0x8F, 0x58, 0x65, 0xC1, 0x74, 0x2E, 0x28, - 0xE2, 0x6D, 0xEF, 0x38, 0xA9, 0x3A, 0xB5, 0xD8, - 0x2D, 0x43, 0xEC, 0xCC, 0xBF, 0x0B, 0xEF, 0x22, - 0xE1, 0xFD, 0x57, 0xE2, 0x86, 0x43, 0x33, 0x58, - 0x2F, 0xED, 0xEA, 0xBC, 0x01, 0x2F, 0x98, 0x6D, - 0xDF, 0xC3, 0xE9, 0x44, 0x79, 0x73, 0x47, 0x03, - 0x08, 0x45, 0x5B, 0xDC, 0x57, 0xAA, 0x17, 0x0B, - 0x84, 0x42, 0x7F, 0x73, 0xA2, 0x9B, 0x48, 0xF6, - 0xDA, 0x13, 0x5F, 0x66, 0xC7, 0x45, 0xC1, 0x42, - 0xA8, 0x4A, 0xFB, 0x0E, 0x6A, 0x5E, 0xED, 0x85, - 0xD7, 0xB9, 0x71, 0x99, 0x36, 0xF8, 0xCE, 0x2B, - 0x62, 0x1F, 0x39, 0x5F, 0x40, 0xDC, 0x03, 0xBE, - 0xF8, 0x85, 0x4C, 0x11, 0x17, 0xFF, 0x0C, 0x12, - 0x86, 0x41, 0xCC, 0x78, 0x43, 0xB9, 0x7B, 0x43, - 0x46, 0xDB, 0x22, 0x6F, 0x60, 0x26, 0xAC, 0xB5, - 0x6C, 0x27, 0x8B, 0x8E, 0x0E, 0xA7, 0x9A, 0x2D, - 0x65, 0xEF, 0x79, 0x8E, 0x10, 0x78, 0xAD, 0x80, - 0xED, 0x4B, 0x96, 0x04, 0xD2, 0xF0, 0x8B, 0x2C, - 0xD6, 0x4A, 0x23, 0xA3, 0xDB, 0x27, 0x08, 0x33, - 0xB4, 0x02, 0xF8, 0x08, 0x51, 0xF3, 0x5B, 0xED, - 0x3E, 0xE4, 0x57, 0x7C, 0x66, 0x60, 0xFB, 0xF1, - 0x6D, 0x94, 0x13, 0xE0, 0x9C, 0x91, 0x7A, 0x49, - 0xD4, 0x2C, 0x6D, 0xA3, 0x75, 0xBC, 0x27, 0xF0, - 0x23, 0x0D, 0xB9, 0x8F, 0x89, 0x73, 0xAB, 0x02, - 0x7B, 0x52, 0x2C, 0xD5, 0x7E, 0xC0, 0x3D, 0x25, - 0xE8, 0xB3, 0xFC, 0x34, 0x94, 0xC9, 0x7F, 0xB1, - 0x08, 0xFE, 0x18, 0xC6, 0x8A, 0x43, 0x36, 0xE4, - 0x6C, 0x26, 0xB6, 0xF2, 0x80, 0xD2, 0x7E, 0x34, - 0xBE, 0x28, 0x7C, 0x3E, 0x46, 0x87, 0xBC, 0x9D, - 0x77, 0x6B, 0x76, 0xD9, 0x28, 0xD1, 0xB6, 0x35, - 0x2E, 0xC0, 0x34, 0x7D, 0x72, 0x94, 0xAA, 0x93, - 0x60, 0x26, 0x8D, 0x26, 0xF5, 0xF6, 0x52, 0x06, - 0x4A, 0xF2, 0x40, 0xD7, 0xD0, 0x0C, 0x7C, 0x5E, - 0xA3, 0xC3, 0x2D, 0xE6, 0x2D, 0x9B, 0x5C, 0x4B, - 0x4C, 0xAB, 0x6F, 0xD7, 0xBD, 0x37, 0x1D, 0x57, - 0xC2, 0x16, 0x60, 0x95, 0x91, 0x0E, 0x4A, 0xD8, - 0xE9, 0xED, 0x18, 0x1E, 0xF7, 0x61, 0x93, 0x61, - 0x53, 0x89, 0x2D, 0x77, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x6F, 0x6F, 0x74, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 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, 0x43, 0x41, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x34, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x81, 0x12, 0x2A, 0x46, - 0xC9, 0xCC, 0x2D, 0xC4, 0xDF, 0x29, 0x30, 0xE4, - 0xDF, 0x3F, 0x8C, 0x70, 0xA0, 0x78, 0x94, 0x87, - 0x75, 0xAD, 0x5E, 0x9A, 0xA6, 0x04, 0xC5, 0xB4, - 0xD8, 0xEA, 0xFF, 0x2A, 0xA1, 0xD2, 0x14, 0x67, - 0x65, 0x64, 0xEF, 0xCA, 0x28, 0xCC, 0x00, 0x15, - 0x45, 0x54, 0xA1, 0xA3, 0xEA, 0x13, 0x79, 0xE9, - 0xE6, 0xCA, 0xAC, 0xED, 0x15, 0x93, 0xFE, 0x88, - 0xD8, 0x9A, 0xC6, 0xB8, 0xAC, 0xCC, 0xAB, 0x6E, - 0x20, 0x7C, 0xEB, 0x7C, 0xCA, 0x29, 0x80, 0x9E, - 0x29, 0x80, 0x44, 0x06, 0x62, 0xB7, 0xD4, 0x38, - 0x2A, 0x15, 0xDA, 0x43, 0x08, 0x57, 0x45, 0xA9, - 0xAA, 0xE5, 0x9A, 0xA0, 0x5B, 0xDB, 0x32, 0xF6, - 0x68, 0x69, 0xA2, 0xDD, 0x42, 0x95, 0x38, 0x6C, - 0x87, 0xEC, 0xDD, 0x35, 0x08, 0xA2, 0xCF, 0x60, - 0xD0, 0x1E, 0x23, 0xEC, 0x2F, 0xE6, 0x98, 0xF4, - 0x70, 0xD6, 0x00, 0x15, 0x49, 0xA2, 0xF0, 0x67, - 0x59, 0x13, 0x1E, 0x53, 0x4C, 0x70, 0x06, 0x05, - 0x7D, 0xEF, 0x1D, 0x18, 0xA8, 0x3F, 0x0A, 0xC7, - 0x9C, 0xFE, 0x80, 0xFF, 0x5A, 0x91, 0xF2, 0xBE, - 0xD4, 0xA0, 0x83, 0x70, 0x61, 0x19, 0x0A, 0x03, - 0x29, 0x90, 0x21, 0x65, 0x40, 0x3C, 0x9A, 0x90, - 0x8F, 0xB6, 0x15, 0x73, 0x9F, 0x3C, 0xE3, 0x3B, - 0xF1, 0xBA, 0xEA, 0x16, 0xC2, 0x5B, 0xCE, 0xD7, - 0x96, 0x3F, 0xAC, 0xC9, 0xD2, 0x4D, 0x9C, 0x0A, - 0xD7, 0x6F, 0xC0, 0x20, 0xB2, 0xC4, 0xB8, 0x4C, - 0x10, 0xA7, 0x41, 0xA2, 0xCC, 0x7D, 0x9B, 0xAC, - 0x3A, 0xAC, 0xCC, 0xA3, 0x52, 0x9B, 0xAC, 0x31, - 0x6A, 0x9A, 0xA7, 0x5D, 0x2A, 0x26, 0xC7, 0xD7, - 0xD2, 0x88, 0xCB, 0xA4, 0x66, 0xC5, 0xFE, 0x5F, - 0x45, 0x4A, 0xE6, 0x79, 0x74, 0x4A, 0x90, 0xA1, - 0x57, 0x72, 0xDB, 0x3B, 0x0E, 0x47, 0xA4, 0x9A, - 0xF0, 0x31, 0xD1, 0x6D, 0xBE, 0xAB, 0x33, 0x2B, - 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static const unsigned char xs9_dpki_cert[0x300] = -{ - 0x00, 0x01, 0x00, 0x04, 0x63, 0x80, 0x5A, 0x35, - 0x1A, 0x43, 0x7B, 0xA2, 0x43, 0x19, 0xBB, 0x3A, - 0x77, 0x7B, 0x7A, 0xF3, 0x5E, 0x72, 0x4B, 0x15, - 0x0A, 0x06, 0x39, 0x6C, 0x5F, 0xEC, 0x38, 0x45, - 0xB1, 0x88, 0x76, 0x26, 0x8D, 0x5E, 0xDA, 0xE6, - 0x2F, 0x14, 0xBA, 0x02, 0xFA, 0xD6, 0xFC, 0x3B, - 0x2B, 0xBE, 0x87, 0x07, 0x63, 0x8E, 0x55, 0xBF, - 0x05, 0x5A, 0xFC, 0xFC, 0xB3, 0x47, 0x69, 0x11, - 0x89, 0xDB, 0x1C, 0xAF, 0x4B, 0x43, 0x76, 0x62, - 0x3E, 0x30, 0x89, 0x0A, 0x9D, 0x3B, 0xBB, 0x3E, - 0x50, 0xBD, 0xF7, 0xA6, 0xC0, 0xF7, 0xF8, 0xBB, - 0x0D, 0xB5, 0x6A, 0xBB, 0xC6, 0xC3, 0x50, 0xC8, - 0x88, 0xBB, 0x9D, 0xF0, 0x9B, 0xD1, 0x30, 0x64, - 0x60, 0x69, 0xDD, 0x34, 0x67, 0xA7, 0x00, 0xEB, - 0xDC, 0xF9, 0x8C, 0xB0, 0xF7, 0x93, 0x0E, 0x81, - 0xFE, 0x98, 0xD9, 0x72, 0x45, 0x8B, 0x94, 0x7E, - 0x59, 0xE2, 0xBE, 0x4E, 0x91, 0x2D, 0x75, 0xCA, - 0x1B, 0x8E, 0x2E, 0xF4, 0x6D, 0x73, 0xB1, 0x6B, - 0x35, 0xB5, 0x67, 0x0D, 0x63, 0x2D, 0x51, 0x38, - 0x53, 0x28, 0x19, 0x1D, 0x9D, 0xAE, 0x8D, 0xC6, - 0x61, 0xCC, 0xEF, 0xA4, 0xAB, 0xE2, 0xF3, 0xB0, - 0x4C, 0x7B, 0xE2, 0x71, 0xB5, 0xF9, 0x2C, 0xFA, - 0x55, 0xCD, 0x88, 0x8B, 0x72, 0xCC, 0xBE, 0x67, - 0xFA, 0xDF, 0xEF, 0x6B, 0x53, 0x3C, 0x45, 0xD8, - 0xCB, 0xDF, 0xB2, 0x76, 0x41, 0x46, 0xD6, 0xC2, - 0x6F, 0x27, 0x16, 0xC5, 0x07, 0xF3, 0xF4, 0x44, - 0x66, 0xA3, 0x15, 0xD2, 0x77, 0xF2, 0x89, 0xDA, - 0xFD, 0xD5, 0x50, 0xCF, 0xA4, 0x9B, 0xEA, 0xCA, - 0xC9, 0x7B, 0xE5, 0x46, 0x0E, 0xED, 0x9B, 0xFB, - 0x04, 0xA9, 0xDA, 0x19, 0x58, 0xD9, 0x2A, 0x20, - 0x8A, 0xAC, 0xC1, 0xF4, 0x8E, 0xE9, 0x14, 0xD8, - 0x8A, 0xD7, 0x41, 0xD5, 0x5B, 0x9B, 0x64, 0x22, - 0xD8, 0xAF, 0xAE, 0xC7, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x6F, 0x6F, 0x74, 0x2D, 0x43, 0x41, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x34, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 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, 0x58, 0x53, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x39, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0xA3, 0x47, 0xA4, - 0xC0, 0x84, 0x4C, 0xEB, 0x7E, 0xB0, 0xCF, 0xF0, - 0xAE, 0xB7, 0x77, 0x69, 0x85, 0x93, 0xE4, 0x99, - 0x5A, 0x95, 0x4E, 0x58, 0x17, 0x38, 0xCE, 0xD6, - 0x81, 0xB0, 0xBD, 0x77, 0x09, 0xE7, 0xF8, 0x9A, - 0xDF, 0xAD, 0x05, 0x48, 0x83, 0xF6, 0xC3, 0xFD, - 0xDF, 0x7B, 0x83, 0xE0, 0x0C, 0x26, 0x81, 0x54, - 0x43, 0x29, 0xEA, 0x82, 0x6C, 0x89, 0xF0, 0xA6, - 0x74, 0x42, 0x86, 0x4D, 0x32, 0x60, 0x32, 0x7D, - 0xA7, 0x7A, 0x13, 0x40, 0x66, 0x59, 0xDA, 0x3E, - 0x41, 0x6B, 0x27, 0x94, 0x03, 0x4F, 0xAA, 0x22, - 0x9D, 0xD5, 0x54, 0x52, 0xDB, 0x27, 0x0A, 0x6A, - 0xA2, 0x3D, 0x19, 0xB1, 0x66, 0x1B, 0x19, 0x7D, - 0xAB, 0xC7, 0x0E, 0x88, 0x17, 0x91, 0xA1, 0x2A, - 0xB4, 0x3C, 0x6C, 0xCB, 0xF5, 0xAA, 0x7C, 0x3A, - 0xDD, 0x36, 0xFB, 0x35, 0x71, 0x7B, 0x20, 0x01, - 0x59, 0x00, 0xD6, 0xF6, 0x90, 0x39, 0x35, 0x41, - 0x31, 0xF8, 0xC1, 0xC0, 0x57, 0x3A, 0x35, 0x18, - 0x58, 0x90, 0xB1, 0xAD, 0x9A, 0x0E, 0xEC, 0xE0, - 0xF4, 0x7A, 0x7D, 0xA5, 0x27, 0x48, 0xC9, 0x72, - 0xAB, 0x0D, 0x08, 0x7B, 0x62, 0x35, 0x40, 0x91, - 0x14, 0x2B, 0xB1, 0x1D, 0x1A, 0xFA, 0xF9, 0xCD, - 0x5C, 0x17, 0x13, 0x53, 0x52, 0x71, 0xCA, 0xE2, - 0x2A, 0x78, 0xB1, 0x7F, 0x4A, 0xCD, 0x59, 0xD8, - 0xBA, 0x1D, 0x7D, 0x70, 0x5F, 0x78, 0x1B, 0x9F, - 0x9D, 0x37, 0x18, 0x8E, 0xD7, 0xCD, 0x0D, 0x49, - 0x57, 0x74, 0x69, 0x88, 0x3A, 0x6B, 0x8E, 0x4E, - 0x1B, 0x85, 0xDD, 0xBE, 0x39, 0x45, 0x05, 0x89, - 0x56, 0x12, 0x97, 0x59, 0x9A, 0x09, 0xA4, 0xC8, - 0x2D, 0x2F, 0xF5, 0xCF, 0xB4, 0x73, 0x70, 0xDB, - 0x58, 0x1E, 0xB2, 0x4E, 0x77, 0x6F, 0xA4, 0x7E, - 0x62, 0xDF, 0xB7, 0x05, 0xE8, 0x80, 0x42, 0x5C, - 0xB8, 0x78, 0x87, 0x97, 0x7F, 0x66, 0x2C, 0x5F, - 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static const unsigned char cpA_dpki_cert[0x300] = -{ - 0x00, 0x01, 0x00, 0x04, 0x50, 0x05, 0xD7, 0x5E, - 0x6D, 0xDE, 0xB8, 0x78, 0x3C, 0x81, 0xE9, 0xEF, - 0x0D, 0x17, 0xCD, 0x58, 0xF5, 0x94, 0x26, 0xA3, - 0xFD, 0x6F, 0x69, 0x90, 0xE8, 0xF8, 0x32, 0x87, - 0x12, 0x2E, 0xC2, 0x5C, 0xA1, 0x4B, 0x99, 0x24, - 0x23, 0x37, 0xBA, 0x91, 0xA7, 0x5B, 0x0F, 0x7C, - 0x59, 0xFB, 0xF7, 0xD1, 0x89, 0x27, 0x22, 0xC4, - 0xE6, 0xAF, 0xC7, 0xDE, 0xC7, 0x4A, 0x6E, 0x00, - 0x7F, 0x43, 0x4A, 0x88, 0x8A, 0x82, 0x15, 0xE8, - 0xDF, 0x2B, 0x52, 0xED, 0x42, 0x00, 0xBC, 0x69, - 0xB4, 0xDA, 0x7F, 0xEB, 0x74, 0x6C, 0x7A, 0x2D, - 0x96, 0x56, 0x5B, 0x45, 0x59, 0x7B, 0x8F, 0xAE, - 0xB1, 0x6B, 0xDC, 0x76, 0xC1, 0xC8, 0x0C, 0x47, - 0xF5, 0x0D, 0xA9, 0xC3, 0xE1, 0xFE, 0x28, 0x50, - 0x1C, 0x26, 0xA2, 0xD1, 0x54, 0x4B, 0xD1, 0x60, - 0x4A, 0x9E, 0x8F, 0x32, 0x2A, 0xEF, 0x31, 0x5F, - 0xEA, 0x48, 0x22, 0x67, 0x22, 0xB7, 0xCB, 0x37, - 0x2F, 0xF3, 0x5F, 0x5E, 0x61, 0x6A, 0x53, 0x44, - 0xA5, 0x85, 0xE5, 0xA0, 0x8A, 0x2E, 0x17, 0x77, - 0x57, 0x2B, 0x7A, 0x9A, 0xF7, 0xD2, 0xD8, 0xC4, - 0x9C, 0xD0, 0xA0, 0x54, 0xBF, 0x8A, 0x9D, 0xB4, - 0x9F, 0xC6, 0x60, 0x61, 0x7C, 0xB8, 0x35, 0x4E, - 0x25, 0x7F, 0x68, 0x68, 0x2F, 0x94, 0xB3, 0xCC, - 0x53, 0x8C, 0x42, 0x6F, 0x88, 0xC5, 0x48, 0x5C, - 0xBE, 0xC1, 0xD0, 0x48, 0x04, 0x74, 0x96, 0x5A, - 0x7E, 0x82, 0x59, 0xAA, 0x9F, 0xB6, 0x61, 0x46, - 0xCE, 0x59, 0x21, 0xC6, 0xF0, 0xC1, 0x75, 0x1F, - 0x21, 0x91, 0x7F, 0x24, 0x96, 0xCB, 0x0C, 0x70, - 0x15, 0x7A, 0xB7, 0xBB, 0x3A, 0x9F, 0x57, 0x56, - 0x56, 0x5C, 0x38, 0x92, 0x2E, 0xFD, 0xC8, 0xF1, - 0x70, 0xB9, 0xAE, 0xA1, 0xAE, 0x36, 0xF5, 0x5E, - 0x35, 0x26, 0x63, 0x0A, 0xBA, 0xB2, 0x05, 0x0F, - 0xF0, 0x0C, 0xDC, 0xBB, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x6F, 0x6F, 0x74, 0x2D, 0x43, 0x41, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x34, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 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, 0x43, 0x50, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x61, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0xA3, 0x4D, 0x5B, - 0xAA, 0x7F, 0x93, 0x80, 0x28, 0x9B, 0xE8, 0x98, - 0x63, 0x10, 0x7A, 0xE1, 0x0C, 0x59, 0x2C, 0x2F, - 0x7C, 0xFF, 0xBD, 0xAA, 0xDD, 0x74, 0xF4, 0xA2, - 0xFB, 0xAC, 0xD7, 0x6F, 0x00, 0x93, 0x42, 0x06, - 0x34, 0x71, 0x56, 0xD8, 0x40, 0x49, 0x72, 0x9F, - 0x3E, 0x24, 0xFA, 0x5E, 0x19, 0xD1, 0x5B, 0x63, - 0x5C, 0xD2, 0xEF, 0x09, 0xDE, 0x32, 0xEE, 0x6B, - 0x6F, 0xC8, 0xFA, 0x32, 0x8E, 0x2E, 0x96, 0xB9, - 0x94, 0x41, 0x04, 0x7D, 0x07, 0x62, 0x95, 0xDA, - 0x0D, 0x91, 0xD8, 0x09, 0x35, 0xD0, 0xDE, 0x8E, - 0x6B, 0xC6, 0xAB, 0x14, 0x27, 0x01, 0x9C, 0xFE, - 0x49, 0x96, 0xFC, 0x9B, 0x54, 0x79, 0x4D, 0xEB, - 0xD7, 0xC6, 0x66, 0x73, 0xA6, 0xDD, 0x3A, 0x77, - 0x65, 0x47, 0x94, 0xEC, 0x1C, 0x87, 0xAA, 0x46, - 0xD9, 0x78, 0xA9, 0x7D, 0xDB, 0x11, 0x22, 0x6E, - 0xD4, 0x12, 0xC2, 0x78, 0x4B, 0x21, 0x83, 0x92, - 0xC7, 0x10, 0xC7, 0x74, 0x19, 0xFF, 0xAA, 0xF6, - 0x0B, 0x75, 0xD8, 0x23, 0xDD, 0x33, 0xC3, 0xA1, - 0x5B, 0xA7, 0x2D, 0x30, 0xA5, 0xA4, 0xD8, 0xF8, - 0x0F, 0xD6, 0x73, 0xFD, 0x26, 0xCB, 0x29, 0xA6, - 0xEF, 0x50, 0x39, 0xE2, 0x5F, 0x59, 0x61, 0x84, - 0x6B, 0xDA, 0x2E, 0xC7, 0xCB, 0xE4, 0x38, 0x4B, - 0x28, 0xFB, 0x0D, 0xD5, 0x8E, 0x7C, 0xAA, 0x7D, - 0x4B, 0x37, 0x3A, 0xD7, 0x81, 0xDD, 0x73, 0xE3, - 0x09, 0x93, 0xBD, 0xBD, 0x7E, 0x08, 0x55, 0x4A, - 0x8C, 0xA5, 0xC9, 0x84, 0x2D, 0x71, 0x01, 0xA2, - 0x2A, 0x01, 0xB0, 0x15, 0xFB, 0x30, 0x78, 0xB9, - 0x13, 0xF4, 0xC7, 0x3F, 0xB5, 0xA6, 0xF1, 0xA2, - 0x5E, 0x22, 0xB0, 0x02, 0xB6, 0xE0, 0x09, 0x54, - 0x7F, 0x0F, 0xBD, 0xF0, 0xFE, 0xA5, 0x50, 0x1D, - 0x93, 0x15, 0xF9, 0x3D, 0x83, 0x0F, 0x0F, 0x0E, - 0x3D, 0xE2, 0x3D, 0x96, 0xE7, 0x09, 0xD9, 0x77, - 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -#endif \ No newline at end of file diff --git a/keys_retail.h b/keys_retail.h deleted file mode 100644 index 1b67784..0000000 --- a/keys_retail.h +++ /dev/null @@ -1,553 +0,0 @@ -#ifndef _KEYS_RETAIL_H_ -#define _KEYS_RETAIL_H_ - -#ifndef PUBLIC_BUILD -// AES KEYS -static const unsigned char common_key_prod_keyY0[16] = -{ - 0xD0, 0x7B, 0x33, 0x7F, 0x9C, 0xA4, 0x38, 0x59, - 0x32, 0xA2, 0xE2, 0x57, 0x23, 0x23, 0x2E, 0xB9 -}; - -static const unsigned char common_key_prod_keyY1[16] = -{ - 0x0C, 0x76, 0x72, 0x30, 0xF0, 0x99, 0x8F, 0x1C, - 0x46, 0x82, 0x82, 0x02, 0xFA, 0xAC, 0xBE, 0x4C -}; - -static const unsigned char common_key_prod_keyY2[16] = -{ - 0xC4, 0x75, 0xCB, 0x3A, 0xB8, 0xC7, 0x88, 0xBB, - 0x57, 0x5E, 0x12, 0xA1, 0x09, 0x07, 0xB8, 0xA4 -}; - -static const unsigned char common_key_prod_keyY3[16] = -{ - 0xE4, 0x86, 0xEE, 0xE3, 0xD0, 0xC0, 0x9C, 0x90, - 0x2F, 0x66, 0x86, 0xD4, 0xC0, 0x6F, 0x64, 0x9F -}; - -static const unsigned char common_key_prod_keyY4[16] = -{ - 0xED, 0x31, 0xBA, 0x9C, 0x04, 0xB0, 0x67, 0x50, - 0x6C, 0x44, 0x97, 0xA3, 0x5B, 0x78, 0x04, 0xFC -}; - -static const unsigned char common_key_prod_keyY5[16] = -{ - 0x5E, 0x66, 0x99, 0x8A, 0xB4, 0xE8, 0x93, 0x16, - 0x06, 0x85, 0x0F, 0xD7, 0xA1, 0x6D, 0xD7, 0x55 -}; - -// RSA KEYS -static const unsigned char retail_cert_root_rsa_pubk[0x200] = -{ - 0xF8, 0x24, 0x6C, 0x58, 0xBA, 0xE7, 0x50, 0x03, - 0x01, 0xFB, 0xB7, 0xC2, 0xEB, 0xE0, 0x01, 0x05, - 0x71, 0xDA, 0x92, 0x23, 0x78, 0xF0, 0x51, 0x4E, - 0xC0, 0x03, 0x1D, 0xD0, 0xD2, 0x1E, 0xD3, 0xD0, - 0x7E, 0xFC, 0x85, 0x20, 0x69, 0xB5, 0xDE, 0x9B, - 0xB9, 0x51, 0xA8, 0xBC, 0x90, 0xA2, 0x44, 0x92, - 0x6D, 0x37, 0x92, 0x95, 0xAE, 0x94, 0x36, 0xAA, - 0xA6, 0xA3, 0x02, 0x51, 0x0C, 0x7B, 0x1D, 0xED, - 0xD5, 0xFB, 0x20, 0x86, 0x9D, 0x7F, 0x30, 0x16, - 0xF6, 0xBE, 0x65, 0xD3, 0x83, 0xA1, 0x6D, 0xB3, - 0x32, 0x1B, 0x95, 0x35, 0x18, 0x90, 0xB1, 0x70, - 0x02, 0x93, 0x7E, 0xE1, 0x93, 0xF5, 0x7E, 0x99, - 0xA2, 0x47, 0x4E, 0x9D, 0x38, 0x24, 0xC7, 0xAE, - 0xE3, 0x85, 0x41, 0xF5, 0x67, 0xE7, 0x51, 0x8C, - 0x7A, 0x0E, 0x38, 0xE7, 0xEB, 0xAF, 0x41, 0x19, - 0x1B, 0xCF, 0xF1, 0x7B, 0x42, 0xA6, 0xB4, 0xED, - 0xE6, 0xCE, 0x8D, 0xE7, 0x31, 0x8F, 0x7F, 0x52, - 0x04, 0xB3, 0x99, 0x0E, 0x22, 0x67, 0x45, 0xAF, - 0xD4, 0x85, 0xB2, 0x44, 0x93, 0x00, 0x8B, 0x08, - 0xC7, 0xF6, 0xB7, 0xE5, 0x6B, 0x02, 0xB3, 0xE8, - 0xFE, 0x0C, 0x9D, 0x85, 0x9C, 0xB8, 0xB6, 0x82, - 0x23, 0xB8, 0xAB, 0x27, 0xEE, 0x5F, 0x65, 0x38, - 0x07, 0x8B, 0x2D, 0xB9, 0x1E, 0x2A, 0x15, 0x3E, - 0x85, 0x81, 0x80, 0x72, 0xA2, 0x3B, 0x6D, 0xD9, - 0x32, 0x81, 0x05, 0x4F, 0x6F, 0xB0, 0xF6, 0xF5, - 0xAD, 0x28, 0x3E, 0xCA, 0x0B, 0x7A, 0xF3, 0x54, - 0x55, 0xE0, 0x3D, 0xA7, 0xB6, 0x83, 0x26, 0xF3, - 0xEC, 0x83, 0x4A, 0xF3, 0x14, 0x04, 0x8A, 0xC6, - 0xDF, 0x20, 0xD2, 0x85, 0x08, 0x67, 0x3C, 0xAB, - 0x62, 0xA2, 0xC7, 0xBC, 0x13, 0x1A, 0x53, 0x3E, - 0x0B, 0x66, 0x80, 0x6B, 0x1C, 0x30, 0x66, 0x4B, - 0x37, 0x23, 0x31, 0xBD, 0xC4, 0xB0, 0xCA, 0xD8, - 0xD1, 0x1E, 0xE7, 0xBB, 0xD9, 0x28, 0x55, 0x48, - 0xAA, 0xEC, 0x1F, 0x66, 0xE8, 0x21, 0xB3, 0xC8, - 0xA0, 0x47, 0x69, 0x00, 0xC5, 0xE6, 0x88, 0xE8, - 0x0C, 0xCE, 0x3C, 0x61, 0xD6, 0x9C, 0xBB, 0xA1, - 0x37, 0xC6, 0x60, 0x4F, 0x7A, 0x72, 0xDD, 0x8C, - 0x7B, 0x3E, 0x3D, 0x51, 0x29, 0x0D, 0xAA, 0x6A, - 0x59, 0x7B, 0x08, 0x1F, 0x9D, 0x36, 0x33, 0xA3, - 0x46, 0x7A, 0x35, 0x61, 0x09, 0xAC, 0xA7, 0xDD, - 0x7D, 0x2E, 0x2F, 0xB2, 0xC1, 0xAE, 0xB8, 0xE2, - 0x0F, 0x48, 0x92, 0xD8, 0xB9, 0xF8, 0xB4, 0x6F, - 0x4E, 0x3C, 0x11, 0xF4, 0xF4, 0x7D, 0x8B, 0x75, - 0x7D, 0xFE, 0xFE, 0xA3, 0x89, 0x9C, 0x33, 0x59, - 0x5C, 0x5E, 0xFD, 0xEB, 0xCB, 0xAB, 0xE8, 0x41, - 0x3E, 0x3A, 0x9A, 0x80, 0x3C, 0x69, 0x35, 0x6E, - 0xB2, 0xB2, 0xAD, 0x5C, 0xC4, 0xC8, 0x58, 0x45, - 0x5E, 0xF5, 0xF7, 0xB3, 0x06, 0x44, 0xB4, 0x7C, - 0x64, 0x06, 0x8C, 0xDF, 0x80, 0x9F, 0x76, 0x02, - 0x5A, 0x2D, 0xB4, 0x46, 0xE0, 0x3D, 0x7C, 0xF6, - 0x2F, 0x34, 0xE7, 0x02, 0x45, 0x7B, 0x02, 0xA4, - 0xCF, 0x5D, 0x9D, 0xD5, 0x3C, 0xA5, 0x3A, 0x7C, - 0xA6, 0x29, 0x78, 0x8C, 0x67, 0xCA, 0x08, 0xBF, - 0xEC, 0xCA, 0x43, 0xA9, 0x57, 0xAD, 0x16, 0xC9, - 0x4E, 0x1C, 0xD8, 0x75, 0xCA, 0x10, 0x7D, 0xCE, - 0x7E, 0x01, 0x18, 0xF0, 0xDF, 0x6B, 0xFE, 0xE5, - 0x1D, 0xDB, 0xD9, 0x91, 0xC2, 0x6E, 0x60, 0xCD, - 0x48, 0x58, 0xAA, 0x59, 0x2C, 0x82, 0x00, 0x75, - 0xF2, 0x9F, 0x52, 0x6C, 0x91, 0x7C, 0x6F, 0xE5, - 0x40, 0x3E, 0xA7, 0xD4, 0xA5, 0x0C, 0xEC, 0x3B, - 0x73, 0x84, 0xDE, 0x88, 0x6E, 0x82, 0xD2, 0xEB, - 0x4D, 0x4E, 0x42, 0xB5, 0xF2, 0xB1, 0x49, 0xA8, - 0x1E, 0xA7, 0xCE, 0x71, 0x44, 0xDC, 0x29, 0x94, - 0xCF, 0xC4, 0x4E, 0x1F, 0x91, 0xCB, 0xD4, 0x95 -}; - -static const unsigned char RetailAccessDesc_pubMod[0x100] = -{ - 0xB1, 0xE3, 0xE3, 0x5F, 0x01, 0x39, 0x80, 0xD1, - 0x56, 0x78, 0x9D, 0xB7, 0x06, 0xF7, 0x1D, 0xBF, - 0x3E, 0x22, 0x76, 0xED, 0xF9, 0x5D, 0xA2, 0x36, - 0xB6, 0x30, 0x61, 0x05, 0x96, 0xD3, 0x00, 0xB9, - 0xED, 0xF1, 0xD7, 0xE0, 0x1D, 0xA0, 0x4F, 0xB7, - 0xCF, 0x5A, 0x19, 0x87, 0x75, 0x49, 0x88, 0x40, - 0xED, 0xE3, 0x6F, 0x7C, 0x90, 0x4A, 0x64, 0x45, - 0x98, 0xD7, 0x04, 0xB9, 0x5A, 0x6B, 0x45, 0xAA, - 0x7E, 0x94, 0xC0, 0xB3, 0xB7, 0xDB, 0x7B, 0x66, - 0x59, 0x20, 0xB7, 0x08, 0xE2, 0xF3, 0x83, 0xA3, - 0x7F, 0xE3, 0x20, 0x21, 0xA0, 0xEB, 0xB7, 0x28, - 0x0F, 0xF3, 0x2B, 0x15, 0xA4, 0xC9, 0xD0, 0xAB, - 0x89, 0x39, 0x99, 0x7E, 0x76, 0x5F, 0x9E, 0x4D, - 0x1E, 0x01, 0x22, 0x8D, 0x74, 0xA6, 0xEB, 0x9A, - 0xA3, 0x9D, 0x45, 0xE5, 0x10, 0x61, 0x6E, 0x20, - 0xFD, 0x23, 0x75, 0xC0, 0xC5, 0x05, 0x03, 0xC5, - 0x4C, 0x02, 0x4F, 0x54, 0x4B, 0x57, 0x08, 0xB4, - 0x46, 0xC3, 0x2C, 0xF1, 0xF9, 0x52, 0x6C, 0xCD, - 0x14, 0x55, 0xA8, 0x55, 0x92, 0x6D, 0xE2, 0x4A, - 0x41, 0x46, 0xEB, 0x08, 0xC5, 0xF3, 0xB4, 0x8D, - 0x0D, 0x5E, 0x21, 0xEA, 0xAF, 0x4D, 0x27, 0x4D, - 0xDE, 0x77, 0x93, 0x97, 0xE2, 0xC7, 0x6B, 0x66, - 0x1F, 0xDB, 0x2D, 0x6E, 0xA9, 0x5F, 0x61, 0x14, - 0x17, 0x7B, 0x2B, 0x66, 0x5A, 0xB5, 0x01, 0x89, - 0xF2, 0x23, 0x75, 0x25, 0x25, 0x9C, 0x86, 0x9A, - 0x89, 0xFF, 0x64, 0x1D, 0x5B, 0xCE, 0xD7, 0x7E, - 0x3F, 0x2D, 0xA8, 0xDA, 0xB5, 0x5A, 0xC5, 0x5F, - 0x59, 0x20, 0xB0, 0xED, 0x1C, 0x91, 0xFF, 0xA3, - 0x27, 0xB8, 0x8E, 0xCF, 0x82, 0x15, 0xE5, 0x49, - 0xEF, 0xE4, 0x58, 0xE1, 0x5F, 0x8F, 0x53, 0xB9, - 0x33, 0x2A, 0x56, 0x24, 0xAA, 0xA1, 0xD3, 0x6E, - 0x47, 0x1A, 0x63, 0x44, 0x19, 0xB3, 0x8E, 0xA5 -}; - -static const unsigned char RetailNcsdCfa_pubMod[0x100] = -{ - 0xFB, 0xDE, 0xB8, 0x2B, 0x40, 0x93, 0x0F, 0xF6, - 0xB1, 0x9A, 0x08, 0x06, 0x1B, 0x86, 0xFE, 0xD0, - 0xDF, 0x10, 0x79, 0x17, 0x3D, 0x8C, 0xE2, 0x7A, - 0xCE, 0x8F, 0x23, 0x45, 0xB9, 0x0A, 0x6D, 0xED, - 0x30, 0x0E, 0xC1, 0xA8, 0x92, 0xC4, 0xBD, 0x1A, - 0xCE, 0xA7, 0xAC, 0x77, 0xAA, 0x47, 0xE5, 0x20, - 0x4A, 0x44, 0x91, 0xDF, 0x1C, 0xFE, 0x86, 0x28, - 0x12, 0x2D, 0x66, 0xDF, 0xBE, 0xAD, 0x96, 0x61, - 0xED, 0xF2, 0xF7, 0x41, 0x7B, 0x57, 0x88, 0x6B, - 0x24, 0x1E, 0x7D, 0xEC, 0xBE, 0x98, 0x65, 0x65, - 0x36, 0x65, 0x99, 0xA9, 0xFE, 0x24, 0x67, 0x85, - 0x99, 0xEE, 0x2A, 0xAE, 0xEE, 0xB1, 0x81, 0x1A, - 0x22, 0xE3, 0x6D, 0x75, 0x6E, 0x21, 0xBC, 0xEF, - 0x11, 0x5C, 0x61, 0xAF, 0x0C, 0x30, 0x00, 0xB6, - 0xA2, 0x23, 0xED, 0xFE, 0x70, 0x15, 0xDA, 0x52, - 0xE1, 0xE6, 0x2D, 0xCE, 0x34, 0xE8, 0xAA, 0x4C, - 0xF1, 0xD6, 0x67, 0x56, 0x57, 0xD3, 0xDB, 0xC0, - 0x90, 0x49, 0x6F, 0x45, 0x73, 0x93, 0x4E, 0x30, - 0x30, 0x70, 0xF5, 0xC9, 0x8F, 0x31, 0x25, 0xF2, - 0xC2, 0xE7, 0x33, 0x7F, 0x4E, 0xB6, 0xF5, 0x2A, - 0xDF, 0x20, 0x00, 0xE5, 0x79, 0xB2, 0xD0, 0xF9, - 0x17, 0xF7, 0x7E, 0x16, 0x90, 0x40, 0x00, 0x57, - 0x91, 0x44, 0x78, 0xEF, 0x1C, 0xE0, 0x85, 0x09, - 0xDA, 0xF4, 0x14, 0x7E, 0x4B, 0xD7, 0x35, 0xD6, - 0x87, 0x54, 0x8F, 0x2A, 0xB5, 0xA7, 0x6F, 0x50, - 0xD0, 0xF7, 0xD1, 0xF1, 0x19, 0xC9, 0xAC, 0x22, - 0x7E, 0x05, 0x11, 0xF5, 0xF2, 0x6D, 0xEE, 0x92, - 0x27, 0x57, 0x5F, 0xE5, 0x15, 0x0D, 0x27, 0x68, - 0xBF, 0x52, 0x65, 0x74, 0x73, 0xA6, 0x58, 0x6D, - 0x79, 0x18, 0xAC, 0x31, 0xDD, 0xDD, 0x80, 0x8B, - 0x75, 0x24, 0xE1, 0x17, 0xE1, 0x95, 0x25, 0x16, - 0x29, 0xAB, 0x69, 0x69, 0xC8, 0x28, 0xEE, 0x5D -}; - -static const unsigned char retail_firm_pubk[0x100] = -{ - 0xDE, 0xCF, 0xB6, 0xFC, 0x3D, 0x33, 0xE9, 0x55, - 0xFD, 0xAC, 0x90, 0xE8, 0x88, 0x17, 0xB0, 0x03, - 0xA1, 0x6B, 0x9A, 0xAB, 0x72, 0x70, 0x79, 0x32, - 0xA2, 0xA0, 0x8C, 0xBB, 0x33, 0x6F, 0xB0, 0x76, - 0x96, 0x2E, 0xC4, 0xE9, 0x2E, 0xD8, 0x8F, 0x92, - 0xC0, 0x2D, 0x4D, 0x41, 0x0F, 0xDE, 0x45, 0x1B, - 0x25, 0x3C, 0xBE, 0x37, 0x6B, 0x45, 0x82, 0x21, - 0xE6, 0x4D, 0xB1, 0x23, 0x81, 0x82, 0xB6, 0x81, - 0x62, 0xB7, 0x30, 0xF4, 0x60, 0x4B, 0xC7, 0xF7, - 0xF0, 0x17, 0x0C, 0xB5, 0x75, 0x88, 0x77, 0x93, - 0x52, 0x63, 0x70, 0xF0, 0x0B, 0xC6, 0x73, 0x43, - 0x41, 0xEE, 0xE4, 0xF0, 0x71, 0xEC, 0xC8, 0xC1, - 0x32, 0xC4, 0xDC, 0xA9, 0x99, 0x1D, 0x31, 0xB8, - 0xA4, 0x7E, 0xDD, 0x19, 0x04, 0x0F, 0x02, 0xA8, - 0x1A, 0xAF, 0xB3, 0x48, 0x9A, 0x29, 0x29, 0x5E, - 0x49, 0x84, 0xE0, 0x94, 0x11, 0xD1, 0x7E, 0xAB, - 0xB2, 0xC0, 0x44, 0x7E, 0xA1, 0x1B, 0x5E, 0x9D, - 0x0D, 0x1A, 0xF9, 0x02, 0x9A, 0x2E, 0x53, 0x03, - 0x2D, 0x48, 0x96, 0x7C, 0x2C, 0xA6, 0xD7, 0xAC, - 0xF1, 0xED, 0x2B, 0x18, 0xBB, 0x01, 0xCB, 0x13, - 0xB9, 0xAC, 0xA6, 0xEE, 0x55, 0x00, 0x37, 0x7C, - 0x69, 0x61, 0x62, 0x89, 0x01, 0x54, 0x77, 0x9F, - 0x07, 0x5D, 0x26, 0x34, 0x3A, 0xA9, 0x49, 0xA5, - 0xAF, 0xF2, 0x5E, 0x06, 0x51, 0xB7, 0x1C, 0xE0, - 0xDE, 0xDA, 0x5C, 0x0B, 0x9F, 0x98, 0xC2, 0x15, - 0xFD, 0xBA, 0xD8, 0xA9, 0x99, 0x00, 0xAB, 0xA4, - 0x8E, 0x4A, 0x16, 0x9D, 0x66, 0x2A, 0xE8, 0x56, - 0x64, 0xB2, 0xB6, 0xC0, 0x93, 0xAF, 0x4D, 0x38, - 0xA0, 0x16, 0x5C, 0xE4, 0xBD, 0x62, 0xC2, 0x46, - 0x6B, 0xC9, 0x5A, 0x59, 0x4A, 0x72, 0x58, 0xFD, - 0xB2, 0xCC, 0x36, 0x87, 0x30, 0x85, 0xE8, 0xA1, - 0x04, 0x5B, 0xE0, 0x17, 0x9B, 0xD0, 0xEC, 0x9B -}; -#endif - -//Certificates -static const unsigned char ca3_dpki_cert[0x400] = -{ - 0x00, 0x01, 0x00, 0x03, 0x70, 0x41, 0x38, 0xEF, - 0xBB, 0xBD, 0xA1, 0x6A, 0x98, 0x7D, 0xD9, 0x01, - 0x32, 0x6D, 0x1C, 0x94, 0x59, 0x48, 0x4C, 0x88, - 0xA2, 0x86, 0x1B, 0x91, 0xA3, 0x12, 0x58, 0x7A, - 0xE7, 0x0E, 0xF6, 0x23, 0x7E, 0xC5, 0x0E, 0x10, - 0x32, 0xDC, 0x39, 0xDD, 0xE8, 0x9A, 0x96, 0xA8, - 0xE8, 0x59, 0xD7, 0x6A, 0x98, 0xA6, 0xE7, 0xE3, - 0x6A, 0x0C, 0xFE, 0x35, 0x2C, 0xA8, 0x93, 0x05, - 0x82, 0x34, 0xFF, 0x83, 0x3F, 0xCB, 0x3B, 0x03, - 0x81, 0x1E, 0x9F, 0x0D, 0xC0, 0xD9, 0xA5, 0x2F, - 0x80, 0x45, 0xB4, 0xB2, 0xF9, 0x41, 0x1B, 0x67, - 0xA5, 0x1C, 0x44, 0xB5, 0xEF, 0x8C, 0xE7, 0x7B, - 0xD6, 0xD5, 0x6B, 0xA7, 0x57, 0x34, 0xA1, 0x85, - 0x6D, 0xE6, 0xD4, 0xBE, 0xD6, 0xD3, 0xA2, 0x42, - 0xC7, 0xC8, 0x79, 0x1B, 0x34, 0x22, 0x37, 0x5E, - 0x5C, 0x77, 0x9A, 0xBF, 0x07, 0x2F, 0x76, 0x95, - 0xEF, 0xA0, 0xF7, 0x5B, 0xCB, 0x83, 0x78, 0x9F, - 0xC3, 0x0E, 0x3F, 0xE4, 0xCC, 0x83, 0x92, 0x20, - 0x78, 0x40, 0x63, 0x89, 0x49, 0xC7, 0xF6, 0x88, - 0x56, 0x5F, 0x64, 0x9B, 0x74, 0xD6, 0x3D, 0x8D, - 0x58, 0xFF, 0xAD, 0xDA, 0x57, 0x1E, 0x95, 0x54, - 0x42, 0x6B, 0x13, 0x18, 0xFC, 0x46, 0x89, 0x83, - 0xD4, 0xC8, 0xA5, 0x62, 0x8B, 0x06, 0xB6, 0xFC, - 0x5D, 0x50, 0x7C, 0x13, 0xE7, 0xA1, 0x8A, 0xC1, - 0x51, 0x1E, 0xB6, 0xD6, 0x2E, 0xA5, 0x44, 0x8F, - 0x83, 0x50, 0x14, 0x47, 0xA9, 0xAF, 0xB3, 0xEC, - 0xC2, 0x90, 0x3C, 0x9D, 0xD5, 0x2F, 0x92, 0x2A, - 0xC9, 0xAC, 0xDB, 0xEF, 0x58, 0xC6, 0x02, 0x18, - 0x48, 0xD9, 0x6E, 0x20, 0x87, 0x32, 0xD3, 0xD1, - 0xD9, 0xD9, 0xEA, 0x44, 0x0D, 0x91, 0x62, 0x1C, - 0x7A, 0x99, 0xDB, 0x88, 0x43, 0xC5, 0x9C, 0x1F, - 0x2E, 0x2C, 0x7D, 0x9B, 0x57, 0x7D, 0x51, 0x2C, - 0x16, 0x6D, 0x6F, 0x7E, 0x1A, 0xAD, 0x4A, 0x77, - 0x4A, 0x37, 0x44, 0x7E, 0x78, 0xFE, 0x20, 0x21, - 0xE1, 0x4A, 0x95, 0xD1, 0x12, 0xA0, 0x68, 0xAD, - 0xA0, 0x19, 0xF4, 0x63, 0xC7, 0xA5, 0x56, 0x85, - 0xAA, 0xBB, 0x68, 0x88, 0xB9, 0x24, 0x64, 0x83, - 0xD1, 0x8B, 0x9C, 0x80, 0x6F, 0x47, 0x49, 0x18, - 0x33, 0x17, 0x82, 0x34, 0x4A, 0x4B, 0x85, 0x31, - 0x33, 0x4B, 0x26, 0x30, 0x32, 0x63, 0xD9, 0xD2, - 0xEB, 0x4F, 0x4B, 0xB9, 0x96, 0x02, 0xB3, 0x52, - 0xF6, 0xAE, 0x40, 0x46, 0xC6, 0x9A, 0x5E, 0x7E, - 0x8E, 0x4A, 0x18, 0xEF, 0x9B, 0xC0, 0xA2, 0xDE, - 0xD6, 0x13, 0x10, 0x41, 0x70, 0x12, 0xFD, 0x82, - 0x4C, 0xC1, 0x16, 0xCF, 0xB7, 0xC4, 0xC1, 0xF7, - 0xEC, 0x71, 0x77, 0xA1, 0x74, 0x46, 0xCB, 0xDE, - 0x96, 0xF3, 0xED, 0xD8, 0x8F, 0xCD, 0x05, 0x2F, - 0x0B, 0x88, 0x8A, 0x45, 0xFD, 0xAF, 0x2B, 0x63, - 0x13, 0x54, 0xF4, 0x0D, 0x16, 0xE5, 0xFA, 0x9C, - 0x2C, 0x4E, 0xDA, 0x98, 0xE7, 0x98, 0xD1, 0x5E, - 0x60, 0x46, 0xDC, 0x53, 0x63, 0xF3, 0x09, 0x6B, - 0x2C, 0x60, 0x7A, 0x9D, 0x8D, 0xD5, 0x5B, 0x15, - 0x02, 0xA6, 0xAC, 0x7D, 0x3C, 0xC8, 0xD8, 0xC5, - 0x75, 0x99, 0x8E, 0x7D, 0x79, 0x69, 0x10, 0xC8, - 0x04, 0xC4, 0x95, 0x23, 0x50, 0x57, 0xE9, 0x1E, - 0xCD, 0x26, 0x37, 0xC9, 0xC1, 0x84, 0x51, 0x51, - 0xAC, 0x6B, 0x9A, 0x04, 0x90, 0xAE, 0x3E, 0xC6, - 0xF4, 0x77, 0x40, 0xA0, 0xDB, 0x0B, 0xA3, 0x6D, - 0x07, 0x59, 0x56, 0xCE, 0xE7, 0x35, 0x4E, 0xA3, - 0xE9, 0xA4, 0xF2, 0x72, 0x0B, 0x26, 0x55, 0x0C, - 0x7D, 0x39, 0x43, 0x24, 0xBC, 0x0C, 0xB7, 0xE9, - 0x31, 0x7D, 0x8A, 0x86, 0x61, 0xF4, 0x21, 0x91, - 0xFF, 0x10, 0xB0, 0x82, 0x56, 0xCE, 0x3F, 0xD2, - 0x5B, 0x74, 0x5E, 0x51, 0x94, 0x90, 0x6B, 0x4D, - 0x61, 0xCB, 0x4C, 0x2E, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x6F, 0x6F, 0x74, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 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, 0x43, 0x41, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x33, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7B, 0xE8, 0xEF, 0x6C, - 0xB2, 0x79, 0xC9, 0xE2, 0xEE, 0xE1, 0x21, 0xC6, - 0xEA, 0xF4, 0x4F, 0xF6, 0x39, 0xF8, 0x8F, 0x07, - 0x8B, 0x4B, 0x77, 0xED, 0x9F, 0x95, 0x60, 0xB0, - 0x35, 0x82, 0x81, 0xB5, 0x0E, 0x55, 0xAB, 0x72, - 0x11, 0x15, 0xA1, 0x77, 0x70, 0x3C, 0x7A, 0x30, - 0xFE, 0x3A, 0xE9, 0xEF, 0x1C, 0x60, 0xBC, 0x1D, - 0x97, 0x46, 0x76, 0xB2, 0x3A, 0x68, 0xCC, 0x04, - 0xB1, 0x98, 0x52, 0x5B, 0xC9, 0x68, 0xF1, 0x1D, - 0xE2, 0xDB, 0x50, 0xE4, 0xD9, 0xE7, 0xF0, 0x71, - 0xE5, 0x62, 0xDA, 0xE2, 0x09, 0x22, 0x33, 0xE9, - 0xD3, 0x63, 0xF6, 0x1D, 0xD7, 0xC1, 0x9F, 0xF3, - 0xA4, 0xA9, 0x1E, 0x8F, 0x65, 0x53, 0xD4, 0x71, - 0xDD, 0x7B, 0x84, 0xB9, 0xF1, 0xB8, 0xCE, 0x73, - 0x35, 0xF0, 0xF5, 0x54, 0x05, 0x63, 0xA1, 0xEA, - 0xB8, 0x39, 0x63, 0xE0, 0x9B, 0xE9, 0x01, 0x01, - 0x1F, 0x99, 0x54, 0x63, 0x61, 0x28, 0x70, 0x20, - 0xE9, 0xCC, 0x0D, 0xAB, 0x48, 0x7F, 0x14, 0x0D, - 0x66, 0x26, 0xA1, 0x83, 0x6D, 0x27, 0x11, 0x1F, - 0x20, 0x68, 0xDE, 0x47, 0x72, 0x14, 0x91, 0x51, - 0xCF, 0x69, 0xC6, 0x1B, 0xA6, 0x0E, 0xF9, 0xD9, - 0x49, 0xA0, 0xF7, 0x1F, 0x54, 0x99, 0xF2, 0xD3, - 0x9A, 0xD2, 0x8C, 0x70, 0x05, 0x34, 0x82, 0x93, - 0xC4, 0x31, 0xFF, 0xBD, 0x33, 0xF6, 0xBC, 0xA6, - 0x0D, 0xC7, 0x19, 0x5E, 0xA2, 0xBC, 0xC5, 0x6D, - 0x20, 0x0B, 0xAF, 0x6D, 0x06, 0xD0, 0x9C, 0x41, - 0xDB, 0x8D, 0xE9, 0xC7, 0x20, 0x15, 0x4C, 0xA4, - 0x83, 0x2B, 0x69, 0xC0, 0x8C, 0x69, 0xCD, 0x3B, - 0x07, 0x3A, 0x00, 0x63, 0x60, 0x2F, 0x46, 0x2D, - 0x33, 0x80, 0x61, 0xA5, 0xEA, 0x6C, 0x91, 0x5C, - 0xD5, 0x62, 0x35, 0x79, 0xC3, 0xEB, 0x64, 0xCE, - 0x44, 0xEF, 0x58, 0x6D, 0x14, 0xBA, 0xAA, 0x88, - 0x34, 0x01, 0x9B, 0x3E, 0xEB, 0xEE, 0xD3, 0x79, - 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static const unsigned char xsC_dpki_cert[0x300] = -{ - 0x00, 0x01, 0x00, 0x04, 0x91, 0x9E, 0xBE, 0x46, - 0x4A, 0xD0, 0xF5, 0x52, 0xCD, 0x1B, 0x72, 0xE7, - 0x88, 0x49, 0x10, 0xCF, 0x55, 0xA9, 0xF0, 0x2E, - 0x50, 0x78, 0x96, 0x41, 0xD8, 0x96, 0x68, 0x3D, - 0xC0, 0x05, 0xBD, 0x0A, 0xEA, 0x87, 0x07, 0x9D, - 0x8A, 0xC2, 0x84, 0xC6, 0x75, 0x06, 0x5F, 0x74, - 0xC8, 0xBF, 0x37, 0xC8, 0x80, 0x44, 0x40, 0x95, - 0x02, 0xA0, 0x22, 0x98, 0x0B, 0xB8, 0xAD, 0x48, - 0x38, 0x3F, 0x6D, 0x28, 0xA7, 0x9D, 0xE3, 0x96, - 0x26, 0xCC, 0xB2, 0xB2, 0x2A, 0x0F, 0x19, 0xE4, - 0x10, 0x32, 0xF0, 0x94, 0xB3, 0x9F, 0xF0, 0x13, - 0x31, 0x46, 0xDE, 0xC8, 0xF6, 0xC1, 0xA9, 0xD5, - 0x5C, 0xD2, 0x8D, 0x9E, 0x1C, 0x47, 0xB3, 0xD1, - 0x1F, 0x4F, 0x54, 0x26, 0xC2, 0xC7, 0x80, 0x13, - 0x5A, 0x27, 0x75, 0xD3, 0xCA, 0x67, 0x9B, 0xC7, - 0xE8, 0x34, 0xF0, 0xE0, 0xFB, 0x58, 0xE6, 0x88, - 0x60, 0xA7, 0x13, 0x30, 0xFC, 0x95, 0x79, 0x17, - 0x93, 0xC8, 0xFB, 0xA9, 0x35, 0xA7, 0xA6, 0x90, - 0x8F, 0x22, 0x9D, 0xEE, 0x2A, 0x0C, 0xA6, 0xB9, - 0xB2, 0x3B, 0x12, 0xD4, 0x95, 0xA6, 0xFE, 0x19, - 0xD0, 0xD7, 0x26, 0x48, 0x21, 0x68, 0x78, 0x60, - 0x5A, 0x66, 0x53, 0x8D, 0xBF, 0x37, 0x68, 0x99, - 0x90, 0x5D, 0x34, 0x45, 0xFC, 0x5C, 0x72, 0x7A, - 0x0E, 0x13, 0xE0, 0xE2, 0xC8, 0x97, 0x1C, 0x9C, - 0xFA, 0x6C, 0x60, 0x67, 0x88, 0x75, 0x73, 0x2A, - 0x4E, 0x75, 0x52, 0x3D, 0x2F, 0x56, 0x2F, 0x12, - 0xAA, 0xBD, 0x15, 0x73, 0xBF, 0x06, 0xC9, 0x40, - 0x54, 0xAE, 0xFA, 0x81, 0xA7, 0x14, 0x17, 0xAF, - 0x9A, 0x4A, 0x06, 0x6D, 0x0F, 0xFC, 0x5A, 0xD6, - 0x4B, 0xAB, 0x28, 0xB1, 0xFF, 0x60, 0x66, 0x1F, - 0x44, 0x37, 0xD4, 0x9E, 0x1E, 0x0D, 0x94, 0x12, - 0xEB, 0x4B, 0xCA, 0xCF, 0x4C, 0xFD, 0x6A, 0x34, - 0x08, 0x84, 0x79, 0x82, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x6F, 0x6F, 0x74, 0x2D, 0x43, 0x41, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x33, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 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, 0x58, 0x53, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x63, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x13, 0x7A, 0x08, 0x94, - 0xAD, 0x50, 0x5B, 0xB6, 0xC6, 0x7E, 0x2E, 0x5B, - 0xDD, 0x6A, 0x3B, 0xEC, 0x43, 0xD9, 0x10, 0xC7, - 0x72, 0xE9, 0xCC, 0x29, 0x0D, 0xA5, 0x85, 0x88, - 0xB7, 0x7D, 0xCC, 0x11, 0x68, 0x0B, 0xB3, 0xE2, - 0x9F, 0x4E, 0xAB, 0xBB, 0x26, 0xE9, 0x8C, 0x26, - 0x01, 0x98, 0x5C, 0x04, 0x1B, 0xB1, 0x43, 0x78, - 0xE6, 0x89, 0x18, 0x1A, 0xAD, 0x77, 0x05, 0x68, - 0xE9, 0x28, 0xA2, 0xB9, 0x81, 0x67, 0xEE, 0x3E, - 0x10, 0xD0, 0x72, 0xBE, 0xEF, 0x1F, 0xA2, 0x2F, - 0xA2, 0xAA, 0x3E, 0x13, 0xF1, 0x1E, 0x18, 0x36, - 0xA9, 0x2A, 0x42, 0x81, 0xEF, 0x70, 0xAA, 0xF4, - 0xE4, 0x62, 0x99, 0x82, 0x21, 0xC6, 0xFB, 0xB9, - 0xBD, 0xD0, 0x17, 0xE6, 0xAC, 0x59, 0x04, 0x94, - 0xE9, 0xCE, 0xA9, 0x85, 0x9C, 0xEB, 0x2D, 0x2A, - 0x4C, 0x17, 0x66, 0xF2, 0xC3, 0x39, 0x12, 0xC5, - 0x8F, 0x14, 0xA8, 0x03, 0xE3, 0x6F, 0xCC, 0xDC, - 0xCC, 0xDC, 0x13, 0xFD, 0x7A, 0xE7, 0x7C, 0x7A, - 0x78, 0xD9, 0x97, 0xE6, 0xAC, 0xC3, 0x55, 0x57, - 0xE0, 0xD3, 0xE9, 0xEB, 0x64, 0xB4, 0x3C, 0x92, - 0xF4, 0xC5, 0x0D, 0x67, 0xA6, 0x02, 0xDE, 0xB3, - 0x91, 0xB0, 0x66, 0x61, 0xCD, 0x32, 0x88, 0x0B, - 0xD6, 0x49, 0x12, 0xAF, 0x1C, 0xBC, 0xB7, 0x16, - 0x2A, 0x06, 0xF0, 0x25, 0x65, 0xD3, 0xB0, 0xEC, - 0xE4, 0xFC, 0xEC, 0xDD, 0xAE, 0x8A, 0x49, 0x34, - 0xDB, 0x8E, 0xE6, 0x7F, 0x30, 0x17, 0x98, 0x62, - 0x21, 0x15, 0x5D, 0x13, 0x1C, 0x6C, 0x3F, 0x09, - 0xAB, 0x19, 0x45, 0xC2, 0x06, 0xAC, 0x70, 0xC9, - 0x42, 0xB3, 0x6F, 0x49, 0xA1, 0x18, 0x3B, 0xCD, - 0x78, 0xB6, 0xE4, 0xB4, 0x7C, 0x6C, 0x5C, 0xAC, - 0x0F, 0x8D, 0x62, 0xF8, 0x97, 0xC6, 0x95, 0x3D, - 0xD1, 0x2F, 0x28, 0xB7, 0x0C, 0x5B, 0x7D, 0xF7, - 0x51, 0x81, 0x9A, 0x98, 0x34, 0x65, 0x26, 0x25, - 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static const unsigned char cpB_dpki_cert[0x300] = -{ - 0x00, 0x01, 0x00, 0x04, 0x2E, 0xA6, 0x6C, 0x66, - 0xCF, 0xF3, 0x35, 0x79, 0x7D, 0x04, 0x97, 0xB7, - 0x7A, 0x19, 0x7F, 0x9F, 0xE5, 0x1A, 0xB5, 0xA4, - 0x13, 0x75, 0xDC, 0x73, 0xFD, 0x9E, 0x0B, 0x10, - 0x66, 0x9B, 0x1B, 0x9A, 0x5B, 0x7E, 0x8A, 0xB2, - 0x8F, 0x01, 0xB6, 0x7B, 0x62, 0x54, 0xC1, 0x4A, - 0xA1, 0x33, 0x14, 0x18, 0xF2, 0x5B, 0xA5, 0x49, - 0x00, 0x4C, 0x37, 0x8D, 0xD7, 0x2F, 0x0C, 0xE6, - 0x3B, 0x1F, 0x70, 0x91, 0xAA, 0xFE, 0x38, 0x09, - 0xB7, 0xAC, 0x6C, 0x28, 0x76, 0xA6, 0x1D, 0x60, - 0x51, 0x6C, 0x43, 0xA6, 0x37, 0x29, 0x16, 0x2D, - 0x28, 0x0B, 0xE2, 0x1B, 0xE8, 0xE2, 0xFE, 0x05, - 0x7D, 0x8E, 0xB6, 0xE2, 0x04, 0x24, 0x22, 0x45, - 0x73, 0x1A, 0xB6, 0xFE, 0xE3, 0x0E, 0x53, 0x35, - 0x37, 0x3E, 0xEB, 0xA9, 0x70, 0xD5, 0x31, 0xBB, - 0xA2, 0xCB, 0x22, 0x2D, 0x96, 0x84, 0x38, 0x7D, - 0x5F, 0x2A, 0x1B, 0xF7, 0x52, 0x00, 0xCE, 0x06, - 0x56, 0xE3, 0x90, 0xCE, 0x19, 0x13, 0x5B, 0x59, - 0xE1, 0x4F, 0x0F, 0xA5, 0xC1, 0x28, 0x1A, 0x73, - 0x86, 0xCC, 0xD1, 0xC8, 0xEC, 0x3F, 0xAD, 0x70, - 0xFB, 0xCE, 0x74, 0xDE, 0xEE, 0x1F, 0xD0, 0x5F, - 0x46, 0x33, 0x0B, 0x51, 0xF9, 0xB7, 0x9E, 0x1D, - 0xDB, 0xF4, 0xE3, 0x3F, 0x14, 0x88, 0x9D, 0x05, - 0x28, 0x29, 0x24, 0xC5, 0xF5, 0xDC, 0x27, 0x66, - 0xEF, 0x06, 0x27, 0xD7, 0xEE, 0xDC, 0x73, 0x6E, - 0x67, 0xC2, 0xE5, 0xB9, 0x38, 0x34, 0x66, 0x80, - 0x72, 0x21, 0x6D, 0x1C, 0x78, 0xB8, 0x23, 0xA0, - 0x72, 0xD3, 0x4F, 0xF3, 0xEC, 0xF9, 0xBD, 0x11, - 0xA2, 0x9A, 0xF1, 0x6C, 0x33, 0xBD, 0x09, 0xAF, - 0xB2, 0xD7, 0x4D, 0x53, 0x4E, 0x02, 0x7C, 0x19, - 0x24, 0x0D, 0x59, 0x5A, 0x68, 0xEB, 0xB3, 0x05, - 0xAC, 0xC4, 0x4A, 0xB3, 0x8A, 0xB8, 0x20, 0xC6, - 0xD4, 0x26, 0x56, 0x0C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 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, 0x6F, 0x6F, 0x74, 0x2D, 0x43, 0x41, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x33, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 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, 0x43, 0x50, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x62, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x13, 0x7A, 0x08, 0x0B, - 0xA6, 0x89, 0xC5, 0x90, 0xFD, 0x0B, 0x2F, 0x0D, - 0x4F, 0x56, 0xB6, 0x32, 0xFB, 0x93, 0x4E, 0xD0, - 0x73, 0x95, 0x17, 0xB3, 0x3A, 0x79, 0xDE, 0x04, - 0x0E, 0xE9, 0x2D, 0xC3, 0x1D, 0x37, 0xC7, 0xF7, - 0x3B, 0xF0, 0x4B, 0xD3, 0xE4, 0x4E, 0x20, 0xAB, - 0x5A, 0x6F, 0xEA, 0xF5, 0x98, 0x4C, 0xC1, 0xF6, - 0x06, 0x2E, 0x9A, 0x9F, 0xE5, 0x6C, 0x32, 0x85, - 0xDC, 0x6F, 0x25, 0xDD, 0xD5, 0xD0, 0xBF, 0x9F, - 0xE2, 0xEF, 0xE8, 0x35, 0xDF, 0x26, 0x34, 0xED, - 0x93, 0x7F, 0xAB, 0x02, 0x14, 0xD1, 0x04, 0x80, - 0x9C, 0xF7, 0x4B, 0x86, 0x0E, 0x6B, 0x04, 0x83, - 0xF4, 0xCD, 0x2D, 0xAB, 0x2A, 0x96, 0x02, 0xBC, - 0x56, 0xF0, 0xD6, 0xBD, 0x94, 0x6A, 0xED, 0x6E, - 0x0B, 0xE4, 0xF0, 0x8F, 0x26, 0x68, 0x6B, 0xD0, - 0x9E, 0xF7, 0xDB, 0x32, 0x5F, 0x82, 0xB1, 0x8F, - 0x6A, 0xF2, 0xED, 0x52, 0x5B, 0xFD, 0x82, 0x8B, - 0x65, 0x3F, 0xEE, 0x6E, 0xCE, 0x40, 0x0D, 0x5A, - 0x48, 0xFF, 0xE2, 0x2D, 0x53, 0x8B, 0xB5, 0x33, - 0x5B, 0x41, 0x53, 0x34, 0x2D, 0x43, 0x35, 0xAC, - 0xF5, 0x90, 0xD0, 0xD3, 0x0A, 0xE2, 0x04, 0x3C, - 0x7F, 0x5A, 0xD2, 0x14, 0xFC, 0x9C, 0x0F, 0xE6, - 0xFA, 0x40, 0xA5, 0xC8, 0x65, 0x06, 0xCA, 0x63, - 0x69, 0xBC, 0xEE, 0x44, 0xA3, 0x2D, 0x9E, 0x69, - 0x5C, 0xF0, 0x0B, 0x4F, 0xD7, 0x9A, 0xDB, 0x56, - 0x8D, 0x14, 0x9C, 0x20, 0x28, 0xA1, 0x4C, 0x9D, - 0x71, 0xB8, 0x50, 0xCA, 0x36, 0x5B, 0x37, 0xF7, - 0x0B, 0x65, 0x77, 0x91, 0xFC, 0x5D, 0x72, 0x8C, - 0x4E, 0x18, 0xFD, 0x22, 0x55, 0x7C, 0x40, 0x62, - 0xD7, 0x47, 0x71, 0x53, 0x3C, 0x70, 0x17, 0x9D, - 0x3D, 0xAE, 0x8F, 0x92, 0xB1, 0x17, 0xE4, 0x5C, - 0xB3, 0x32, 0xF3, 0xB3, 0xC2, 0xA2, 0x2E, 0x70, - 0x5C, 0xFE, 0xC6, 0x6F, 0x6D, 0xA3, 0x77, 0x2B, - 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -#endif \ No newline at end of file diff --git a/keyset.c b/keyset.c deleted file mode 100644 index 6414026..0000000 --- a/keyset.c +++ /dev/null @@ -1,231 +0,0 @@ -#include "lib.h" - -// KeyData -#include "keys_common.h" -#include "keys_retail.h" -#ifndef PUBLIC_BUILD -#include "keys_debug.h" -#endif - -// Private Prototypes -int SetRsaKeySet(u8 **PrivDest, u8 *PrivSource, u8 **PubDest, u8 *PubSource); -int SetUnFixedKey(keys_struct *keys, u8 *UnFixedKey); -void InitCommonKeySlots(keys_struct *keys); - -int SetTIK_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod); -int SetTMD_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod); -int SetCFA_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod); -int SetCCI_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod); -int SetAccessDesc_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod); -int SetCXI_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod); - -int SetCaCert(keys_struct *keys, u8 *Cert); -int SetTikCert(keys_struct *keys, u8 *Cert); -int SetTmdCert(keys_struct *keys, u8 *Cert); - - -// Code -void InitKeys(keys_struct *keys) -{ - memset(keys,0,sizeof(keys_struct)); - InitCommonKeySlots(keys); -} - -void SetKeys(keys_struct *keys) -{ - if(keys->keyset == keyset_RETAIL){ - /* AES Keys */ - // CIA - //SetCommonKey(keys,(u8*)zeros_fixed_aesKey,1); - SetCurrentCommonKey(keys,1); - - // NCCH - keys->aes.NormalKey = (u8*)zeros_fixed_aesKey; - SetSystemFixedKey(keys,(u8*)system_fixed_aesKey); - - /* RSA Keys */ - keys->rsa.FalseSign = true; - // CIA - SetTIK_RsaKey(keys,(u8*)Dummy_rsa_privExp,(u8*)Dummy_rsa_pubMod); - SetTMD_RsaKey(keys,(u8*)Dummy_rsa_privExp,(u8*)Dummy_rsa_pubMod); - // CFA - SetCFA_RsaKey(keys,(u8*)Dummy_rsa_privExp,(u8*)Dummy_rsa_pubMod); - // CCI - SetCCI_RsaKey(keys,(u8*)Dummy_rsa_privExp,(u8*)Dummy_rsa_pubMod); - // CXI - SetAccessDesc_RsaKey(keys,(u8*)Dummy_rsa_privExp,(u8*)Dummy_rsa_pubMod); - - /* Certs */ - SetCaCert(keys,(u8*)ca3_dpki_cert); - SetTikCert(keys,(u8*)xsC_dpki_cert); - SetTmdCert(keys,(u8*)cpB_dpki_cert); - } -#ifndef PUBLIC_BUILD - else if(keys->keyset == keyset_DEBUG){ - /* AES Keys */ - // CIA - SetCommonKey(keys,(u8*)ctr_aes_common_key_dev0,0); - SetCommonKey(keys,(u8*)ctr_aes_common_key_dev1,1); - SetCurrentCommonKey(keys,0); - - // NCCH - keys->aes.NormalKey = (u8*)zeros_fixed_aesKey; - SetSystemFixedKey(keys,(u8*)system_fixed_aesKey); - - /* RSA Keys */ - // CIA - SetTIK_RsaKey(keys,(u8*)xs9_dpki_rsa_privExp,(u8*)xs9_dpki_rsa_pubMod); - SetTMD_RsaKey(keys,(u8*)cpA_dpki_rsa_privExp,(u8*)cpA_dpki_rsa_pubMod); - // CFA - SetCFA_RsaKey(keys,(u8*)DevNcsdCfa_privExp,(u8*)DevNcsdCfa_pubMod); - // CCI - SetCCI_RsaKey(keys,(u8*)DevNcsdCfa_privExp,(u8*)DevNcsdCfa_pubMod); - // CXI - SetAccessDesc_RsaKey(keys,(u8*)AccessDesc_privExp,(u8*)AccessDesc_pubMod); - - /* Certs */ - SetCaCert(keys,(u8*)ca4_dpki_cert); - SetTikCert(keys,(u8*)xs9_dpki_cert); - SetTmdCert(keys,(u8*)cpA_dpki_cert); - } -#endif - // Checking if AccessDesc can be signed - u8 *tmp = malloc(0x100); - memset(tmp,0,0x100); - if(memcmp(tmp,keys->rsa.AccessDesc_Priv,0x100) == 0) - keys->rsa.RequiresPresignedDesc = true; - else - keys->rsa.RequiresPresignedDesc = false; - - free(tmp); - - return; -} - -void FreeKeys(keys_struct *keys) -{ - // AES - if(keys->aes.CommonKey){ - for(int i = 0; i < 256; i++){ - free(keys->aes.CommonKey[i]); - } - } - free(keys->aes.CommonKey); - free(keys->aes.SystemFixedKey); - free(keys->aes.UnFixedKey); - - // RSA - free(keys->rsa.TIK_Priv); - free(keys->rsa.TIK_Pub); - free(keys->rsa.TMD_Priv); - free(keys->rsa.TMD_Pub); - - free(keys->rsa.CFA_Priv); - free(keys->rsa.CFA_Pub); - - free(keys->rsa.CCI_Priv); - free(keys->rsa.CCI_Pub); - - free(keys->rsa.AccessDesc_Priv); - free(keys->rsa.AccessDesc_Pub); - - // Certs - free(keys->certs.ca_cert); - free(keys->certs.tik_cert); - free(keys->certs.tmd_cert); - memset(keys,0,sizeof(keys_struct)); -} - -int SetRsaKeySet(u8 **PrivDest, u8 *PrivSource, u8 **PubDest, u8 *PubSource) -{ - int result = 0; - if(PrivSource){ - result = CopyData(PrivDest,PrivSource,0x100); - if(result) return result; - } - if(PubSource){ - result = CopyData(PubDest,PubSource,0x100); - if(result) return result; - } - return 0; -} - -int SetCommonKey(keys_struct *keys, u8 *CommonKey, u8 Index) -{ - if(!keys) return -1; - return CopyData(&keys->aes.CommonKey[Index],CommonKey,16); -} - -void InitCommonKeySlots(keys_struct *keys) -{ - if(!keys->aes.CommonKey){ - keys->aes.CommonKey = malloc(sizeof(u8*)*256); - memset(keys->aes.CommonKey,0,sizeof(u8*)*256); - } -} - -int SetCurrentCommonKey(keys_struct *keys, u8 Index) -{ - if(!keys) return -1; - keys->aes.CurrentCommonKey = Index; - return 0; -} - -int SetSystemFixedKey(keys_struct *keys, u8 *SystemFixedKey) -{ - if(!keys) return -1; - return CopyData(&keys->aes.SystemFixedKey,SystemFixedKey,16); -} - -int SetUnFixedKey(keys_struct *keys, u8 *UnFixedKey) -{ - if(!keys) return -1; - return CopyData(&keys->aes.UnFixedKey,UnFixedKey,16); -} - -int SetTIK_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod) -{ - if(!keys) return -1; - return SetRsaKeySet(&keys->rsa.TIK_Priv,PrivateExp,&keys->rsa.TIK_Pub,PublicMod); -} - -int SetTMD_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod) -{ - if(!keys) return -1; - return SetRsaKeySet(&keys->rsa.TMD_Priv,PrivateExp,&keys->rsa.TMD_Pub,PublicMod); -} - -int SetCFA_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod) -{ - if(!keys) return -1; - return SetRsaKeySet(&keys->rsa.CFA_Priv,PrivateExp,&keys->rsa.CFA_Pub,PublicMod); -} - -int SetCCI_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod) -{ - if(!keys) return -1; - return SetRsaKeySet(&keys->rsa.CCI_Priv,PrivateExp,&keys->rsa.CCI_Pub,PublicMod); -} - -int SetAccessDesc_RsaKey(keys_struct *keys, u8 *PrivateExp, u8 *PublicMod) -{ - if(!keys) return -1; - return SetRsaKeySet(&keys->rsa.AccessDesc_Priv,PrivateExp,&keys->rsa.AccessDesc_Pub,PublicMod); -} - -int SetCaCert(keys_struct *keys, u8 *Cert) -{ - if(!keys) return -1; - return CopyData(&keys->certs.ca_cert,Cert,0x400); -} -int SetTikCert(keys_struct *keys, u8 *Cert) -{ - if(!keys) return -1; - return CopyData(&keys->certs.tik_cert,Cert,0x300); -} - -int SetTmdCert(keys_struct *keys, u8 *Cert) -{ - if(!keys) return -1; - return CopyData(&keys->certs.tmd_cert,Cert,0x400); -} \ No newline at end of file diff --git a/keyset.h b/keyset.h deleted file mode 100644 index 1197679..0000000 --- a/keyset.h +++ /dev/null @@ -1,83 +0,0 @@ -#ifndef _KEYSET_H_ -#define _KEYSET_H_ - -typedef enum -{ - keyset_DEBUG, - keyset_RETAIL, -} keysets; - -typedef enum -{ - not_preset, - app, - dlp, - demo, -} fixed_accessdesc_type; - -// Structs - -typedef struct -{ - keysets keyset; - - struct - { - fixed_accessdesc_type PresetType; - u32 TargetFirmware; - } AccessDescSign; - - struct - { - // CIA - u8 **CommonKey; - u8 CurrentCommonKey; - - // NCCH Keys - u8 *NormalKey; - u8 *SystemFixedKey; - u8 *UnFixedKey; - } aes; - - struct - { - bool FalseSign; - // CIA RSA - u8 *TMD_Priv; - u8 *TMD_Pub; - u8 *TIK_Priv; - u8 *TIK_Pub; - - // CFA - u8 *CFA_Priv; - u8 *CFA_Pub; - - // CCI - u8 *CCI_Priv; - u8 *CCI_Pub; - - // CXI - bool RequiresPresignedDesc; - u8 *AccessDesc_Priv; - u8 *AccessDesc_Pub; - } rsa; - - struct - { - // CIA - u8 *ca_cert; - u8 *tik_cert; - u8 *tmd_cert; - } certs; -} keys_struct; - -#endif - -// Public Prototypes -void InitKeys(keys_struct *keys); -void SetKeys(keys_struct *keys); -void FreeKeys(keys_struct *keys); - -int SetCommonKey(keys_struct *keys, u8 *CommonKey, u8 Index); -int SetCurrentCommonKey(keys_struct *keys, u8 Index); -int SetSystemFixedKey(keys_struct *keys, u8 *SystemFixedKey); diff --git a/lib.h b/lib.h deleted file mode 100644 index 4dda1ab..0000000 --- a/lib.h +++ /dev/null @@ -1,35 +0,0 @@ -#define _LARGEFILE_SOURCE -#define _LARGEFILE64_SOURCE -#define _FILE_OFFSET_BITS 64 - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef _WIN32 - #include - #include - #include - //#include -#else - #include - #include -#endif - - -#include "types.h" -#include "utils.h" -#include "crypto.h" - -#include "keyset.h" -#include "usersettings.h" -#include "libyaml/yaml.h" -#include "yaml_ctr.h" - - diff --git a/logo_data.h b/logo_data.h deleted file mode 100644 index 66ec98a..0000000 --- a/logo_data.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef _LOGO_DATA_H_ -#define _LOGO_DATA_H_ - -static const unsigned char Nintendo_LZ[0x2000] = -{ - 0x11, 0x48, 0x65, 0x00, 0x00, 0x64, 0x61, 0x72, 0x63, 0xFF, 0xFE, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x28, 0x65, 0x00, 0x00, 0x83, 0x30, 0x09, 0x1C, 0x04, 0x00, 0x00, 0x40, 0x20, 0x03, 0x30, 0x13, 0xAB, 0x30, 0x18, 0x15, 0x20, 0x1D, 0x02, 0xA0, 0x0B, 0x06, 0x20, 0x2B, 0x30, 0x18, 0x5A, 0x09, 0x20, 0x35, 0x10, 0x20, 0x39, 0x30, 0x2B, 0xF8, 0x20, 0x41, 0x54, 0x85, 0x30, 0x0B, 0x05, 0x00, 0x00, 0xEC, 0x20, 0x4D, 0x98, 0x30, 0x17, 0xD0, 0x20, 0x28, 0x30, 0x17, 0xDC, 0x30, 0x23, 0x07, 0x00, 0x00, 0xCC, 0x09, 0x0C, 0x00, 0x00, 0x20, 0x20, 0x51, 0x20, 0x14, 0x20, 0x2B, 0xA0, 0x20, 0x0B, 0x64, 0x20, 0x5D, 0x80, 0x20, 0x00, 0x00, 0x4C, 0x99, 0x20, 0x5C, 0xA8, 0x01, 0x50, 0x53, 0x20, 0x22, 0x00, 0xB2, 0x20, 0x75, 0x34, 0xE0, 0x22, 0x20, 0x13, 0x20, 0x74, 0xE2, 0x20, 0x81, 0xA0, 0x25, 0x13, 0x00, 0x00, 0x3C, 0x20, 0x68, 0x12, 0x02, 0x50, 0x77, 0x30, 0x8F, 0x41, 0x1C, 0x20, 0x90, 0x00, 0x36, 0x00, 0x00, 0x28, 0x20, 0xAB, 0x4D, 0x3E, 0x20, 0x9C, 0x80, 0x3A, 0x20, 0x0B, 0x20, 0xAD, 0x60, 0x30, 0x17, 0x54, 0x3C, 0x50, 0x17, 0x82, 0x30, 0x17, 0x40, 0x20, 0x23, 0x08, 0x00, 0x2D, 0x00, 0xA4, 0x30, 0x2F, 0x49, 0x20, 0x67, 0x20, 0xE9, 0xC4, 0x30, 0x3B, 0x56, 0x4A, 0x50, 0x17, 0xDC, 0x30, 0x3B, 0x52, 0x20, 0x47, 0x20, 0xE0, 0xF4, 0xB2, 0x30, 0x53, 0x55, 0x20, 0x53, 0x30, 0xD4, 0x00, 0x2E, 0x21, 0x13, 0x61, 0x02, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x6D, 0x21, 0x1D, 0x4E, 0x82, 0x20, 0x07, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x20, 0x11, 0x64, 0x0A, 0x00, 0x6F, 0x00, 0x4C, 0x20, 0x03, 0x67, 0x20, 0x07, 0x5F, 0x28, 0x00, 0x44, 0x20, 0x03, 0x30, 0x20, 0x01, 0x5F, 0x00, 0x53, 0x20, 0x00, 0x63, 0x40, 0x1F, 0x65, 0x00, 0x4F, 0x00, 0x75, 0xAB, 0x20, 0x2B, 0x41, 0x20, 0x43, 0x62, 0x20, 0x13, 0x6C, 0x40, 0x47, 0x02, 0x50, 0x43, 0x57, 0x42, 0x03, 0x20, 0x43, 0x43, 0x01, 0x80, 0x87, 0x55, 0x03, 0x20, 0xCB, 0x00, 0x90, 0x43, 0x01, 0x90, 0xCB, 0xD7, 0x00, 0x90, 0x87, 0xF0, 0xCB, 0x62, 0x21, 0x5D, 0x79, 0x21, 0x97, 0x01, 0x31, 0xA1, 0x71, 0x8D, 0xEA, 0x00, 0xF0, 0x2F, 0x71, 0x05, 0xD0, 0x2F, 0x74, 0x42, 0x09, 0x67, 0x23, 0x29, 0x33, 0xBD, 0x22, 0x01, 0x73, 0xA2, 0x01, 0xB0, 0x5B, 0x52, 0x2D, 0x00, 0x10, 0x21, 0x31, 0x01, 0x00, 0x21, 0x55, 0x32, 0x01, 0x00, 0x43, 0x33, 0xE0, 0x65, 0x4C, 0x23, 0x71, 0x4D, 0x22, 0xA3, 0x1F, 0x73, 0x00, 0x6B, 0x00, 0x40, 0x85, 0x30, 0x1F, 0x00, 0xB0, 0x17, 0xF0, 0x93, 0xF2, 0xE3, 0x41, 0x5F, 0x20, 0xB5, 0x32, 0x00, 0x38, 0x00, 0x78, 0x23, 0x68, 0x60, 0x34, 0xE0, 0xE1, 0x70, 0x02, 0x43, 0x4C, 0x41, 0x4E, 0xFF, 0x46, 0xFE, 0x23, 0xD0, 0x00, 0x02, 0x02, 0x34, 0x03, 0x33, 0x96, 0x70, 0x1D, 0x61, 0x74, 0x31, 0x23, 0x82, 0x44, 0x3E, 0x34, 0x59, 0x28, 0x33, 0x73, 0x10, 0xFF, 0xFF, 0xFF, 0x34, 0x4C, 0x53, 0x63, 0x65, 0x6E, 0x04, 0x65, 0x4F, 0x75, 0x74, 0x41, 0x24, 0x71, 0x47, 0x5F, 0x0C, 0x41, 0x5F, 0x30, 0x30, 0xA0, 0x4C, 0x40, 0x3B, 0x69, 0x31, 0xCD, 0x33, 0xA3, 0x50, 0x3F, 0x02, 0x00, 0x30, 0x59, 0x34, 0x9D, 0x68, 0x24, 0xA1, 0x00, 0x50, 0x5F, 0x4E, 0x69, 0x6E, 0x4C, 0x6F, 0x67, 0x70, 0x6F, 0xA0, 0x35, 0x34, 0xA0, 0x34, 0xBD, 0x43, 0x4C, 0x56, 0x43, 0x8F, 0x74, 0x3F, 0x00, 0x10, 0x02, 0x40, 0x87, 0x40, 0x0B, 0xD0, 0x5D, 0x20, 0x76, 0x20, 0x7F, 0x43, 0x34, 0xEC, 0x4E, 0x5F, 0x52, 0x6F, 0x6F, 0x73, 0x74, 0xD0, 0x7E, 0x00, 0x70, 0x4B, 0x80, 0x57, 0x00, 0x20, 0x20, 0x3B, 0x50, 0x3F, 0xF8, 0x00, 0x30, 0xFF, 0x34, 0xF7, 0xB0, 0xFF, 0x24, 0xD2, 0x80, 0xFF, 0x00, 0x00, 0x1E, 0xD5, 0x45, 0x4C, 0x70, 0xFF, 0x42, 0x40, 0xFF, 0x42, 0x00, 0x40, 0xFF, 0x9C, 0x80, 0x2D, 0xB2, 0x90, 0xFF, 0x5C, 0x01, 0xE0, 0xFF, 0x90, 0xB3, 0x34, 0xC2, 0x02, 0xD0, 0xF3, 0xC8, 0xFD, 0x20, 0xAA, 0xD0, 0xF3, 0x00, 0x70, 0xFF, 0xF1, 0xFF, 0x31, 0x39, 0x71, 0xFF, 0x65, 0x23, 0x31, 0xC5, 0xB1, 0xFF, 0x31, 0x84, 0x47, 0x5F, 0x43, 0x00, 0x81, 0xFF, 0x0F, 0xE1, 0xFF, 0x99, 0x02, 0x90, 0xFF, 0x12, 0xC3, 0x02, 0x31, 0xF3, 0x92, 0x3F, 0x80, 0xBF, 0x91, 0xF3, 0x7B, 0x60, 0x32, 0xB6, 0x00, 0x80, 0xFF, 0x36, 0xDF, 0x03, 0x32, 0xFF, 0x7C, 0x27, 0x27, 0x53, 0x3F, 0x55, 0x0D, 0x42, 0xFF, 0x48, 0x27, 0x9D, 0xB0, 0x27, 0xA1, 0xA4, 0x27, 0x8D, 0x60, 0x24, 0x27, 0x88, 0x36, 0xCB, 0x30, 0x03, 0x00, 0x00, 0xBC, 0xAD, 0x20, 0x03, 0x24, 0x27, 0xAB, 0x88, 0x37, 0x73, 0x27, 0x94, 0xB0, 0x26, 0xE7, 0x02, 0x74, 0x0A, 0x00, 0x00, 0x78, 0x0B, 0x32, 0xDF, 0x57, 0xF9, 0x00, 0x03, 0x5B, 0x37, 0x32, 0x27, 0x6E, 0x26, 0xB1, 0x33, 0xB7, 0x50, 0x41, 0x83, 0x2F, 0x71, 0x02, 0xF2, 0xE3, 0x73, 0xDB, 0x01, 0x13, 0x07, 0x50, 0x5F, 0x33, 0x00, 0x80, 0x67, 0x77, 0xB8, 0x60, 0x67, 0x20, 0xAA, 0x43, 0xC7, 0x38, 0x63, 0xC7, 0x30, 0x6F, 0x93, 0x9F, 0x53, 0xA0, 0x24, 0x0A, 0xA0, 0x27, 0xA5, 0x80, 0xBE, 0x24, 0x39, 0x23, 0x16, 0x23, 0xA0, 0xC0, 0x48, 0x79, 0x06, 0x02, 0x00, 0x30, 0x37, 0x70, 0x23, 0x00, 0x33, 0x33, 0xB3, 0x3F, 0xFC, 0x2D, 0xEC, 0xBC, 0x8C, 0x70, 0x0B, 0x0A, 0xD7, 0x23, 0x20, 0x0B, 0x30, 0x2F, 0x80, 0x3F, 0xBC, 0x48, 0xA9, 0x07, 0x01, 0xD0, 0x2F, 0xF4, 0x2F, 0xB0, 0x6B, 0x39, 0x0C, 0x40, 0x9D, 0x6F, 0x1C, 0x30, 0x97, 0x61, 0xEF, 0xCC, 0x28, 0x45, 0x30, 0x9B, 0x70, 0xF3, 0x24, 0x87, 0xDC, 0xE4, 0xB9, 0x71, 0x5B, 0x50, 0xF1, 0x5B, 0x29, 0x39, 0xD4, 0x8B, 0x80, 0x41, 0x17, 0xCD, 0xCC, 0xCC, 0x20, 0xEB, 0x20, 0x34, 0x02, 0x00, 0x41, 0x67, 0x00, 0x14, 0xBB, 0xE6, 0x30, 0x7F, 0x30, 0x2F, 0x71, 0x73, 0x44, 0x73, 0xF5, 0x38, 0x01, 0xA0, 0x7F, 0xC1, 0xA3, 0x20, 0x7F, 0x3E, 0x02, 0xD0, 0x7F, 0x52, 0x65, 0x64, 0x01, 0x70, 0xFF, 0xC1, 0xEB, 0x85, 0x45, 0x43, 0xC2, 0xB7, 0x6D, 0xDB, 0x20, 0x7F, 0x8C, 0x25, 0x02, 0x35, 0x20, 0xC1, 0x00, 0xD1, 0x8B, 0xB6, 0x1B, 0x5C, 0xA4, 0x87, 0xB4, 0x41, 0x3B, 0x0B, 0x92, 0x24, 0xE9, 0xC0, 0x60, 0x8B, 0x31, 0x00, 0x32, 0xE7, 0x35, 0x33, 0xD7, 0xF2, 0xE7, 0x92, 0x53, 0xF0, 0x26, 0x82, 0x20, 0x25, 0x1B, 0x90, 0x0B, 0x50, 0x97, 0xFA, 0x34, 0xEF, 0x00, 0x50, 0x97, 0x96, 0x53, 0x30, 0x3B, 0x77, 0x04, 0xAA, 0xF1, 0x17, 0x32, 0xFF, 0x02, 0x13, 0x73, 0x32, 0xF7, 0x50, 0x8B, 0x00, 0x96, 0x7B, 0x33, 0x1B, 0x57, 0x78, 0x00, 0x31, 0x7F, 0x3B, 0x90, 0x9B, 0x57, 0x07, 0x54, 0x53, 0x2A, 0xEE, 0x47, 0x73, 0x4C, 0x37, 0x8B, 0x2B, 0xD9, 0x76, 0x94, 0x63, 0x8B, 0x3B, 0x87, 0x3B, 0xD1, 0x24, 0x4B, 0xD5, 0x00, 0x01, 0x97, 0xC0, 0x1E, 0x39, 0x8E, 0xE3, 0x2B, 0x39, 0x51, 0x5B, 0x5B, 0xFD, 0x01, 0x20, 0x23, 0x03, 0x81, 0xF7, 0x6B, 0x40, 0x41, 0x9E, 0x15, 0x8D, 0xBD, 0x31, 0xA3, 0x1A, 0x9A, 0x99, 0xB9, 0x2B, 0x7D, 0x2C, 0x5A, 0x04, 0x01, 0x10, 0x23, 0x01, 0xAA, 0x01, 0x20, 0x8F, 0x01, 0x01, 0x20, 0x8F, 0x01, 0x00, 0x10, 0x8F, 0xC1, 0x20, 0x8F, 0x3D, 0xD8, 0x60, 0x8F, 0x44, 0x5B, 0x01, 0x00, 0x10, 0x8F, 0x00, 0x00, 0x23, 0x50, 0x5F, 0x42, 0x20, 0x6C, 0x6B, 0x03, 0xE1, 0x63, 0x9A, 0x99, 0x19, 0xC0, 0x0E, 0x3F, 0x74, 0xDA, 0x00, 0xC1, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0xEA, 0x03, 0x81, 0x63, 0x00, 0x13, 0xBB, 0x00, 0x32, 0xC7, 0x58, 0x2E, 0x9D, 0x88, 0x66, 0x4F, 0xE8, 0xAB, 0x2E, 0xA9, 0x18, 0x2E, 0x95, 0x48, 0x2E, 0x99, 0x78, 0x62, 0xC7, 0xE3, 0xD3, 0xEF, 0x56, 0x3F, 0x60, 0x0B, 0x52, 0xD3, 0xF0, 0xC2, 0xD3, 0x01, 0xC0, 0x2F, 0x22, 0xDF, 0xD4, 0x33, 0x77, 0x40, 0x68, 0x03, 0x50, 0x0B, 0x52, 0xEB, 0xF0, 0xC2, 0xEB, 0x01, 0xB0, 0x2F, 0x32, 0xF7, 0xFF, 0x01, 0xB0, 0xBF, 0x33, 0x03, 0x01, 0xC0, 0x2F, 0x00, 0x10, 0xBF, 0x45, 0x73, 0x70, 0x0B, 0x53, 0x1B, 0x40, 0xBF, 0xFF, 0x83, 0x1B, 0x01, 0xB0, 0x2F, 0x63, 0x27, 0x03, 0xC1, 0xC3, 0x33, 0x27, 0x75, 0x97, 0x93, 0x33, 0x00, 0x91, 0xC3, 0xFF, 0x01, 0x00, 0x2F, 0x05, 0xE1, 0xC3, 0x00, 0xF0, 0xBF, 0xF1, 0xC3, 0x01, 0x00, 0x2F, 0x05, 0x01, 0xC3, 0x00, 0x16, 0xB7, 0x00, 0x36, 0x4F, 0xF5, 0x35, 0xCC, 0x33, 0x8B, 0x36, 0x53, 0x33, 0x8F, 0xA0, 0x69, 0xE3, 0xD0, 0x6D, 0xAB, 0xFF, 0xE6, 0xCF, 0x59, 0xC7, 0x26, 0x43, 0x00, 0x40, 0x17, 0x26, 0x37, 0xD6, 0xFF, 0x63, 0x57, 0x26, 0x2B, 0xFF, 0x00, 0x30, 0x17, 0x36, 0x1F, 0x00, 0x30, 0x5F, 0x36, 0x13, 0x00, 0x40, 0x17, 0x00, 0x10, 0x5F, 0x48, 0x6B, 0x35, 0xFB, 0xFF, 0x00, 0x30, 0x17, 0x65, 0xEF, 0x03, 0xC1, 0x03, 0x82, 0xC7, 0xE1, 0x03, 0x82, 0xDF, 0x02, 0xE1, 0x03, 0x73, 0x27, 0xF6, 0xF1, 0x03, 0x80, 0x17, 0x01, 0xE1, 0x03, 0x00, 0xFD, 0xDF, 0x54, 0xEC, 0xDF, 0x02, 0x7E, 0xDF, 0x04, 0xEA, 0x2F, 0xA4, 0x5F, 0x0D, 0xDC, 0xDF, 0x50, 0x2F, 0xCC, 0xB8, 0x2F, 0xD0, 0x20, 0xAA, 0x2F, 0xBC, 0xA0, 0x2F, 0xC0, 0x2C, 0x2C, 0xE3, 0xAC, 0x2C, 0xE7, 0x10, 0xA5, 0x2C, 0xDF, 0x74, 0x2C, 0xDF, 0xD8, 0x07, 0x2D, 0x17, 0x09, 0x2C, 0x31, 0xFD, 0x2C, 0xE3, 0x02, 0x9C, 0xDF, 0x3E, 0xCF, 0x00, 0xFC, 0xDF, 0x9E, 0xF3, 0x00, 0xBC, 0xDF, 0x7C, 0xEC, 0xDF, 0x7F, 0x2C, 0x6D, 0x5B, 0xDD, 0x4F, 0x4C, 0xE3, 0x8C, 0xD3, 0xD0, 0x17, 0x9C, 0xBB, 0x00, 0x30, 0x17, 0xFB, 0x00, 0x9F, 0xD3, 0x3F, 0xFD, 0x01, 0x1C, 0x8B, 0x00, 0x0D, 0xE7, 0xC3, 0xA3, 0xA0, 0x81, 0xF3, 0x00, 0x9F, 0xFB, 0xF6, 0x30, 0x23, 0x01, 0x1C, 0x73, 0x03, 0xD0, 0x67, 0x02, 0x7C, 0x5B, 0x70, 0x2B, 0xCB, 0x7C, 0x5B, 0x20, 0xFE, 0x3B, 0xDB, 0x00, 0xEB, 0xC3, 0x3E, 0x67, 0x7F, 0xD7, 0x5B, 0xCF, 0x00, 0xFC, 0x4F, 0x00, 0xDC, 0xDB, 0xF0, 0xFB, 0x2C, 0xCB, 0x80, 0x7F, 0x01, 0x2C, 0xDB, 0x30, 0x2F, 0x7F, 0xFB, 0xC8, 0x2F, 0x03, 0x7C, 0xDB, 0xFF, 0x5B, 0xE7, 0xAC, 0xDB, 0x00, 0x4C, 0x4F, 0x03, 0x3D, 0x67, 0x00, 0x1E, 0x67, 0xDD, 0x67, 0x04, 0x1C, 0x67, 0x41, 0xA3, 0xFF, 0x79, 0x93, 0x9D, 0x43, 0xCC, 0x67, 0x00, 0x60, 0x23, 0xCC, 0x67, 0x31, 0xEB, 0x89, 0x7B, 0x28, 0x2F, 0xFF, 0x00, 0x3C, 0x67, 0x00, 0x50, 0x23, 0xDC, 0x67, 0x00, 0x50, 0x8F, 0xDC, 0x67, 0x00, 0x60, 0x23, 0x00, 0x10, 0x8F, 0x79, 0x4B, 0xF3, 0x30, 0x8F, 0x00, 0x2C, 0x67, 0x00, 0x50, 0x23, 0x04, 0x1C, 0x67, 0x70, 0xC2, 0xA9, 0x33, 0x00, 0x81, 0x63, 0xFF, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0x03, 0x81, 0x63, 0x01, 0x5C, 0x67, 0x01, 0x9F, 0x2F, 0xFF, 0x43, 0xEB, 0x6F, 0x2F, 0x9F, 0x97, 0xDF, 0x2F, 0x00, 0x60, 0x23, 0xCF, 0x2F, 0x34, 0x33, 0x7F, 0x2F, 0xFF, 0x38, 0x2F, 0x00, 0x3F, 0x2F, 0x00, 0x50, 0x23, 0xDF, 0x2F, 0x00, 0x50, 0x8F, 0xDF, 0x2F, 0x00, 0x60, 0x23, 0x00, 0x10, 0x8F, 0xFF, 0x6F, 0x2F, 0x40, 0x8F, 0x00, 0x2F, 0x2F, 0x00, 0x50, 0x23, 0x01, 0x7C, 0x07, 0x01, 0xB1, 0x63, 0x9F, 0x2F, 0x00, 0x91, 0x63, 0xFF, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0x03, 0x81, 0x63, 0x01, 0x5B, 0xA7, 0x01, 0x95, 0x8F, 0xFF, 0x46, 0x27, 0x6F, 0x23, 0x9F, 0xDF, 0xD5, 0x8F, 0x00, 0x60, 0x23, 0xC5, 0x8F, 0x4F, 0xDF, 0x6F, 0x0B, 0xFF, 0x4F, 0xDF, 0x00, 0x25, 0x8F, 0x00, 0x50, 0x23, 0xD5, 0x8F, 0x00, 0x50, 0x8F, 0xD5, 0x8F, 0x00, 0x60, 0x23, 0x00, 0x10, 0x8F, 0xFF, 0x6E, 0xDB, 0x40, 0x8F, 0x00, 0x25, 0x8F, 0x00, 0x50, 0x23, 0x01, 0x7C, 0x07, 0x01, 0xB1, 0x63, 0x9E, 0xC3, 0x00, 0x91, 0x63, 0xFE, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0x03, 0x61, 0x63, 0x00, 0x7C, 0x5F, 0x4C, 0xF1, 0x2C, 0x5C, 0xBC, 0x5F, 0x3E, 0x51, 0x7C, 0x5F, 0x65, 0x00, 0x73, 0xCC, 0x5F, 0x8A, 0x3B, 0x9C, 0x47, 0x5F, 0x43, 0x00, 0x4C, 0x5F, 0xFC, 0x2E, 0xBB, 0x0F, 0xF5, 0x5B, 0x58, 0x4C, 0x5F, 0x3C, 0x82, 0x3B, 0xAB, 0xBC, 0x2F, 0xFF, 0xFC, 0x2F, 0xF8, 0x57, 0x3C, 0x2E, 0xDB, 0x7C, 0x2E, 0xDF, 0xBC, 0x2E, 0xE3, 0x00, 0x3C, 0x47, 0x3E, 0xC7, 0xCB, 0x5E, 0xFB, 0x00, 0x7A, 0x3B, 0x80, 0xBF, 0x9A, 0x3B, 0x60, 0x88, 0xC7, 0x00, 0x3C, 0x2B, 0xDD, 0x00, 0x70, 0x4B, 0x9F, 0x2B, 0xCA, 0x2A, 0xB7, 0x00, 0x9B, 0xCB, 0x01, 0x10, 0x3F, 0xF2, 0xA0, 0x3F, 0xF7, 0x00, 0x1B, 0xA3, 0x01, 0xD0, 0x3F, 0x00, 0x29, 0xEF, 0x01, 0x00, 0xBF, 0x8E, 0x2B, 0x77, 0x70, 0xFF, 0x00, 0x27, 0x67, 0xBB, 0x01, 0x00, 0xFF, 0x24, 0xF0, 0x3F, 0xDF, 0x83, 0x01, 0x01, 0x3F, 0x30, 0x00, 0x8E, 0xBB, 0x5E, 0xBF, 0x2A, 0x59, 0x54, 0x7E, 0xBF, 0xA8, 0x2E, 0xBC, 0x10, 0x2F, 0xFB, 0x6C, 0x19, 0x79, 0x74, 0x31, 0x3E, 0xD1, 0x4A, 0x9E, 0x00, 0xA0, 0x2D, 0xE7, 0x03, 0x70, 0x43, 0x74, 0x78, 0x6C, 0x31, 0x3F, 0xDF, 0x3F, 0xBF, 0x60, 0x04, 0x2F, 0xFF, 0x2D, 0x55, 0x74, 0x65, 0x6E, 0x64, 0x6F, 0x00, 0x5F, 0x31, 0x32, 0x38, 0x78, 0x36, 0x34, 0x2E, 0x05, 0x62, 0x63, 0x6C, 0x69, 0x6D, 0x2F, 0xFF, 0x6D, 0x2E, 0xFB, 0x70, 0x60, 0x62, 0x23, 0x30, 0x4B, 0x4D, 0x7F, 0x4C, 0x6F, 0x67, 0x6F, 0x8D, 0xAE, 0xE9, 0xFF, 0xFF, 0xFF, 0x30, 0x03, 0x00, 0x40, 0x02, 0x15, 0x5F, 0xE0, 0xF0, 0x30, 0x62, 0xAF, 0x72, 0x3E, 0x07, 0x5E, 0x0B, 0x70, 0x61, 0x6E, 0x31, 0x80, 0x3B, 0x4F, 0x01, 0x04, 0xFF, 0x00, 0x52, 0x6F, 0x6F, 0x07, 0x74, 0x50, 0x61, 0x6E, 0x65, 0x00, 0xB0, 0xDF, 0x00, 0x50, 0x47, 0x50, 0xD3, 0x0D, 0x70, 0x61, 0x73, 0x31, 0x3B, 0xA3, 0x70, 0x53, 0x03, 0x20, 0x53, 0x3D, 0x4E, 0x5F, 0x30, 0x55, 0x00, 0x0F, 0x96, 0x01, 0x20, 0x53, 0x4C, 0xD3, 0x42, 0x80, 0x53, 0x09, 0x69, 0x63, 0x31, 0x80, 0x3C, 0x0F, 0x07, 0xFF, 0x00, 0x41, 0x03, 0xF9, 0x7E, 0xE0, 0x2D, 0x5B, 0x82, 0x1F, 0x00, 0x20, 0xEF, 0x2F, 0x63, 0x80, 0x42, 0xF1, 0x2B, 0xE0, 0x71, 0x99, 0xCF, 0x23, 0xC1, 0x27, 0x80, 0x3F, 0x70, 0x61, 0x65, 0xC3, 0x60, 0xDB, 0x50, 0x07, 0x67, 0x72, 0x70, 0x31, 0x3C, 0x97, 0x31, 0x33, 0x0C, 0x47, 0x72, 0x6F, 0x75, 0x3C, 0x8F, 0x7F, 0xE7, 0x67, 0x72, 0xE3, 0x51, 0x07, 0x30, 0x23, 0x34, 0x57, 0x47, 0x5F, 0x41, 0xCF, 0xD3, 0x3F, 0xCF, 0xF1, 0xF1, 0x17, 0xF1, 0xD7, 0x30, 0x5F, 0x3F, 0xDF, 0x47, 0x5F, 0x42, 0xCF, 0x6D, 0xF9, 0x3F, 0xE7, 0x00, 0x90, 0x2B, 0xD4, 0x9F, 0x3F, 0xFB, 0xF1, 0x7F, 0x67, 0x72, 0x50, 0xC7, 0xAB, 0x01, 0x32, 0xBF, 0x3C, 0x22, 0xBC, 0x22, 0x00, 0x02, 0xBF, 0xC8, 0x82, 0xBF, 0x3D, 0x7F, 0x59, 0x07, 0x64, 0xBB, 0x2D, 0x2F, 0xFF, 0x2F, 0x08, 0x00, 0x4F, 0x34, 0xA1, 0xD1, 0x32, 0xF3, 0x2F, 0xFF, 0x78, 0x2F, 0xFB, 0x33, 0x64, 0x73, 0x62, 0xAD, 0xD5, 0x62, 0xD2, 0x80, 0x10, 0x31, 0xF0, 0x10, 0x32, 0xF0, 0x21, 0x33, 0x63, 0x05, 0x38, 0x4C, 0x54, 0x90, 0x3E, 0x30, 0x0B, 0x70, 0x39, 0x4C, 0x54, 0x4D, 0x38, 0x61, 0x73, 0x3C, 0xCC, 0x63, 0x2D, 0x33, 0x2B, 0xA8, 0x06, 0x00, 0x2A, 0x00, 0x0B, 0x2F, 0xFF, 0x38, 0x2F, 0xFF, 0x88, 0x2F, 0xFB, 0x08, 0xAA, 0x2F, 0xF4, 0x88, 0x2F, 0xF8, 0x08, 0x2F, 0xD4, 0x88, 0x2F, 0xD8, 0x4C, 0xA9, 0x2F, 0x10, 0xE8, 0x2F, 0x14, 0xAC, 0x23, 0x74, 0x48, 0x05, 0x2F, 0xD7, 0xDB, 0x20, 0x2F, 0x00, 0x35, 0x47, 0xAA, 0x53, 0x57, 0x00, 0x83, 0x53, 0x02, 0x00, 0xA3, 0x53, 0x00, 0x35, 0x57, 0xB6, 0x00, 0xB3, 0xA3, 0xD5, 0x20, 0xB3, 0x00, 0xB3, 0xA3, 0x40, 0x24, 0x20, 0x30, 0x03, 0x11, 0x86, 0x2F, 0xFB, 0x74, 0x06, 0x00, 0x04, 0x30, 0x03, 0x30, 0x0B, 0x65, 0x1E, 0x06, 0x00, 0x01, 0x30, 0x03, 0x30, 0x17, 0x31, 0x87, 0x5E, 0x03, 0x05, 0x9B, 0x2F, 0x47, 0x4F, 0x5F, 0x31, 0x32, 0x01, 0xB0, 0x7F, 0x01, 0x03, 0xE0, 0x7F, 0xD2, 0xB5, 0x07, 0x00, 0x00, 0x8C, 0x8C, 0x8C, 0x05, 0xA0, 0x7F, 0x00, 0x16, 0x97, 0x00, 0xF1, 0x7F, 0x7C, 0x03, 0x03, 0xC1, 0x7F, 0x00, 0x16, 0xD7, 0x45, 0xA7, 0x2F, 0xB4, 0x00, 0x25, 0xA7, 0x80, 0x3F, 0xB0, 0x23, 0x44, 0x04, 0x25, 0xA3, 0x30, 0x03, 0x06, 0x00, 0x06, 0x06, 0x0C, 0x73, 0x09, 0xED, 0xBE, 0x30, 0x03, 0x3F, 0xFB, 0x3A, 0x57, 0x37, 0xDE, 0x40, 0x30, 0x03, 0xE0, 0x13, 0xC0, 0x30, 0x03, 0x00, 0x75, 0xD3, 0x78, 0x54, 0x00, 0x10, 0x04, 0x00, 0x01, 0x10, 0x04, 0x10, 0x02, 0xA0, 0xA2, 0x37, 0x46, 0xF2, 0x37, 0x26, 0x06, 0x02, 0x05, 0x66, 0xF9, 0x23, 0x33, 0x00, 0x12, 0x43, 0x4D, 0x5F, 0x00, 0x35, 0xB6, 0x00, 0x36, 0x6A, 0x80, 0xEA, 0x23, 0x77, 0x61, 0x05, 0x26, 0x67, 0x30, 0x03, 0x30, 0x8E, 0xE3, 0xBE, 0x30, 0x03, 0xF7, 0xB0, 0xBF, 0xE0, 0x13, 0xC0, 0xBF, 0x50, 0xA7, 0x00, 0x00, 0xC0, 0xA7, 0x00, 0x21, 0x5F, 0xCF, 0x5F, 0x86, 0x01, 0xB1, 0x5F, 0x2F, 0xA1, 0xBD, 0xBF, 0x30, 0x03, 0x3F, 0xF7, 0xCE, 0x1B, 0x95, 0x17, 0x41, 0x30, 0x03, 0xE0, 0x13, 0xC1, 0x30, 0x03, 0x05, 0x21, 0x5F, 0xC3, 0x00, 0x00, 0xC3, 0x01, 0x31, 0x5F, 0x61, 0x0B, 0xB6, 0xBF, 0x30, 0x03, 0xB0, 0xBF, 0xFF, 0xE0, 0x13, 0xC0, 0xBF, 0x02, 0x61, 0x5F, 0xCD, 0xF7, 0x01, 0xB2, 0xBF, 0x3F, 0xF7, 0x50, 0x03, 0x5D, 0xA7, 0xFF, 0x50, 0x03, 0xC0, 0x13, 0x4F, 0xF7, 0x05, 0x22, 0xBF, 0x00, 0x00, 0xC3, 0x01, 0x32, 0xBF, 0x3F, 0xE3, 0x3F, 0xE7, 0xFF, 0xB0, 0xBF, 0xE0, 0x13, 0xC0, 0xBF, 0x01, 0xF2, 0xBF, 0x03, 0x59, 0x73, 0x57, 0x87, 0x00, 0x59, 0x73, 0x00, 0x1C, 0x63, 0xFA, 0x99, 0x1F, 0x40, 0x03, 0x00, 0x79, 0x1F, 0x3F, 0x93, 0xC9, 0x73, 0xA0, 0x4E, 0xC7, 0xF5, 0xC7, 0x00, 0x84, 0xD3, 0x70, 0x53, 0x46, 0x31, 0x32, 0x00, 0x63, 0x2F, 0x58, 0x2F, 0xFA, 0x9F, 0x41, 0x05, 0x4F, 0xF1, 0x00, 0x00, 0xCD, 0xCC, 0x4C, 0x28, 0x36, 0x3F, 0x80, 0x3F, 0x50, 0x07, 0x40, 0x0F, 0x4A, 0x9B, 0x50, 0x07, 0x9F, 0xEC, 0xE0, 0x0B, 0xFB, 0x40, 0x03, 0x00, 0x0A, 0x1B, 0x2A, 0xC3, 0x00, 0xA4, 0xB7, 0x60, 0xFB, 0x20, 0x01, 0xC0, 0xA7, 0x27, 0x62, 0xEC, 0x01, 0x00, 0xA7, 0x8A, 0x1B, 0x81, 0x2F, 0x91, 0x00, 0x84, 0xA3, 0x71, 0x83, 0x10, 0xF4, 0x5D, 0xBF, 0x01, 0xC1, 0x2F, 0x07, 0x04, 0xD1, 0x2F, 0x00, 0x80, 0xA7, 0x01, 0xF1, 0x2F, 0x08, 0x02, 0x41, 0x2F, 0xF7, 0x00, 0x5D, 0x8B, 0xE1, 0xB7, 0xEB, 0xD7, 0x00, 0xD2, 0x5F, 0x09, 0x04, 0xD2, 0x5F, 0x00, 0xB0, 0xA7, 0x01, 0xC3, 0x07, 0x7B, 0x0A, 0x01, 0xE2, 0x5F, 0x92, 0xE7, 0x00, 0x1F, 0xFB, 0x5F, 0xC7, 0xF8, 0x25, 0x6F, 0x3D, 0x07, 0x5A, 0xA0, 0x00, 0x68, 0x1F, 0x10, 0x43, 0xE3, 0x00, 0x5D, 0x03, 0x50, 0x43, 0x83, 0x00, 0x3F, 0x00, 0x44, 0x6D, 0x03, 0x30, 0x0F, 0x3E, 0x2B, 0x30, 0x0F, 0x2D, 0x03, 0x6D, 0x83, 0x3D, 0x03, 0x08, 0x6D, 0x83, 0x00, 0xC3, 0x67, 0x00, 0x70, 0x7F, 0x4D, 0x83, 0x41, 0xFE, 0xAF, 0x7F, 0x01, 0x01, 0x4D, 0x83, 0x00, 0x3E, 0x0B, 0x00, 0x1A, 0xEB, 0x01, 0x94, 0xEB, 0x00, 0x10, 0x87, 0x5F, 0xE9, 0x00, 0xEE, 0x0B, 0xBB, 0x7E, 0x8B, 0x01, 0x50, 0x7F, 0xFA, 0xEB, 0x02, 0xB0, 0x7F, 0x03, 0x8E, 0x8B, 0x9E, 0x7B, 0xDF, 0xFE, 0x9B, 0x00, 0x02, 0x0F, 0x03, 0x3F, 0x13, 0x00, 0x1A, 0xF3, 0x01, 0x91, 0x8F, 0x00, 0x12, 0x0F, 0x2A, 0x3A, 0xAF, 0x04, 0x8F, 0x13, 0xDC, 0x00, 0x2F, 0x13, 0x0C, 0x4F, 0x13, 0xD6, 0xB7, 0xFD, 0x97, 0xFD, 0x57, 0xFF, 0xFC, 0xE7, 0xFC, 0x77, 0xFC, 0x07, 0xFB, 0x97, 0xFA, 0xE3, 0xFA, 0x57, 0xF9, 0xA3, 0xF9, 0x17, 0xDD, 0xF8, 0x63, 0x3F, 0xEF, 0xCC, 0x00, 0x2F, 0xB3, 0x3E, 0x8F, 0x0A, 0x30, 0xCB, 0x2C, 0x41, 0xA7, 0x73, 0x43, 0xCF, 0x1B, 0x37, 0x0D, 0xF8, 0x5F, 0x67, 0x72, 0x56, 0xFF, 0x03, 0x40, 0x02, 0x04, 0x40, 0x00, 0x78, 0x80, 0x80, 0x34, 0x8F, 0x00, 0x00, 0x60, 0x0A, 0x2B, 0xA1, 0x20, 0x0B, 0xEF, 0x80, 0x80, 0xEF, 0xEF, 0x00, 0xFF, 0xF8, 0x0B, 0xBF, 0x70, 0x01, 0xFF, 0xF6, 0x82, 0x8F, 0xA5, 0x20, 0x00, 0x88, 0x40, 0x30, 0x50, 0x27, 0x1C, 0x0F, 0xCF, 0x00, 0x01, 0x30, 0x20, 0x0B, 0x30, 0x03, 0x38, 0x56, 0x4F, 0x99, 0x01, 0x87, 0x00, 0x05, 0xFD, 0xFC, 0x0B, 0x0A, 0x3F, 0xA5, 0x86, 0x3F, 0xA9, 0xFC, 0xFC, 0x0A, 0x0A, 0x30, 0x03, 0x2F, 0xE5, 0x83, 0x09, 0x00, 0x00, 0xF7, 0xF7, 0x3F, 0x30, 0xBF, 0xFF, 0x31, 0x9A, 0xC0, 0x20, 0x0B, 0x20, 0x0F, 0xFF, 0x9F, 0xCF, 0xFF, 0x1F, 0x2F, 0x20, 0xF6, 0x60, 0xAF, 0xD3, 0x81, 0x00, 0x00, 0xF3, 0xF3, 0x49, 0x01, 0x22, 0xD0, 0xCF, 0xFF, 0x30, 0x05, 0xF3, 0xF3, 0x40, 0x03, 0x04, 0x28, 0x00, 0x00, 0x5F, 0x5F, 0x40, 0x5F, 0x88, 0xFE, 0x1C, 0xCA, 0xFF, 0xCC, 0x30, 0x0B, 0x40, 0x0F, 0x7F, 0xEC, 0x88, 0x00, 0x19, 0x88, 0xFF, 0xCC, 0x2F, 0xEC, 0x30, 0x07, 0xCF, 0xFF, 0x22, 0x0E, 0x2E, 0xFC, 0xFC, 0x30, 0x7D, 0x0C, 0x22, 0xE0, 0x30, 0x03, 0x20, 0x1F, 0x06, 0x00, 0xFF, 0xCC, 0x0D, 0x0A, 0x00, 0x30, 0x00, 0x88, 0x3E, 0x60, 0x60, 0x50, 0xE7, 0x3F, 0xFD, 0x30, 0x0B, 0x40, 0x0F, 0x30, 0x3F, 0xCD, 0xC8, 0x20, 0x37, 0x50, 0x47, 0xCC, 0x02, 0x2D, 0xC7, 0x34, 0xFF, 0x33, 0xB5, 0x41, 0x0F, 0x33, 0x30, 0x07, 0x40, 0x3F, 0x0E, 0x30, 0xC7, 0x84, 0x25, 0xEB, 0x7C, 0xF8, 0x4F, 0xF3, 0x2F, 0xBF, 0x50, 0x0B, 0x20, 0x0F, 0x2F, 0x88, 0xAF, 0xFF, 0x60, 0x00, 0x30, 0xE7, 0x5F, 0xF7, 0x8E, 0xBF, 0xFF, 0x0E, 0x1E, 0x28, 0xF7, 0x70, 0x32, 0x84, 0xBF, 0x40, 0xC7, 0x00, 0x82, 0x00, 0x27, 0x00, 0xF4, 0x40, 0xC7, 0x4F, 0x4F, 0x3F, 0xF1, 0x50, 0xD7, 0x30, 0x0B, 0x80, 0x40, 0x0F, 0x80, 0x00, 0x88, 0xF1, 0xE1, 0xFF, 0xEF, 0x86, 0x70, 0x7F, 0xE1, 0xE1, 0x7F, 0x7F, 0x30, 0x03, 0xE0, 0xDF, 0xDC, 0x01, 0x00, 0x15, 0x00, 0x00, 0xEF, 0xFF, 0x05, 0x40, 0x41, 0x89, 0x3F, 0xFA, 0xD3, 0x40, 0xDF, 0x2E, 0xDE, 0xFD, 0xFA, 0x00, 0x0E, 0x2F, 0x9C, 0x2F, 0xD5, 0x07, 0x09, 0x01, 0xAA, 0xDD, 0x21, 0xEB, 0x31, 0xEF, 0x01, 0x01, 0x60, 0x60, 0x25, 0x5F, 0x40, 0x0F, 0xFF, 0x70, 0x00, 0xDE, 0x01, 0xC0, 0x30, 0x0B, 0x39, 0x89, 0xFF, 0xF6, 0x1C, 0xCF, 0x50, 0x00, 0x01, 0xFF, 0xF5, 0x30, 0x31, 0xFF, 0xFF, 0x5C, 0x46, 0xB7, 0x40, 0x50, 0x5F, 0xDF, 0xF5, 0xFF, 0xFF, 0x40, 0x00, 0xEE, 0x70, 0x10, 0xF1, 0xEF, 0x41, 0xFF, 0x2F, 0xFF, 0xFC, 0xFD, 0x0A, 0x0B, 0x30, 0xEB, 0x10, 0x30, 0x88, 0x51, 0xEF, 0x2F, 0x2F, 0x00, 0x00, 0xCA, 0x30, 0x03, 0x51, 0xFF, 0xE6, 0x10, 0x30, 0x0F, 0x2E, 0x2F, 0xFF, 0xF5, 0x40, 0x50, 0x30, 0xC7, 0xF5, 0x40, 0x02, 0x1D, 0xF3, 0xF2, 0x68, 0xDF, 0x20, 0x54, 0x7F, 0xC3, 0xF4, 0x2F, 0xB9, 0x00, 0x00, 0xD4, 0xEE, 0x41, 0xFB, 0xB1, 0xEF, 0x32, 0x0B, 0x4E, 0xB6, 0xBA, 0xF1, 0xEF, 0x20, 0x79, 0x00, 0x1E, 0x00, 0xEB, 0x10, 0x31, 0xFF, 0x34, 0x07, 0x00, 0x01, 0xEF, 0xB1, 0xFF, 0x00, 0x03, 0xEE, 0x11, 0xFF, 0x35, 0xFF, 0x33, 0x30, 0xF7, 0x21, 0xF2, 0x40, 0x33, 0x3F, 0xFF, 0x57, 0xFF, 0x55, 0xFF, 0xEE, 0x11, 0x16, 0xEE, 0x11, 0x55, 0x60, 0x07, 0x06, 0x87, 0x26, 0x51, 0xEF, 0x55, 0x06, 0xFF, 0x04, 0x0D, 0xEE, 0x11, 0x34, 0x61, 0x32, 0x0B, 0xE7, 0x04, 0x10, 0x1E, 0x1E, 0x00, 0x00, 0x30, 0x03, 0xF6, 0x60, 0x40, 0xCF, 0x2F, 0x0E, 0xF6, 0x50, 0x1E, 0x1F, 0x00, 0x00, 0x41, 0x1D, 0xAF, 0xC4, 0x01, 0x1C, 0xF3, 0xF3, 0xCF, 0x21, 0x2C, 0x97, 0x71, 0xEF, 0xF5, 0x50, 0x37, 0xFB, 0xE4, 0x42, 0x0B, 0x30, 0xC7, 0x61, 0xEF, 0x41, 0x6F, 0x7F, 0xF7, 0xE1, 0xF1, 0xAF, 0xFF, 0xD1, 0x20, 0x97, 0xC1, 0x70, 0x7F, 0x9F, 0x73, 0xF9, 0xFB, 0x10, 0x90, 0xFE, 0x20, 0x9D, 0x40, 0x65, 0x30, 0x9F, 0x01, 0xFB, 0xFF, 0x9F, 0x0B, 0x7C, 0xD8, 0x33, 0xB3, 0x2C, 0x8C, 0x06, 0x5B, 0xDA, 0x00, 0x4C, 0xD2, 0x43, 0x4C, 0x49, 0x08, 0x4D, 0xFF, 0xFE, 0x14, 0x2F, 0xFA, 0x02, 0x02, 0x28, 0xC1, 0x29, 0xF7, 0x3B, 0x5D, 0x69, 0x6D, 0x61, 0x67, 0x10, 0x4C, 0x9C, 0x18, 0x10, 0x00, 0x0D, 0x62, 0x33, 0x06, 0xD0, 0x01, 0x20, 0xA0, 0x00, 0x54, 0x71, 0x23, 0xDF, 0xFF, 0x33, 0xBF, 0xC0, 0x2E, 0xCB, 0xC0, 0xC0, 0x07, 0xAF, 0x9F, 0x00, 0x00, 0x9F, 0x20, 0x03, 0x73, 0x97, 0x80, 0x07, 0x81, 0xFF, 0xC0, 0x78, 0x00, 0x02, 0xFF, 0xFC, 0x3E, 0x4F, 0x9B, 0x87, 0x3F, 0xEE, 0x90, 0x90, 0xDF, 0xDF, 0x30, 0x03, 0x01, 0x9D, 0xDF, 0x50, 0x6F, 0xCA, 0x30, 0x6B, 0x40, 0x6F, 0x00, 0xB0, 0x44, 0x93, 0xDF, 0x22, 0x07, 0xD7, 0x3E, 0x00, 0xEE, 0x00, 0x0E, 0xCE, 0x42, 0x17, 0x20, 0x17, 0x70, 0x07, 0x40, 0x6F, 0x80, 0x81, 0x90, 0x6F, 0xC5, 0xFF, 0xCF, 0x7F, 0xDE, 0x00, 0x95, 0x9D, 0xEE, 0xC1, 0x7F, 0x63, 0x53, 0x71, 0x7F, 0x20, 0x71, 0x7F, 0xC2, 0xCF, 0x06, 0xB1, 0x8B, 0x50, 0xB0, 0xA8, 0x42, 0x70, 0x28, 0x4E, 0x2E, 0x06, 0x10, 0x00, 0x43, 0xFD, 0x89, 0x3A, 0xAF, 0x76, 0x00, 0x98, 0x6F, 0xC8, 0xCE, 0x47, 0x2D, 0xA3, 0x08, 0xFF, 0x7A, 0xFF, 0x45, 0x4F, 0xFE, 0xAA, 0x00, 0xBB, 0xA2, 0x4A, 0xCF, 0xBB, 0x50, 0x07, 0xFF, 0x23, 0xEF, 0x42, 0xB3, 0xFF, 0x11, 0x21, 0xFF, 0x53, 0x4F, 0xFF, 0x9A, 0x00, 0x68, 0x4A, 0xEF, 0x41, 0x24, 0x25, 0x1B, 0xFF, 0xAD, 0xFF, 0xFF, 0xC8, 0x3A, 0xFB, 0x68, 0xB3, 0x20, 0x0B, 0x2E, 0xA1, 0xFA, 0x56, 0x77, 0x27, 0xFF, 0x00, 0x7E, 0x4B, 0x85, 0x3F, 0x7B, 0xA7, 0x26, 0x8B, 0x2E, 0x0D, 0xB3, 0xC2, 0x07, 0xC0, 0x0A, 0x21, 0x1C, 0xF6, 0x22, 0xFF, 0x26, 0xC5, 0x86, 0x4F, 0x7F, 0xFD, 0x22, 0xFF, 0x46, 0x32, 0x4F, 0x7A, 0x43, 0xFF, 0x97, 0x6B, 0xE7, 0x37, 0x3B, 0x10, 0x03, 0xE7, 0xF2, 0xF4, 0xFF, 0xFF, 0xFC, 0x2F, 0x94, 0x30, 0x03, 0xA0, 0x9F, 0x9B, 0xDF, 0xAF, 0xA6, 0x0C, 0x09, 0xFF, 0x4F, 0x02, 0x00, 0x00, 0xFF, 0xAD, 0xBF, 0x04, 0x28, 0xFF, 0x00, 0x22, 0x6C, 0x03, 0x07, 0xE0, 0xF8, 0xD6, 0x00, 0xDD, 0x00, 0x48, 0x71, 0xDD, 0xD0, 0x26, 0x03, 0x61, 0xEF, 0x54, 0x00, 0x3D, 0x1D, 0xFF, 0xB8, 0xFF, 0xFE, 0x12, 0x00, 0x00, 0x51, 0x41, 0xEF, 0xFD, 0xA0, 0x97, 0x7F, 0x10, 0x06, 0x00, 0xFE, 0xFC, 0x10, 0xA0, 0x23, 0xF1, 0x6F, 0xFF, 0x2C, 0x01, 0xEF, 0x00, 0x03, 0xFF, 0xFF, 0x1E, 0x8F, 0xA1, 0x1B, 0x50, 0xEF, 0x21, 0x1F, 0xAF, 0x05, 0x94, 0x99, 0xA1, 0xF2, 0x00, 0x00, 0x70, 0xF2, 0x20, 0x03, 0x85, 0x89, 0x40, 0xD7, 0x37, 0xFF, 0x01, 0xBE, 0x88, 0x4D, 0xAF, 0x58, 0x00, 0x23, 0x4F, 0x7B, 0x64, 0xFF, 0xA7, 0x8B, 0x47, 0xE7, 0xDC, 0xFF, 0xED, 0x79, 0xA0, 0xDE, 0x28, 0x80, 0x30, 0xD2, 0x22, 0xCC, 0xFF, 0x50, 0xCF, 0x21, 0x00, 0x32, 0x42, 0xDF, 0x33, 0x47, 0x00, 0x26, 0x52, 0x73, 0x30, 0xFB, 0x3F, 0xB3, 0x40, 0x04, 0x63, 0x3F, 0x4C, 0x12, 0x38, 0x27, 0x7A, 0xEF, 0x35, 0x94, 0x72, 0xEF, 0x8E, 0xFF, 0x0B, 0xFF, 0x2F, 0x05, 0x4D, 0x2F, 0xCA, 0x6B, 0x03, 0xE4, 0x0C, 0x00, 0xB5, 0xFF, 0x74, 0x40, 0x29, 0xD4, 0x07, 0x55, 0xFF, 0x08, 0xC0, 0x7F, 0x91, 0x4A, 0x8B, 0x99, 0x00, 0x7E, 0x99, 0x5F, 0xB7, 0x5A, 0x97, 0x8F, 0xC7, 0x70, 0x17, 0x60, 0x1F, 0x8F, 0xE7, 0x56, 0x1B, 0xFF, 0x55, 0x01, 0x37, 0x97, 0x90, 0x1F, 0x78, 0x4F, 0xFF, 0x27, 0xC0, 0x9B, 0x4A, 0x27, 0x97, 0xFF, 0x2A, 0xA7, 0x27, 0x85, 0x35, 0x26, 0xBF, 0x24, 0x07, 0x88, 0x3F, 0xFF, 0x8B, 0xFF, 0x03, 0x44, 0x10, 0xC6, 0x00, 0xFF, 0x68, 0xD4, 0x80, 0x5F, 0x3F, 0xF0, 0x17, 0x9F, 0xF5, 0xEF, 0xFF, 0x07, 0x66, 0xCF, 0x45, 0x6F, 0x2B, 0x77, 0x3E, 0xEF, 0x3B, 0x7D, 0xAF, 0xF5, 0x30, 0x22, 0x20, 0xFB, 0x5F, 0x87, 0xF3, 0xF9, 0xF8, 0x90, 0x3F, 0x31, 0x4C, 0xB7, 0x22, 0x97, 0x00, 0x75, 0x85, 0xBF, 0x2F, 0xFF, 0xAF, 0x0D, 0x08, 0xFF, 0x9E, 0xFF, 0x45, 0x4F, 0x79, 0xA9, 0x00, 0x9A, 0xA2, 0x45, 0xBF, 0x89, 0x55, 0xA7, 0xFF, 0x22, 0xFF, 0x3E, 0x9F, 0x00, 0x0A, 0xFF, 0x75, 0xFF, 0xDA, 0x4F, 0xE3, 0x23, 0x35, 0xB7, 0x5E, 0x83, 0x8A, 0x8F, 0xFF, 0xFF, 0x7F, 0x8F, 0x52, 0x23, 0x0C, 0x0D, 0x92, 0x31, 0xEF, 0xE1, 0xEF, 0xE1, 0xFF, 0x7F, 0xC7, 0x02, 0x2D, 0x07, 0x30, 0x03, 0xF0, 0x0F, 0x01, 0x1D, 0xA6, 0x83, 0x45, 0x3E, 0x00, 0xFB, 0xB0, 0xFF, 0xFF, 0x25, 0x13, 0x4C, 0x5F, 0x9D, 0x5F, 0xFB, 0xF2, 0xD0, 0x28, 0x8B, 0x25, 0x31, 0x77, 0x11, 0x0D, 0xA5, 0x1B, 0xC1, 0x96, 0x44, 0x2D, 0x69, 0xFB, 0x01, 0x07, 0xF8, 0xF2, 0x86, 0x45, 0x04, 0x0E, 0x50, 0x00, 0x2F, 0x3F, 0x2C, 0x87, 0xE5, 0xFF, 0x09, 0xFF, 0x20, 0x00, 0xFA, 0x2D, 0xB1, 0x0D, 0x6F, 0x76, 0x87, 0x0E, 0x18, 0xEF, 0x00, 0x38, 0x77, 0x77, 0xC2, 0x5F, 0xAE, 0x4B, 0x6B, 0x1E, 0xFF, 0x01, 0xAF, 0x47, 0xCF, 0x4C, 0x6F, 0x26, 0x89, 0x00, 0x3E, 0x67, 0x3A, 0xE5, 0x0D, 0xB4, 0x2F, 0x04, 0xF1, 0xFF, 0x7F, 0xEB, 0xA0, 0xB0, 0x2C, 0x0D, 0xF4, 0x79, 0x7C, 0x0E, 0x00, 0x60, 0xFB, 0xFF, 0x28, 0x32, 0x00, 0xB0, 0x01, 0x24, 0x07, 0x4F, 0x3C, 0x08, 0x2F, 0x2C, 0x6F, 0x2E, 0xDD, 0xBD, 0xFE, 0xDB, 0x59, 0x00, 0xD8, 0xAD, 0x5E, 0x97, 0xA5, 0x37, 0x87, 0x61, 0x00, 0x17, 0x9F, 0x38, 0x93, 0x40, 0x96, 0x9E, 0xA5, 0x7D, 0xDF, 0xFE, 0x28, 0xAF, 0xD0, 0xE1, 0x39, 0xF1, 0x1A, 0x27, 0x87, 0xD8, 0x2F, 0xF7, 0x2F, 0xE3, 0x3F, 0x2B, 0x55, 0x98, 0xBE, 0x04, 0x07, 0xFF, 0x34, 0xFF, 0x08, 0x4F, 0x09, 0x0E, 0x13, 0xFF, 0x20, 0x4A, 0xBF, 0x22, 0x00, 0x47, 0x22, 0xC3, 0xEF, 0xDE, 0xFF, 0xDD, 0x55, 0x42, 0x60, 0x17, 0x30, 0x1F, 0x80, 0x49, 0x23, 0xFF, 0xED, 0xFF, 0x00, 0x31, 0x00, 0x95, 0xC9, 0x7A, 0xDB, 0x60, 0x37, 0xEE, 0x12, 0x2F, 0x61, 0x50, 0xFD, 0xDA, 0x11, 0x09, 0xFF, 0xBD, 0xFF, 0x69, 0x45, 0xE7, 0x14, 0x6B, 0x9B, 0x0F, 0x0D, 0x8E, 0x5E, 0x01, 0x9F, 0x6C, 0x52, 0x00, 0x1C, 0x2A, 0x35, 0x2E, 0xEF, 0x89, 0x2F, 0x03, 0xAD, 0x00, 0x47, 0x5A, 0x6F, 0xFD, 0x74, 0x4F, 0x9F, 0x1E, 0xB9, 0xFF, 0xDC, 0x4F, 0xFF, 0x28, 0x6C, 0x2B, 0xB2, 0x4F, 0x57, 0xBB, 0x6A, 0xFF, 0x2B, 0xAA, 0x2D, 0x64, 0x10, 0x60, 0xB7, 0x32, 0x35, 0xDC, 0x10, 0x15, 0x00, 0xB4, 0xEC, 0x2F, 0xD7, 0xF9, 0x7B, 0x78, 0xEF, 0x68, 0x9F, 0x10, 0x8B, 0xFF, 0x25, 0xAB, 0x8F, 0x6D, 0xFF, 0x8F, 0x02, 0x5F, 0x00, 0x3F, 0xCD, 0x6C, 0x01, 0xEC, 0xAC, 0xCE, 0x7F, 0x2E, 0xAB, 0xDE, 0x7F, 0x68, 0x7F, 0xC0, 0x9D, 0x2E, 0x04, 0x0E, 0x88, 0xFF, 0xEF, 0xEF, 0x8A, 0xAF, 0x8E, 0x00, 0x47, 0x24, 0xDD, 0x78, 0xDD, 0x77, 0x33, 0x11, 0x01, 0x33, 0x11, 0x8D, 0x7D, 0x13, 0x13, 0x7D, 0x20, 0x03, 0xBF, 0x8A, 0xBF, 0x77, 0x50, 0x17, 0x70, 0x07, 0xFF, 0x49, 0x30, 0x2B, 0xB0, 0x2F, 0xF0, 0x0F, 0xB7, 0x01, 0xB9, 0x7F, 0xA8, 0x6D, 0xEA, 0x7F, 0x7F, 0x10, 0x6F, 0x7F, 0x27, 0xB0, 0x04, 0xA1, 0x00, 0xA0, 0x0D, 0xB0, 0x01, 0x02, 0x60, 0xED, 0x61, 0xFF, 0x2C, 0xFF, 0xBE, 0x35, 0xFF, 0xF0, 0x3E, 0xB7, 0x00, 0xC0, 0xFF, 0x19, 0x00, 0x21, 0x1D, 0x01, 0x28, 0xFA, 0x18, 0xCC, 0xFF, 0x3A, 0x3B, 0x92, 0x40, 0x3F, 0x17, 0xFF, 0x6B, 0x8D, 0x27, 0x4C, 0x84, 0xFF, 0xE9, 0xBD, 0xB9, 0x3C, 0xB8, 0xFD, 0x23, 0x34, 0xE2, 0x30, 0x62, 0x4C, 0xDA, 0x40, 0x13, 0xF7, 0xFF, 0xF1, 0x20, 0x03, 0xEF, 0x08, 0xFF, 0xE8, 0xFF, 0xE0, 0x20, 0x03, 0xE1, 0xFF, 0xD9, 0x38, 0xFF, 0xD3, 0x50, 0x95, 0x2E, 0xE1, 0x21, 0x87, 0x57, 0xFF, 0x86, 0x34, 0xFF, 0xD1, 0x93, 0x69, 0x30, 0x41, 0xFA, 0x31, 0x9F, 0xAC, 0xFF, 0x44, 0xC7, 0x41, 0xA5, 0xD9, 0xFF, 0xE4, 0x50, 0x5B, 0xF6, 0xFF, 0x41, 0xF2, 0x20, 0x5D, 0xFB, 0xFF, 0xEE, 0xFF, 0xEA, 0x2F, 0x23, 0x54, 0xF5, 0x20, 0x05, 0xE4, 0x23, 0x97, 0xEA, 0x2E, 0x2E, 0xDA, 0xFF, 0x10, 0xDB, 0xFF, 0xD5, 0x2C, 0x6E, 0xC6, 0xFF, 0xD0, 0xFF, 0x05, 0xCB, 0xFF, 0xC1, 0xFF, 0xBC, 0x27, 0xE7, 0xE1, 0x20, 0x11, 0x41, 0xD2, 0x24, 0x7A, 0xDA, 0xFF, 0xCD, 0xFF, 0xCA, 0x20, 0x19, 0x04, 0xC1, 0xFF, 0xB7, 0xFF, 0xB3, 0x20, 0xFE, 0xBA, 0xFF, 0x14, 0xAF, 0xFF, 0xAB, 0x05, 0xD1, 0xFF, 0x5F, 0x62, 0x6D, 0x03, 0xFF, 0x51, 0x29, 0x20, 0xC2, 0xC2, 0xE1, 0x7F, 0x05, 0xFF, 0x9F, 0x22, 0x8D, 0x5B, 0x07, 0x21, 0x61, 0xA7, 0x20, 0x9A, 0x5F, 0xE9, 0x8A, 0xD9, 0x48, 0x38, 0x99, 0x50, 0xFE, 0x41, 0x01, 0xF7, 0x25, 0x34, 0xEA, 0xFF, 0xE0, 0x8D, 0xA2, 0xD1, 0x73, 0xF6, 0x80, 0x27, 0xF7, 0xFF, 0xEB, 0x25, 0x56, 0xE0, 0xA8, 0x21, 0x1D, 0xE9, 0x21, 0x25, 0xDE, 0x2F, 0x4A, 0xD4, 0xFF, 0xD3, 0x28, 0xFF, 0xC9, 0x2F, 0x52, 0xD3, 0x2B, 0x3D, 0xC9, 0xFF, 0xC8, 0xA8, 0x25, 0x49, 0xBD, 0x21, 0x07, 0xFC, 0x27, 0x46, 0xF0, 0xFF, 0xE6, 0xA2, 0x20, 0x2D, 0xE2, 0x25, 0x9E, 0xD5, 0xFF, 0xE3, 0x21, 0x95, 0xD6, 0xAA, 0x2D, 0xB0, 0xD0, 0x20, 0x21, 0xC3, 0x25, 0x10, 0xDA, 0x21, 0x3B, 0xCD, 0x28, 0xFF, 0xC5, 0x21, 0x4D, 0xC4, 0x25, 0x7B, 0xB6, 0xFF, 0xBF, 0x80, 0x21, 0x3D, 0xB2, 0xFF, 0xAB, 0xFF, 0xB0, 0xFF, 0xA9, 0x0A, 0xFF, 0xA3, 0xFF, 0x9C, 0x21, 0x51, 0xC0, 0x22, 0x4A, 0xB5, 0xA8, 0x21, 0x53, 0xAE, 0x21, 0xA8, 0xA2, 0x21, 0x59, 0xAA, 0xFF, 0xA8, 0xA0, 0x20, 0xC8, 0xA0, 0x2F, 0xE0, 0x95, 0xFF, 0x8C, 0xFF, 0xA6, 0x80, 0x2B, 0x49, 0x9A, 0xFF, 0x92, 0xFF, 0x96, 0xFF, 0x8F, 0xA8, 0x25, 0x33, 0x84, 0x20, 0x05, 0x87, 0x22, 0x2C, 0x7C, 0xFF, 0x7F, 0x2A, 0xFF, 0x79, 0x2B, 0x43, 0x6E, 0x22, 0x86, 0xB8, 0x20, 0x4B, 0xAA, 0x8C, 0x20, 0x53, 0xAD, 0xFF, 0xA4, 0x21, 0x00, 0x30, 0x53, 0x96, 0xFF, 0x54, 0x90, 0x2B, 0xFF, 0x92, 0x20, 0xFC, 0x85, 0x20, 0x4B, 0xA4, 0xFF, 0x41, 0x9B, 0x20, 0x3D, 0xA0, 0xFF, 0x9D, 0xFF, 0x93, 0x20, 0x17, 0x04, 0x8D, 0xFF, 0x89, 0xFF, 0x80, 0x20, 0x3F, 0x86, 0xFF, 0x50, 0x83, 0x20, 0x41, 0x76, 0x20, 0x0D, 0x83, 0xFF, 0x7D, 0xFF, 0x14, 0x77, 0xFF, 0x7E, 0x20, 0x4F, 0x72, 0x25, 0x87, 0x72, 0xFF, 0x04, 0x6C, 0xFF, 0x67, 0xFF, 0x62, 0x40, 0x03, 0x5C, 0xFF, 0x00, 0x58, 0xFF, 0x74, 0xFF, 0x70, 0xFF, 0x69, 0xFF, 0x50, 0x65, 0x25, 0xA1, 0x6A, 0x20, 0x15, 0x5F, 0xFF, 0x5E, 0xFF, 0x04, 0x5A, 0xFF, 0x53, 0xFF, 0x50, 0x22, 0x6C, 0x54, 0xFF, 0x14, 0x4D, 0xFF, 0x4A, 0x00, 0xD3, 0xFF, 0x16, 0x24, 0x1D, 0x6B, 0xFF, 0x6A, 0x15, 0x22, 0x66, 0x72, 0xD7, 0x85, 0x2F, 0xA8, 0xED, 0x5F, 0x95, 0xF9, 0xAA, 0x2E, 0xCE, 0xF0, 0x94, 0x3F, 0x75, 0x21, 0xBF, 0xD5, 0x84, 0x4D, 0x3D, 0xD5, 0x2F, 0xD0, 0xAF, 0xAC, 0xFD, 0x22, 0xFB, 0xE8, 0x26, 0x3B, 0xE0, 0x2F, 0xE7, 0x55, 0xF8, 0x2F, 0x06, 0xF1, 0x23, 0x03, 0xD9, 0x23, 0x01, 0xD3, 0x21, 0x7F, 0x55, 0xF0, 0x28, 0xC8, 0xE6, 0x21, 0x77, 0xD6, 0x23, 0x0F, 0xCC, 0x22, 0xD1, 0x55, 0xDD, 0x21, 0x89, 0xD5, 0x22, 0xBF, 0xC3, 0x22, 0xF6, 0xBB, 0x22, 0xB1, 0x55, 0xBF, 0x21, 0x61, 0xB5, 0x22, 0xB1, 0xA8, 0x21, 0x59, 0x9F, 0x22, 0xBB, 0x55, 0xAB, 0x21, 0x69, 0xA2, 0x21, 0x5F, 0x95, 0x2D, 0x23, 0x8C, 0x42, 0xD5, 0x5A, 0xD2, 0x21, 0x9F, 0xBF, 0x21, 0x95, 0x30, 0x1B, 0xCB, 0x27, 0x21, 0xC4, 0xAA, 0x21, 0xA7, 0xB0, 0x21, 0x9D, 0xA9, 0x21, 0x9F, 0xA6, 0x21, 0x7D, 0x9E, 0xAB, 0x21, 0x7F, 0x8F, 0x23, 0xA2, 0x87, 0x21, 0x77, 0x96, 0x26, 0xB9, 0x30, 0x0B, 0x51, 0x7F, 0x21, 0x19, 0x78, 0x21, 0x7F, 0x9E, 0xFF, 0x94, 0x20, 0x01, 0x45, 0x8A, 0x26, 0xCF, 0x82, 0xFF, 0x81, 0x20, 0x11, 0x8B, 0x20, 0x05, 0x62, 0x82, 0x20, 0x19, 0x30, 0x1B, 0x6E, 0xFF, 0x66, 0x21, 0xA5, 0x71, 0xA2, 0x21, 0x41, 0x68, 0x21, 0x3D, 0x63, 0xFF, 0x60, 0x21, 0x3B, 0x66, 0xA0, 0x21, 0x41, 0x5E, 0x2D, 0xBD, 0x57, 0xFF, 0x51, 0xFF, 0x4F, 0x2A, 0xFF, 0x48, 0x21, 0xC5, 0x70, 0x20, 0x21, 0x68, 0x80, 0x17, 0x6A, 0xAA, 0x20, 0x25, 0x63, 0x21, 0x63, 0x57, 0x20, 0x1D, 0x50, 0x20, 0x1F, 0x55, 0x20, 0xFF, 0x4E, 0x20, 0x01, 0x46, 0xFF, 0x47, 0xFF, 0x40, 0x0A, 0xFF, 0x3F, 0xFF, 0x39, 0x20, 0x07, 0x3F, 0x20, 0x09, 0x39, 0xA2, 0x20, 0x09, 0x32, 0x20, 0x01, 0x2C, 0xFF, 0x5D, 0x23, 0xF6, 0x53, 0xC0, 0x20, 0x23, 0x30, 0x03, 0x49, 0xFF, 0x44, 0xFF, 0x4B, 0xFF, 0x10, 0x45, 0xFF, 0x42, 0x21, 0x3E, 0x40, 0xFF, 0x3C, 0xFF, 0x05, 0x38, 0xFF, 0x34, 0xFF, 0x4A, 0x20, 0x39, 0x41, 0x21, 0x4E, 0x50, 0x43, 0x20, 0x05, 0x3B, 0x20, 0x11, 0x38, 0xFF, 0x35, 0xFF, 0x00, 0x31, 0xFF, 0x2E, 0xFF, 0x33, 0xFF, 0x30, 0xFF, 0x55, 0x2B, 0x23, 0x46, 0x3B, 0x20, 0x0F, 0x33, 0x20, 0x0F, 0x30, 0x24, 0xD2, 0x05, 0x2A, 0xFF, 0x26, 0xFF, 0x2D, 0x2B, 0x94, 0x27, 0x2D, 0xA5, 0x01, 0x23, 0xFF, 0x20, 0xFF, 0x1E, 0xFF, 0x1B, 0x23, 0x68, 0x50, 0x26, 0x40, 0x0B, 0x24, 0x2D, 0xB9, 0x1E, 0xFF, 0x1C, 0xFF, 0x05, 0x1D, 0xFF, 0x1A, 0xFF, 0x18, 0x21, 0xD2, 0x18, 0x24, 0xB8, 0x15, 0x13, 0xFF, 0x12, 0x33, 0x8B, 0x00, 0x20, 0x36, 0xD2, 0x6B, 0xF6, 0xB5, 0x34, 0x85, 0x00, 0x24, 0x87, 0x64, 0xB3, 0xFA, 0x2C, 0x0B, 0xEA, 0x24, 0x61, 0x55, 0xE4, 0x24, 0x57, 0xCC, 0x24, 0x59, 0xC6, 0x27, 0xFF, 0xDF, 0x24, 0x75, 0x52, 0xDA, 0x24, 0x5F, 0xC1, 0x24, 0x4D, 0xBC, 0x00, 0x22, 0xB6, 0x00, 0xC5, 0x23, 0x56, 0x43, 0x7B, 0xFE, 0xFF, 0xF2, 0x34, 0xA5, 0x00, 0x23, 0x4E, 0xAA, 0x24, 0xFD, 0xED, 0x2A, 0x35, 0xEA, 0x2C, 0x67, 0xD5, 0x24, 0xE9, 0xD2, 0xAA, 0x24, 0x91, 0xB7, 0x24, 0x8F, 0xB2, 0x29, 0x02, 0xCD, 0x24, 0xA5, 0xCA, 0xAA, 0x25, 0x7E, 0xAF, 0x24, 0x81, 0xAB, 0x25, 0x86, 0xB0, 0x23, 0x01, 0xAA, 0xAA, 0x23, 0x4B, 0x96, 0x23, 0x4D, 0x90, 0x23, 0x5B, 0xA4, 0x23, 0x09, 0x9F, 0xAA, 0x2E, 0xFF, 0x8A, 0x23, 0x35, 0x85, 0x22, 0xED, 0x7D, 0x22, 0xE9, 0x77, 0xAA, 0x22, 0xDB, 0x67, 0x22, 0xD9, 0x62, 0x22, 0xE7, 0x72, 0x23, 0x39, 0x6D, 0xAA, 0x22, 0xE3, 0x5C, 0x22, 0xE5, 0x57, 0x23, 0x6B, 0x9A, 0x23, 0x37, 0x96, 0xAA, 0x23, 0x17, 0x80, 0x23, 0x19, 0x7C, 0x23, 0x77, 0x93, 0x23, 0x29, 0x90, 0xAA, 0x25, 0x4A, 0x79, 0x23, 0x21, 0x76, 0x22, 0xFF, 0x6A, 0x23, 0x01, 0x65, 0xAA, 0x24, 0x7A, 0x53, 0x22, 0xF9, 0x50, 0x28, 0xA9, 0x62, 0x23, 0x09, 0x5F, 0xAA, 0x25, 0x6C, 0x4D, 0x23, 0x01, 0x4A, 0x21, 0x7F, 0x53, 0x25, 0x78, 0x4E, 0xA2, 0x21, 0x77, 0x42, 0x21, 0x79, 0x3D, 0xFF, 0x52, 0x21, 0x85, 0x4E, 0xAA, 0x21, 0x87, 0x40, 0x21, 0x7D, 0x3C, 0x21, 0x7F, 0x3A, 0x21, 0x69, 0x35, 0xAA, 0x21, 0x6F, 0x2D, 0x25, 0xA4, 0x28, 0x2E, 0xFD, 0x30, 0x21, 0x65, 0x2C, 0xAA, 0x41, 0x53, 0x1E, 0x21, 0x61, 0x1B, 0x21, 0x9F, 0x41, 0x21, 0xDD, 0x3D, 0xAA, 0x21, 0xAB, 0x31, 0x21, 0x99, 0x2D, 0x21, 0xA7, 0x3B, 0x21, 0xAF, 0x38, 0xAA, 0x21, 0x9F, 0x2B, 0x21, 0xA1, 0x29, 0x24, 0xE8, 0x23, 0x21, 0x95, 0x20, 0xAA, 0x21, 0x77, 0x18, 0x21, 0x79, 0x15, 0x21, 0x87, 0x1E, 0x2F, 0x43, 0x1C, 0xAA, 0x21, 0x83, 0x13, 0x23, 0x5E, 0x12, 0x2F, 0x4F, 0x1D, 0x40, 0x1B, 0x19, 0x8A, 0x23, 0x6C, 0x14, 0xFF, 0x11, 0x26, 0x72, 0x14, 0x23, 0x76, 0x11, 0xA8, 0x20, 0x09, 0x0E, 0x20, 0x01, 0x0B, 0x21, 0xA3, 0x10, 0xFF, 0x0F, 0x20, 0xFF, 0x0D, 0x40, 0x03, 0x0B, 0xFF, 0x0A, 0xFF, 0x0C, 0xAA, 0x20, 0x03, 0x09, 0x25, 0x24, 0x08, 0x25, 0x28, 0x06, 0x25, 0x32, 0x13, 0xAA, 0x20, 0x1D, 0x10, 0x20, 0x1F, 0x0C, 0x20, 0x15, 0x0A, 0x25, 0x3C, 0x0F, 0xAB, 0x20, 0x33, 0x0D, 0x20, 0x27, 0x08, 0x20, 0x1D, 0x07, 0x25, 0x52, 0x50, 0x25, 0x56, 0x04, 0x20, 0x01, 0x03, 0x25, 0x76, 0x02, 0x80, 0x07, 0x50, 0x01, 0x01, 0xAC, 0x00, 0xB9, 0x7F, 0x20, 0x2C, 0x1D, 0x03, 0x04, 0xE9, 0x7F, 0x10, 0x04, 0x80, 0x59, 0x30, 0xC2, 0x30, 0xFE, 0xE2, 0x2C, 0x3A, 0x3A, 0x46, 0x20, 0xF8, 0xE9, 0xFF, 0x0C, 0x00, 0x95, 0x00, 0xDC, 0x00, 0x3E, 0x2E, 0x03, 0x1F, 0xA9, 0x80, 0xF2, 0x18, 0x00, 0x10, 0xF9, 0x38, 0xEF, 0x4F, 0x02, 0x50, 0x90, 0xFF, 0x1F, 0xFF, 0xC0, 0xD0, 0x00, 0xDE, 0x98, 0xBF, 0x1B, 0xCB, 0xFF, 0x2F, 0x23, 0xF2, 0x7F, 0xE2, 0x4B, 0xFF, 0x01, 0xCF, 0x27, 0x10, 0x5B, 0x20, 0x2B, 0x10, 0x00, 0x11, 0x49, 0x71, 0x11, 0xFD, 0x60, 0x07, 0xF9, 0x7E, 0x70, 0x17, 0x0B, 0x10, 0x1F, 0x3A, 0x6E, 0x0C, 0xBA, 0x5C, 0x40, 0x41, 0xCD, 0x00, 0x30, 0xE3, 0xFF, 0x20, 0xF9, 0xB7, 0xFF, 0xFF, 0x00, 0xAF, 0xCF, 0x03, 0xD1, 0xF8, 0xFF, 0x7F, 0xFE, 0x00, 0xFF, 0x0C, 0x05, 0x06, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x90, 0x80, 0xED, 0xFF, 0xEE, 0xFF, 0x79, 0x0A, 0x00, 0x77, 0x00, 0xEE, 0x20, 0x07, 0x77, 0x20, 0x07, 0x00, 0x01, 0xAA, 0x00, 0x07, 0xFF, 0xFF, 0x3F, 0xCF, 0x2B, 0x90, 0x06, 0xA5, 0x00, 0x00, 0xF9, 0xF8, 0x70, 0x17, 0x80, 0x1F, 0x4A, 0x00, 0x00, 0xA0, 0x6F, 0x6F, 0xF0, 0x30, 0x00, 0x9B, 0x07, 0x00, 0x00, 0xEF, 0x23, 0x00, 0x80, 0x37, 0x80, 0x3F, 0xEA, 0x05, 0x8B, 0x00, 0x30, 0x1F, 0x80, 0xE8, 0xAB, 0x59, 0xF7, 0x59, 0x00, 0x60, 0x3F, 0x3B, 0xFC, 0xE0, 0x6B, 0xF2, 0x00, 0xE0, 0x5F, 0x00, 0x90, 0x7F, 0xA2, 0x00, 0x6A, 0xF4, 0xF3, 0x2A, 0x9F, 0x8F, 0x90, 0xBF, 0xDE, 0x20, 0xDF, 0x97, 0xDC, 0x48, 0x01, 0x00, 0x20, 0x10, 0x7B, 0xFF, 0x02, 0xAF, 0xFC, 0x30, 0x20, 0xFF, 0xFA, 0x39, 0xE3, 0x4E, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x65, 0x50, 0x01, 0xA9, 0x88, 0x05, 0x04, 0xFF, 0x02, 0xF6, 0x1E, 0x8F, 0xB0, 0x50, 0xEF, 0x00, 0x4A, 0x9F, 0x01, 0x4B, 0x05, 0x08, 0x3C, 0x8F, 0x70, 0x90, 0x21, 0xCF, 0x70, 0xA1, 0xFA, 0x41, 0x45, 0x0C, 0xFF, 0xEF, 0x02, 0x00, 0x20, 0xC5, 0x2A, 0xD9, 0x80, 0x80, 0x80, 0x30, 0x03, 0xFF, 0xFE, 0x05, 0x0B, 0xF8, 0xE1, 0x6F, 0x81, 0x2B, 0x97, 0x80, 0x90, 0x00, 0x05, 0x60, 0x00, 0x2F, 0x66, 0x00, 0xB6, 0xFF, 0xFF, 0x25, 0x06, 0x06, 0x1F, 0xF8, 0x08, 0xF8, 0x9F, 0xF8, 0xF7, 0x2F, 0x73, 0x06, 0x07, 0xBB, 0x90, 0x21, 0x06, 0xD0, 0x40, 0x3B, 0xBB, 0xB8, 0x00, 0x6F, 0x6F, 0x00, 0x70, 0xF0, 0x6F, 0x6F, 0xE0, 0xE0, 0x68, 0xDF, 0x02, 0x50, 0xA0, 0xDF, 0xDF, 0x90, 0x90, 0x20, 0x0B, 0xF0, 0x08, 0x4B, 0x00, 0xB0, 0x00, 0x20, 0x0B, 0xA0, 0x9B, 0x00, 0x00, 0x70, 0x00, 0x89, 0xFF, 0xB6, 0x8D, 0xFF, 0xFF, 0x00, 0x04, 0x03, 0xAD, 0xFD, 0x23, 0x2F, 0xF3, 0xF3, 0x24, 0x9F, 0xAF, 0x20, 0x0B, 0x04, 0xBB, 0x2D, 0xB5, 0xF3, 0xF3, 0x00, 0xAF, 0xBF, 0xB2, 0x00, 0x8B, 0x00, 0xE8, 0xB0, 0x00, 0xFF, 0xEF, 0xC0, 0xC0, 0xFF, 0xFF, 0x49, 0x10, 0x0C, 0x81, 0xFD, 0x90, 0xC1, 0x2B, 0x9B, 0x20, 0x0B, 0x90, 0x00, 0x00, 0xBB, 0x00, 0xA0, 0x21, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0xB3, 0x00, 0xCC, 0x07, 0x7C, 0xFA, 0x68, 0xAC, 0x00, 0xFB, 0x89, 0x00, 0x0A, 0x95, 0xFA, 0x5F, 0x48, 0x00, 0xF8, 0xF9, 0x03, 0x06, 0x72, 0xFA, 0xBD, 0x21, 0x00, 0x9D, 0x01, 0x17, 0x0D, 0xF9, 0xF9, 0x01, 0x00, 0x00, 0xB7, 0x00, 0x58, 0xDF, 0xDB, 0xD8, 0x4F, 0x3F, 0x00, 0x30, 0x20, 0x3A, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x01, 0x38, 0x6A, 0x4F, 0x4F, 0x20, 0x30, 0x3B, 0x2E, 0x19, 0x04, 0xFF, 0xFF, 0x4A, 0x0B, 0xBB, 0x2E, 0x18, 0x70, 0xFA, 0x00, 0xCC, 0x5E, 0xFF, 0xFF, 0x09, 0x08, 0xFA, 0xFA, 0x00, 0x8F, 0x8F, 0xF3, 0xF3, 0x8F, 0x7F, 0xFF, 0xFC, 0x00, 0x08, 0x3D, 0x91, 0x00, 0xDD, 0x00, 0xF3, 0xF9, 0x00, 0x8F, 0x9F, 0xBA, 0x00, 0x6B, 0x00, 0x00, 0xB0, 0x00, 0xC7, 0xAF, 0xF4, 0xF7, 0x6F, 0x7F, 0xDC, 0x70, 0x00, 0x19, 0xDF, 0x30, 0x30, 0xFF, 0xFF, 0xF5, 0xC0, 0x00, 0x6F, 0x9F, 0x10, 0x00, 0xD8, 0x00, 0x30, 0x60, 0x01, 0xFF, 0xEF, 0xDB, 0x12, 0x2A, 0x00, 0x31, 0x2E, 0x70, 0x20, 0x09, 0x0C, 0x34, 0xF2, 0xFF, 0xFE, 0x00, 0x10, 0xFD, 0x22, 0xFF, 0x09, 0x5B, 0xEB, 0x40, 0x40, 0xB0, 0x20, 0x2B, 0xFF, 0x0D, 0x9F, 0x1E, 0x08, 0x09, 0x20, 0x1F, 0xAE, 0x7F, 0x05, 0x09, 0xE4, 0x31, 0x08, 0x40, 0x00, 0xFF, 0xE4, 0x3F, 0x49, 0x9F, 0xFF, 0x02, 0x07, 0xBF, 0xFA, 0x30, 0xFF, 0xC8, 0x00, 0x0F, 0x49, 0x23, 0xFC, 0x24, 0x02, 0x7F, 0xEE, 0x24, 0x02, 0x40, 0x07, 0x00, 0x05, 0xFA, 0x60, 0x17, 0x70, 0x1F, 0x00, 0x05, 0xFA, 0x09, 0x90, 0x1F, 0x60, 0x87, 0xD0, 0xBF, 0x55, 0xFA, 0x20, 0xFB, 0xF9, 0xFF, 0xFF, 0x02, 0x8C, 0xAF, 0x03, 0xFF, 0x5E, 0x04, 0x10, 0x16, 0x4D, 0xE6, 0x43, 0x02, 0x4C, 0x49, 0x4D, 0xFF, 0xFE, 0x14, 0x2F, 0xFF, 0x02, 0x30, 0x02, 0x28, 0x26, 0xF7, 0x38, 0x90, 0x69, 0x6D, 0x61, 0x67, 0xA8, 0x37, 0x02, 0x80, 0x27, 0xBE, 0x0D, 0x67, 0x0F, 0x2B, 0xEA, 0x91, 0x00, 0xE1, 0x95, 0x34, 0xA7, 0x5B, 0x58, 0x01, 0xAD, 0x00, 0x9B, 0xEF, 0x2F, 0x93, 0x39, 0x5F, 0x2E, 0x47, 0x00, 0x1A, 0x26, 0x38, 0x61, 0xA5, 0x72, 0xFA, 0x4F, 0x00, 0xFE, 0x8B, 0x89, 0x49, 0xE9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static const unsigned char Nintendo_LicensedBy_LZ[0x2000] = -{ - 0x11, 0x48, 0x65, 0x00, 0x00, 0x64, 0x61, 0x72, 0x63, 0xFF, 0xFE, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x28, 0x65, 0x00, 0x00, 0x83, 0x30, 0x09, 0x32, 0x04, 0x00, 0x00, 0x60, 0x20, 0x03, 0x30, 0x13, 0xAB, 0x30, 0x18, 0x15, 0x20, 0x1D, 0x02, 0xA0, 0x0B, 0x06, 0x20, 0x2B, 0x30, 0x18, 0x5A, 0x09, 0x20, 0x35, 0x10, 0x20, 0x39, 0x30, 0x2B, 0xF8, 0x20, 0x41, 0x54, 0x85, 0x30, 0x0B, 0x05, 0x00, 0x00, 0xEC, 0x20, 0x4D, 0x98, 0x30, 0x17, 0xD0, 0x20, 0x28, 0x30, 0x17, 0xDC, 0x30, 0x23, 0x07, 0x00, 0x00, 0xCC, 0x09, 0x0C, 0x00, 0x00, 0x20, 0x20, 0x51, 0x40, 0x14, 0x20, 0x2B, 0xA0, 0x20, 0x0B, 0x64, 0x20, 0x5D, 0xA0, 0x20, 0x00, 0x00, 0x4C, 0x99, 0x20, 0x5C, 0xA8, 0x01, 0x50, 0x53, 0x20, 0x22, 0x00, 0xB2, 0x30, 0x75, 0x0A, 0x23, 0x00, 0x00, 0xB4, 0x20, 0x74, 0xE2, 0x20, 0x81, 0xC0, 0x09, 0x25, 0x00, 0x00, 0x3C, 0x20, 0x68, 0x12, 0x02, 0x50, 0x77, 0xA0, 0x30, 0x8F, 0x1C, 0x20, 0x90, 0x00, 0x36, 0x00, 0x00, 0x28, 0xA6, 0x20, 0xAB, 0x3E, 0x20, 0x9C, 0x80, 0x3A, 0x20, 0x0B, 0x20, 0xAD, 0x60, 0xAA, 0x30, 0x17, 0x3C, 0x50, 0x17, 0x82, 0x30, 0x17, 0x40, 0x20, 0x23, 0x08, 0x16, 0x00, 0x00, 0xA4, 0x30, 0x2F, 0x49, 0x20, 0x67, 0x20, 0xE9, 0xC4, 0xAB, 0x30, 0x3B, 0x4A, 0x50, 0x17, 0xDC, 0x30, 0x3B, 0x52, 0x20, 0x47, 0x20, 0xE0, 0x59, 0xF4, 0x30, 0x53, 0x55, 0x20, 0x53, 0x30, 0xD4, 0x00, 0x2E, 0x21, 0x13, 0x01, 0x61, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x6D, 0x21, 0x1D, 0x41, 0x4E, 0x20, 0x07, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x20, 0x11, 0x05, 0x64, 0x00, 0x6F, 0x00, 0x4C, 0x20, 0x03, 0x67, 0x20, 0x07, 0x14, 0x5F, 0x00, 0x44, 0x20, 0x03, 0x30, 0x20, 0x01, 0x5F, 0x00, 0x10, 0x53, 0x00, 0x63, 0x40, 0x1F, 0x65, 0x00, 0x4F, 0x00, 0x55, 0x75, 0x20, 0x2B, 0x41, 0x20, 0x43, 0x62, 0x20, 0x13, 0x6C, 0x40, 0x47, 0xAB, 0x02, 0x50, 0x43, 0x42, 0x03, 0x20, 0x43, 0x43, 0x01, 0x80, 0x87, 0x55, 0x03, 0x20, 0xCB, 0x00, 0x90, 0x43, 0xEB, 0x01, 0x90, 0xCB, 0x00, 0x90, 0x87, 0xF0, 0xCB, 0x62, 0x21, 0x5D, 0x79, 0x21, 0x97, 0x01, 0x31, 0xA1, 0xF5, 0x71, 0x8D, 0x00, 0xF0, 0x2F, 0x71, 0x05, 0xD0, 0x2F, 0x74, 0x42, 0x09, 0x67, 0x23, 0x29, 0x5E, 0x33, 0x22, 0x01, 0x73, 0xA2, 0x01, 0xB0, 0x5B, 0x52, 0x2D, 0x00, 0x10, 0x21, 0x31, 0xAA, 0x01, 0x00, 0x21, 0x32, 0x01, 0x00, 0x43, 0x33, 0xE0, 0x65, 0x4C, 0x23, 0x71, 0x4D, 0x8F, 0x22, 0xA3, 0x73, 0x00, 0x6B, 0x00, 0x40, 0x85, 0x30, 0x1F, 0x00, 0xB0, 0x17, 0xF0, 0x93, 0xAA, 0xF2, 0xE3, 0x5F, 0x22, 0xE5, 0x69, 0x62, 0xD3, 0x73, 0x22, 0xF9, 0x64, 0xA8, 0x22, 0x8D, 0x79, 0x22, 0xF1, 0x31, 0x20, 0xAB, 0x38, 0x00, 0x78, 0xB0, 0x23, 0x7E, 0x34, 0xE0, 0xF7, 0x00, 0x10, 0x02, 0x43, 0x4C, 0x41, 0x4E, 0x23, 0xFF, 0xFE, 0x23, 0xF0, 0x00, 0x02, 0x02, 0x34, 0x23, 0x33, 0xB6, 0x0E, 0x70, 0x61, 0x74, 0x31, 0x23, 0xA2, 0x44, 0x5E, 0x34, 0x79, 0x28, 0x88, 0x33, 0x93, 0xFF, 0xFF, 0xFF, 0x34, 0x6C, 0x53, 0x63, 0x65, 0x02, 0x6E, 0x65, 0x4F, 0x75, 0x74, 0x41, 0x24, 0x91, 0x47, 0x04, 0x5F, 0x41, 0x5F, 0x30, 0x30, 0xD0, 0x56, 0x70, 0x61, 0x33, 0x69, 0x31, 0x33, 0xC3, 0x50, 0x3F, 0x02, 0x00, 0x30, 0x59, 0x34, 0xBD, 0x40, 0x68, 0x24, 0xC1, 0x50, 0x5F, 0x4E, 0x69, 0x6E, 0x4C, 0x1C, 0x6F, 0x67, 0x6F, 0xA0, 0x35, 0x34, 0xC0, 0x34, 0xDD, 0x43, 0x4C, 0x23, 0x56, 0x43, 0x74, 0x5F, 0x00, 0x10, 0x02, 0x40, 0x87, 0x40, 0x0B, 0xC8, 0xD0, 0x5D, 0x20, 0x76, 0x7F, 0x43, 0x35, 0x0C, 0x4E, 0x5F, 0x52, 0x1C, 0x6F, 0x6F, 0x74, 0xD0, 0x7E, 0x00, 0x70, 0x4B, 0x80, 0x57, 0x00, 0x20, 0xFE, 0x20, 0x3B, 0x50, 0x3F, 0x00, 0x30, 0xFF, 0x35, 0x17, 0xB0, 0xFF, 0x24, 0xF2, 0x80, 0xFF, 0x00, 0x35, 0x00, 0x1E, 0x45, 0x6C, 0x70, 0xFF, 0x42, 0x40, 0xFF, 0x42, 0x00, 0x40, 0xFF, 0x6C, 0x9C, 0x80, 0x2D, 0x90, 0xFF, 0x5C, 0x01, 0xE0, 0xFF, 0x90, 0xB3, 0x34, 0xC2, 0xBE, 0x02, 0xD0, 0xF3, 0xC8, 0x20, 0xAA, 0xD0, 0xF3, 0x01, 0x71, 0xFF, 0x31, 0x39, 0x71, 0xFF, 0x65, 0xE2, 0x23, 0x51, 0xB1, 0xFF, 0x31, 0x84, 0x47, 0x5F, 0x43, 0x00, 0x81, 0xFF, 0x0F, 0xCC, 0xE1, 0xFF, 0x02, 0x90, 0xFF, 0x12, 0xC3, 0x02, 0x31, 0xF3, 0x92, 0x3F, 0x80, 0xBF, 0xBD, 0x91, 0xF3, 0x60, 0x32, 0xB6, 0x00, 0x82, 0xFF, 0x36, 0xFF, 0x03, 0x32, 0xFF, 0x7C, 0x27, 0x47, 0xAA, 0x53, 0x3F, 0x0D, 0x42, 0xFF, 0x48, 0x27, 0xBD, 0xB0, 0x27, 0xC1, 0xA4, 0xB0, 0x27, 0xAD, 0x24, 0x27, 0xA8, 0x36, 0xEB, 0x30, 0x03, 0x00, 0x00, 0x56, 0xBC, 0x20, 0x03, 0x24, 0x27, 0xCB, 0x88, 0x37, 0x93, 0x27, 0xB4, 0xB0, 0x81, 0x27, 0x07, 0x74, 0x0A, 0x00, 0x00, 0x78, 0x0B, 0x32, 0xDF, 0x7C, 0x57, 0x00, 0x03, 0x5B, 0x37, 0x52, 0x27, 0x8E, 0x26, 0xD1, 0x33, 0xB7, 0x50, 0x41, 0xB8, 0x83, 0x2F, 0x02, 0xF2, 0xE3, 0x73, 0xDB, 0x01, 0x13, 0x07, 0x50, 0x5F, 0x33, 0xBB, 0x00, 0x80, 0x67, 0xB8, 0x60, 0x67, 0x20, 0xAA, 0x43, 0xC7, 0x38, 0x63, 0xC7, 0x30, 0x6F, 0xA9, 0x93, 0x9F, 0xA0, 0x24, 0x0A, 0xA0, 0x27, 0xC5, 0x80, 0xBE, 0x24, 0x39, 0x91, 0x23, 0x16, 0xA0, 0xC0, 0x48, 0x99, 0x06, 0x02, 0x00, 0x30, 0x37, 0x80, 0x70, 0x23, 0x33, 0x33, 0xB3, 0x3F, 0xFC, 0x2D, 0xEC, 0x46, 0xBC, 0x70, 0x0B, 0x0A, 0xD7, 0x23, 0x20, 0x0B, 0x30, 0x2F, 0x80, 0x5E, 0x3F, 0x48, 0xC9, 0x07, 0x01, 0xD0, 0x2F, 0xF4, 0x2F, 0xB0, 0x6B, 0x39, 0x2C, 0x40, 0x37, 0x9D, 0x1C, 0x30, 0x97, 0x61, 0xEF, 0xCC, 0x28, 0x65, 0x30, 0x9B, 0x70, 0xF3, 0xEE, 0x24, 0x87, 0xE4, 0xB9, 0x71, 0x5B, 0x50, 0xF1, 0x5B, 0x29, 0x59, 0xD4, 0x8B, 0x80, 0x0B, 0x41, 0xCD, 0xCC, 0xCC, 0x20, 0xEB, 0x20, 0x34, 0x02, 0x00, 0x41, 0x67, 0xF3, 0x00, 0x14, 0xBB, 0x30, 0x7F, 0x30, 0x2F, 0x71, 0x73, 0x44, 0x73, 0xF5, 0x38, 0x01, 0xA0, 0x7F, 0x51, 0xC1, 0x20, 0x7F, 0x3E, 0x02, 0xD0, 0x7F, 0x52, 0x65, 0x64, 0x01, 0x70, 0xFF, 0xC2, 0xC1, 0xEB, 0x45, 0x43, 0xC2, 0xB7, 0x6D, 0xDB, 0x20, 0x7F, 0x8C, 0x9A, 0x25, 0x02, 0x20, 0xC1, 0x00, 0xD1, 0x8B, 0xB6, 0x72, 0x5C, 0xA4, 0x87, 0xB4, 0x85, 0x41, 0x3B, 0x92, 0x24, 0xE9, 0xC0, 0x60, 0x8B, 0x31, 0x00, 0x32, 0xE7, 0xEB, 0x35, 0x33, 0xF2, 0xE7, 0x92, 0x53, 0xF0, 0x26, 0x82, 0x20, 0x25, 0x1B, 0x90, 0x0B, 0xFD, 0x50, 0x97, 0x34, 0xEF, 0x00, 0x50, 0x97, 0x96, 0x53, 0x30, 0x3B, 0x77, 0x0E, 0xAA, 0xF1, 0x17, 0x7F, 0x32, 0x02, 0x13, 0x73, 0x32, 0xF7, 0x50, 0x8B, 0x00, 0x96, 0x7B, 0x33, 0x1B, 0x57, 0x82, 0x00, 0x31, 0x7F, 0xCD, 0x3B, 0xB0, 0x57, 0x07, 0x54, 0x53, 0x2B, 0x0E, 0x47, 0x73, 0x4C, 0x37, 0x8B, 0xBB, 0x2B, 0xF9, 0x94, 0x63, 0x8B, 0x3B, 0xA7, 0x3B, 0xF1, 0x24, 0x4B, 0xF5, 0x00, 0x01, 0x97, 0x0F, 0xC0, 0x39, 0x8E, 0xE3, 0x2B, 0x59, 0x51, 0x5B, 0x5C, 0x1D, 0x01, 0x20, 0x23, 0x40, 0x03, 0xF7, 0x6B, 0x40, 0x41, 0x9E, 0x15, 0x8D, 0xBD, 0x8D, 0x31, 0xA3, 0x9A, 0x99, 0xB9, 0x2B, 0x9D, 0x2C, 0x7A, 0x04, 0x01, 0x10, 0x23, 0x55, 0x01, 0x01, 0x20, 0x8F, 0x01, 0x01, 0x20, 0x8F, 0x01, 0x00, 0x10, 0x8F, 0xC1, 0x20, 0x8F, 0x6C, 0x3D, 0x60, 0x8F, 0x44, 0x5B, 0x01, 0x00, 0x10, 0x8F, 0x00, 0x00, 0x23, 0x50, 0x5F, 0x10, 0x42, 0x6C, 0x6B, 0x03, 0xE1, 0x63, 0x9A, 0x99, 0x19, 0xC0, 0x1F, 0x0E, 0x74, 0xDA, 0x00, 0xC1, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0xF5, 0x00, 0x40, 0x23, 0x03, 0x81, 0x63, 0x00, 0x13, 0xBB, 0x00, 0x32, 0xC7, 0x58, 0x2E, 0xBD, 0x88, 0x66, 0x4F, 0x55, 0xE8, 0x2E, 0xC9, 0x18, 0x2E, 0xB5, 0x48, 0x2E, 0xB9, 0x78, 0x62, 0xC7, 0xF7, 0xE3, 0xD3, 0x56, 0x3F, 0x60, 0x0B, 0x52, 0xD3, 0xF0, 0xC2, 0xD3, 0x01, 0xC0, 0x2F, 0x22, 0xDF, 0xBB, 0xD4, 0x33, 0x40, 0x68, 0x03, 0x50, 0x0B, 0x52, 0xEB, 0xF0, 0xC2, 0xEB, 0x01, 0xB0, 0x2F, 0xFF, 0x32, 0xF7, 0x01, 0xB0, 0xBF, 0x33, 0x03, 0x01, 0xC0, 0x2F, 0x00, 0x10, 0xBF, 0x45, 0x73, 0x70, 0x0B, 0x53, 0x1B, 0xFF, 0x40, 0xBF, 0x83, 0x1B, 0x01, 0xB0, 0x2F, 0x63, 0x27, 0x03, 0xC1, 0xC3, 0x33, 0x27, 0x75, 0x97, 0x93, 0x33, 0xFF, 0x00, 0x91, 0xC3, 0x01, 0x00, 0x2F, 0x05, 0xE1, 0xC3, 0x00, 0xF0, 0xBF, 0xF1, 0xC3, 0x01, 0x00, 0x2F, 0x05, 0x01, 0xC3, 0x00, 0x16, 0xB7, 0xFA, 0x00, 0x36, 0x4F, 0x35, 0xCC, 0x33, 0x8B, 0x36, 0x53, 0x33, 0x8F, 0xA0, 0x69, 0xE3, 0xD0, 0xFF, 0x6D, 0xAB, 0xE6, 0xCF, 0x59, 0xC7, 0x26, 0x43, 0x00, 0x40, 0x17, 0x26, 0x37, 0xD6, 0xFF, 0x63, 0x57, 0xFF, 0x26, 0x2B, 0x00, 0x30, 0x17, 0x36, 0x1F, 0x00, 0x30, 0x5F, 0x36, 0x13, 0x00, 0x40, 0x17, 0x00, 0x10, 0x5F, 0x48, 0x6B, 0xFF, 0x35, 0xFB, 0x00, 0x30, 0x17, 0x65, 0xEF, 0x03, 0xC1, 0x03, 0x82, 0xC7, 0xE1, 0x03, 0x82, 0xDF, 0x02, 0xE1, 0x03, 0xFB, 0x73, 0x27, 0xF1, 0x03, 0x80, 0x17, 0x01, 0xE1, 0x03, 0x00, 0xFF, 0xDF, 0x54, 0xEC, 0xDF, 0x02, 0x7E, 0xDF, 0x75, 0x04, 0x2F, 0xA4, 0x5F, 0x0D, 0xDC, 0xDF, 0x50, 0x2F, 0xCC, 0xB8, 0x2F, 0xD0, 0x55, 0x20, 0x2F, 0xBC, 0xA0, 0x2F, 0xC0, 0x2C, 0x2C, 0xE3, 0xAC, 0x2C, 0xE7, 0x52, 0x10, 0x2C, 0xDF, 0x74, 0x2C, 0xDF, 0xD8, 0x07, 0x2D, 0x17, 0x09, 0xFE, 0x2C, 0x31, 0x2C, 0xE3, 0x02, 0x9C, 0xDF, 0x3E, 0xCF, 0x00, 0xFC, 0xDF, 0x9E, 0xF3, 0x00, 0xBC, 0xDF, 0x7C, 0xBF, 0xEC, 0xDF, 0x2C, 0x6D, 0x5B, 0xDD, 0x4F, 0x4C, 0xE3, 0x8C, 0xD3, 0xD0, 0x17, 0x9C, 0xBB, 0xFD, 0x00, 0x30, 0x17, 0x00, 0x9F, 0xD3, 0x3F, 0xFD, 0x01, 0x1C, 0x8B, 0x00, 0x0D, 0xE7, 0xC3, 0xA3, 0xA0, 0x81, 0xF3, 0xFB, 0x00, 0x9F, 0xFB, 0x30, 0x23, 0x01, 0x1C, 0x73, 0x03, 0xD0, 0x67, 0x02, 0x7C, 0x5B, 0x70, 0x2B, 0xCB, 0x7C, 0x5B, 0x7F, 0x20, 0x3B, 0xDB, 0x00, 0xEB, 0xC3, 0x3E, 0x67, 0x7F, 0xD7, 0x5B, 0xCF, 0x00, 0xFC, 0x4F, 0x00, 0xDC, 0xDB, 0x7D, 0xF0, 0x2C, 0xCB, 0x80, 0x7F, 0x01, 0x2C, 0xDB, 0x30, 0x2F, 0x7F, 0xFB, 0xC8, 0x2F, 0x03, 0xFF, 0x7C, 0xDB, 0x5B, 0xE7, 0xAC, 0xDB, 0x00, 0x4C, 0x4F, 0x03, 0x3D, 0x67, 0x00, 0x1E, 0x67, 0xDD, 0x67, 0x04, 0x1C, 0x67, 0xFF, 0x41, 0xA3, 0x79, 0x93, 0x9D, 0x43, 0xCC, 0x67, 0x00, 0x60, 0x23, 0xCC, 0x67, 0x31, 0xEB, 0x89, 0x7B, 0xFF, 0x28, 0x2F, 0x00, 0x3C, 0x67, 0x00, 0x50, 0x23, 0xDC, 0x67, 0x00, 0x50, 0x8F, 0xDC, 0x67, 0x00, 0x60, 0x23, 0x00, 0x10, 0x8F, 0xF9, 0x79, 0x4B, 0x30, 0x8F, 0x00, 0x2C, 0x67, 0x00, 0x50, 0x23, 0x04, 0x1C, 0x67, 0x70, 0xC2, 0xA9, 0x33, 0xFF, 0x00, 0x81, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0x03, 0x81, 0x63, 0x01, 0x5C, 0x67, 0xFF, 0x01, 0x9F, 0x2F, 0x43, 0xEB, 0x6F, 0x2F, 0x9F, 0x97, 0xDF, 0x2F, 0x00, 0x60, 0x23, 0xCF, 0x2F, 0x34, 0x33, 0xFF, 0x7F, 0x2F, 0x38, 0x2F, 0x00, 0x3F, 0x2F, 0x00, 0x50, 0x23, 0xDF, 0x2F, 0x00, 0x50, 0x8F, 0xDF, 0x2F, 0x00, 0x60, 0x23, 0xFF, 0x00, 0x10, 0x8F, 0x6F, 0x2F, 0x40, 0x8F, 0x00, 0x2F, 0x2F, 0x00, 0x50, 0x23, 0x01, 0x7C, 0x07, 0x01, 0xB1, 0x63, 0x9F, 0x2F, 0xFF, 0x00, 0x91, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0x03, 0x81, 0x63, 0x01, 0x5B, 0xA7, 0xFF, 0x01, 0x95, 0x8F, 0x46, 0x27, 0x6F, 0x23, 0x9F, 0xDF, 0xD5, 0x8F, 0x00, 0x60, 0x23, 0xC5, 0x8F, 0x4F, 0xDF, 0xFF, 0x6F, 0x0B, 0x4F, 0xDF, 0x00, 0x25, 0x8F, 0x00, 0x50, 0x23, 0xD5, 0x8F, 0x00, 0x50, 0x8F, 0xD5, 0x8F, 0x00, 0x60, 0x23, 0xFF, 0x00, 0x10, 0x8F, 0x6E, 0xDB, 0x40, 0x8F, 0x00, 0x25, 0x8F, 0x00, 0x50, 0x23, 0x01, 0x7C, 0x07, 0x01, 0xB1, 0x63, 0x9E, 0xC3, 0xFF, 0x00, 0x91, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0x03, 0x61, 0x63, 0x00, 0x7C, 0x5F, 0x78, 0x4C, 0x2C, 0x5C, 0xBC, 0x5F, 0x3E, 0x51, 0x7C, 0x5F, 0x65, 0x00, 0x73, 0xC5, 0xCC, 0x5F, 0x3B, 0x9C, 0x47, 0x5F, 0x43, 0x00, 0x4C, 0x5F, 0xFC, 0x2E, 0xBB, 0x7A, 0x0F, 0x5B, 0x58, 0x4C, 0x5F, 0x3C, 0x82, 0x3B, 0xAB, 0xBC, 0x2F, 0xFF, 0xFC, 0xAB, 0x2F, 0xF8, 0x3C, 0x2E, 0xDB, 0x7C, 0x2E, 0xDF, 0xBC, 0x2E, 0xE3, 0x00, 0x3C, 0x47, 0xE5, 0x3E, 0xC7, 0x5E, 0xFB, 0x00, 0x7A, 0x3B, 0x80, 0xBF, 0x9A, 0x3B, 0x60, 0x88, 0xC7, 0xEE, 0x00, 0x3C, 0x2B, 0x00, 0x70, 0x4B, 0x9F, 0x2B, 0xCA, 0x2A, 0xB7, 0x00, 0x9B, 0xCB, 0x01, 0x10, 0x3F, 0xF2, 0xFB, 0xA0, 0x3F, 0x00, 0x1B, 0xA3, 0x01, 0xD0, 0x3F, 0x00, 0x29, 0xEF, 0x01, 0x00, 0xBF, 0x8E, 0x2B, 0x77, 0x70, 0xFF, 0xDD, 0x00, 0x27, 0x67, 0x01, 0x00, 0xFF, 0x24, 0xF0, 0x3F, 0xDF, 0x83, 0x01, 0x01, 0x3F, 0x30, 0x00, 0x8E, 0xBB, 0x95, 0x5E, 0xBF, 0x59, 0x54, 0x7E, 0xBF, 0xB4, 0x2E, 0xBC, 0x10, 0x2F, 0xFB, 0x0C, 0x6C, 0x79, 0x74, 0x31, 0x3E, 0xD1, 0x4A, 0x9E, 0x00, 0xA0, 0x80, 0x2D, 0xE7, 0x70, 0x43, 0x74, 0x78, 0x6C, 0x31, 0x34, 0xB0, 0x61, 0xFB, 0x04, 0x2F, 0xFF, 0x2D, 0x55, 0x74, 0x65, 0x6E, 0x64, 0x08, 0x6F, 0x5F, 0x4C, 0x69, 0x2E, 0xD1, 0x73, 0x65, 0x64, 0x00, 0x42, 0x79, 0x5F, 0x31, 0x32, 0x38, 0x78, 0x36, 0x01, 0x34, 0x2E, 0x62, 0x63, 0x6C, 0x69, 0x6D, 0x3F, 0xEE, 0x5C, 0x6D, 0x2F, 0x07, 0x60, 0x62, 0x2F, 0x30, 0x57, 0x4D, 0x8B, 0x4C, 0x6F, 0x23, 0x67, 0x6F, 0xAE, 0xF5, 0xFF, 0xFF, 0xFF, 0x30, 0x03, 0x00, 0x40, 0x02, 0x7C, 0x15, 0x5F, 0xEC, 0x30, 0x6E, 0xAF, 0x7E, 0x3E, 0x13, 0x5E, 0x17, 0x70, 0x61, 0x20, 0x6E, 0x31, 0x3B, 0x5B, 0x01, 0x04, 0xFF, 0x00, 0x52, 0x01, 0x6F, 0x6F, 0x74, 0x50, 0x61, 0x6E, 0x65, 0x00, 0xB0, 0xEB, 0xC3, 0x00, 0x50, 0x47, 0x50, 0xDF, 0x70, 0x61, 0x73, 0x31, 0x3B, 0xAF, 0x70, 0x53, 0x4F, 0x03, 0x20, 0x53, 0x4E, 0x5F, 0x30, 0x55, 0x00, 0x0F, 0xA2, 0x01, 0x20, 0x53, 0x4C, 0xDF, 0x42, 0x42, 0x80, 0x53, 0x69, 0x63, 0x31, 0x80, 0x3C, 0x1B, 0x07, 0x7E, 0xFF, 0x00, 0x41, 0x03, 0x7E, 0xEC, 0x2D, 0x67, 0x82, 0x2B, 0x00, 0x20, 0xEF, 0x2F, 0x6F, 0x80, 0x78, 0x42, 0xF1, 0x2B, 0x71, 0xA5, 0xCF, 0x2F, 0xC1, 0x27, 0x80, 0x3F, 0x70, 0x30, 0x61, 0x65, 0x60, 0xDB, 0x50, 0x07, 0x67, 0x72, 0x70, 0x31, 0xC3, 0x3C, 0xA3, 0x31, 0x33, 0x47, 0x72, 0x6F, 0x75, 0x3C, 0x9B, 0x7F, 0xF3, 0x38, 0x67, 0x72, 0x51, 0x07, 0x30, 0x23, 0x34, 0x63, 0x47, 0x5F, 0x41, 0xFC, 0xCF, 0xDF, 0x3F, 0xDB, 0xF1, 0x17, 0xF1, 0xD7, 0x30, 0x5F, 0x3F, 0xEB, 0x47, 0x5F, 0x7E, 0x42, 0xCF, 0x79, 0x3F, 0xF3, 0x00, 0x90, 0x2B, 0xD4, 0xAB, 0x3F, 0xEF, 0xF1, 0x7F, 0x67, 0x6A, 0x72, 0x50, 0xC7, 0x00, 0x72, 0xBF, 0x3C, 0x22, 0xBC, 0x22, 0x00, 0x02, 0xBF, 0xC8, 0xD6, 0x82, 0xBF, 0x3D, 0x7F, 0x07, 0x64, 0xBB, 0x2D, 0x2F, 0xFF, 0x2F, 0x08, 0x00, 0x74, 0x4F, 0x34, 0xA1, 0x32, 0xF3, 0x2F, 0xFF, 0x78, 0x2F, 0xFB, 0x33, 0x64, 0x75, 0x73, 0x62, 0xA1, 0x62, 0xC7, 0x80, 0x10, 0x31, 0xF0, 0x10, 0x32, 0xF0, 0x21, 0x4E, 0x33, 0x62, 0xFA, 0x4C, 0x54, 0x90, 0x3E, 0x30, 0x0B, 0x70, 0x39, 0x4C, 0x0E, 0x54, 0x4D, 0x61, 0x73, 0x3C, 0xCC, 0x63, 0x22, 0x33, 0x1F, 0xA8, 0x0A, 0x06, 0x00, 0x00, 0x0B, 0x2F, 0xFF, 0x38, 0x2F, 0xFF, 0x88, 0xAA, 0x2F, 0xFB, 0x08, 0x2F, 0xF4, 0x88, 0x2F, 0xF8, 0x08, 0x2F, 0xD4, 0x88, 0xAA, 0x2F, 0xD8, 0x4C, 0x2F, 0x10, 0xE8, 0x2F, 0x14, 0xAC, 0x23, 0x74, 0x48, 0x76, 0x05, 0x2F, 0xD7, 0x20, 0x2F, 0x00, 0x35, 0x47, 0xAA, 0x53, 0x4B, 0x00, 0x83, 0x47, 0x02, 0xED, 0x00, 0xA3, 0x47, 0x00, 0x35, 0x57, 0x00, 0xB3, 0x97, 0xD5, 0x20, 0xB3, 0x00, 0xB3, 0x97, 0x40, 0x24, 0x20, 0xA1, 0x30, 0x03, 0x11, 0x2F, 0xFB, 0x74, 0x06, 0x00, 0x04, 0x30, 0x03, 0x87, 0x30, 0x0B, 0x65, 0x06, 0x00, 0x01, 0x30, 0x03, 0x30, 0x17, 0x31, 0x87, 0xA6, 0x5E, 0x03, 0x05, 0x2F, 0x47, 0x4F, 0x5F, 0x31, 0x32, 0x01, 0xB0, 0x7F, 0x01, 0xC1, 0x03, 0xE0, 0x7F, 0xD2, 0xA9, 0x00, 0x00, 0x8C, 0x8C, 0x8C, 0x05, 0xA0, 0x7F, 0xDF, 0x00, 0x16, 0x97, 0x00, 0xF1, 0x7F, 0x03, 0x03, 0xC1, 0x7F, 0x00, 0x16, 0xD7, 0x45, 0x9B, 0x2F, 0xB4, 0x00, 0x25, 0x9B, 0x2C, 0x80, 0x3F, 0x23, 0x44, 0x04, 0x25, 0x97, 0x30, 0x03, 0x06, 0x00, 0x03, 0x06, 0x06, 0x73, 0x09, 0xED, 0xBE, 0x30, 0x03, 0x3F, 0xFB, 0x0D, 0x3A, 0x57, 0xDE, 0x40, 0x30, 0x03, 0xE0, 0x13, 0xC0, 0x30, 0x03, 0xC0, 0x00, 0x75, 0xC7, 0x78, 0x54, 0x10, 0x04, 0x00, 0x01, 0x10, 0x04, 0x28, 0x10, 0x02, 0xA2, 0x37, 0x46, 0xF2, 0x37, 0x26, 0x06, 0x02, 0x3E, 0x05, 0x66, 0x23, 0x33, 0x00, 0x12, 0x43, 0x4D, 0x5F, 0x00, 0x35, 0xAA, 0x00, 0x36, 0x5E, 0x80, 0x58, 0xEA, 0x23, 0x77, 0x05, 0x26, 0x5B, 0x30, 0x03, 0x30, 0x8E, 0xE3, 0x7D, 0xBE, 0x30, 0x03, 0xB0, 0xBF, 0xE0, 0x13, 0xC0, 0xBF, 0x50, 0xA7, 0x00, 0x00, 0xC0, 0xA7, 0xE1, 0x00, 0x21, 0x5F, 0xCF, 0x5F, 0x01, 0xB1, 0x5F, 0x2F, 0xA1, 0xBD, 0xBF, 0x30, 0x03, 0x86, 0x3F, 0xF7, 0xCE, 0x95, 0x17, 0x41, 0x30, 0x03, 0xE0, 0x13, 0xC1, 0xF0, 0x30, 0x03, 0x05, 0x21, 0x5F, 0x00, 0x00, 0xC3, 0x01, 0x31, 0x5F, 0x61, 0x0B, 0xB6, 0xBF, 0xFF, 0x30, 0x03, 0xB0, 0xBF, 0xE0, 0x13, 0xC0, 0xBF, 0x02, 0x61, 0x5F, 0xCD, 0xF7, 0x01, 0xB2, 0xBF, 0x3F, 0xF7, 0xFF, 0x50, 0x03, 0x5D, 0xA7, 0x50, 0x03, 0xC0, 0x13, 0x4F, 0xF7, 0x05, 0x22, 0xBF, 0x00, 0x00, 0xC3, 0x01, 0x32, 0xBF, 0xFF, 0x3F, 0xE3, 0x3F, 0xE7, 0xB0, 0xBF, 0xE0, 0x13, 0xC0, 0xBF, 0x01, 0xF2, 0xBF, 0x03, 0x59, 0x67, 0x57, 0x87, 0xFE, 0x00, 0x59, 0x67, 0x00, 0x1C, 0x63, 0x99, 0x13, 0x40, 0x03, 0x00, 0x79, 0x13, 0x3F, 0x93, 0xC9, 0x67, 0xA0, 0xB1, 0x4E, 0xC7, 0xF5, 0x00, 0x84, 0xD3, 0x70, 0x53, 0x46, 0x31, 0x32, 0x00, 0x63, 0x2F, 0xD0, 0x58, 0x2F, 0xFA, 0x93, 0x05, 0x4F, 0xF1, 0x00, 0x00, 0xCD, 0xCC, 0x4F, 0x4C, 0x28, 0x36, 0x80, 0x3F, 0x50, 0x07, 0x40, 0x0F, 0x4A, 0x8F, 0x50, 0x07, 0xFE, 0x9F, 0xEC, 0xE0, 0x0B, 0x40, 0x03, 0x00, 0x0A, 0x0F, 0x2A, 0xB7, 0x00, 0xA4, 0xB7, 0x60, 0xFB, 0x20, 0xFB, 0x01, 0xC0, 0xA7, 0x27, 0x62, 0x01, 0x00, 0xA7, 0x8A, 0x0F, 0x81, 0x2F, 0x91, 0x00, 0x84, 0xA3, 0x71, 0x83, 0x17, 0x10, 0xF4, 0xBF, 0x01, 0xC1, 0x2F, 0x07, 0x04, 0xD1, 0x2F, 0x00, 0x80, 0xA7, 0x01, 0xF1, 0x2F, 0x7D, 0x08, 0x02, 0x41, 0x2F, 0x00, 0x5D, 0x8B, 0xE1, 0xB7, 0xEB, 0xCB, 0x00, 0xD2, 0x5F, 0x09, 0x04, 0xD2, 0x5F, 0xDE, 0x00, 0xB0, 0xA7, 0x01, 0xC3, 0x07, 0x0A, 0x01, 0xE2, 0x5F, 0x92, 0xE7, 0x00, 0x1F, 0xFB, 0x5F, 0xC7, 0xF8, 0xD6, 0x25, 0x6F, 0x3C, 0xFB, 0xA0, 0x00, 0x68, 0x1F, 0x10, 0x43, 0xE3, 0x00, 0x5C, 0xF7, 0x50, 0x8F, 0x43, 0x83, 0x00, 0x00, 0x44, 0x6C, 0xF7, 0x30, 0x0F, 0x3E, 0x1F, 0x30, 0x0F, 0xCF, 0x2C, 0xF7, 0x6D, 0x77, 0x03, 0x08, 0x6D, 0x77, 0x00, 0xC3, 0x67, 0x00, 0x70, 0x7F, 0x4D, 0x77, 0x5F, 0x41, 0xFE, 0xA3, 0x01, 0x01, 0x4D, 0x77, 0x00, 0x3D, 0xFF, 0x00, 0x1A, 0xEB, 0x01, 0x94, 0xEB, 0x00, 0x10, 0x87, 0xEE, 0x5F, 0xE9, 0x00, 0xED, 0xFF, 0x7E, 0x7F, 0x01, 0x50, 0x7F, 0xFA, 0xEB, 0x02, 0xB0, 0x7F, 0x03, 0xF7, 0x8E, 0x7F, 0x9E, 0x6F, 0xFE, 0x8F, 0x00, 0x02, 0x0F, 0x03, 0x3F, 0x07, 0x00, 0x1A, 0xF3, 0x01, 0x91, 0x8F, 0xEB, 0x00, 0x12, 0x0F, 0x2A, 0x3A, 0x04, 0x8F, 0x07, 0xDC, 0x00, 0x2F, 0x07, 0x0C, 0x4F, 0x07, 0xD6, 0xB7, 0xFF, 0xFD, 0x97, 0xFD, 0x57, 0xFC, 0xE7, 0xFC, 0x77, 0xFC, 0x07, 0xFB, 0x97, 0xFA, 0xE3, 0xFA, 0x57, 0xF7, 0xF9, 0xA3, 0xF9, 0x17, 0xF8, 0x63, 0x3F, 0xE3, 0xCC, 0x00, 0x2F, 0xA7, 0x3E, 0x8F, 0x0A, 0x30, 0xCB, 0x5C, 0x2C, 0x41, 0xA7, 0x43, 0xCF, 0x1B, 0x37, 0x0D, 0xF8, 0x5F, 0x67, 0x72, 0xC1, 0x56, 0xFF, 0x01, 0x48, 0xC3, 0x40, 0x00, 0x78, 0x80, 0x80, 0x34, 0x6F, 0x18, 0x00, 0x00, 0x0A, 0x2B, 0x81, 0x20, 0x0B, 0xEF, 0x80, 0x80, 0x00, 0xEF, 0xEF, 0xFF, 0xF8, 0x0B, 0xBF, 0x70, 0x01, 0x20, 0xFF, 0xF6, 0x8F, 0x85, 0x20, 0x00, 0x88, 0x40, 0x30, 0x83, 0x50, 0x27, 0x1C, 0xCF, 0x00, 0x01, 0x30, 0x20, 0x0B, 0x30, 0x03, 0xC0, 0x38, 0x36, 0x4F, 0x79, 0x87, 0x00, 0x05, 0xFD, 0xFC, 0x0B, 0x61, 0x0A, 0x3F, 0x85, 0x3F, 0x89, 0xFC, 0xFC, 0x0A, 0x0A, 0x30, 0x03, 0x82, 0x2F, 0xFA, 0x83, 0x00, 0x00, 0xF7, 0xF7, 0x3F, 0x10, 0xBF, 0x70, 0xFF, 0x31, 0x7A, 0x20, 0x0B, 0x20, 0x0F, 0xFF, 0x9F, 0xCF, 0xFF, 0x08, 0x1F, 0x2F, 0xF6, 0x60, 0xAF, 0xE5, 0x81, 0x00, 0x00, 0x12, 0xF3, 0xF3, 0x01, 0x22, 0xB0, 0xCF, 0xFF, 0x30, 0x05, 0xF3, 0x41, 0xF3, 0x40, 0x03, 0x28, 0x00, 0x00, 0x5F, 0x5F, 0x40, 0x5F, 0x07, 0x88, 0xFE, 0xCA, 0xFF, 0xCC, 0x30, 0x0B, 0x40, 0x0F, 0x7F, 0xEC, 0x06, 0x88, 0x00, 0x88, 0xFF, 0xCC, 0x2F, 0xCC, 0x30, 0x07, 0xCF, 0x4B, 0xFF, 0x21, 0xEE, 0xFC, 0xFC, 0x30, 0x7D, 0x0C, 0x22, 0xC0, 0x30, 0x03, 0x80, 0x20, 0x1F, 0x06, 0xFF, 0xCC, 0x0D, 0x0A, 0x00, 0x30, 0x0F, 0x00, 0x88, 0x60, 0x60, 0x50, 0xE7, 0x3F, 0xFF, 0x30, 0x0B, 0x40, 0x0F, 0xB2, 0x30, 0x3F, 0xCD, 0x20, 0x37, 0x50, 0x47, 0xCC, 0x02, 0x2D, 0xA7, 0x34, 0x2D, 0xFF, 0x33, 0x41, 0x0F, 0x33, 0x30, 0x07, 0x40, 0x3F, 0x0E, 0x30, 0xC7, 0x5F, 0x84, 0x25, 0xCB, 0xF8, 0x4F, 0xD3, 0x2F, 0x9F, 0x50, 0x0B, 0x20, 0x0F, 0x2F, 0xE8, 0x18, 0xAF, 0xFF, 0x00, 0x30, 0xE7, 0x5F, 0xD7, 0x8E, 0xBF, 0xFF, 0x0A, 0x0E, 0x1E, 0xF7, 0x70, 0x32, 0x64, 0xBF, 0x40, 0xC7, 0x00, 0x09, 0x82, 0x00, 0x00, 0xF4, 0x40, 0xC7, 0x4F, 0x4F, 0x3F, 0xFF, 0xE0, 0x50, 0xD7, 0x30, 0x0B, 0x40, 0x0F, 0x80, 0x00, 0x88, 0xF1, 0xE1, 0x21, 0xFF, 0xEF, 0x70, 0x7F, 0xE1, 0xE1, 0x7F, 0x7F, 0x30, 0x03, 0x80, 0xE0, 0xDF, 0xDC, 0x00, 0x15, 0x00, 0x00, 0xEF, 0xFF, 0x62, 0x05, 0x40, 0x41, 0x3F, 0xDA, 0xD3, 0x40, 0xDF, 0x2E, 0xBE, 0xFD, 0x67, 0xFA, 0x00, 0x0E, 0x0F, 0x2F, 0xB5, 0x07, 0x09, 0x01, 0xAA, 0xBD, 0x21, 0xEB, 0x31, 0xEF, 0x18, 0x01, 0x01, 0x60, 0x25, 0x3F, 0x40, 0x0F, 0xFF, 0x70, 0x00, 0x30, 0xDE, 0x01, 0x30, 0x0B, 0x39, 0x69, 0xFF, 0xF6, 0x1C, 0xCF, 0x00, 0x50, 0x00, 0xFF, 0xF5, 0x30, 0x31, 0xFF, 0xFF, 0x50, 0x5C, 0x46, 0x97, 0x50, 0x5F, 0xBF, 0xF5, 0xFF, 0xFF, 0x40, 0x1C, 0x00, 0xEE, 0x10, 0xF1, 0xEF, 0x41, 0xFF, 0x2F, 0xFF, 0xFC, 0xFD, 0x0C, 0x0A, 0x0B, 0xEB, 0x10, 0x30, 0x88, 0x51, 0xEF, 0x2F, 0x2F, 0x32, 0x00, 0x00, 0x30, 0x03, 0x51, 0xFF, 0xE6, 0x10, 0x30, 0x0F, 0x2E, 0x90, 0x2F, 0xE0, 0xF5, 0x50, 0x30, 0xC7, 0xF5, 0x40, 0x02, 0x1D, 0x1A, 0xF3, 0xF2, 0xDF, 0x20, 0x54, 0x7F, 0xF3, 0xF4, 0x2F, 0x99, 0x00, 0x3B, 0x00, 0xD4, 0x41, 0xFB, 0xB1, 0xEF, 0x32, 0x0B, 0x4E, 0xB6, 0x9A, 0xF1, 0xEF, 0x87, 0x20, 0x79, 0x00, 0x00, 0xEB, 0x10, 0x31, 0xFF, 0x33, 0xE7, 0x00, 0x01, 0xEF, 0x80, 0xB1, 0xFF, 0x00, 0xEE, 0x11, 0xFF, 0x35, 0xFF, 0x33, 0xD0, 0x30, 0xF7, 0x21, 0xF2, 0x33, 0x3F, 0xDF, 0x57, 0xFF, 0x55, 0xFF, 0x05, 0xEE, 0x11, 0xEE, 0x11, 0x55, 0x60, 0x07, 0x06, 0x87, 0x06, 0x81, 0x51, 0xEF, 0x55, 0xFF, 0x04, 0x0D, 0xEE, 0x11, 0x34, 0x41, 0x81, 0x32, 0x0B, 0xE7, 0x10, 0x1E, 0x1E, 0x00, 0x00, 0x30, 0x03, 0x10, 0xF6, 0x60, 0xCF, 0x2E, 0xEE, 0xF6, 0x50, 0x1E, 0x1F, 0x10, 0x00, 0x00, 0x1D, 0xAF, 0xA4, 0x01, 0x1C, 0xF3, 0xF3, 0x65, 0xCF, 0x21, 0x2C, 0x71, 0xEF, 0xF5, 0x50, 0x37, 0xDB, 0xE4, 0x42, 0x0B, 0xD0, 0x30, 0xC7, 0x61, 0xEF, 0x6F, 0x7F, 0xD7, 0xE1, 0xF1, 0xAF, 0xFF, 0x70, 0xD1, 0x20, 0x97, 0x70, 0x7F, 0x9F, 0xEF, 0xF9, 0xFB, 0x10, 0x90, 0x50, 0xFE, 0x20, 0x9D, 0x65, 0x30, 0x9F, 0x01, 0xFB, 0xFF, 0x9F, 0x36, 0x0B, 0x7C, 0x33, 0xB3, 0x2C, 0x6C, 0x06, 0x5B, 0xBA, 0x00, 0x4C, 0xB2, 0x43, 0x02, 0x4C, 0x49, 0x4D, 0xFF, 0xFE, 0x14, 0x2F, 0xFA, 0x02, 0x30, 0x02, 0x28, 0x29, 0xD7, 0x3B, 0x3D, 0x69, 0x6D, 0x61, 0x67, 0x46, 0x10, 0x4C, 0x7C, 0x10, 0x00, 0x0D, 0x62, 0x33, 0x06, 0xD0, 0x01, 0x20, 0x15, 0xA0, 0x00, 0x71, 0x23, 0xDF, 0xFF, 0x33, 0xBF, 0xC0, 0x2E, 0xAB, 0x01, 0xC0, 0xC0, 0xAF, 0x9F, 0x00, 0x00, 0x9F, 0x20, 0x03, 0xE0, 0x73, 0x97, 0x80, 0x07, 0xFF, 0xA0, 0x78, 0x00, 0x02, 0xFF, 0xFC, 0x61, 0x3E, 0x4F, 0x7B, 0x3F, 0xCE, 0x90, 0x90, 0xDF, 0xDF, 0x30, 0x03, 0xF2, 0x01, 0x9D, 0xBF, 0x50, 0x6F, 0x30, 0x6B, 0x40, 0x6F, 0x00, 0xB0, 0x44, 0x93, 0xDF, 0x8F, 0x22, 0x07, 0xD7, 0x00, 0xEE, 0x00, 0x0E, 0xAE, 0x42, 0x17, 0x20, 0x17, 0x70, 0x07, 0xA0, 0x40, 0x6F, 0x80, 0x90, 0x6F, 0xC5, 0xFF, 0xCF, 0x7F, 0xDE, 0x7B, 0x00, 0x95, 0x7D, 0xC1, 0x7F, 0x63, 0x53, 0x71, 0x7F, 0x20, 0x71, 0x7F, 0xC2, 0xCF, 0xAC, 0x06, 0xB1, 0x8B, 0x50, 0xA8, 0x22, 0x70, 0x28, 0x2E, 0x2D, 0xE6, 0x10, 0x00, 0x22, 0x43, 0xFD, 0x3A, 0x8F, 0x76, 0x00, 0x98, 0x6F, 0xA8, 0xCE, 0x42, 0x47, 0x2D, 0x83, 0xFF, 0x7A, 0xFF, 0x45, 0x4F, 0xDE, 0xAA, 0x28, 0x00, 0xBB, 0x4A, 0xAF, 0xBB, 0x50, 0x07, 0xFF, 0x23, 0xEF, 0x84, 0x42, 0xB3, 0xFF, 0x21, 0xFF, 0x53, 0x4F, 0xFE, 0x9A, 0x00, 0x50, 0x68, 0x4A, 0xCF, 0x24, 0x3F, 0xE8, 0xAD, 0xFF, 0xFF, 0xC8, 0xA8, 0x3A, 0xDB, 0xB3, 0x5F, 0xF4, 0xFA, 0x56, 0x77, 0x27, 0xFF, 0x00, 0x7E, 0x4B, 0x85, 0x3F, 0x7B, 0x87, 0x26, 0x8B, 0x2D, 0xED, 0xB3, 0xC2, 0x07, 0xC0, 0x0A, 0x21, 0x1C, 0xF6, 0x22, 0xFF, 0x26, 0xC5, 0x86, 0x4F, 0x7F, 0xDD, 0x22, 0xFF, 0x46, 0x32, 0x4F, 0x5A, 0x43, 0xFF, 0x97, 0x6B, 0xC7, 0x37, 0x3B, 0x10, 0x03, 0xE7, 0xF2, 0xF4, 0xFF, 0xFF, 0xFC, 0x2F, 0x74, 0x30, 0x03, 0xA0, 0x9F, 0x7B, 0xDF, 0xAF, 0x86, 0x0C, 0x09, 0xFF, 0x4F, 0x02, 0x00, 0x00, 0xFF, 0xAD, 0xBF, 0x04, 0x28, 0xFF, 0x00, 0x22, 0x6C, 0x03, 0x07, 0xE0, 0xF8, 0xD6, 0x00, 0xDD, 0x00, 0x48, 0x51, 0xDD, 0xD0, 0x26, 0x03, 0x61, 0xEF, 0x54, 0x00, 0x3C, 0xFD, 0xFF, 0xB8, 0xFF, 0xFE, 0x12, 0x00, 0x00, 0x51, 0x41, 0xEF, 0xFD, 0xA0, 0x97, 0x7F, 0x10, 0x06, 0x00, 0xFE, 0xFC, 0x10, 0xA0, 0x23, 0xF1, 0x6F, 0xE0, 0x2C, 0x01, 0xEF, 0x00, 0x03, 0xFF, 0xFF, 0x1E, 0x8F, 0xA1, 0x1B, 0x50, 0xEF, 0x21, 0x1F, 0xAF, 0x05, 0x94, 0x99, 0xA1, 0xF2, 0x00, 0x00, 0x70, 0xF2, 0x20, 0x03, 0x85, 0x89, 0x40, 0xD7, 0x37, 0xFF, 0x01, 0xBE, 0x88, 0x4D, 0x8F, 0x58, 0x00, 0x23, 0x4F, 0xFF, 0x64, 0xFF, 0xA7, 0x8B, 0x47, 0xE7, 0xDC, 0xFF, 0xED, 0x79, 0x80, 0xDE, 0x28, 0x80, 0x30, 0xD2, 0x22, 0xCC, 0xFF, 0x50, 0xCF, 0x21, 0x00, 0x32, 0x42, 0xDF, 0x33, 0x47, 0x00, 0x26, 0x52, 0x73, 0x30, 0xFB, 0x3F, 0x93, 0x40, 0x04, 0x63, 0x3F, 0x4C, 0x12, 0x38, 0x27, 0x7A, 0xEF, 0x35, 0x94, 0x72, 0xEF, 0x8E, 0xFF, 0x0B, 0xFF, 0x2F, 0x05, 0x4D, 0x2F, 0xAA, 0x6B, 0x03, 0xE4, 0x0C, 0x00, 0xB5, 0xFF, 0x74, 0x40, 0x29, 0xD4, 0x07, 0x55, 0xFF, 0x08, 0xC0, 0x7F, 0x91, 0x4A, 0x8B, 0x99, 0x00, 0x7E, 0x99, 0x5F, 0x97, 0x5A, 0x97, 0x8F, 0xA7, 0x70, 0x17, 0x60, 0x1F, 0x8F, 0xC7, 0x56, 0x1B, 0xFF, 0x55, 0x01, 0x37, 0x97, 0x90, 0x1F, 0x78, 0x4F, 0xE3, 0x27, 0xC0, 0x9B, 0x4A, 0x27, 0x97, 0xFF, 0x2A, 0xA7, 0x27, 0x85, 0x35, 0x26, 0xBF, 0x24, 0x07, 0x88, 0x3F, 0xE7, 0x8B, 0xFF, 0x03, 0x44, 0x10, 0xC6, 0x00, 0xFF, 0x68, 0xD4, 0x80, 0x5F, 0x3F, 0xFF, 0x17, 0x9F, 0xD5, 0xEF, 0xFF, 0x07, 0x66, 0xCF, 0x45, 0x6F, 0x2B, 0x77, 0x3E, 0xEF, 0x3B, 0x7D, 0xAF, 0xF1, 0x30, 0x22, 0x20, 0xFB, 0x5F, 0xEF, 0xF3, 0xF9, 0xF8, 0x90, 0x3F, 0x31, 0x4C, 0xB7, 0x22, 0x97, 0x00, 0x75, 0x85, 0xBF, 0x2F, 0xEA, 0xAF, 0x0D, 0x08, 0xFF, 0x9E, 0xFF, 0x45, 0x4F, 0xE1, 0xA9, 0x00, 0x9A, 0xA2, 0x45, 0xBF, 0x89, 0x55, 0xA7, 0xFF, 0x22, 0xFF, 0x3E, 0x7F, 0x00, 0x0A, 0xFF, 0x75, 0xFF, 0xDA, 0x4F, 0xFF, 0x23, 0x35, 0xB7, 0x5E, 0x83, 0x8A, 0x8F, 0xFF, 0xFF, 0x7F, 0x8F, 0x52, 0x23, 0x0C, 0x0D, 0x92, 0x31, 0xEF, 0xE1, 0xEF, 0xE1, 0xFF, 0x7F, 0xA7, 0x02, 0x2D, 0x07, 0x30, 0x03, 0xF0, 0x0F, 0x01, 0x1D, 0x86, 0x83, 0x45, 0x3E, 0x00, 0xFB, 0xB0, 0xFF, 0xFF, 0x25, 0x13, 0x4C, 0x5F, 0x9D, 0x5F, 0xE8, 0xF2, 0xD0, 0x28, 0x8B, 0x25, 0x31, 0x77, 0x11, 0x0D, 0xA5, 0x1B, 0xC1, 0x96, 0x44, 0x2D, 0x69, 0xFB, 0x01, 0x07, 0xF8, 0xF2, 0x86, 0x45, 0x04, 0x0E, 0x50, 0x00, 0x2F, 0x3F, 0x2C, 0x87, 0xE5, 0xFF, 0x09, 0xFF, 0x20, 0x00, 0xFA, 0x2D, 0xB1, 0x0D, 0x6F, 0x76, 0x87, 0x0E, 0x18, 0xEF, 0x00, 0x38, 0x77, 0x77, 0xC2, 0x5F, 0xAE, 0x2B, 0x6B, 0x1E, 0xFF, 0x01, 0xAF, 0x47, 0xCF, 0x4C, 0x6F, 0x26, 0x89, 0x00, 0x3E, 0x47, 0x3A, 0xE5, 0x0D, 0xB4, 0x2F, 0x04, 0xF1, 0xFF, 0x7F, 0xF1, 0xA0, 0xB0, 0x2C, 0x0D, 0xF4, 0x79, 0x7C, 0x0E, 0x00, 0x60, 0xFB, 0xFF, 0x28, 0x32, 0x00, 0xB0, 0x01, 0x24, 0x07, 0x4F, 0x3C, 0x08, 0x2F, 0x2C, 0x6F, 0x2E, 0xDD, 0xBD, 0xFE, 0xDB, 0x59, 0x00, 0xD8, 0xAD, 0x5E, 0x97, 0xA5, 0x37, 0x87, 0x61, 0x00, 0x17, 0x9F, 0x38, 0x93, 0x40, 0x96, 0x9E, 0xA5, 0x7D, 0xDF, 0xFE, 0x28, 0xAF, 0xD0, 0xE1, 0x39, 0xF1, 0x1A, 0x27, 0x87, 0xD8, 0x2F, 0xF7, 0x2F, 0xE3, 0x3F, 0x2B, 0x55, 0x98, 0xBE, 0x04, 0x07, 0xFF, 0x34, 0xFF, 0x08, 0x4F, 0x09, 0x0E, 0x13, 0xFF, 0x20, 0x4A, 0xBF, 0x22, 0x00, 0x47, 0x22, 0xC3, 0xEF, 0xDE, 0xFF, 0xDD, 0x55, 0x42, 0x60, 0x17, 0x30, 0x1F, 0x80, 0x49, 0x23, 0xFF, 0xED, 0xFF, 0x00, 0x31, 0x00, 0x95, 0xC9, 0x7A, 0xDB, 0x60, 0x37, 0xEE, 0x12, 0x2F, 0x61, 0x50, 0xFD, 0xDA, 0x11, 0x09, 0xFF, 0xBD, 0xFF, 0x69, 0x45, 0xE7, 0x14, 0x6B, 0x9B, 0x0F, 0x0D, 0x8E, 0x5E, 0x01, 0x9F, 0x6C, 0x52, 0x00, 0x1C, 0x2A, 0x35, 0x2E, 0xEF, 0x89, 0x2F, 0x03, 0xAD, 0x00, 0x47, 0x5A, 0x6F, 0xFD, 0x74, 0x4F, 0x9F, 0x1E, 0xB9, 0xFF, 0xDC, 0x4F, 0xFF, 0x28, 0x6C, 0x2B, 0xB2, 0x4F, 0x57, 0xBB, 0x6A, 0xFF, 0x2B, 0xAA, 0x2D, 0x64, 0x10, 0x60, 0xB7, 0x32, 0x35, 0xDC, 0x10, 0x15, 0x00, 0xB4, 0xEC, 0x2F, 0xD7, 0xF9, 0x7B, 0x78, 0xEF, 0x68, 0x9F, 0x10, 0x8B, 0xFF, 0x25, 0xAB, 0x8F, 0x6D, 0xFF, 0x8F, 0x02, 0x5F, 0x00, 0x3F, 0xCD, 0x6C, 0x01, 0xEC, 0xAC, 0xCE, 0x7F, 0x2E, 0xAB, 0xDE, 0x7F, 0x68, 0x7F, 0xC0, 0x9D, 0x2E, 0x04, 0x0E, 0x88, 0xFF, 0xEF, 0xEF, 0x8A, 0xAF, 0x8E, 0x00, 0x47, 0x24, 0xDD, 0x78, 0xDD, 0x77, 0x33, 0x11, 0x01, 0x33, 0x11, 0x8D, 0x7D, 0x13, 0x13, 0x7D, 0x20, 0x03, 0xBF, 0x8A, 0xBF, 0x77, 0x50, 0x17, 0x70, 0x07, 0xFF, 0x49, 0x30, 0x2B, 0xB0, 0x2F, 0xF0, 0x0F, 0xB7, 0x01, 0xB9, 0x7F, 0xA8, 0x6D, 0xEA, 0x7F, 0x7F, 0x10, 0x6F, 0x7F, 0x27, 0xB0, 0x04, 0xA1, 0x00, 0xA0, 0x0D, 0xB0, 0x01, 0x02, 0x60, 0xED, 0x61, 0xFF, 0x2C, 0xFF, 0xBE, 0x35, 0xFF, 0xF0, 0x3E, 0xB7, 0x00, 0xC0, 0xFF, 0x19, 0x00, 0x21, 0x1D, 0x01, 0x28, 0xFA, 0x18, 0xCC, 0xFF, 0x3A, 0x3B, 0x92, 0x40, 0x3F, 0x17, 0xFF, 0x6B, 0x8D, 0x27, 0x4C, 0x84, 0xFF, 0xE9, 0xBD, 0xB9, 0x3C, 0xB8, 0xFD, 0x23, 0x34, 0xE2, 0x30, 0x62, 0x4C, 0xDA, 0x40, 0x13, 0xF7, 0xFF, 0xF1, 0x20, 0x03, 0xEF, 0x08, 0xFF, 0xE8, 0xFF, 0xE0, 0x20, 0x03, 0xE1, 0xFF, 0xD9, 0x38, 0xFF, 0xD3, 0x50, 0x95, 0x2E, 0xE1, 0x21, 0x87, 0x57, 0xFF, 0x86, 0x34, 0xFF, 0xD1, 0x93, 0x69, 0x30, 0x41, 0xFA, 0x31, 0x9F, 0xAC, 0xFF, 0x44, 0xC7, 0x41, 0xA5, 0xD9, 0xFF, 0xE4, 0x50, 0x5B, 0xF6, 0xFF, 0x41, 0xF2, 0x20, 0x5D, 0xFB, 0xFF, 0xEE, 0xFF, 0xEA, 0x2F, 0x23, 0x54, 0xF5, 0x20, 0x05, 0xE4, 0x23, 0x97, 0xEA, 0x2E, 0x2E, 0xDA, 0xFF, 0x10, 0xDB, 0xFF, 0xD5, 0x2C, 0x6E, 0xC6, 0xFF, 0xD0, 0xFF, 0x05, 0xCB, 0xFF, 0xC1, 0xFF, 0xBC, 0x27, 0xE7, 0xE1, 0x20, 0x11, 0x41, 0xD2, 0x24, 0x7A, 0xDA, 0xFF, 0xCD, 0xFF, 0xCA, 0x20, 0x19, 0x04, 0xC1, 0xFF, 0xB7, 0xFF, 0xB3, 0x20, 0xFE, 0xBA, 0xFF, 0x14, 0xAF, 0xFF, 0xAB, 0x05, 0xD1, 0xFF, 0x5F, 0x62, 0x6D, 0x03, 0xFF, 0x51, 0x29, 0x20, 0xC2, 0xC2, 0xE1, 0x7F, 0x05, 0xFF, 0x9F, 0x22, 0x8D, 0x5B, 0x07, 0x21, 0x61, 0xA7, 0x20, 0x9A, 0x5F, 0xE9, 0x8A, 0xD9, 0x48, 0x38, 0x99, 0x50, 0xFE, 0x41, 0x01, 0xF7, 0x25, 0x34, 0xEA, 0xFF, 0xE0, 0x8D, 0xA2, 0xD1, 0x73, 0xF6, 0x80, 0x27, 0xF7, 0xFF, 0xEB, 0x25, 0x56, 0xE0, 0xA8, 0x21, 0x1D, 0xE9, 0x21, 0x25, 0xDE, 0x2F, 0x4A, 0xD4, 0xFF, 0xD3, 0x28, 0xFF, 0xC9, 0x2F, 0x52, 0xD3, 0x2B, 0x3D, 0xC9, 0xFF, 0xC8, 0xA8, 0x25, 0x49, 0xBD, 0x21, 0x07, 0xFC, 0x27, 0x46, 0xF0, 0xFF, 0xE6, 0xA2, 0x20, 0x2D, 0xE2, 0x25, 0x9E, 0xD5, 0xFF, 0xE3, 0x21, 0x95, 0xD6, 0xAA, 0x2D, 0xB0, 0xD0, 0x20, 0x21, 0xC3, 0x25, 0x10, 0xDA, 0x21, 0x3B, 0xCD, 0x28, 0xFF, 0xC5, 0x21, 0x4D, 0xC4, 0x25, 0x7B, 0xB6, 0xFF, 0xBF, 0x80, 0x21, 0x3D, 0xB2, 0xFF, 0xAB, 0xFF, 0xB0, 0xFF, 0xA9, 0x0A, 0xFF, 0xA3, 0xFF, 0x9C, 0x21, 0x51, 0xC0, 0x22, 0x4A, 0xB5, 0xA8, 0x21, 0x53, 0xAE, 0x21, 0xA8, 0xA2, 0x21, 0x59, 0xAA, 0xFF, 0xA8, 0xA0, 0x20, 0xC8, 0xA0, 0x2F, 0xE0, 0x95, 0xFF, 0x8C, 0xFF, 0xA6, 0x80, 0x2B, 0x49, 0x9A, 0xFF, 0x92, 0xFF, 0x96, 0xFF, 0x8F, 0xA8, 0x25, 0x33, 0x84, 0x20, 0x05, 0x87, 0x22, 0x2C, 0x7C, 0xFF, 0x7F, 0x2A, 0xFF, 0x79, 0x2B, 0x43, 0x6E, 0x22, 0x86, 0xB8, 0x20, 0x4B, 0xAA, 0x8C, 0x20, 0x53, 0xAD, 0xFF, 0xA4, 0x21, 0x00, 0x30, 0x53, 0x96, 0xFF, 0x54, 0x90, 0x2B, 0xFF, 0x92, 0x20, 0xFC, 0x85, 0x20, 0x4B, 0xA4, 0xFF, 0x41, 0x9B, 0x20, 0x3D, 0xA0, 0xFF, 0x9D, 0xFF, 0x93, 0x20, 0x17, 0x04, 0x8D, 0xFF, 0x89, 0xFF, 0x80, 0x20, 0x3F, 0x86, 0xFF, 0x50, 0x83, 0x20, 0x41, 0x76, 0x20, 0x0D, 0x83, 0xFF, 0x7D, 0xFF, 0x14, 0x77, 0xFF, 0x7E, 0x20, 0x4F, 0x72, 0x25, 0x87, 0x72, 0xFF, 0x04, 0x6C, 0xFF, 0x67, 0xFF, 0x62, 0x40, 0x03, 0x5C, 0xFF, 0x00, 0x58, 0xFF, 0x74, 0xFF, 0x70, 0xFF, 0x69, 0xFF, 0x50, 0x65, 0x25, 0xA1, 0x6A, 0x20, 0x15, 0x5F, 0xFF, 0x5E, 0xFF, 0x04, 0x5A, 0xFF, 0x53, 0xFF, 0x50, 0x22, 0x6C, 0x54, 0xFF, 0x14, 0x4D, 0xFF, 0x4A, 0x00, 0xD3, 0xFF, 0x16, 0x24, 0x1D, 0x6B, 0xFF, 0x6A, 0x15, 0x22, 0x66, 0x72, 0xD7, 0x85, 0x2F, 0xA8, 0xED, 0x5F, 0x95, 0xF9, 0xAA, 0x2E, 0xCE, 0xF0, 0x94, 0x3F, 0x75, 0x21, 0xBF, 0xD5, 0x84, 0x4D, 0x3D, 0xD5, 0x2F, 0xD0, 0xAF, 0xAC, 0xFD, 0x22, 0xFB, 0xE8, 0x26, 0x3B, 0xE0, 0x2F, 0xE7, 0x55, 0xF8, 0x2F, 0x06, 0xF1, 0x23, 0x03, 0xD9, 0x23, 0x01, 0xD3, 0x21, 0x7F, 0x55, 0xF0, 0x28, 0xC8, 0xE6, 0x21, 0x77, 0xD6, 0x23, 0x0F, 0xCC, 0x22, 0xD1, 0x55, 0xDD, 0x21, 0x89, 0xD5, 0x22, 0xBF, 0xC3, 0x22, 0xF6, 0xBB, 0x22, 0xB1, 0x55, 0xBF, 0x21, 0x61, 0xB5, 0x22, 0xB1, 0xA8, 0x21, 0x59, 0x9F, 0x22, 0xBB, 0x55, 0xAB, 0x21, 0x69, 0xA2, 0x21, 0x5F, 0x95, 0x2D, 0x23, 0x8C, 0x42, 0xD5, 0x5A, 0xD2, 0x21, 0x9F, 0xBF, 0x21, 0x95, 0x30, 0x1B, 0xCB, 0x27, 0x21, 0xC4, 0xAA, 0x21, 0xA7, 0xB0, 0x21, 0x9D, 0xA9, 0x21, 0x9F, 0xA6, 0x21, 0x7D, 0x9E, 0xAB, 0x21, 0x7F, 0x8F, 0x23, 0xA2, 0x87, 0x21, 0x77, 0x96, 0x26, 0xB9, 0x30, 0x0B, 0x51, 0x7F, 0x21, 0x19, 0x78, 0x21, 0x7F, 0x9E, 0xFF, 0x94, 0x20, 0x01, 0x45, 0x8A, 0x26, 0xCF, 0x82, 0xFF, 0x81, 0x20, 0x11, 0x8B, 0x20, 0x05, 0x62, 0x82, 0x20, 0x19, 0x30, 0x1B, 0x6E, 0xFF, 0x66, 0x21, 0xA5, 0x71, 0xA2, 0x21, 0x41, 0x68, 0x21, 0x3D, 0x63, 0xFF, 0x60, 0x21, 0x3B, 0x66, 0xA0, 0x21, 0x41, 0x5E, 0x2D, 0xBD, 0x57, 0xFF, 0x51, 0xFF, 0x4F, 0x2A, 0xFF, 0x48, 0x21, 0xC5, 0x70, 0x20, 0x21, 0x68, 0x80, 0x17, 0x6A, 0xAA, 0x20, 0x25, 0x63, 0x21, 0x63, 0x57, 0x20, 0x1D, 0x50, 0x20, 0x1F, 0x55, 0x20, 0xFF, 0x4E, 0x20, 0x01, 0x46, 0xFF, 0x47, 0xFF, 0x40, 0x0A, 0xFF, 0x3F, 0xFF, 0x39, 0x20, 0x07, 0x3F, 0x20, 0x09, 0x39, 0xA2, 0x20, 0x09, 0x32, 0x20, 0x01, 0x2C, 0xFF, 0x5D, 0x23, 0xF6, 0x53, 0xC0, 0x20, 0x23, 0x30, 0x03, 0x49, 0xFF, 0x44, 0xFF, 0x4B, 0xFF, 0x10, 0x45, 0xFF, 0x42, 0x21, 0x3E, 0x40, 0xFF, 0x3C, 0xFF, 0x05, 0x38, 0xFF, 0x34, 0xFF, 0x4A, 0x20, 0x39, 0x41, 0x21, 0x4E, 0x50, 0x43, 0x20, 0x05, 0x3B, 0x20, 0x11, 0x38, 0xFF, 0x35, 0xFF, 0x00, 0x31, 0xFF, 0x2E, 0xFF, 0x33, 0xFF, 0x30, 0xFF, 0x55, 0x2B, 0x23, 0x46, 0x3B, 0x20, 0x0F, 0x33, 0x20, 0x0F, 0x30, 0x24, 0xD2, 0x05, 0x2A, 0xFF, 0x26, 0xFF, 0x2D, 0x2B, 0x94, 0x27, 0x2D, 0xA5, 0x01, 0x23, 0xFF, 0x20, 0xFF, 0x1E, 0xFF, 0x1B, 0x23, 0x68, 0x50, 0x26, 0x40, 0x0B, 0x24, 0x2D, 0xB9, 0x1E, 0xFF, 0x1C, 0xFF, 0x05, 0x1D, 0xFF, 0x1A, 0xFF, 0x18, 0x21, 0xD2, 0x18, 0x24, 0xB8, 0x15, 0x13, 0xFF, 0x12, 0x33, 0x8B, 0x00, 0x20, 0x36, 0xD2, 0x6B, 0xF6, 0xB5, 0x34, 0x85, 0x00, 0x24, 0x87, 0x64, 0xB3, 0xFA, 0x2C, 0x0B, 0xEA, 0x24, 0x61, 0x55, 0xE4, 0x24, 0x57, 0xCC, 0x24, 0x59, 0xC6, 0x27, 0xFF, 0xDF, 0x24, 0x75, 0x52, 0xDA, 0x24, 0x5F, 0xC1, 0x24, 0x4D, 0xBC, 0x00, 0x22, 0xB6, 0x00, 0xC5, 0x23, 0x56, 0x43, 0x7B, 0xFE, 0xFF, 0xF2, 0x34, 0xA5, 0x00, 0x23, 0x4E, 0xAA, 0x24, 0xFD, 0xED, 0x2A, 0x35, 0xEA, 0x2C, 0x67, 0xD5, 0x24, 0xE9, 0xD2, 0xAA, 0x24, 0x91, 0xB7, 0x24, 0x8F, 0xB2, 0x29, 0x02, 0xCD, 0x24, 0xA5, 0xCA, 0xAA, 0x25, 0x7E, 0xAF, 0x24, 0x81, 0xAB, 0x25, 0x86, 0xB0, 0x23, 0x01, 0xAA, 0xAA, 0x23, 0x4B, 0x96, 0x23, 0x4D, 0x90, 0x23, 0x5B, 0xA4, 0x23, 0x09, 0x9F, 0xAA, 0x2E, 0xFF, 0x8A, 0x23, 0x35, 0x85, 0x22, 0xED, 0x7D, 0x22, 0xE9, 0x77, 0xAA, 0x22, 0xDB, 0x67, 0x22, 0xD9, 0x62, 0x22, 0xE7, 0x72, 0x23, 0x39, 0x6D, 0xAA, 0x22, 0xE3, 0x5C, 0x22, 0xE5, 0x57, 0x23, 0x6B, 0x9A, 0x23, 0x37, 0x96, 0xAA, 0x23, 0x17, 0x80, 0x23, 0x19, 0x7C, 0x23, 0x77, 0x93, 0x23, 0x29, 0x90, 0xAA, 0x25, 0x4A, 0x79, 0x23, 0x21, 0x76, 0x22, 0xFF, 0x6A, 0x23, 0x01, 0x65, 0xAA, 0x24, 0x7A, 0x53, 0x22, 0xF9, 0x50, 0x28, 0xA9, 0x62, 0x23, 0x09, 0x5F, 0xAA, 0x25, 0x6C, 0x4D, 0x23, 0x01, 0x4A, 0x21, 0x7F, 0x53, 0x25, 0x78, 0x4E, 0xA2, 0x21, 0x77, 0x42, 0x21, 0x79, 0x3D, 0xFF, 0x52, 0x21, 0x85, 0x4E, 0xAA, 0x21, 0x87, 0x40, 0x21, 0x7D, 0x3C, 0x21, 0x7F, 0x3A, 0x21, 0x69, 0x35, 0xAA, 0x21, 0x6F, 0x2D, 0x25, 0xA4, 0x28, 0x2E, 0xFD, 0x30, 0x21, 0x65, 0x2C, 0xAA, 0x41, 0x53, 0x1E, 0x21, 0x61, 0x1B, 0x21, 0x9F, 0x41, 0x21, 0xDD, 0x3D, 0xAA, 0x21, 0xAB, 0x31, 0x21, 0x99, 0x2D, 0x21, 0xA7, 0x3B, 0x21, 0xAF, 0x38, 0xAA, 0x21, 0x9F, 0x2B, 0x21, 0xA1, 0x29, 0x24, 0xE8, 0x23, 0x21, 0x95, 0x20, 0xAA, 0x21, 0x77, 0x18, 0x21, 0x79, 0x15, 0x21, 0x87, 0x1E, 0x2F, 0x43, 0x1C, 0xAA, 0x21, 0x83, 0x13, 0x23, 0x5E, 0x12, 0x2F, 0x4F, 0x1D, 0x40, 0x1B, 0x19, 0x8A, 0x23, 0x6C, 0x14, 0xFF, 0x11, 0x26, 0x72, 0x14, 0x23, 0x76, 0x11, 0xA8, 0x20, 0x09, 0x0E, 0x20, 0x01, 0x0B, 0x21, 0xA3, 0x10, 0xFF, 0x0F, 0x20, 0xFF, 0x0D, 0x40, 0x03, 0x0B, 0xFF, 0x0A, 0xFF, 0x0C, 0xAA, 0x20, 0x03, 0x09, 0x25, 0x24, 0x08, 0x25, 0x28, 0x06, 0x25, 0x32, 0x13, 0xAA, 0x20, 0x1D, 0x10, 0x20, 0x1F, 0x0C, 0x20, 0x15, 0x0A, 0x25, 0x3C, 0x0F, 0xAB, 0x20, 0x33, 0x0D, 0x20, 0x27, 0x08, 0x20, 0x1D, 0x07, 0x25, 0x52, 0x50, 0x25, 0x56, 0x04, 0x20, 0x01, 0x03, 0x25, 0x76, 0x02, 0x80, 0x07, 0x50, 0x01, 0x01, 0xAC, 0x00, 0xB9, 0x7F, 0x20, 0x2C, 0x1D, 0x03, 0x04, 0xE9, 0x7F, 0x10, 0x04, 0x80, 0x59, 0x30, 0xC2, 0x30, 0xFE, 0xE2, 0x2C, 0x3A, 0x3A, 0x46, 0x20, 0xF8, 0xE9, 0xFF, 0x0C, 0x00, 0x95, 0x00, 0xDC, 0x00, 0x3E, 0x2E, 0x03, 0x1F, 0xA9, 0x80, 0xF2, 0x18, 0x00, 0x10, 0xF9, 0x38, 0xEF, 0x4F, 0x02, 0x50, 0x90, 0xFF, 0x1F, 0xFF, 0xC0, 0xD0, 0x00, 0xDE, 0x98, 0xBF, 0x1B, 0xCB, 0xFF, 0x2F, 0x23, 0xF2, 0x7F, 0xE0, 0x4B, 0xFF, 0x01, 0xCF, 0x27, 0x10, 0x3A, 0x60, 0x2B, 0x20, 0x01, 0x1C, 0x20, 0x20, 0x22, 0x1E, 0x1D, 0x80, 0x0E, 0x20, 0x1D, 0x0D, 0x20, 0x0F, 0xCE, 0xA2, 0x25, 0xBE, 0xB0, 0x25, 0xCC, 0xA0, 0x00, 0x04, 0x27, 0x9B, 0x03, 0x00, 0x20, 0xCA, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0xCC, 0x00, 0xC0, 0xA3, 0x74, 0xA4, 0x0B, 0x05, 0x84, 0x14, 0x21, 0x0A, 0xBB, 0x3F, 0xFF, 0x01, 0x6C, 0x00, 0x90, 0x3F, 0xFF, 0x00, 0x12, 0xBB, 0x00, 0x06, 0x20, 0x00, 0xA5, 0xC9, 0x00, 0x20, 0x7B, 0xB6, 0xA0, 0x30, 0xAA, 0x1E, 0x18, 0x08, 0x00, 0xBA, 0x04, 0x09, 0x4F, 0xFF, 0xBA, 0x02, 0xDB, 0x80, 0x4F, 0xFF, 0x12, 0x20, 0xAB, 0x6C, 0x3C, 0x90, 0x70, 0x00, 0x4C, 0x3B, 0x80, 0x70, 0x38, 0x09, 0x2E, 0xB6, 0x0A, 0x29, 0x28, 0x03, 0xAC, 0x40, 0x3F, 0x4C, 0x90, 0x3F, 0x11, 0x00, 0x2B, 0xA6, 0xC9, 0xB8, 0x6C, 0xA6, 0xA0, 0x40, 0x02, 0xAA, 0x2E, 0x48, 0x00, 0xBA, 0x24, 0x30, 0x3F, 0x70, 0x0A, 0x10, 0xD5, 0x82, 0xDB, 0x38, 0x03, 0x09, 0x28, 0x1F, 0x3D, 0x00, 0x0C, 0x90, 0x60, 0x2E, 0xC7, 0xA0, 0xCA, 0x09, 0x90, 0x20, 0x59, 0x09, 0x07, 0x26, 0x5C, 0xC1, 0x00, 0x00, 0xD1, 0x20, 0xE1, 0x21, 0x40, 0x87, 0x00, 0x0B, 0x01, 0x6A, 0xE1, 0x00, 0xC1, 0x03, 0x00, 0xE1, 0xC1, 0x02, 0xAA, 0x7B, 0x02, 0xA7, 0xC4, 0xD0, 0x8B, 0x1C, 0x70, 0x58, 0x38, 0x50, 0x20, 0x00, 0x0A, 0x78, 0x41, 0xA0, 0xC5, 0x06, 0x01, 0xAE, 0x54, 0x5F, 0x10, 0x00, 0x38, 0x4F, 0x11, 0x99, 0x64, 0x10, 0x60, 0x0C, 0x11, 0x00, 0x5D, 0x11, 0x90, 0x15, 0x20, 0xB0, 0x2A, 0x80, 0x1F, 0x77, 0x1A, 0x22, 0xD0, 0x4A, 0xED, 0x80, 0x3F, 0xA8, 0x10, 0x02, 0x40, 0x3F, 0x20, 0x00, 0x37, 0x7C, 0xC0, 0x5F, 0x31, 0x6A, 0x1C, 0x27, 0x51, 0xC5, 0x00, 0x30, 0x9F, 0x1E, 0x05, 0x00, 0x40, 0xEA, 0x70, 0xDF, 0x3A, 0x6E, 0xA0, 0x0C, 0xBA, 0x5C, 0x40, 0x41, 0xCD, 0x30, 0xE3, 0xFF, 0x20, 0xF9, 0x00, 0xB7, 0xFF, 0xFF, 0xAF, 0xCF, 0x03, 0xD1, 0xF8, 0x01, 0xFF, 0x7F, 0xFE, 0xFF, 0x0C, 0x05, 0x06, 0x33, 0x15, 0x00, 0x00, 0x90, 0x80, 0xED, 0xFF, 0xEE, 0xFF, 0x79, 0x0A, 0x00, 0x77, 0x00, 0xEE, 0x20, 0x07, 0x77, 0x20, 0x07, 0x00, 0x01, 0xAA, 0x00, 0x07, 0xFF, 0xFF, 0x3F, 0xCF, 0x2B, 0x90, 0x06, 0xA5, 0x00, 0x00, 0xF9, 0xF8, 0x70, 0x17, 0x80, 0x1F, 0x4A, 0x00, 0x00, 0xA0, 0x6F, 0x6F, 0xF0, 0x30, 0x00, 0x9B, 0x07, 0x00, 0x00, 0xEF, 0x23, 0x00, 0x80, 0x37, 0x80, 0x3F, 0xEA, 0x05, 0x8B, 0x00, 0x30, 0x1F, 0x80, 0xE8, 0xAB, 0x59, 0xF7, 0x59, 0x00, 0x60, 0x3F, 0x3B, 0xFC, 0xE0, 0x6B, 0xF2, 0x00, 0xE0, 0x5F, 0x00, 0x90, 0x7F, 0xA2, 0x00, 0x6A, 0xF4, 0xF3, 0x2A, 0x9F, 0x8F, 0x90, 0xBF, 0xDE, 0x20, 0xDF, 0x97, 0xDC, 0x48, 0x01, 0x00, 0x20, 0x10, 0x7B, 0xFF, 0x02, 0xAF, 0xFC, 0x30, 0x24, 0xFF, 0xFA, 0x39, 0xE3, 0x4E, 0xFF, 0x24, 0xE5, 0x65, 0x50, 0x00, 0x01, 0xA9, 0x88, 0x05, 0x04, 0xFF, 0xF6, 0x1E, 0x0B, 0x8F, 0xB0, 0x50, 0xEF, 0x00, 0x4A, 0x9F, 0x01, 0x00, 0x32, 0x53, 0x07, 0x0C, 0xA2, 0x5C, 0x70, 0x25, 0x83, 0x90, 0x64, 0xF0, 0x41, 0xFA, 0x41, 0x45, 0xFF, 0xEF, 0x32, 0x02, 0x00, 0x20, 0xC5, 0x2A, 0xD9, 0x80, 0x80, 0x30, 0x03, 0xFF, 0x02, 0xFE, 0x05, 0x0B, 0xF8, 0xE1, 0x6F, 0x2B, 0x97, 0x80, 0x04, 0x90, 0x00, 0x05, 0x60, 0x00, 0x2F, 0x66, 0xB6, 0xFF, 0x00, 0xFF, 0x25, 0x06, 0x06, 0x1F, 0xF8, 0xF8, 0x9F, 0x22, 0xF8, 0xF7, 0x2F, 0x73, 0x06, 0x07, 0xBB, 0x25, 0xEC, 0xD0, 0x40, 0x40, 0x3B, 0xBB, 0xB8, 0x00, 0x6F, 0x6F, 0x70, 0xF0, 0x00, 0x6F, 0x6F, 0xE0, 0xE0, 0x68, 0xDF, 0x50, 0xA0, 0x08, 0xDF, 0xDF, 0x90, 0x90, 0x20, 0x0B, 0xF0, 0x4B, 0x00, 0x20, 0xB0, 0x00, 0x20, 0x0B, 0xA0, 0x9B, 0x00, 0x70, 0x00, 0x00, 0x89, 0xFF, 0xB6, 0x8D, 0xFF, 0xFF, 0x04, 0x03, 0x00, 0xAD, 0xFD, 0x23, 0x2F, 0xF3, 0xF3, 0x9F, 0xAF, 0x90, 0x20, 0x0B, 0x04, 0xBB, 0x2D, 0xB5, 0xF3, 0xF3, 0xAF, 0xBF, 0x00, 0xB2, 0x00, 0x8B, 0x00, 0xE8, 0xB0, 0xFF, 0xEF, 0x00, 0xC0, 0xC0, 0xFF, 0xFF, 0x49, 0x10, 0x81, 0xFD, 0x30, 0x90, 0xC1, 0x2B, 0x9B, 0x20, 0x0B, 0x90, 0x00, 0xBB, 0x00, 0x00, 0xA0, 0x21, 0xFF, 0xFF, 0x01, 0x00, 0xB3, 0x00, 0x00, 0xCC, 0x07, 0x7C, 0xFA, 0x68, 0xAC, 0xFB, 0x89, 0x00, 0x00, 0x0A, 0x95, 0xFA, 0x5F, 0x48, 0xF8, 0xF9, 0x00, 0x03, 0x06, 0x72, 0xFA, 0xBD, 0x21, 0x9D, 0x01, 0x00, 0x17, 0x0D, 0xF9, 0xF9, 0x01, 0x00, 0xB7, 0x00, 0x00, 0x58, 0xDF, 0xDB, 0xD8, 0x4F, 0x3F, 0x30, 0x20, 0x00, 0x3A, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x38, 0x6A, 0x04, 0x4F, 0x4F, 0x20, 0x30, 0x3B, 0x2E, 0x19, 0xFF, 0xFF, 0x10, 0x4A, 0x0B, 0xBB, 0x2E, 0x18, 0x70, 0xFA, 0xCC, 0x5E, 0x00, 0xFF, 0xFF, 0x09, 0x08, 0xFA, 0xFA, 0x8F, 0x8F, 0x00, 0xF3, 0xF3, 0x8F, 0x7F, 0xFF, 0xFC, 0x08, 0x3D, 0x00, 0x91, 0x00, 0xDD, 0x00, 0xF3, 0xF9, 0x8F, 0x9F, 0x00, 0xBA, 0x00, 0x6B, 0x00, 0x00, 0xB0, 0xC7, 0xAF, 0x00, 0xF4, 0xF7, 0x6F, 0x7F, 0xDC, 0x70, 0x19, 0xDF, 0x00, 0x30, 0x30, 0xFF, 0xFF, 0xF5, 0xC0, 0x6F, 0x9F, 0x00, 0x10, 0x00, 0xD8, 0x00, 0x30, 0x60, 0xFF, 0xEF, 0x04, 0xDB, 0x12, 0x2A, 0x00, 0x31, 0x2E, 0x70, 0x09, 0x0C, 0x80, 0x34, 0xF2, 0xFF, 0xFE, 0x00, 0x10, 0xFD, 0xFF, 0x09, 0x88, 0x5B, 0xEB, 0x40, 0x40, 0xB0, 0x20, 0x2B, 0xFF, 0x9F, 0x1E, 0x68, 0x08, 0x36, 0x67, 0xAE, 0x7F, 0x05, 0x09, 0xE4, 0x31, 0x40, 0x00, 0xFF, 0x40, 0xE4, 0x3F, 0x49, 0x9F, 0xFF, 0x02, 0xBF, 0xFA, 0x30, 0x3B, 0xFF, 0xC8, 0x00, 0x0F, 0x49, 0x23, 0xFC, 0x24, 0x02, 0xEE, 0x24, 0x02, 0x40, 0x07, 0xFD, 0xA5, 0xFA, 0x5F, 0x74, 0x60, 0x17, 0x70, 0x1F, 0x00, 0x05, 0xDA, 0x09, 0x90, 0x1F, 0x87, 0xD0, 0xBF, 0x80, 0x55, 0xFA, 0x20, 0xFB, 0xF9, 0xFF, 0xFF, 0x8C, 0xAF, 0x08, 0x03, 0xFF, 0x5E, 0x04, 0x10, 0x16, 0x4D, 0xE6, 0x43, 0x4C, 0x49, 0x08, 0x4D, 0xFF, 0xFE, 0x14, 0x2F, 0xFF, 0x02, 0x02, 0x28, 0xC2, 0x26, 0xF7, 0x38, 0x90, 0x69, 0x6D, 0x61, 0x67, 0x37, 0x02, 0x80, 0xA0, 0x27, 0xBE, 0x0D, 0x67, 0x0F, 0x4A, 0x4A, 0xE3, 0x64, 0xDB, 0x00, 0xE2, 0x95, 0x36, 0xB4, 0xC5, 0xE8, 0xC1, 0x17, 0x00, 0xED, 0xFB, 0xAB, 0x9B, 0x18, 0xC3, 0x05, 0x24, 0x00, 0xB5, 0x7C, 0x77, 0xB7, 0xD1, 0x53, 0x44, 0x24, 0x00, 0xD2, 0xBC, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static const unsigned char Nintendo_DistributedBy_LZ[0x2000] = -{ - 0x11, 0x48, 0x65, 0x00, 0x00, 0x64, 0x61, 0x72, 0x63, 0xFF, 0xFE, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x28, 0x65, 0x00, 0x00, 0x83, 0x30, 0x09, 0x38, 0x04, 0x00, 0x00, 0x60, 0x20, 0x03, 0x30, 0x13, 0xAB, 0x30, 0x18, 0x15, 0x20, 0x1D, 0x02, 0xA0, 0x0B, 0x06, 0x20, 0x2B, 0x30, 0x18, 0x5A, 0x09, 0x20, 0x35, 0x10, 0x20, 0x39, 0x30, 0x2B, 0xF8, 0x20, 0x41, 0x54, 0x85, 0x30, 0x0B, 0x05, 0x00, 0x00, 0xEC, 0x20, 0x4D, 0x98, 0x30, 0x17, 0xD0, 0x20, 0x28, 0x30, 0x17, 0xDC, 0x30, 0x23, 0x07, 0x00, 0x00, 0xCC, 0x09, 0x0C, 0x00, 0x00, 0x20, 0x20, 0x51, 0x40, 0x14, 0x20, 0x2B, 0xA0, 0x20, 0x0B, 0x64, 0x20, 0x5D, 0xA0, 0x20, 0x00, 0x00, 0x4C, 0x99, 0x20, 0x5C, 0xA8, 0x01, 0x50, 0x53, 0x20, 0x22, 0x00, 0xB2, 0x30, 0x75, 0x0A, 0x23, 0x00, 0x00, 0xB4, 0x20, 0x74, 0xE2, 0x20, 0x81, 0xC0, 0x09, 0x25, 0x00, 0x00, 0x3C, 0x20, 0x68, 0x12, 0x02, 0x50, 0x77, 0xA0, 0x30, 0x8F, 0x1C, 0x20, 0x90, 0x00, 0x36, 0x00, 0x00, 0x28, 0xA6, 0x20, 0xAB, 0x3E, 0x20, 0x9C, 0x80, 0x3A, 0x20, 0x0B, 0x20, 0xAD, 0x60, 0xAA, 0x30, 0x17, 0x3C, 0x50, 0x17, 0x82, 0x30, 0x17, 0x40, 0x20, 0x23, 0x08, 0x16, 0x00, 0x00, 0xA4, 0x30, 0x2F, 0x49, 0x20, 0x67, 0x20, 0xE9, 0xC4, 0xAB, 0x30, 0x3B, 0x4A, 0x50, 0x17, 0xDC, 0x30, 0x3B, 0x52, 0x20, 0x47, 0x20, 0xE0, 0x59, 0xF4, 0x30, 0x53, 0x55, 0x20, 0x53, 0x30, 0xD4, 0x00, 0x2E, 0x21, 0x13, 0x01, 0x61, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x6D, 0x21, 0x1D, 0x41, 0x4E, 0x20, 0x07, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x20, 0x11, 0x05, 0x64, 0x00, 0x6F, 0x00, 0x4C, 0x20, 0x03, 0x67, 0x20, 0x07, 0x14, 0x5F, 0x00, 0x44, 0x20, 0x03, 0x30, 0x20, 0x01, 0x5F, 0x00, 0x10, 0x53, 0x00, 0x63, 0x40, 0x1F, 0x65, 0x00, 0x4F, 0x00, 0x55, 0x75, 0x20, 0x2B, 0x41, 0x20, 0x43, 0x62, 0x20, 0x13, 0x6C, 0x40, 0x47, 0xAB, 0x02, 0x50, 0x43, 0x42, 0x03, 0x20, 0x43, 0x43, 0x01, 0x80, 0x87, 0x55, 0x03, 0x20, 0xCB, 0x00, 0x90, 0x43, 0xEB, 0x01, 0x90, 0xCB, 0x00, 0x90, 0x87, 0xF0, 0xCB, 0x62, 0x21, 0x5D, 0x79, 0x21, 0x97, 0x01, 0x31, 0xA1, 0xF5, 0x71, 0x8D, 0x00, 0xF0, 0x2F, 0x71, 0x05, 0xD0, 0x2F, 0x74, 0x42, 0x09, 0x67, 0x23, 0x29, 0x5E, 0x33, 0x22, 0x01, 0x73, 0xA2, 0x01, 0xB0, 0x5B, 0x52, 0x2D, 0x00, 0x10, 0x21, 0x31, 0xAA, 0x01, 0x00, 0x21, 0x32, 0x01, 0x00, 0x43, 0x33, 0xE0, 0x65, 0x4C, 0x23, 0x71, 0x4D, 0x8F, 0x22, 0xA3, 0x73, 0x00, 0x6B, 0x00, 0x40, 0x85, 0x30, 0x1F, 0x00, 0xB0, 0x17, 0xF0, 0x93, 0xD1, 0xF2, 0xE3, 0x32, 0xDB, 0x69, 0x20, 0xE9, 0x74, 0x00, 0x72, 0x23, 0x05, 0x55, 0x62, 0x42, 0xD3, 0x65, 0x22, 0xFD, 0x42, 0x21, 0x71, 0x5F, 0x20, 0xD1, 0x05, 0x32, 0x00, 0x38, 0x00, 0x78, 0x23, 0x84, 0x34, 0xE0, 0xFD, 0x81, 0xB0, 0x02, 0x43, 0x4C, 0x41, 0x4E, 0xFF, 0xFE, 0x23, 0xF0, 0x18, 0x00, 0x02, 0x02, 0x34, 0x23, 0x33, 0xB6, 0x70, 0x61, 0x74, 0x74, 0x31, 0x23, 0xA2, 0x44, 0x5E, 0x34, 0x79, 0x28, 0x33, 0x93, 0xFF, 0xFF, 0x40, 0xFF, 0x34, 0x6C, 0x53, 0x63, 0x65, 0x6E, 0x65, 0x4F, 0x10, 0x75, 0x74, 0x41, 0x24, 0x91, 0x47, 0x5F, 0x41, 0x5F, 0x21, 0x30, 0x30, 0xD0, 0x50, 0x70, 0x61, 0x69, 0x31, 0x33, 0xC3, 0x9A, 0x50, 0x3F, 0x02, 0x00, 0x30, 0x59, 0x34, 0xBD, 0x68, 0x24, 0xC1, 0x50, 0x00, 0x5F, 0x4E, 0x69, 0x6E, 0x4C, 0x6F, 0x67, 0x6F, 0xE1, 0xA0, 0x35, 0x34, 0xC0, 0x34, 0xDD, 0x43, 0x4C, 0x56, 0x43, 0x74, 0x5F, 0x1E, 0x00, 0x10, 0x02, 0x40, 0x87, 0x40, 0x0B, 0xD0, 0x5D, 0x20, 0x76, 0x7F, 0x40, 0x43, 0x35, 0x0C, 0x4E, 0x5F, 0x52, 0x6F, 0x6F, 0x74, 0xE7, 0xD0, 0x7E, 0x00, 0x70, 0x4B, 0x80, 0x57, 0x00, 0x20, 0x20, 0x3B, 0x50, 0x3F, 0x00, 0x30, 0xFF, 0xF1, 0x35, 0x17, 0xB0, 0xFF, 0x24, 0xF2, 0x80, 0xFF, 0x00, 0x00, 0x1E, 0x45, 0x6C, 0xAB, 0x70, 0xFF, 0x42, 0x40, 0xFF, 0x42, 0x00, 0x40, 0xFF, 0x9C, 0x80, 0x2D, 0x90, 0xFF, 0x65, 0x5C, 0x01, 0xE0, 0xFF, 0x90, 0xB3, 0x34, 0xC2, 0x02, 0xD0, 0xF3, 0xC8, 0x20, 0xAA, 0xF7, 0xD0, 0xF3, 0x01, 0x71, 0xFF, 0x31, 0x39, 0x71, 0xFF, 0x65, 0x23, 0x51, 0xB1, 0xFF, 0x31, 0x84, 0x16, 0x47, 0x5F, 0x43, 0x00, 0x81, 0xFF, 0x0F, 0xE1, 0xFF, 0x02, 0x90, 0xFF, 0x12, 0x65, 0xC3, 0x02, 0x31, 0xF3, 0x92, 0x3F, 0x80, 0xBF, 0x91, 0xF3, 0x60, 0x32, 0xB6, 0xED, 0x00, 0x82, 0xFF, 0x36, 0xFF, 0x03, 0x32, 0xFF, 0x7C, 0x27, 0x47, 0x53, 0x3F, 0x0D, 0x42, 0xFF, 0x55, 0x48, 0x27, 0xBD, 0xB0, 0x27, 0xC1, 0xA4, 0x27, 0xAD, 0x24, 0x27, 0xA8, 0x82, 0x36, 0xEB, 0x30, 0x03, 0x00, 0x00, 0xBC, 0x20, 0x03, 0x24, 0xB4, 0x27, 0xCB, 0x88, 0x37, 0x93, 0x27, 0xB4, 0xB0, 0x27, 0x07, 0x74, 0x0A, 0x0B, 0x00, 0x00, 0x78, 0x0B, 0x32, 0xDF, 0x57, 0x00, 0x03, 0x5B, 0x37, 0x52, 0xE5, 0x27, 0x8E, 0x26, 0xD1, 0x33, 0xB7, 0x50, 0x41, 0x83, 0x2F, 0x02, 0xF2, 0xE3, 0xC5, 0x73, 0xDB, 0x01, 0x13, 0x07, 0x50, 0x5F, 0x33, 0x00, 0x80, 0x67, 0xB8, 0x60, 0x67, 0xDD, 0x20, 0xAA, 0x43, 0xC7, 0x38, 0x63, 0xC7, 0x30, 0x6F, 0x93, 0x9F, 0xA0, 0x24, 0x0A, 0x4C, 0xA0, 0x27, 0xC5, 0x80, 0xBE, 0x24, 0x39, 0x23, 0x16, 0xA0, 0xC0, 0x8C, 0x48, 0x99, 0x06, 0x02, 0x00, 0x30, 0x37, 0x70, 0x23, 0x33, 0x33, 0x02, 0xB3, 0x3F, 0xFC, 0x2D, 0xEC, 0xBC, 0x70, 0x0B, 0x0A, 0x32, 0xD7, 0x23, 0x20, 0x0B, 0x30, 0x2F, 0x80, 0x3F, 0x48, 0xC9, 0x07, 0xF1, 0x01, 0xD0, 0x2F, 0xF4, 0x2F, 0xB0, 0x6B, 0x39, 0x2C, 0x40, 0x9D, 0x1C, 0x30, 0x97, 0xBF, 0x61, 0xEF, 0xCC, 0x28, 0x65, 0x30, 0x9B, 0x70, 0xF3, 0x24, 0x87, 0xE4, 0xB9, 0x71, 0x5B, 0x70, 0x50, 0xF1, 0x5B, 0x29, 0x59, 0xD4, 0x8B, 0x80, 0x41, 0xCD, 0xCC, 0x5F, 0xCC, 0x20, 0xEB, 0x20, 0x34, 0x02, 0x00, 0x41, 0x67, 0x00, 0x14, 0xBB, 0x30, 0x7F, 0x30, 0x2F, 0x9A, 0x71, 0x73, 0x44, 0x73, 0xF5, 0x38, 0x01, 0xA0, 0x7F, 0xC1, 0x20, 0x7F, 0x3E, 0x8E, 0x02, 0xD0, 0x7F, 0x52, 0x65, 0x64, 0x01, 0x70, 0xFF, 0xC1, 0xEB, 0x45, 0x43, 0xC2, 0x14, 0xB7, 0x6D, 0xDB, 0x20, 0x7F, 0x8C, 0x25, 0x02, 0x20, 0xC1, 0xD4, 0x00, 0xD1, 0x8B, 0xB6, 0x6C, 0x5C, 0xA4, 0x87, 0xB4, 0x41, 0x3B, 0x92, 0x24, 0x2F, 0xE9, 0xC0, 0x60, 0x8B, 0x31, 0x00, 0x32, 0xE7, 0x35, 0x33, 0xF2, 0xE7, 0x92, 0x53, 0x5F, 0xF0, 0x26, 0x82, 0x20, 0x25, 0x1B, 0x90, 0x0B, 0x50, 0x97, 0x34, 0xEF, 0x00, 0x50, 0x97, 0xEB, 0x96, 0x53, 0x30, 0x3B, 0x77, 0x08, 0xAA, 0xF1, 0x17, 0x32, 0x02, 0x13, 0x73, 0x32, 0xF7, 0xFE, 0x50, 0x8B, 0x00, 0x96, 0x7B, 0x33, 0x1B, 0x57, 0x7C, 0x00, 0x31, 0x7F, 0x3B, 0xB0, 0x57, 0x07, 0x54, 0x6D, 0x53, 0x2B, 0x0E, 0x47, 0x73, 0x4C, 0x37, 0x8B, 0x2B, 0xF9, 0x94, 0x63, 0x8B, 0xD8, 0x3B, 0xA7, 0x3B, 0xF1, 0x24, 0x4B, 0xF5, 0x00, 0x01, 0x97, 0xC0, 0x39, 0x8E, 0x7A, 0xE3, 0x2B, 0x59, 0x51, 0x5B, 0x5C, 0x1D, 0x01, 0x20, 0x23, 0x03, 0xF7, 0x6B, 0x40, 0x04, 0x41, 0x9E, 0x15, 0x8D, 0xBD, 0x31, 0xA3, 0x9A, 0x99, 0x6A, 0xB9, 0x2B, 0x9D, 0x2C, 0x7A, 0x04, 0x01, 0x10, 0x23, 0x01, 0x01, 0x20, 0x8F, 0x01, 0xAB, 0x01, 0x20, 0x8F, 0x01, 0x00, 0x10, 0x8F, 0xC1, 0x20, 0x8F, 0x3D, 0x60, 0x8F, 0x44, 0x5B, 0x60, 0x01, 0x00, 0x10, 0x8F, 0x00, 0x00, 0x23, 0x50, 0x5F, 0x42, 0x6C, 0x6B, 0x80, 0x03, 0xE1, 0x63, 0x9A, 0x99, 0x19, 0xC0, 0x0E, 0x74, 0xDA, 0xFF, 0x00, 0xC1, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0x03, 0x81, 0x63, 0x00, 0x13, 0xBB, 0xAA, 0x00, 0x32, 0xC7, 0x58, 0x2E, 0xBD, 0x88, 0x66, 0x4F, 0xE8, 0x2E, 0xC9, 0x18, 0xAF, 0x2E, 0xB5, 0x48, 0x2E, 0xB9, 0x78, 0x62, 0xC7, 0xE3, 0xD3, 0x56, 0x3F, 0x60, 0x0B, 0xBD, 0x52, 0xD3, 0xF0, 0xC2, 0xD3, 0x01, 0xC0, 0x2F, 0x22, 0xDF, 0xD4, 0x33, 0x40, 0x68, 0x03, 0xDF, 0x50, 0x0B, 0x52, 0xEB, 0xF0, 0xC2, 0xEB, 0x01, 0xB0, 0x2F, 0x32, 0xF7, 0x01, 0xB0, 0xBF, 0x33, 0x03, 0xFF, 0x01, 0xC0, 0x2F, 0x00, 0x10, 0xBF, 0x45, 0x73, 0x70, 0x0B, 0x53, 0x1B, 0x40, 0xBF, 0x83, 0x1B, 0x01, 0xB0, 0x2F, 0xFF, 0x63, 0x27, 0x03, 0xC1, 0xC3, 0x33, 0x27, 0x75, 0x97, 0x93, 0x33, 0x00, 0x91, 0xC3, 0x01, 0x00, 0x2F, 0x05, 0xE1, 0xC3, 0xFF, 0x00, 0xF0, 0xBF, 0xF1, 0xC3, 0x01, 0x00, 0x2F, 0x05, 0x01, 0xC3, 0x00, 0x16, 0xB7, 0x00, 0x36, 0x4F, 0x35, 0xCC, 0x33, 0x8B, 0xD7, 0x36, 0x53, 0x33, 0x8F, 0xA0, 0x69, 0xE3, 0xD0, 0x6D, 0xAB, 0xE6, 0xCF, 0x59, 0xC7, 0xFF, 0x26, 0x43, 0x00, 0x40, 0x17, 0x26, 0x37, 0xD6, 0xFF, 0x63, 0x57, 0x26, 0x2B, 0x00, 0x30, 0x17, 0x36, 0x1F, 0xFF, 0x00, 0x30, 0x5F, 0x36, 0x13, 0x00, 0x40, 0x17, 0x00, 0x10, 0x5F, 0x48, 0x6B, 0x35, 0xFB, 0x00, 0x30, 0x17, 0x65, 0xEF, 0xFF, 0x03, 0xC1, 0x03, 0x82, 0xC7, 0xE1, 0x03, 0x82, 0xDF, 0x02, 0xE1, 0x03, 0x73, 0x27, 0xF1, 0x03, 0x80, 0x17, 0xDB, 0x01, 0xE1, 0x03, 0x00, 0xFD, 0xDF, 0x54, 0xEC, 0xDF, 0x02, 0x7E, 0xDF, 0x04, 0x2F, 0xA4, 0x5F, 0x0D, 0xAA, 0xDC, 0xDF, 0x50, 0x2F, 0xCC, 0xB8, 0x2F, 0xD0, 0x20, 0x2F, 0xBC, 0xA0, 0xAA, 0x2F, 0xC0, 0x2C, 0x2C, 0xE3, 0xAC, 0x2C, 0xE7, 0x10, 0x2C, 0xDF, 0x74, 0x97, 0x2C, 0xDF, 0xD8, 0x07, 0x2D, 0x17, 0x09, 0x2C, 0x31, 0x2C, 0xE3, 0x02, 0x9C, 0xDF, 0xF5, 0x3E, 0xCF, 0x00, 0xFC, 0xDF, 0x9E, 0xF3, 0x00, 0xBC, 0xDF, 0x7C, 0xEC, 0xDF, 0x2C, 0x6D, 0x5B, 0xFF, 0xDD, 0x4F, 0x4C, 0xE3, 0x8C, 0xD3, 0xD0, 0x17, 0x9C, 0xBB, 0x00, 0x30, 0x17, 0x00, 0x9F, 0xD3, 0x3F, 0xFD, 0xEF, 0x01, 0x1C, 0x8B, 0x00, 0x0D, 0xE7, 0xC3, 0xA3, 0xA0, 0x81, 0xF3, 0x00, 0x9F, 0xFB, 0x30, 0x23, 0x01, 0x1C, 0x73, 0xDB, 0x03, 0xD0, 0x67, 0x02, 0x7C, 0x5B, 0x70, 0x2B, 0xCB, 0x7C, 0x5B, 0x20, 0x3B, 0xDB, 0x00, 0xEB, 0xC3, 0xFB, 0x3E, 0x67, 0x7F, 0xD7, 0x5B, 0xCF, 0x00, 0xFC, 0x4F, 0x00, 0xDC, 0xDB, 0xF0, 0x2C, 0xCB, 0x80, 0x7F, 0xEF, 0x01, 0x2C, 0xDB, 0x30, 0x2F, 0x7F, 0xFB, 0xC8, 0x2F, 0x03, 0x7C, 0xDB, 0x5B, 0xE7, 0xAC, 0xDB, 0xFF, 0x00, 0x4C, 0x4F, 0x03, 0x3D, 0x67, 0x00, 0x1E, 0x67, 0xDD, 0x67, 0x04, 0x1C, 0x67, 0x41, 0xA3, 0x79, 0x93, 0x9D, 0x43, 0xFF, 0xCC, 0x67, 0x00, 0x60, 0x23, 0xCC, 0x67, 0x31, 0xEB, 0x89, 0x7B, 0x28, 0x2F, 0x00, 0x3C, 0x67, 0x00, 0x50, 0x23, 0xFF, 0xDC, 0x67, 0x00, 0x50, 0x8F, 0xDC, 0x67, 0x00, 0x60, 0x23, 0x00, 0x10, 0x8F, 0x79, 0x4B, 0x30, 0x8F, 0x00, 0x2C, 0x67, 0xCF, 0x00, 0x50, 0x23, 0x04, 0x1C, 0x67, 0x70, 0xC2, 0xA9, 0x33, 0x00, 0x81, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0xFF, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0x03, 0x81, 0x63, 0x01, 0x5C, 0x67, 0x01, 0x9F, 0x2F, 0x43, 0xEB, 0x6F, 0x2F, 0xFF, 0x9F, 0x97, 0xDF, 0x2F, 0x00, 0x60, 0x23, 0xCF, 0x2F, 0x34, 0x33, 0x7F, 0x2F, 0x38, 0x2F, 0x00, 0x3F, 0x2F, 0xFF, 0x00, 0x50, 0x23, 0xDF, 0x2F, 0x00, 0x50, 0x8F, 0xDF, 0x2F, 0x00, 0x60, 0x23, 0x00, 0x10, 0x8F, 0x6F, 0x2F, 0x40, 0x8F, 0xFF, 0x00, 0x2F, 0x2F, 0x00, 0x50, 0x23, 0x01, 0x7C, 0x07, 0x01, 0xB1, 0x63, 0x9F, 0x2F, 0x00, 0x91, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0xFF, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0x03, 0x81, 0x63, 0x01, 0x5B, 0xA7, 0x01, 0x95, 0x8F, 0x46, 0x27, 0x6F, 0x23, 0xFF, 0x9F, 0xDF, 0xD5, 0x8F, 0x00, 0x60, 0x23, 0xC5, 0x8F, 0x4F, 0xDF, 0x6F, 0x0B, 0x4F, 0xDF, 0x00, 0x25, 0x8F, 0xFF, 0x00, 0x50, 0x23, 0xD5, 0x8F, 0x00, 0x50, 0x8F, 0xD5, 0x8F, 0x00, 0x60, 0x23, 0x00, 0x10, 0x8F, 0x6E, 0xDB, 0x40, 0x8F, 0xFF, 0x00, 0x25, 0x8F, 0x00, 0x50, 0x23, 0x01, 0x7C, 0x07, 0x01, 0xB1, 0x63, 0x9E, 0xC3, 0x00, 0x91, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0xFB, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0x03, 0x61, 0x63, 0x00, 0x7C, 0x5F, 0x4C, 0x2C, 0x5C, 0xBC, 0x5F, 0xC6, 0x3E, 0x51, 0x7C, 0x5F, 0x65, 0x00, 0x73, 0xCC, 0x5F, 0x3B, 0x9C, 0x47, 0x2B, 0x5F, 0x43, 0x00, 0x4C, 0x5F, 0xFC, 0x2E, 0xBB, 0x0F, 0x5B, 0x58, 0x4C, 0x5F, 0xD5, 0x3C, 0x82, 0x3B, 0xAB, 0xBC, 0x2F, 0xFF, 0xFC, 0x2F, 0xF8, 0x3C, 0x2E, 0xDB, 0x5F, 0x7C, 0x2E, 0xDF, 0xBC, 0x2E, 0xE3, 0x00, 0x3C, 0x47, 0x3E, 0xC7, 0x5E, 0xFB, 0x00, 0x7A, 0x3B, 0x2F, 0x80, 0xBF, 0x9A, 0x3B, 0x60, 0x88, 0xC7, 0x00, 0x3C, 0x2B, 0x00, 0x70, 0x4B, 0x9F, 0x2B, 0x77, 0xCA, 0x2A, 0xB7, 0x00, 0x9B, 0xCB, 0x01, 0x10, 0x3F, 0xF2, 0xA0, 0x3F, 0x00, 0x1B, 0xA3, 0x01, 0xD0, 0x3F, 0xDE, 0x00, 0x29, 0xEF, 0x01, 0x00, 0xBF, 0x8E, 0x2B, 0x77, 0x70, 0xFF, 0x00, 0x27, 0x67, 0x01, 0x00, 0xFF, 0x24, 0xEC, 0xF0, 0x3F, 0xDF, 0x83, 0x01, 0x01, 0x3F, 0x30, 0x00, 0x8E, 0xBB, 0x5E, 0xBF, 0x59, 0x54, 0xA8, 0x7E, 0xBF, 0xB4, 0x2E, 0xBC, 0x10, 0x2F, 0xFB, 0x6C, 0x79, 0x74, 0x64, 0x31, 0x3E, 0xD1, 0x4A, 0x9E, 0x00, 0xA0, 0x2D, 0xE7, 0x70, 0x43, 0x05, 0x74, 0x78, 0x6C, 0x31, 0x34, 0x61, 0xFB, 0x04, 0x2F, 0xFF, 0x80, 0x2D, 0x55, 0x74, 0x65, 0x6E, 0x64, 0x6F, 0x5F, 0x44, 0x00, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x00, 0x65, 0x64, 0x42, 0x79, 0x5F, 0x31, 0x32, 0x38, 0x00, 0x78, 0x36, 0x34, 0x2E, 0x62, 0x63, 0x6C, 0x69, 0x17, 0x6D, 0x00, 0x6D, 0x2F, 0x07, 0x60, 0x62, 0x2F, 0x30, 0x57, 0x4D, 0x8B, 0x08, 0x4C, 0x6F, 0x67, 0x6F, 0xAE, 0xF5, 0xFF, 0xFF, 0xFF, 0xDF, 0x30, 0x03, 0x00, 0x40, 0x02, 0x15, 0x5F, 0xEC, 0x30, 0x6E, 0xAF, 0x7E, 0x3E, 0x13, 0x5E, 0x17, 0x08, 0x70, 0x61, 0x6E, 0x31, 0x3B, 0x5B, 0x01, 0x04, 0xFF, 0x00, 0x00, 0x52, 0x6F, 0x6F, 0x74, 0x50, 0x61, 0x6E, 0x70, 0x65, 0x00, 0xB0, 0xEB, 0x00, 0x50, 0x47, 0x50, 0xDF, 0x70, 0x61, 0x73, 0x31, 0xD3, 0x3B, 0xAF, 0x70, 0x53, 0x03, 0x20, 0x53, 0x4E, 0x5F, 0x30, 0x55, 0x00, 0x0F, 0xA2, 0xD0, 0x01, 0x20, 0x53, 0x4C, 0xDF, 0x42, 0x80, 0x53, 0x69, 0x63, 0x31, 0x80, 0x9F, 0x3C, 0x1B, 0x07, 0xFF, 0x00, 0x41, 0x03, 0x7E, 0xEC, 0x2D, 0x67, 0x82, 0x2B, 0x00, 0x20, 0xEF, 0x9E, 0x2F, 0x6F, 0x80, 0x42, 0xF1, 0x2B, 0x71, 0xA5, 0xCF, 0x2F, 0xC1, 0x27, 0x80, 0x0C, 0x3F, 0x70, 0x61, 0x65, 0x60, 0xDB, 0x50, 0x07, 0x67, 0x72, 0x30, 0x70, 0x31, 0x3C, 0xA3, 0x31, 0x33, 0x47, 0x72, 0x6F, 0x75, 0xCE, 0x3C, 0x9B, 0x7F, 0xF3, 0x67, 0x72, 0x51, 0x07, 0x30, 0x23, 0x34, 0x63, 0x47, 0x3F, 0x5F, 0x41, 0xCF, 0xDF, 0x3F, 0xDB, 0xF1, 0x17, 0xF1, 0xD7, 0x30, 0x5F, 0x3F, 0xEB, 0x1F, 0x47, 0x5F, 0x42, 0xCF, 0x79, 0x3F, 0xF3, 0x00, 0x90, 0x2B, 0xD4, 0xAB, 0x3F, 0xEF, 0x9A, 0xF1, 0x7F, 0x67, 0x72, 0x50, 0xC7, 0x00, 0x72, 0xBF, 0x3C, 0x22, 0xBC, 0x22, 0xB5, 0x00, 0x02, 0xBF, 0xC8, 0x82, 0xBF, 0x3D, 0x7F, 0x07, 0x64, 0xBB, 0x2D, 0x2F, 0xFF, 0x9D, 0x2F, 0x08, 0x00, 0x4F, 0x34, 0xA1, 0x32, 0xF3, 0x2F, 0xFF, 0x78, 0x2F, 0xFB, 0x1D, 0x33, 0x64, 0x73, 0x62, 0xA1, 0x62, 0xC4, 0x80, 0x10, 0x31, 0xF0, 0x10, 0x53, 0x32, 0xF0, 0x21, 0x33, 0x62, 0xF7, 0x4C, 0x54, 0x90, 0x3E, 0x30, 0x0B, 0x83, 0x70, 0x39, 0x4C, 0x54, 0x4D, 0x61, 0x73, 0x3C, 0xCC, 0xA3, 0x1F, 0x05, 0xA8, 0x06, 0x00, 0x00, 0x0B, 0x2F, 0xFF, 0x38, 0x2F, 0xFF, 0x55, 0x88, 0x2F, 0xFB, 0x08, 0x2F, 0xF4, 0x88, 0x2F, 0xF8, 0x08, 0x2F, 0xD4, 0x55, 0x88, 0x2F, 0xD8, 0x4C, 0x2F, 0x10, 0xE8, 0x2F, 0x14, 0xAC, 0x23, 0x74, 0x3B, 0x48, 0x05, 0x2F, 0xD7, 0x20, 0x2F, 0x00, 0x35, 0x47, 0xAA, 0x53, 0x4B, 0x00, 0x83, 0x47, 0x76, 0x02, 0x00, 0xA3, 0x47, 0x00, 0x35, 0x57, 0x00, 0xB3, 0x97, 0xD5, 0x20, 0xB3, 0x00, 0xB3, 0x97, 0x40, 0xD0, 0x24, 0x20, 0x30, 0x03, 0x11, 0x2F, 0xFB, 0x74, 0x06, 0x00, 0x04, 0xC3, 0x30, 0x03, 0x30, 0x0B, 0x65, 0x06, 0x00, 0x01, 0x30, 0x03, 0x30, 0x17, 0xD3, 0x31, 0x87, 0x5E, 0x03, 0x05, 0x2F, 0x47, 0x4F, 0x5F, 0x31, 0x32, 0x01, 0xB0, 0x7F, 0x60, 0x01, 0x03, 0xE0, 0x7F, 0xD2, 0xA9, 0x00, 0x00, 0x8C, 0x8C, 0x8C, 0xEF, 0x05, 0xA0, 0x7F, 0x00, 0x16, 0x97, 0x00, 0xF1, 0x7F, 0x03, 0x03, 0xC1, 0x7F, 0x00, 0x16, 0xD7, 0x45, 0x9B, 0x2F, 0xB4, 0x96, 0x00, 0x25, 0x9B, 0x80, 0x3F, 0x23, 0x44, 0x04, 0x25, 0x97, 0x30, 0x03, 0x06, 0x01, 0x00, 0x06, 0x06, 0x73, 0x09, 0xED, 0xBE, 0x30, 0x03, 0x86, 0x3F, 0xFB, 0x3A, 0x57, 0xDE, 0x40, 0x30, 0x03, 0xE0, 0x13, 0xC0, 0xE0, 0x30, 0x03, 0x00, 0x75, 0xC7, 0x78, 0x54, 0x10, 0x04, 0x00, 0x01, 0x10, 0x14, 0x04, 0x10, 0x02, 0xA2, 0x37, 0x46, 0xF2, 0x37, 0x26, 0x06, 0x1F, 0x02, 0x05, 0x66, 0x23, 0x33, 0x00, 0x12, 0x43, 0x4D, 0x5F, 0x00, 0x35, 0xAA, 0x00, 0x36, 0x5E, 0x2C, 0x80, 0xEA, 0x23, 0x77, 0x05, 0x26, 0x5B, 0x30, 0x03, 0x30, 0x8E, 0x3E, 0xE3, 0xBE, 0x30, 0x03, 0xB0, 0xBF, 0xE0, 0x13, 0xC0, 0xBF, 0x50, 0xA7, 0x00, 0xF0, 0x00, 0xC0, 0xA7, 0x00, 0x21, 0x5F, 0xCF, 0x5F, 0x01, 0xB1, 0x5F, 0x2F, 0xA1, 0xBD, 0xBF, 0xC3, 0x30, 0x03, 0x3F, 0xF7, 0xCE, 0x95, 0x17, 0x41, 0x30, 0x03, 0xE0, 0x13, 0x78, 0xC1, 0x30, 0x03, 0x05, 0x21, 0x5F, 0x00, 0x00, 0xC3, 0x01, 0x31, 0x5F, 0x61, 0x0B, 0xB6, 0x7F, 0xBF, 0x30, 0x03, 0xB0, 0xBF, 0xE0, 0x13, 0xC0, 0xBF, 0x02, 0x61, 0x5F, 0xCD, 0xF7, 0x01, 0xB2, 0xBF, 0xFF, 0x3F, 0xF7, 0x50, 0x03, 0x5D, 0xA7, 0x50, 0x03, 0xC0, 0x13, 0x4F, 0xF7, 0x05, 0x22, 0xBF, 0x00, 0x00, 0xC3, 0xFF, 0x01, 0x32, 0xBF, 0x3F, 0xE3, 0x3F, 0xE7, 0xB0, 0xBF, 0xE0, 0x13, 0xC0, 0xBF, 0x01, 0xF2, 0xBF, 0x03, 0x59, 0x67, 0xFF, 0x57, 0x87, 0x00, 0x59, 0x67, 0x00, 0x1C, 0x63, 0x99, 0x13, 0x40, 0x03, 0x00, 0x79, 0x13, 0x3F, 0x93, 0xC9, 0x67, 0x58, 0xA0, 0x4E, 0xC7, 0xF5, 0x00, 0x84, 0xD3, 0x70, 0x53, 0x46, 0x31, 0x32, 0xE8, 0x00, 0x63, 0x2F, 0x58, 0x2F, 0xFA, 0x93, 0x05, 0x4F, 0xF1, 0x00, 0x00, 0xCD, 0x27, 0xCC, 0x4C, 0x28, 0x36, 0x80, 0x3F, 0x50, 0x07, 0x40, 0x0F, 0x4A, 0x8F, 0xFF, 0x50, 0x07, 0x9F, 0xEC, 0xE0, 0x0B, 0x40, 0x03, 0x00, 0x0A, 0x0F, 0x2A, 0xB7, 0x00, 0xA4, 0xB7, 0x60, 0xFB, 0x7D, 0x20, 0x01, 0xC0, 0xA7, 0x27, 0x62, 0x01, 0x00, 0xA7, 0x8A, 0x0F, 0x81, 0x2F, 0x91, 0x00, 0x84, 0xA3, 0x8B, 0x71, 0x83, 0x10, 0xF4, 0xBF, 0x01, 0xC1, 0x2F, 0x07, 0x04, 0xD1, 0x2F, 0x00, 0x80, 0xA7, 0xBE, 0x01, 0xF1, 0x2F, 0x08, 0x02, 0x41, 0x2F, 0x00, 0x5D, 0x8B, 0xE1, 0xB7, 0xEB, 0xCB, 0x00, 0xD2, 0x5F, 0x09, 0xEF, 0x04, 0xD2, 0x5F, 0x00, 0xB0, 0xA7, 0x01, 0xC3, 0x07, 0x0A, 0x01, 0xE2, 0x5F, 0x92, 0xE7, 0x00, 0x1F, 0xFB, 0x5F, 0xC7, 0x6B, 0xF8, 0x25, 0x6F, 0x3C, 0xFB, 0xA0, 0x00, 0x68, 0x1F, 0x10, 0x43, 0xE3, 0x00, 0x5C, 0xF7, 0x47, 0x50, 0x43, 0x83, 0x00, 0x00, 0x44, 0x6C, 0xF7, 0x30, 0x0F, 0x3E, 0x1F, 0xE7, 0x30, 0x0F, 0x2C, 0xF7, 0x6D, 0x77, 0x03, 0x08, 0x6D, 0x77, 0x00, 0xC3, 0x67, 0x00, 0x70, 0x7F, 0xAF, 0x4D, 0x77, 0x41, 0xFE, 0xA3, 0x01, 0x01, 0x4D, 0x77, 0x00, 0x3D, 0xFF, 0x00, 0x1A, 0xEB, 0x01, 0x94, 0xEB, 0xF7, 0x00, 0x10, 0x87, 0x5F, 0xE9, 0x00, 0xED, 0xFF, 0x7E, 0x7F, 0x01, 0x50, 0x7F, 0xFA, 0xEB, 0x02, 0xB0, 0x7F, 0x7B, 0x03, 0x8E, 0x7F, 0x9E, 0x6F, 0xFE, 0x8F, 0x00, 0x02, 0x0F, 0x03, 0x3F, 0x07, 0x00, 0x1A, 0xF3, 0xF5, 0x01, 0x91, 0x8F, 0x00, 0x12, 0x0F, 0x2A, 0x3A, 0x04, 0x8F, 0x07, 0xDC, 0x00, 0x2F, 0x07, 0x0C, 0x4F, 0x07, 0xFF, 0xD6, 0xB7, 0xFD, 0x97, 0xFD, 0x57, 0xFC, 0xE7, 0xFC, 0x77, 0xFC, 0x07, 0xFB, 0x97, 0xFA, 0xE3, 0xFB, 0xFA, 0x57, 0xF9, 0xA3, 0xF9, 0x17, 0xF8, 0x63, 0x3F, 0xE3, 0xCC, 0x00, 0x2F, 0xA7, 0x3E, 0x8F, 0xAE, 0x0A, 0x30, 0xCB, 0x2C, 0x41, 0xA7, 0x43, 0xCF, 0x1B, 0x37, 0x0D, 0xF8, 0x5F, 0x67, 0x60, 0x72, 0x56, 0xFF, 0x01, 0x48, 0xC3, 0x40, 0x00, 0x78, 0x80, 0x80, 0x8C, 0x34, 0x6F, 0x00, 0x00, 0x0A, 0x2B, 0x81, 0x20, 0x0B, 0xEF, 0x80, 0x00, 0x80, 0xEF, 0xEF, 0xFF, 0xF8, 0x0B, 0xBF, 0x70, 0x10, 0x01, 0xFF, 0xF6, 0x8F, 0x85, 0x20, 0x00, 0x88, 0x40, 0x41, 0x30, 0x50, 0x27, 0x1C, 0xCF, 0x00, 0x01, 0x30, 0x20, 0x0B, 0xE0, 0x30, 0x03, 0x38, 0x36, 0x4F, 0x79, 0x87, 0x00, 0x05, 0xFD, 0xFC, 0x30, 0x0B, 0x0A, 0x3F, 0x85, 0x3F, 0x89, 0xFC, 0xFC, 0x0A, 0x0A, 0xC1, 0x30, 0x03, 0x2F, 0xFA, 0x83, 0x00, 0x00, 0xF7, 0xF7, 0x3F, 0x10, 0x38, 0xBF, 0xFF, 0x31, 0x7A, 0x20, 0x0B, 0x20, 0x0F, 0xFF, 0x9F, 0xCF, 0x04, 0xFF, 0x1F, 0x2F, 0xF6, 0x60, 0xAF, 0xE5, 0x81, 0x00, 0x09, 0x00, 0xF3, 0xF3, 0x01, 0x22, 0xB0, 0xCF, 0xFF, 0x30, 0x05, 0x20, 0xF3, 0xF3, 0x40, 0x03, 0x28, 0x00, 0x00, 0x5F, 0x5F, 0x83, 0x40, 0x5F, 0x88, 0xFE, 0xCA, 0xFF, 0xCC, 0x30, 0x0B, 0x40, 0x0F, 0x83, 0x7F, 0xEC, 0x88, 0x00, 0x88, 0xFF, 0xCC, 0x2F, 0xCC, 0x30, 0x07, 0x25, 0xCF, 0xFF, 0x21, 0xEE, 0xFC, 0xFC, 0x30, 0x7D, 0x0C, 0x22, 0xC0, 0xC0, 0x30, 0x03, 0x20, 0x1F, 0x06, 0xFF, 0xCC, 0x0D, 0x0A, 0x00, 0x07, 0x30, 0x00, 0x88, 0x60, 0x60, 0x50, 0xE7, 0x3F, 0xFF, 0x30, 0x0B, 0xD9, 0x40, 0x0F, 0x30, 0x3F, 0xCD, 0x20, 0x37, 0x50, 0x47, 0xCC, 0x02, 0x2D, 0xA7, 0x16, 0x34, 0xFF, 0x33, 0x41, 0x0F, 0x33, 0x30, 0x07, 0x40, 0x3F, 0x0E, 0xAF, 0x30, 0xC7, 0x84, 0x25, 0xCB, 0xF8, 0x4F, 0xD3, 0x2F, 0x9F, 0x50, 0x0B, 0x20, 0x0F, 0x8C, 0x2F, 0xE8, 0xAF, 0xFF, 0x00, 0x30, 0xE7, 0x5F, 0xD7, 0x8E, 0xBF, 0x05, 0xFF, 0x0E, 0x1E, 0xF7, 0x70, 0x32, 0x64, 0xBF, 0x40, 0xC7, 0x04, 0x00, 0x82, 0x00, 0x00, 0xF4, 0x40, 0xC7, 0x4F, 0x4F, 0xF0, 0x3F, 0xFF, 0x50, 0xD7, 0x30, 0x0B, 0x40, 0x0F, 0x80, 0x00, 0x88, 0xF1, 0x10, 0xE1, 0xFF, 0xEF, 0x70, 0x7F, 0xE1, 0xE1, 0x7F, 0x7F, 0xC0, 0x30, 0x03, 0xE0, 0xDF, 0xDC, 0x00, 0x15, 0x00, 0x00, 0xEF, 0x31, 0xFF, 0x05, 0x40, 0x41, 0x3F, 0xDA, 0xD3, 0x40, 0xDF, 0x2E, 0xBE, 0x33, 0xFD, 0xFA, 0x00, 0x0E, 0x0F, 0x2F, 0xB5, 0x07, 0x09, 0x01, 0xAA, 0xBD, 0x21, 0xEB, 0x8C, 0x31, 0xEF, 0x01, 0x01, 0x60, 0x25, 0x3F, 0x40, 0x0F, 0xFF, 0x70, 0x18, 0x00, 0xDE, 0x01, 0x30, 0x0B, 0x39, 0x69, 0xFF, 0xF6, 0x1C, 0x00, 0xCF, 0x50, 0x00, 0xFF, 0xF5, 0x30, 0x31, 0xFF, 0x28, 0xFF, 0x5C, 0x46, 0x97, 0x50, 0x5F, 0xBF, 0xF5, 0xFF, 0xFF, 0x0E, 0x40, 0x00, 0xEE, 0x10, 0xF1, 0xEF, 0x41, 0xFF, 0x2F, 0xFF, 0xFC, 0x06, 0xFD, 0x0A, 0x0B, 0xEB, 0x10, 0x30, 0x88, 0x51, 0xEF, 0x2F, 0x19, 0x2F, 0x00, 0x00, 0x30, 0x03, 0x51, 0xFF, 0xE6, 0x10, 0x30, 0x0F, 0x48, 0x2E, 0x2F, 0xE0, 0xF5, 0x50, 0x30, 0xC7, 0xF5, 0x40, 0x02, 0x0D, 0x1D, 0xF3, 0xF2, 0xDF, 0x20, 0x54, 0x7F, 0xF3, 0xF4, 0x2F, 0x99, 0x1D, 0x00, 0x00, 0xD4, 0x41, 0xFB, 0xB1, 0xEF, 0x32, 0x0B, 0x4E, 0xB6, 0x9A, 0xC3, 0xF1, 0xEF, 0x20, 0x79, 0x00, 0x00, 0xEB, 0x10, 0x31, 0xFF, 0x33, 0xE7, 0xC0, 0x00, 0x01, 0xEF, 0xB1, 0xFF, 0x00, 0xEE, 0x11, 0xFF, 0x35, 0xFF, 0x68, 0x33, 0x30, 0xF7, 0x21, 0xF2, 0x33, 0x3F, 0xDF, 0x57, 0xFF, 0x55, 0x02, 0xFF, 0xEE, 0x11, 0xEE, 0x11, 0x55, 0x60, 0x07, 0x06, 0xC0, 0x87, 0x06, 0x51, 0xEF, 0x55, 0xFF, 0x04, 0x0D, 0xEE, 0x11, 0xC0, 0x34, 0x41, 0x32, 0x0B, 0xE7, 0x10, 0x1E, 0x1E, 0x00, 0x00, 0x88, 0x30, 0x03, 0xF6, 0x60, 0xCF, 0x2E, 0xEE, 0xF6, 0x50, 0x1E, 0x08, 0x1F, 0x00, 0x00, 0x1D, 0xAF, 0xA4, 0x01, 0x1C, 0xF3, 0x32, 0xF3, 0xCF, 0x21, 0x2C, 0x71, 0xEF, 0xF5, 0x50, 0x37, 0xDB, 0xE4, 0xE8, 0x42, 0x0B, 0x30, 0xC7, 0x61, 0xEF, 0x6F, 0x7F, 0xD7, 0xE1, 0xF1, 0xAF, 0x38, 0xFF, 0xD1, 0x20, 0x97, 0x70, 0x7F, 0x9F, 0xEF, 0xF9, 0xFB, 0x10, 0x28, 0x90, 0xFE, 0x20, 0x9D, 0x65, 0x30, 0x9F, 0x01, 0xFB, 0xFF, 0x1B, 0x9F, 0x0B, 0x7C, 0x33, 0xB3, 0x2C, 0x6C, 0x06, 0x5B, 0xBA, 0x00, 0x4C, 0xB2, 0x01, 0x43, 0x4C, 0x49, 0x4D, 0xFF, 0xFE, 0x14, 0x2F, 0xFA, 0x18, 0x02, 0x02, 0x28, 0x29, 0xD7, 0x3B, 0x3D, 0x69, 0x6D, 0x61, 0x23, 0x67, 0x10, 0x4C, 0x7C, 0x10, 0x00, 0x0D, 0x62, 0x33, 0x06, 0xD0, 0x01, 0x0A, 0x20, 0xA0, 0x00, 0x71, 0x23, 0xDF, 0xFF, 0x33, 0xBF, 0xC0, 0x80, 0x2E, 0xAB, 0xC0, 0xC0, 0xAF, 0x9F, 0x00, 0x00, 0x9F, 0xF0, 0x20, 0x03, 0x73, 0x97, 0x80, 0x07, 0xFF, 0xA0, 0x78, 0x00, 0x02, 0xFF, 0x30, 0xFC, 0x3E, 0x4F, 0x7B, 0x3F, 0xCE, 0x90, 0x90, 0xDF, 0xDF, 0xF9, 0x30, 0x03, 0x01, 0x9D, 0xBF, 0x50, 0x6F, 0x30, 0x6B, 0x40, 0x6F, 0x00, 0xB0, 0x44, 0x93, 0x47, 0xDF, 0x22, 0x07, 0xD7, 0x00, 0xEE, 0x00, 0x0E, 0xAE, 0x42, 0x17, 0x20, 0x17, 0xD0, 0x70, 0x07, 0x40, 0x6F, 0x80, 0x90, 0x6F, 0xC5, 0xFF, 0xCF, 0x7F, 0x3D, 0xDE, 0x00, 0x95, 0x7D, 0xC1, 0x7F, 0x63, 0x53, 0x71, 0x7F, 0x20, 0x71, 0x7F, 0xD6, 0xC2, 0xCF, 0x06, 0xB1, 0x8B, 0x50, 0xA8, 0x22, 0x70, 0x28, 0x2E, 0x2D, 0xE6, 0x10, 0x11, 0x00, 0x43, 0xFD, 0x3A, 0x8F, 0x76, 0x00, 0x98, 0x6F, 0xA8, 0x21, 0xCE, 0x47, 0x2D, 0x83, 0xFF, 0x7A, 0xFF, 0x45, 0x4F, 0xDE, 0x14, 0xAA, 0x00, 0xBB, 0x4A, 0xAF, 0xBB, 0x50, 0x07, 0xFF, 0x23, 0x42, 0xEF, 0x42, 0xB3, 0xFF, 0x21, 0xFF, 0x53, 0x4F, 0xFE, 0x9A, 0x28, 0x00, 0x68, 0x4A, 0xCF, 0x24, 0x3F, 0xE8, 0xAD, 0xFF, 0xFF, 0x54, 0xC8, 0x3A, 0xDB, 0xB3, 0x5F, 0xF4, 0xFA, 0x56, 0x77, 0x27, 0xFF, 0x3F, 0x00, 0x4B, 0x85, 0x3F, 0x7B, 0x87, 0x26, 0x8B, 0x2D, 0xED, 0xB3, 0xC2, 0x07, 0xC0, 0x0A, 0x0E, 0x21, 0xF6, 0x22, 0xFF, 0x26, 0xC5, 0x86, 0x4F, 0x7F, 0xDD, 0x22, 0x23, 0xFF, 0x32, 0x4F, 0x5A, 0x43, 0xFF, 0x97, 0x6B, 0xC7, 0x37, 0x3B, 0x01, 0x10, 0xE7, 0xF2, 0xF4, 0xFF, 0xFF, 0xFC, 0x2F, 0x74, 0xD0, 0x30, 0x03, 0x9F, 0x7B, 0xDF, 0xAF, 0x86, 0x0C, 0x09, 0xFF, 0x4F, 0x00, 0x02, 0x00, 0xFF, 0xAD, 0xBF, 0x04, 0x28, 0xFF, 0x11, 0x00, 0x6C, 0x03, 0x07, 0xE0, 0xF8, 0xD6, 0x00, 0xDD, 0x00, 0x48, 0x51, 0x68, 0xDD, 0x26, 0x03, 0x61, 0xEF, 0x54, 0x00, 0x3C, 0xFD, 0xFF, 0xB8, 0xFF, 0x09, 0xFE, 0x00, 0x00, 0x51, 0x41, 0xEF, 0xFD, 0xA0, 0x97, 0x7F, 0x03, 0x10, 0x00, 0xFE, 0xFC, 0x10, 0xA0, 0x23, 0xF1, 0x6F, 0xE0, 0x00, 0x2C, 0xEF, 0x00, 0x03, 0xFF, 0xFF, 0x1E, 0x8F, 0xA8, 0xA1, 0x1B, 0xEF, 0x21, 0x1F, 0xAF, 0x05, 0x94, 0x99, 0xA1, 0xF2, 0x00, 0x38, 0x00, 0xF2, 0x20, 0x03, 0x85, 0x89, 0x40, 0xD7, 0x37, 0xFF, 0x01, 0x44, 0xBE, 0x4D, 0x8F, 0x58, 0x00, 0x23, 0x4F, 0xFF, 0x64, 0xFF, 0x45, 0xA7, 0x47, 0xE7, 0xDC, 0xFF, 0xED, 0x79, 0x80, 0xDE, 0x28, 0x80, 0x91, 0x30, 0xD2, 0xCC, 0xFF, 0x50, 0xCF, 0x21, 0x00, 0x32, 0x42, 0xDF, 0x23, 0x33, 0x00, 0x26, 0x52, 0x73, 0x30, 0xFB, 0x3F, 0x93, 0x40, 0x04, 0xA6, 0x63, 0x3F, 0x12, 0x38, 0x27, 0x7A, 0xEF, 0x35, 0x94, 0x72, 0xEF, 0x8E, 0x05, 0xFF, 0xFF, 0x2F, 0x05, 0x4D, 0x2F, 0xAA, 0x6B, 0x03, 0xE4, 0x0C, 0xBA, 0x00, 0xB5, 0xFF, 0x40, 0x29, 0xD4, 0x07, 0x55, 0xFF, 0x08, 0xC0, 0x7F, 0x91, 0x4A, 0x8B, 0x99, 0x3F, 0x00, 0x99, 0x5F, 0x97, 0x5A, 0x97, 0x8F, 0xA7, 0x70, 0x17, 0x60, 0x1F, 0x8F, 0xC7, 0x0D, 0x56, 0xFF, 0x55, 0x01, 0x37, 0x97, 0x90, 0x1F, 0x78, 0x4F, 0xE3, 0xCD, 0x27, 0xC0, 0x4A, 0x27, 0x97, 0xFF, 0x2A, 0xA7, 0x27, 0x85, 0x35, 0x26, 0xBF, 0xC4, 0x24, 0x07, 0x3F, 0xE7, 0x8B, 0xFF, 0x03, 0x44, 0x10, 0xC6, 0x00, 0x34, 0xFF, 0xD4, 0x80, 0x5F, 0x3F, 0xFF, 0x17, 0x9F, 0xD5, 0xEF, 0xFF, 0x33, 0x07, 0xCF, 0x45, 0x6F, 0x2B, 0x77, 0x3E, 0xEF, 0x3B, 0x7D, 0xAF, 0xF1, 0x11, 0x30, 0x20, 0xFB, 0x5F, 0xEF, 0xF3, 0xF9, 0xF8, 0x90, 0x3F, 0x26, 0x31, 0xB7, 0x22, 0x97, 0x00, 0x75, 0x85, 0xBF, 0x2F, 0xEA, 0xAF, 0x04, 0x0D, 0xFF, 0x9E, 0xFF, 0x45, 0x4F, 0xE1, 0xA9, 0x00, 0x51, 0x9A, 0x45, 0xBF, 0x89, 0x55, 0xA7, 0xFF, 0x22, 0xFF, 0x3E, 0x7F, 0x05, 0x00, 0xFF, 0x75, 0xFF, 0xDA, 0x4F, 0xFF, 0x23, 0x35, 0xB7, 0x41, 0x5E, 0x8A, 0x8F, 0xFF, 0xFF, 0x7F, 0x8F, 0x52, 0x23, 0x0C, 0xF7, 0x0D, 0x92, 0x31, 0xE1, 0xEF, 0xE1, 0xFF, 0x7F, 0xA7, 0x02, 0x2D, 0x07, 0x30, 0x03, 0xF0, 0x0F, 0xC1, 0x01, 0x1D, 0x86, 0x45, 0x3E, 0x00, 0xFB, 0xB0, 0xFF, 0xFF, 0x25, 0x13, 0xCE, 0x4C, 0x5F, 0x5F, 0xE8, 0xF2, 0xD0, 0x28, 0x8B, 0x25, 0x31, 0x77, 0x11, 0x0D, 0xE0, 0xA5, 0x1B, 0x96, 0x44, 0x2D, 0x69, 0xFB, 0x01, 0x07, 0xF8, 0xF2, 0x82, 0x86, 0x45, 0x0E, 0x50, 0x00, 0x2F, 0x3F, 0x2C, 0x87, 0xE5, 0x04, 0xFF, 0xFF, 0x20, 0x00, 0xFA, 0x2D, 0xB1, 0x0D, 0x6F, 0x87, 0x76, 0x87, 0x18, 0xEF, 0x00, 0x38, 0x77, 0x77, 0xC2, 0x5F, 0xAE, 0x2B, 0x0F, 0x6B, 0xFF, 0x01, 0xAF, 0x47, 0xCF, 0x4C, 0x6F, 0x26, 0x89, 0x00, 0x3E, 0x47, 0x72, 0x3A, 0x0D, 0xB4, 0x2F, 0x04, 0xF1, 0xFF, 0x7F, 0xF1, 0xA0, 0xB0, 0x2C, 0x0D, 0xF4, 0x87, 0x79, 0x7C, 0x00, 0x60, 0xFB, 0xFF, 0x28, 0x32, 0x00, 0xB0, 0x01, 0x24, 0x07, 0x1E, 0x4F, 0x08, 0x2F, 0x2C, 0x6F, 0x2E, 0xDD, 0xBD, 0xFE, 0xDB, 0x59, 0x00, 0x56, 0xD8, 0x5E, 0x97, 0xA5, 0x37, 0x87, 0x61, 0x00, 0x17, 0x9F, 0x38, 0x93, 0x40, 0xD2, 0x96, 0x9E, 0x7D, 0xDF, 0xFE, 0x28, 0xAF, 0xD0, 0xE1, 0x39, 0xF1, 0x1A, 0xEC, 0x27, 0x87, 0x2F, 0xF7, 0x2F, 0xE3, 0x3F, 0x2B, 0x55, 0x98, 0xBE, 0x04, 0x07, 0x1A, 0xFF, 0xFF, 0x08, 0x4F, 0x09, 0x0E, 0x13, 0xFF, 0x20, 0x4A, 0xBF, 0x22, 0x23, 0x00, 0x22, 0xC3, 0xEF, 0xDE, 0xFF, 0xDD, 0x55, 0x42, 0x60, 0x17, 0xC0, 0x30, 0x1F, 0x49, 0x23, 0xFF, 0xED, 0xFF, 0x00, 0x31, 0x00, 0x64, 0x95, 0x7A, 0xDB, 0x60, 0x37, 0xEE, 0x12, 0x2F, 0x61, 0x50, 0xFD, 0x84, 0xDA, 0x11, 0xFF, 0xBD, 0xFF, 0x69, 0x45, 0xE7, 0x14, 0x6B, 0x86, 0x9B, 0x0F, 0x8E, 0x5E, 0x01, 0x9F, 0x6C, 0x52, 0x00, 0x1C, 0x2A, 0x35, 0xC4, 0x2E, 0xEF, 0x2F, 0x03, 0xAD, 0x00, 0x47, 0x5A, 0x6F, 0xFD, 0x74, 0x8F, 0x4F, 0x9F, 0xB9, 0xFF, 0xDC, 0x4F, 0xFF, 0x28, 0x6C, 0x2B, 0xB2, 0x4F, 0x57, 0x35, 0xBB, 0xFF, 0x2B, 0xAA, 0x2D, 0x64, 0x10, 0x60, 0xB7, 0x32, 0x35, 0xDC, 0x0A, 0x10, 0x00, 0xB4, 0xEC, 0x2F, 0xD7, 0xF9, 0x7B, 0x78, 0xEF, 0x88, 0x68, 0x9F, 0x8B, 0xFF, 0x25, 0xAB, 0x8F, 0x6D, 0xFF, 0x8F, 0x2F, 0x02, 0x00, 0x3F, 0xCD, 0x6C, 0x01, 0xEC, 0xAC, 0xCE, 0x7F, 0x2E, 0xAB, 0xDE, 0x7F, 0xE0, 0x68, 0x7F, 0x9D, 0x2E, 0x04, 0x0E, 0x88, 0xFF, 0xEF, 0xEF, 0x8A, 0xAF, 0x00, 0x8E, 0x47, 0x24, 0xDD, 0x78, 0xDD, 0x77, 0x33, 0x00, 0x11, 0x33, 0x11, 0x8D, 0x7D, 0x13, 0x13, 0x7D, 0xDF, 0x20, 0x03, 0x8A, 0xBF, 0x77, 0x50, 0x17, 0x70, 0x07, 0xFF, 0x49, 0x30, 0x2B, 0xB0, 0x2F, 0xDB, 0xF0, 0x0F, 0x01, 0xB9, 0x7F, 0xA8, 0x6D, 0xEA, 0x7F, 0x7F, 0x10, 0x6F, 0x7F, 0x27, 0xB0, 0xD0, 0x04, 0xA1, 0x00, 0x0D, 0xB0, 0x01, 0x02, 0x60, 0xED, 0x61, 0xFF, 0x2C, 0xFF, 0x1A, 0xBE, 0xFF, 0xF0, 0x3E, 0xB7, 0x00, 0xC0, 0xFF, 0x19, 0x00, 0x21, 0x1D, 0x01, 0x8C, 0x28, 0xFA, 0xCC, 0xFF, 0x3A, 0x3B, 0x92, 0x40, 0x3F, 0x17, 0xFF, 0x46, 0x6B, 0x27, 0x4C, 0x84, 0xFF, 0xE9, 0xBD, 0xB9, 0x3C, 0xB8, 0xFD, 0xF1, 0x23, 0x34, 0x30, 0x62, 0x4C, 0xDA, 0x40, 0x13, 0xF7, 0xFF, 0xF1, 0x20, 0x03, 0x04, 0xEF, 0xFF, 0xE8, 0xFF, 0xE0, 0x20, 0x03, 0xE1, 0xFF, 0x1C, 0xD9, 0xFF, 0xD3, 0x50, 0x95, 0x2E, 0xE1, 0x21, 0x87, 0x57, 0xFF, 0x1A, 0x86, 0xFF, 0xD1, 0x93, 0x69, 0x30, 0x41, 0xFA, 0x31, 0x9F, 0xAC, 0x22, 0xFF, 0xC7, 0x41, 0xA5, 0xD9, 0xFF, 0xE4, 0x50, 0x5B, 0xF6, 0x20, 0xFF, 0xF2, 0x20, 0x5D, 0xFB, 0xFF, 0xEE, 0xFF, 0xEA, 0xAA, 0x2F, 0x23, 0xF5, 0x20, 0x05, 0xE4, 0x23, 0x97, 0xEA, 0x2E, 0x2E, 0xDA, 0x08, 0xFF, 0xDB, 0xFF, 0xD5, 0x2C, 0x6E, 0xC6, 0xFF, 0xD0, 0x02, 0xFF, 0xCB, 0xFF, 0xC1, 0xFF, 0xBC, 0x27, 0xE7, 0xE1, 0xA0, 0x20, 0x11, 0xD2, 0x24, 0x7A, 0xDA, 0xFF, 0xCD, 0xFF, 0xCA, 0x82, 0x20, 0x19, 0xC1, 0xFF, 0xB7, 0xFF, 0xB3, 0x20, 0xFE, 0xBA, 0x0A, 0xFF, 0xAF, 0xFF, 0xAB, 0x05, 0xD1, 0xFF, 0x5F, 0x62, 0x6D, 0x03, 0x28, 0xFF, 0x29, 0x20, 0xC2, 0xC2, 0xE1, 0x7F, 0x05, 0xFF, 0x9F, 0xAD, 0x22, 0x8D, 0x07, 0x21, 0x61, 0xA7, 0x20, 0x9A, 0x5F, 0xE9, 0x8A, 0xD9, 0x48, 0xA8, 0x38, 0x99, 0xFE, 0x41, 0x01, 0xF7, 0x25, 0x34, 0xEA, 0xFF, 0xE0, 0x51, 0x8D, 0xD1, 0x73, 0xF6, 0x80, 0x27, 0xF7, 0xFF, 0xEB, 0x25, 0x56, 0x54, 0xE0, 0x21, 0x1D, 0xE9, 0x21, 0x25, 0xDE, 0x2F, 0x4A, 0xD4, 0xFF, 0x14, 0xD3, 0xFF, 0xC9, 0x2F, 0x52, 0xD3, 0x2B, 0x3D, 0xC9, 0xFF, 0x54, 0xC8, 0x25, 0x49, 0xBD, 0x21, 0x07, 0xFC, 0x27, 0x46, 0xF0, 0xFF, 0x51, 0xE6, 0x20, 0x2D, 0xE2, 0x25, 0x9E, 0xD5, 0xFF, 0xE3, 0x21, 0x95, 0x55, 0xD6, 0x2D, 0xB0, 0xD0, 0x20, 0x21, 0xC3, 0x25, 0x10, 0xDA, 0x21, 0x3B, 0x14, 0xCD, 0xFF, 0xC5, 0x21, 0x4D, 0xC4, 0x25, 0x7B, 0xB6, 0xFF, 0x40, 0xBF, 0x21, 0x3D, 0xB2, 0xFF, 0xAB, 0xFF, 0xB0, 0xFF, 0x05, 0xA9, 0xFF, 0xA3, 0xFF, 0x9C, 0x21, 0x51, 0xC0, 0x22, 0x4A, 0x54, 0xB5, 0x21, 0x53, 0xAE, 0x21, 0xA8, 0xA2, 0x21, 0x59, 0xAA, 0xFF, 0x50, 0xA8, 0x20, 0xC8, 0xA0, 0x2F, 0xE0, 0x95, 0xFF, 0x8C, 0xFF, 0x40, 0xA6, 0x2B, 0x49, 0x9A, 0xFF, 0x92, 0xFF, 0x96, 0xFF, 0x54, 0x8F, 0x25, 0x33, 0x84, 0x20, 0x05, 0x87, 0x22, 0x2C, 0x7C, 0xFF, 0x15, 0x7F, 0xFF, 0x79, 0x2B, 0x43, 0x6E, 0x22, 0x86, 0xB8, 0x20, 0x4B, 0x46, 0xAA, 0x20, 0x53, 0xAD, 0xFF, 0xA4, 0x21, 0x00, 0x30, 0x53, 0x96, 0x2A, 0xFF, 0x90, 0x2B, 0xFF, 0x92, 0x20, 0xFC, 0x85, 0x20, 0x4B, 0xA4, 0x20, 0xFF, 0x9B, 0x20, 0x3D, 0xA0, 0xFF, 0x9D, 0xFF, 0x93, 0x82, 0x20, 0x17, 0x8D, 0xFF, 0x89, 0xFF, 0x80, 0x20, 0x3F, 0x86, 0x28, 0xFF, 0x83, 0x20, 0x41, 0x76, 0x20, 0x0D, 0x83, 0xFF, 0x7D, 0x0A, 0xFF, 0x77, 0xFF, 0x7E, 0x20, 0x4F, 0x72, 0x25, 0x87, 0x72, 0x02, 0xFF, 0x6C, 0xFF, 0x67, 0xFF, 0x62, 0x40, 0x03, 0x5C, 0x00, 0xFF, 0x58, 0xFF, 0x74, 0xFF, 0x70, 0xFF, 0x69, 0x28, 0xFF, 0x65, 0x25, 0xA1, 0x6A, 0x20, 0x15, 0x5F, 0xFF, 0x5E, 0x02, 0xFF, 0x5A, 0xFF, 0x53, 0xFF, 0x50, 0x22, 0x6C, 0x54, 0x0A, 0xFF, 0x4D, 0xFF, 0x4A, 0x00, 0xD3, 0xFF, 0x16, 0x24, 0x1D, 0x6B, 0x35, 0xFF, 0x15, 0x22, 0x66, 0x72, 0xD7, 0x85, 0x2F, 0xA8, 0xED, 0x5F, 0x95, 0x55, 0xF9, 0x2E, 0xCE, 0xF0, 0x94, 0x3F, 0x75, 0x21, 0xBF, 0xD5, 0x84, 0x4D, 0x6A, 0x3D, 0x2F, 0xD0, 0xAF, 0xAC, 0xFD, 0x22, 0xFB, 0xE8, 0x26, 0x3B, 0xE0, 0xAA, 0x2F, 0xE7, 0xF8, 0x2F, 0x06, 0xF1, 0x23, 0x03, 0xD9, 0x23, 0x01, 0xD3, 0xAA, 0x21, 0x7F, 0xF0, 0x28, 0xC8, 0xE6, 0x21, 0x77, 0xD6, 0x23, 0x0F, 0xCC, 0xAA, 0x22, 0xD1, 0xDD, 0x21, 0x89, 0xD5, 0x22, 0xBF, 0xC3, 0x22, 0xF6, 0xBB, 0xAA, 0x22, 0xB1, 0xBF, 0x21, 0x61, 0xB5, 0x22, 0xB1, 0xA8, 0x21, 0x59, 0x9F, 0xAA, 0x22, 0xBB, 0xAB, 0x21, 0x69, 0xA2, 0x21, 0x5F, 0x95, 0x2D, 0x23, 0x8C, 0xAD, 0x42, 0xD5, 0xD2, 0x21, 0x9F, 0xBF, 0x21, 0x95, 0x30, 0x1B, 0xCB, 0x27, 0x21, 0x55, 0xC4, 0x21, 0xA7, 0xB0, 0x21, 0x9D, 0xA9, 0x21, 0x9F, 0xA6, 0x21, 0x7D, 0x55, 0x9E, 0x21, 0x7F, 0x8F, 0x23, 0xA2, 0x87, 0x21, 0x77, 0x96, 0x26, 0xB9, 0xA8, 0x30, 0x0B, 0x7F, 0x21, 0x19, 0x78, 0x21, 0x7F, 0x9E, 0xFF, 0x94, 0xA2, 0x20, 0x01, 0x8A, 0x26, 0xCF, 0x82, 0xFF, 0x81, 0x20, 0x11, 0x8B, 0xB1, 0x20, 0x05, 0x82, 0x20, 0x19, 0x30, 0x1B, 0x6E, 0xFF, 0x66, 0x21, 0xA5, 0x51, 0x71, 0x21, 0x41, 0x68, 0x21, 0x3D, 0x63, 0xFF, 0x60, 0x21, 0x3B, 0x50, 0x66, 0x21, 0x41, 0x5E, 0x2D, 0xBD, 0x57, 0xFF, 0x51, 0xFF, 0x15, 0x4F, 0xFF, 0x48, 0x21, 0xC5, 0x70, 0x20, 0x21, 0x68, 0x80, 0x17, 0x55, 0x6A, 0x20, 0x25, 0x63, 0x21, 0x63, 0x57, 0x20, 0x1D, 0x50, 0x20, 0x1F, 0x10, 0x55, 0xFF, 0x4E, 0x20, 0x01, 0x46, 0xFF, 0x47, 0xFF, 0x05, 0x40, 0xFF, 0x3F, 0xFF, 0x39, 0x20, 0x07, 0x3F, 0x20, 0x09, 0x51, 0x39, 0x20, 0x09, 0x32, 0x20, 0x01, 0x2C, 0xFF, 0x5D, 0x23, 0xF6, 0x60, 0x53, 0x20, 0x23, 0x30, 0x03, 0x49, 0xFF, 0x44, 0xFF, 0x4B, 0x08, 0xFF, 0x45, 0xFF, 0x42, 0x21, 0x3E, 0x40, 0xFF, 0x3C, 0x02, 0xFF, 0x38, 0xFF, 0x34, 0xFF, 0x4A, 0x20, 0x39, 0x41, 0xA8, 0x21, 0x4E, 0x43, 0x20, 0x05, 0x3B, 0x20, 0x11, 0x38, 0xFF, 0x35, 0x00, 0xFF, 0x31, 0xFF, 0x2E, 0xFF, 0x33, 0xFF, 0x30, 0x2A, 0xFF, 0x2B, 0x23, 0x46, 0x3B, 0x20, 0x0F, 0x33, 0x20, 0x0F, 0x30, 0x82, 0x24, 0xD2, 0x2A, 0xFF, 0x26, 0xFF, 0x2D, 0x2B, 0x94, 0x27, 0x80, 0x2D, 0xA5, 0x23, 0xFF, 0x20, 0xFF, 0x1E, 0xFF, 0x1B, 0xA8, 0x23, 0x68, 0x26, 0x40, 0x0B, 0x24, 0x2D, 0xB9, 0x1E, 0xFF, 0x1C, 0x02, 0xFF, 0x1D, 0xFF, 0x1A, 0xFF, 0x18, 0x21, 0xD2, 0x18, 0x8A, 0x24, 0xB8, 0x13, 0xFF, 0x12, 0x33, 0x8B, 0x00, 0x20, 0x36, 0xD2, 0xDA, 0x6B, 0xF6, 0x34, 0x85, 0x00, 0x24, 0x87, 0x64, 0xB3, 0xFA, 0x2C, 0x0B, 0xEA, 0xAA, 0x24, 0x61, 0xE4, 0x24, 0x57, 0xCC, 0x24, 0x59, 0xC6, 0x27, 0xFF, 0xDF, 0xA9, 0x24, 0x75, 0xDA, 0x24, 0x5F, 0xC1, 0x24, 0x4D, 0xBC, 0x00, 0x22, 0xB6, 0x62, 0x00, 0x23, 0x56, 0x43, 0x7B, 0xFE, 0xFF, 0xF2, 0x34, 0xA5, 0x00, 0xD5, 0x23, 0x4E, 0x24, 0xFD, 0xED, 0x2A, 0x35, 0xEA, 0x2C, 0x67, 0xD5, 0x24, 0xE9, 0x55, 0xD2, 0x24, 0x91, 0xB7, 0x24, 0x8F, 0xB2, 0x29, 0x02, 0xCD, 0x24, 0xA5, 0x55, 0xCA, 0x25, 0x7E, 0xAF, 0x24, 0x81, 0xAB, 0x25, 0x86, 0xB0, 0x23, 0x01, 0x55, 0xAA, 0x23, 0x4B, 0x96, 0x23, 0x4D, 0x90, 0x23, 0x5B, 0xA4, 0x23, 0x09, 0x55, 0x9F, 0x2E, 0xFF, 0x8A, 0x23, 0x35, 0x85, 0x22, 0xED, 0x7D, 0x22, 0xE9, 0x55, 0x77, 0x22, 0xDB, 0x67, 0x22, 0xD9, 0x62, 0x22, 0xE7, 0x72, 0x23, 0x39, 0x55, 0x6D, 0x22, 0xE3, 0x5C, 0x22, 0xE5, 0x57, 0x23, 0x6B, 0x9A, 0x23, 0x37, 0x55, 0x96, 0x23, 0x17, 0x80, 0x23, 0x19, 0x7C, 0x23, 0x77, 0x93, 0x23, 0x29, 0x55, 0x90, 0x25, 0x4A, 0x79, 0x23, 0x21, 0x76, 0x22, 0xFF, 0x6A, 0x23, 0x01, 0x55, 0x65, 0x24, 0x7A, 0x53, 0x22, 0xF9, 0x50, 0x28, 0xA9, 0x62, 0x23, 0x09, 0x55, 0x5F, 0x25, 0x6C, 0x4D, 0x23, 0x01, 0x4A, 0x21, 0x7F, 0x53, 0x25, 0x78, 0x51, 0x4E, 0x21, 0x77, 0x42, 0x21, 0x79, 0x3D, 0xFF, 0x52, 0x21, 0x85, 0x55, 0x4E, 0x21, 0x87, 0x40, 0x21, 0x7D, 0x3C, 0x21, 0x7F, 0x3A, 0x21, 0x69, 0x55, 0x35, 0x21, 0x6F, 0x2D, 0x25, 0xA4, 0x28, 0x2E, 0xFD, 0x30, 0x21, 0x65, 0x55, 0x2C, 0x41, 0x53, 0x1E, 0x21, 0x61, 0x1B, 0x21, 0x9F, 0x41, 0x21, 0xDD, 0x55, 0x3D, 0x21, 0xAB, 0x31, 0x21, 0x99, 0x2D, 0x21, 0xA7, 0x3B, 0x21, 0xAF, 0x55, 0x38, 0x21, 0x9F, 0x2B, 0x21, 0xA1, 0x29, 0x24, 0xE8, 0x23, 0x21, 0x95, 0x55, 0x20, 0x21, 0x77, 0x18, 0x21, 0x79, 0x15, 0x21, 0x87, 0x1E, 0x2F, 0x43, 0x55, 0x1C, 0x21, 0x83, 0x13, 0x23, 0x5E, 0x12, 0x2F, 0x4F, 0x1D, 0x40, 0x1B, 0x45, 0x19, 0x23, 0x6C, 0x14, 0xFF, 0x11, 0x26, 0x72, 0x14, 0x23, 0x76, 0x54, 0x11, 0x20, 0x09, 0x0E, 0x20, 0x01, 0x0B, 0x21, 0xA3, 0x10, 0xFF, 0x10, 0x0F, 0xFF, 0x0D, 0x40, 0x03, 0x0B, 0xFF, 0x0A, 0xFF, 0x55, 0x0C, 0x20, 0x03, 0x09, 0x25, 0x24, 0x08, 0x25, 0x28, 0x06, 0x25, 0x32, 0x55, 0x13, 0x20, 0x1D, 0x10, 0x20, 0x1F, 0x0C, 0x20, 0x15, 0x0A, 0x25, 0x3C, 0x55, 0x0F, 0x20, 0x33, 0x0D, 0x20, 0x27, 0x08, 0x20, 0x1D, 0x07, 0x25, 0x52, 0xAB, 0x50, 0x25, 0x04, 0x20, 0x01, 0x03, 0x25, 0x76, 0x02, 0x80, 0x07, 0x50, 0x01, 0x56, 0x01, 0x00, 0xB9, 0x7F, 0x20, 0x2C, 0x1D, 0x03, 0x04, 0xE9, 0x7F, 0x10, 0x04, 0x80, 0x59, 0x30, 0x18, 0xC2, 0xFE, 0xE2, 0x2C, 0x3A, 0x3A, 0x46, 0x20, 0xF8, 0xE9, 0x06, 0xFF, 0x00, 0x95, 0x00, 0xDC, 0x00, 0x3E, 0x2E, 0x03, 0x1F, 0xA9, 0x80, 0x0C, 0xF2, 0x00, 0x10, 0xF9, 0x38, 0xEF, 0x4F, 0x02, 0x50, 0x90, 0x0F, 0xFF, 0xFF, 0xC0, 0xD0, 0x00, 0xDE, 0x98, 0xBF, 0x1B, 0xCB, 0xFF, 0x2F, 0x23, 0xF0, 0xF2, 0x7F, 0x4B, 0xFF, 0x01, 0xCF, 0x27, 0x10, 0x39, 0xE0, 0x2B, 0x80, 0x11, 0xCD, 0x90, 0x00, 0x90, 0x09, 0x08, 0x01, 0x9C, 0x00, 0x00, 0xB2, 0x00, 0x10, 0x0A, 0x0E, 0x90, 0x90, 0x08, 0x08, 0x90, 0x00, 0x80, 0x09, 0xBD, 0x00, 0x20, 0x2D, 0x1E, 0xB1, 0x00, 0x9C, 0x0A, 0x00, 0x01, 0x5B, 0x00, 0x00, 0x13, 0x10, 0x49, 0x00, 0xC3, 0x35, 0xC7, 0x02, 0xBA, 0x40, 0xA2, 0x00, 0x4B, 0x5B, 0xC7, 0x80, 0x5C, 0x4B, 0x13, 0xC5, 0x00, 0x21, 0xAC, 0x41, 0x31, 0xC0, 0xCA, 0x37, 0x13, 0x02, 0x00, 0x06, 0x00, 0x00, 0x0D, 0x7F, 0x30, 0x1F, 0x01, 0x00, 0x3B, 0x01, 0x3C, 0x13, 0x3A, 0x0C, 0x0C, 0xE4, 0x00, 0xC4, 0x0D, 0x8D, 0xC4, 0xB4, 0x01, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x3B, 0x00, 0x86, 0x00, 0x04, 0x00, 0x97, 0xD6, 0x11, 0xDA, 0x4F, 0xFF, 0x07, 0x00, 0x00, 0x4B, 0xB7, 0x87, 0x20, 0x00, 0xA7, 0xC6, 0x20, 0x00, 0xCA, 0x1E, 0x3C, 0x4C, 0x4B, 0x1E, 0x08, 0x5C, 0x40, 0xD6, 0x47, 0xD9, 0x60, 0x00, 0x58, 0x00, 0x26, 0x00, 0x00, 0x00, 0x5C, 0xCE, 0x00, 0x41, 0x70, 0x70, 0x0A, 0x00, 0x0A, 0x90, 0xCA, 0x0A, 0x08, 0x4C, 0x3C, 0xC0, 0x04, 0xE1, 0x4C, 0xC8, 0xD0, 0x52, 0x37, 0xFE, 0x21, 0xBC, 0x20, 0x00, 0x0A, 0x36, 0x47, 0x00, 0xB1, 0x22, 0xBB, 0x13, 0x00, 0xA9, 0x7C, 0x49, 0x03, 0xAC, 0x23, 0x3C, 0xA8, 0x00, 0x5B, 0x30, 0x00, 0x99, 0xC1, 0x20, 0xAA, 0x01, 0x04, 0x1C, 0x00, 0x00, 0x1D, 0x1E, 0x28, 0x3E, 0x90, 0x00, 0x02, 0x07, 0x90, 0x90, 0x27, 0xBD, 0x1D, 0x20, 0x0F, 0x1E, 0x85, 0x20, 0x13, 0x90, 0x90, 0x0A, 0x06, 0x20, 0xC7, 0xAC, 0x38, 0x3E, 0x08, 0x01, 0x5D, 0x00, 0xB3, 0x68, 0x41, 0x2B, 0xD4, 0xD0, 0x00, 0xD0, 0x70, 0xD3, 0x6D, 0x10, 0x00, 0x33, 0x8A, 0x0B, 0x0C, 0x08, 0xDD, 0xD9, 0x0F, 0x35, 0xD8, 0x11, 0x49, 0x5C, 0x39, 0x77, 0xAF, 0x89, 0x65, 0x10, 0x60, 0x14, 0x11, 0x30, 0x1C, 0x39, 0x89, 0x22, 0x03, 0xD0, 0x32, 0xB5, 0x80, 0x1F, 0x21, 0x00, 0x50, 0x52, 0xA0, 0x3F, 0x22, 0x69, 0xBC, 0x20, 0x00, 0x40, 0x3F, 0xEF, 0x77, 0x5A, 0xA0, 0x1D, 0xC0, 0x5F, 0x31, 0x89, 0xFA, 0xA0, 0x81, 0xC0, 0x5F, 0x7A, 0x1B, 0x93, 0x00, 0x70, 0x5F, 0x20, 0xB0, 0x3A, 0x42, 0x7C, 0x09, 0x00, 0x40, 0xBF, 0xC0, 0xF6, 0xA0, 0x0C, 0x2A, 0x65, 0x40, 0x43, 0x37, 0x30, 0xE3, 0xFF, 0x20, 0xF9, 0x00, 0xB7, 0xFF, 0xFF, 0xAF, 0xCF, 0x03, 0xD1, 0xF8, 0x02, 0xFF, 0x7F, 0xFE, 0xFF, 0x0C, 0x05, 0x23, 0xB6, 0x50, 0x80, 0x23, 0x34, 0x80, 0xED, 0xFF, 0xEE, 0xFF, 0x79, 0x00, 0x14, 0x77, 0x00, 0xEE, 0x20, 0x07, 0x77, 0x20, 0x07, 0x00, 0xAA, 0x02, 0x00, 0x07, 0xFF, 0xFF, 0x3F, 0xCF, 0x2B, 0x90, 0xA5, 0x0C, 0x00, 0x00, 0xF9, 0xF8, 0x70, 0x17, 0x80, 0x1F, 0x4A, 0x00, 0x00, 0xA0, 0x6F, 0x6F, 0xF0, 0x30, 0x00, 0x9B, 0x00, 0x0F, 0x00, 0xEF, 0x23, 0x00, 0x80, 0x37, 0x80, 0x3F, 0xEA, 0x05, 0x00, 0x30, 0x1F, 0x17, 0x80, 0xE8, 0xAB, 0x59, 0xF7, 0x59, 0x00, 0x60, 0x3F, 0x52, 0x72, 0x4B, 0xF4, 0xC0, 0x00, 0xE0, 0x5F, 0x00, 0x90, 0x7F, 0xA2, 0x00, 0x6A, 0xF4, 0xF3, 0x9F, 0x54, 0x8F, 0x90, 0xBF, 0xDE, 0x20, 0xDF, 0x97, 0xDC, 0x48, 0x01, 0x20, 0x00, 0x10, 0x7B, 0xFF, 0x02, 0xAF, 0xFC, 0x30, 0xFF, 0x40, 0xFA, 0x39, 0xE3, 0x4E, 0xFF, 0x00, 0x04, 0x00, 0x65, 0x00, 0x50, 0x01, 0xA9, 0x88, 0x05, 0x04, 0xFF, 0xF6, 0x04, 0x1E, 0x8F, 0xB0, 0x50, 0xEF, 0x00, 0x4A, 0x9F, 0x01, 0x05, 0x96, 0x08, 0x3C, 0x8F, 0x70, 0x90, 0x25, 0x04, 0x70, 0xA1, 0xFA, 0x43, 0xB8, 0xFF, 0x19, 0xEF, 0x02, 0x00, 0x20, 0xC5, 0x2A, 0xD9, 0x80, 0x80, 0x30, 0x03, 0x01, 0xFF, 0xFE, 0x05, 0x0B, 0xF8, 0xE1, 0x6F, 0x2B, 0x97, 0x02, 0x80, 0x90, 0x00, 0x05, 0x60, 0x00, 0x2F, 0x66, 0xB6, 0x00, 0xFF, 0xFF, 0x25, 0x06, 0x06, 0x1F, 0xF8, 0xF8, 0x11, 0x9F, 0xF8, 0xF7, 0x2F, 0x73, 0x06, 0x07, 0xBB, 0x21, 0x06, 0x20, 0xD0, 0x40, 0x3B, 0xBB, 0xB8, 0x00, 0x6F, 0x6F, 0x70, 0x00, 0xF0, 0x6F, 0x6F, 0xE0, 0xE0, 0x68, 0xDF, 0x50, 0x04, 0xA0, 0xDF, 0xDF, 0x90, 0x90, 0x20, 0x0B, 0xF0, 0x4B, 0x10, 0x00, 0xB0, 0x00, 0x20, 0x0B, 0xA0, 0x9B, 0x00, 0x70, 0x00, 0x00, 0x89, 0xFF, 0xB6, 0x8D, 0xFF, 0xFF, 0x04, 0x00, 0x03, 0xAD, 0xFD, 0x23, 0x2F, 0xF3, 0xF3, 0x9F, 0x48, 0xAF, 0x20, 0x0B, 0x04, 0xBB, 0x2D, 0xB5, 0xF3, 0xF3, 0xAF, 0x00, 0xBF, 0xB2, 0x00, 0x8B, 0x00, 0xE8, 0xB0, 0xFF, 0x00, 0xEF, 0xC0, 0xC0, 0xFF, 0xFF, 0x49, 0x10, 0x81, 0x18, 0xFD, 0x90, 0xC1, 0x2B, 0x9B, 0x20, 0x0B, 0x90, 0x00, 0xBB, 0x02, 0x00, 0xA0, 0x21, 0xFF, 0xFF, 0x01, 0x25, 0x96, 0xCC, 0x00, 0x07, 0x7C, 0xFA, 0x68, 0xAC, 0xFB, 0x89, 0x00, 0x00, 0x0A, 0x95, 0xFA, 0x5F, 0x48, 0xF8, 0xF9, 0x03, 0x00, 0x06, 0x72, 0xFA, 0xBD, 0x21, 0x9D, 0x01, 0x17, 0x00, 0x0D, 0xF9, 0xF9, 0x01, 0x00, 0xB7, 0x00, 0x58, 0x00, 0xDF, 0xDB, 0xD8, 0x4F, 0x3F, 0x30, 0x20, 0x3A, 0x00, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x38, 0x6A, 0x4F, 0x08, 0x4F, 0x20, 0x30, 0x3B, 0x2E, 0x19, 0xFF, 0xFF, 0x4A, 0x20, 0x0B, 0xBB, 0x2E, 0x18, 0x70, 0xFA, 0xCC, 0x5E, 0xFF, 0x00, 0xFF, 0x09, 0x08, 0xFA, 0xFA, 0x8F, 0x8F, 0xF3, 0x00, 0xF3, 0x8F, 0x7F, 0xFF, 0xFC, 0x08, 0x3D, 0x91, 0x00, 0x00, 0xDD, 0x00, 0xF3, 0xF9, 0x8F, 0x9F, 0xBA, 0x00, 0x00, 0x6B, 0x00, 0x00, 0xB0, 0xC7, 0xAF, 0xF4, 0x00, 0xF7, 0x6F, 0x7F, 0xDC, 0x70, 0x19, 0xDF, 0x30, 0x00, 0x30, 0xFF, 0xFF, 0xF5, 0xC0, 0x6F, 0x9F, 0x10, 0x00, 0x00, 0xD8, 0x00, 0x30, 0x60, 0xFF, 0xEF, 0xDB, 0x09, 0x12, 0x2A, 0x00, 0x31, 0x2E, 0x70, 0x09, 0x0C, 0x36, 0x5C, 0x01, 0xFF, 0xFE, 0x00, 0x10, 0xFD, 0xFF, 0x09, 0x5B, 0xEB, 0x10, 0x40, 0x40, 0xB0, 0x20, 0x2B, 0xFF, 0x9F, 0x1E, 0x08, 0xA8, 0x24, 0x37, 0x09, 0xAE, 0x7F, 0x05, 0x09, 0xE4, 0x31, 0x40, 0x00, 0xFF, 0x40, 0xE4, 0x3F, 0x49, 0x9F, 0xFF, 0x02, 0xBF, 0xFA, 0x30, 0x3B, 0xFF, 0xC8, 0x00, 0x0F, 0x49, 0x23, 0xFC, 0x24, 0x02, 0xEE, 0x24, 0x02, 0x40, 0x07, 0xFD, 0xC5, 0xFA, 0x3F, 0x7B, 0x60, 0x17, 0x70, 0x1F, 0x00, 0x05, 0x7A, 0x09, 0x90, 0x1F, 0x87, 0xD0, 0xBF, 0x80, 0x56, 0xF1, 0x20, 0xFB, 0xF9, 0xFF, 0xFF, 0x8C, 0xAF, 0x08, 0x03, 0xFF, 0x5E, 0x04, 0x10, 0x16, 0x4D, 0xE6, 0x43, 0x4C, 0x49, 0x08, 0x4D, 0xFF, 0xFE, 0x14, 0x2F, 0xFF, 0x02, 0x02, 0x28, 0xC2, 0x29, 0x6A, 0x39, 0x87, 0x69, 0x6D, 0x61, 0x67, 0x39, 0x75, 0x80, 0xA0, 0x27, 0xBE, 0x0D, 0x67, 0x0F, 0x6C, 0x1E, 0xCE, 0x25, 0x67, 0x00, 0xD5, 0x3B, 0x50, 0x41, 0x4B, 0x55, 0x53, 0xBB, 0x00, 0xB5, 0xA2, 0xE7, 0x03, 0x3F, 0x61, 0x30, 0xD2, 0x00, 0x45, 0x8F, 0x3B, 0x58, 0x49, 0xCA, 0xF6, 0xA4, 0x00, 0x24, 0x2D, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static const unsigned char iQue_with_ISBN_LZ[0x2000] = -{ - 0x11, 0x48, 0x70, 0x00, 0x00, 0x64, 0x61, 0x72, 0x63, 0xFF, 0xFE, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x28, 0x70, 0x00, 0x00, 0x83, 0x30, 0x09, 0x1C, 0x04, 0x00, 0x00, 0x40, 0x20, 0x03, 0x30, 0x13, 0xAB, 0x30, 0x18, 0x15, 0x20, 0x1D, 0x02, 0xA0, 0x0B, 0x06, 0x20, 0x2B, 0x30, 0x18, 0x5A, 0x09, 0x20, 0x35, 0x10, 0x20, 0x39, 0x30, 0x2B, 0x48, 0x20, 0x29, 0x54, 0x82, 0x20, 0x45, 0xA0, 0x05, 0x00, 0x00, 0x30, 0x20, 0x35, 0x98, 0xAA, 0x20, 0x51, 0xE0, 0x20, 0x28, 0x3C, 0x20, 0x41, 0xDC, 0x20, 0x5D, 0x20, 0x07, 0x08, 0x00, 0x00, 0xCC, 0x0C, 0x20, 0x07, 0x30, 0x51, 0x20, 0x50, 0x50, 0x54, 0x20, 0x0B, 0x64, 0x20, 0x5D, 0x60, 0x21, 0x00, 0x00, 0x4C, 0x4C, 0x20, 0x5C, 0xA8, 0x01, 0x50, 0x53, 0x20, 0x22, 0x00, 0xB2, 0x82, 0x20, 0x75, 0xC0, 0x23, 0x00, 0x00, 0x94, 0x20, 0x2F, 0xE2, 0xB3, 0x30, 0x23, 0x30, 0x20, 0x47, 0x20, 0x68, 0x12, 0x02, 0x50, 0x77, 0x30, 0x8F, 0x41, 0x1C, 0x20, 0x90, 0x00, 0x41, 0x00, 0x00, 0x28, 0x20, 0xAB, 0x4E, 0x3E, 0x20, 0x9C, 0x80, 0x45, 0x20, 0x0B, 0x30, 0x4F, 0x30, 0x17, 0x47, 0xAD, 0x50, 0x17, 0x82, 0x30, 0x17, 0x4B, 0x20, 0x23, 0x20, 0x7B, 0xA4, 0x30, 0x2F, 0xAA, 0x20, 0xA0, 0xA8, 0x20, 0xE9, 0xC4, 0x30, 0x3B, 0x55, 0x50, 0x17, 0xDC, 0xB5, 0x30, 0x3B, 0x5D, 0x20, 0x47, 0x20, 0xE0, 0xF4, 0x30, 0x53, 0x60, 0x20, 0x53, 0x90, 0x30, 0xD4, 0x00, 0x2E, 0x21, 0x13, 0x61, 0x00, 0x6E, 0x00, 0x14, 0x69, 0x00, 0x6D, 0x21, 0x1D, 0x4E, 0x20, 0x07, 0x6E, 0x00, 0x10, 0x74, 0x00, 0x65, 0x20, 0x11, 0x64, 0x00, 0x6F, 0x00, 0x51, 0x4C, 0x20, 0x03, 0x67, 0x20, 0x07, 0x5F, 0x00, 0x44, 0x20, 0x03, 0x41, 0x30, 0x20, 0x01, 0x5F, 0x00, 0x53, 0x00, 0x63, 0x40, 0x1F, 0x05, 0x65, 0x00, 0x4F, 0x00, 0x75, 0x20, 0x2B, 0x41, 0x20, 0x43, 0x5A, 0x62, 0x20, 0x13, 0x6C, 0x40, 0x47, 0x02, 0x50, 0x43, 0x42, 0x03, 0x20, 0x43, 0x43, 0xBE, 0x01, 0x80, 0x87, 0x55, 0x03, 0x20, 0xCB, 0x00, 0x90, 0x43, 0x01, 0x90, 0xCB, 0x00, 0x90, 0x87, 0xF0, 0xCB, 0x62, 0xBF, 0x21, 0x5D, 0x79, 0x21, 0x97, 0x01, 0x31, 0xA1, 0x71, 0x8D, 0x00, 0xF0, 0x2F, 0x71, 0x05, 0xD0, 0x2F, 0x55, 0x74, 0x42, 0x09, 0x67, 0x23, 0x29, 0x33, 0x22, 0x01, 0x73, 0xA2, 0x01, 0xEA, 0xB0, 0x5B, 0x52, 0x2D, 0x00, 0x10, 0x21, 0x31, 0x01, 0x00, 0x21, 0x32, 0x01, 0x00, 0x43, 0x33, 0xA8, 0xE0, 0x65, 0x4C, 0x23, 0x71, 0x4D, 0x22, 0xA3, 0x73, 0x00, 0x6B, 0xFA, 0x00, 0x40, 0x85, 0x30, 0x1F, 0x00, 0xB0, 0x17, 0xF0, 0x93, 0xF2, 0xE3, 0x5F, 0x20, 0xB5, 0x32, 0x00, 0x00, 0x38, 0x00, 0x78, 0x00, 0x36, 0x00, 0x34, 0xC0, 0xE0, 0xE1, 0x70, 0x02, 0x43, 0x4C, 0x41, 0x4E, 0xFF, 0xFE, 0x58, 0x14, 0x34, 0x21, 0x02, 0x34, 0x03, 0x33, 0x96, 0x70, 0x61, 0x74, 0x34, 0x31, 0x3C, 0x64, 0x3E, 0x34, 0x59, 0x28, 0x33, 0x73, 0xFF, 0xFF, 0x40, 0xFF, 0x34, 0x4C, 0x53, 0x63, 0x65, 0x6E, 0x65, 0x4F, 0x20, 0x75, 0x74, 0x23, 0xBA, 0x00, 0x47, 0x5F, 0x41, 0x5F, 0x60, 0x30, 0x23, 0xDB, 0xB0, 0x01, 0x70, 0x61, 0x69, 0x31, 0xF8, 0xCA, 0x24, 0x8D, 0x50, 0x3F, 0x03, 0x00, 0x30, 0x59, 0x20, 0x24, 0x9D, 0x6C, 0xA0, 0x24, 0xA1, 0xAC, 0x24, 0xA5, 0x50, 0x5F, 0x4E, 0x69, 0x6E, 0x0E, 0x4C, 0x6F, 0x67, 0x6F, 0xA0, 0x39, 0x34, 0xA4, 0x34, 0xC1, 0x43, 0x11, 0x4C, 0x56, 0x43, 0x74, 0x43, 0x00, 0x10, 0x02, 0x40, 0x8B, 0xE4, 0x40, 0x0B, 0xD0, 0x61, 0x24, 0x35, 0x7F, 0x43, 0x34, 0xF0, 0x4E, 0x5F, 0x0E, 0x52, 0x6F, 0x6F, 0x74, 0xD0, 0x82, 0x00, 0x70, 0x4B, 0x80, 0x57, 0x00, 0x61, 0x20, 0x20, 0x3B, 0x70, 0x3F, 0x49, 0x53, 0x42, 0x4E, 0xD0, 0xBF, 0xFE, 0x02, 0x70, 0x8B, 0x00, 0x70, 0x03, 0xB1, 0x5F, 0x35, 0x57, 0xB1, 0x5F, 0x25, 0x32, 0x81, 0x5F, 0x00, 0x35, 0x00, 0x1E, 0x45, 0xAC, 0x71, 0x5F, 0x42, 0x41, 0x5F, 0x42, 0x00, 0x41, 0x5F, 0x73, 0xE0, 0x80, 0x2D, 0x91, 0x5F, 0x24, 0xF6, 0x00, 0xA0, 0x01, 0xE1, 0x5F, 0x91, 0x13, 0x2F, 0x34, 0xC2, 0x02, 0xD1, 0x53, 0xC8, 0x20, 0xAE, 0x02, 0x11, 0x53, 0x00, 0x30, 0x7F, 0x00, 0xB1, 0x3F, 0xF7, 0x36, 0x8B, 0xB2, 0x9F, 0x31, 0xD5, 0x72, 0x9F, 0x65, 0x23, 0xD1, 0xB2, 0x9F, 0x32, 0x20, 0x15, 0x47, 0x5F, 0x43, 0x00, 0x42, 0x9F, 0xEC, 0x27, 0x2D, 0x0F, 0xE2, 0x9F, 0xE6, 0x31, 0x3F, 0x01, 0xF2, 0x9F, 0x92, 0x53, 0x12, 0xC3, 0x02, 0x32, 0x93, 0x92, 0xDF, 0x80, 0x5F, 0xBF, 0x92, 0x47, 0x60, 0x33, 0x5A, 0x47, 0xBC, 0x02, 0x51, 0x4B, 0x90, 0x8B, 0xF3, 0xDF, 0xDA, 0x37, 0xBF, 0x03, 0x33, 0xDF, 0x7C, 0x28, 0x07, 0x54, 0x1F, 0x0D, 0x43, 0xDF, 0x48, 0xAB, 0x28, 0x7D, 0xB0, 0x28, 0x81, 0xA4, 0x28, 0x6D, 0x24, 0x28, 0x68, 0x37, 0xAB, 0x05, 0x30, 0x03, 0x00, 0x00, 0xBC, 0x20, 0x03, 0x24, 0x28, 0x8B, 0x54, 0x88, 0x28, 0x53, 0xEC, 0x28, 0x74, 0xB0, 0x28, 0x43, 0x74, 0x0A, 0x0B, 0x00, 0x00, 0x78, 0x0B, 0x33, 0xBB, 0x57, 0x00, 0x04, 0x3B, 0x38, 0x12, 0xA5, 0x34, 0x2B, 0x44, 0x44, 0x97, 0x50, 0x41, 0x84, 0x0B, 0x02, 0xF3, 0xBF, 0xC5, 0x74, 0xBB, 0x01, 0x13, 0xE3, 0x50, 0x5F, 0x33, 0x00, 0x80, 0x67, 0xB8, 0x60, 0x67, 0xD6, 0x20, 0xAA, 0x44, 0xA7, 0x38, 0x29, 0x45, 0x68, 0x60, 0x6F, 0x94, 0x7B, 0xA0, 0x96, 0x28, 0xA5, 0xA0, 0x40, 0x28, 0xA1, 0xBE, 0x25, 0x19, 0x23, 0x96, 0xA0, 0x4C, 0xC0, 0x49, 0x59, 0x06, 0x02, 0x24, 0xDD, 0x90, 0x23, 0x33, 0x33, 0x02, 0xB3, 0x3F, 0xFC, 0x2D, 0xEC, 0xBC, 0x70, 0x0B, 0x0A, 0x32, 0xD7, 0x23, 0x20, 0x0B, 0x30, 0x2F, 0x80, 0x3F, 0x49, 0x89, 0x07, 0xF1, 0x01, 0xD0, 0x2F, 0xF5, 0x0B, 0xB0, 0x6B, 0x39, 0xEC, 0x40, 0x9D, 0x1C, 0x30, 0x97, 0xBF, 0x62, 0x2B, 0xCC, 0x20, 0x9F, 0x30, 0x9B, 0x70, 0xF3, 0x25, 0x63, 0xE5, 0x99, 0x71, 0x5B, 0x70, 0x50, 0xF1, 0x5B, 0x2A, 0x19, 0xD5, 0x67, 0x70, 0xC1, 0xCD, 0xCC, 0x53, 0xCC, 0x20, 0xEB, 0x20, 0x24, 0x82, 0xF8, 0xC1, 0x00, 0x31, 0x67, 0x00, 0x15, 0x97, 0xE6, 0x30, 0x7F, 0x30, 0x2F, 0x71, 0x73, 0x44, 0x73, 0xF6, 0x18, 0x01, 0x90, 0x7F, 0x3C, 0x51, 0xC2, 0x20, 0x7F, 0x3E, 0x02, 0xD0, 0x7F, 0x52, 0x65, 0x64, 0x01, 0x70, 0xFF, 0xC2, 0xC1, 0xEB, 0x46, 0x1F, 0xC2, 0xB7, 0x6D, 0xDB, 0x20, 0x7F, 0x8C, 0xBA, 0x25, 0x82, 0x20, 0x00, 0x40, 0xFF, 0x91, 0xF7, 0xB6, 0xFB, 0x5C, 0x85, 0x03, 0x00, 0x20, 0x00, 0xB4, 0x35, 0xBE, 0x00, 0x92, 0x24, 0xE9, 0xC0, 0xAD, 0x60, 0x8B, 0x31, 0x00, 0x32, 0xE7, 0x5C, 0x00, 0x22, 0xE7, 0x92, 0x53, 0xF0, 0x2B, 0x1D, 0x7F, 0x20, 0x25, 0x97, 0x90, 0x0B, 0x50, 0x97, 0x35, 0x6B, 0x00, 0x50, 0x97, 0x97, 0x2F, 0x30, 0x3B, 0xAF, 0x77, 0xE4, 0xAA, 0xF1, 0x17, 0x32, 0x02, 0x13, 0x73, 0x32, 0xF7, 0x50, 0x8B, 0x00, 0x97, 0x57, 0xF9, 0x33, 0x1B, 0x58, 0x58, 0x00, 0x31, 0x7F, 0x3C, 0x70, 0x57, 0xE3, 0x54, 0x53, 0x2C, 0x4A, 0xB7, 0x48, 0x53, 0x4C, 0x38, 0x6B, 0x2C, 0xB9, 0x94, 0x63, 0x8B, 0x3C, 0x67, 0x3C, 0xB1, 0x61, 0x24, 0x4C, 0xB5, 0x00, 0x01, 0x97, 0xC0, 0x39, 0x8E, 0xE3, 0x28, 0x96, 0xE8, 0x51, 0x5B, 0x5C, 0xDD, 0x01, 0x20, 0x23, 0x03, 0xF8, 0x47, 0x40, 0x41, 0x9E, 0x11, 0x15, 0x8D, 0xBD, 0x31, 0xA3, 0x9A, 0x99, 0xB9, 0x23, 0xD7, 0xAA, 0x2D, 0x3A, 0x04, 0x01, 0x10, 0x23, 0x01, 0x01, 0x20, 0x8F, 0x01, 0x01, 0x20, 0x8F, 0x01, 0xAD, 0x00, 0x10, 0x8F, 0xC1, 0x20, 0x8F, 0x3D, 0x60, 0x8F, 0x44, 0x5B, 0x01, 0x00, 0x10, 0x8F, 0x82, 0x00, 0x00, 0x23, 0x50, 0x5F, 0x42, 0x6C, 0x6B, 0x03, 0xE1, 0x63, 0x9A, 0x03, 0x99, 0x19, 0xC0, 0x0E, 0x74, 0xDA, 0x00, 0xC1, 0x63, 0x00, 0x40, 0x23, 0xFE, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0x03, 0x81, 0x63, 0x00, 0x13, 0xBB, 0x00, 0x32, 0xC7, 0x58, 0xAB, 0x2F, 0x7D, 0x88, 0x66, 0x4F, 0xE8, 0x2F, 0x89, 0x18, 0x2F, 0x75, 0x3F, 0x4F, 0x7D, 0x78, 0x62, 0xC7, 0xE3, 0xD3, 0x56, 0x3F, 0x60, 0x0B, 0x52, 0xD3, 0xF0, 0xC2, 0xD3, 0xEE, 0x01, 0xC0, 0x2F, 0x22, 0xDF, 0xD4, 0x33, 0x40, 0x68, 0x3F, 0x50, 0x0B, 0x52, 0xEB, 0xF0, 0xFF, 0xC2, 0xEB, 0x01, 0xB0, 0x2F, 0x32, 0xF7, 0x01, 0xB0, 0xBF, 0x33, 0x03, 0x01, 0xC0, 0x2F, 0x00, 0x10, 0xBF, 0x46, 0x73, 0xFF, 0x70, 0x0B, 0x53, 0x1B, 0x40, 0xBF, 0x83, 0x1B, 0x01, 0xB0, 0x2F, 0x63, 0x27, 0x03, 0xC1, 0xC3, 0x33, 0x27, 0xFF, 0x75, 0x97, 0x93, 0x33, 0x00, 0x91, 0xC3, 0x01, 0x00, 0x2F, 0x05, 0xE1, 0xC3, 0x00, 0xF0, 0xBF, 0xF1, 0xC3, 0x01, 0x00, 0x2F, 0xFF, 0x05, 0x01, 0xC3, 0x00, 0x16, 0xB7, 0x00, 0x36, 0x4F, 0x35, 0xCC, 0x33, 0x8B, 0x36, 0x53, 0x33, 0x8F, 0x3D, 0x0F, 0xBF, 0x39, 0xE3, 0xD0, 0x6A, 0x5D, 0xE6, 0xCF, 0x59, 0xC7, 0x26, 0x43, 0x00, 0x40, 0x17, 0x26, 0x37, 0xFF, 0xD6, 0xFF, 0x63, 0x57, 0x26, 0x2B, 0x00, 0x30, 0x17, 0x36, 0x1F, 0x00, 0x30, 0x5F, 0x36, 0x13, 0x00, 0x40, 0x17, 0xFF, 0x00, 0x10, 0x5F, 0x49, 0x6B, 0x35, 0xFB, 0x00, 0x30, 0x17, 0x65, 0xEF, 0x03, 0xC1, 0x03, 0x82, 0xC7, 0xE1, 0x03, 0xFE, 0x82, 0xDF, 0x02, 0xE1, 0x03, 0x73, 0x27, 0xF1, 0x03, 0x80, 0x17, 0x01, 0xE1, 0x03, 0x00, 0xFF, 0x5F, 0x54, 0xDD, 0xEC, 0xDF, 0x02, 0x7F, 0x5F, 0x04, 0x2F, 0xF4, 0x5F, 0x8D, 0xDC, 0xDF, 0x50, 0x2F, 0xBF, 0x55, 0xB8, 0x2F, 0xC3, 0x20, 0x2F, 0xC4, 0xA0, 0x2F, 0xC8, 0x2C, 0x2C, 0xE3, 0x54, 0xAC, 0x2C, 0xE7, 0x10, 0x2C, 0xDF, 0x74, 0x2C, 0xDF, 0xD8, 0x07, 0xBF, 0x2D, 0x17, 0x09, 0x2F, 0x87, 0x2C, 0xE3, 0x02, 0x9C, 0xDF, 0x3F, 0x4B, 0x00, 0xFC, 0xDF, 0x9F, 0x6F, 0xAF, 0x00, 0xBC, 0xDF, 0x7C, 0xEC, 0xDF, 0x2C, 0x6D, 0x5B, 0xDD, 0x4F, 0x4C, 0xE3, 0x8C, 0xD3, 0xFF, 0xD0, 0x17, 0x9C, 0xBB, 0x00, 0x30, 0x17, 0x00, 0x9F, 0xCF, 0x3F, 0xFF, 0x01, 0x1C, 0x8B, 0x00, 0x0D, 0xE7, 0xC3, 0xA3, 0x7E, 0xA0, 0x2C, 0x7B, 0x00, 0x5C, 0x7F, 0xD0, 0x23, 0x01, 0x1C, 0x73, 0x03, 0xD0, 0x67, 0x02, 0x7C, 0x5B, 0x70, 0xDF, 0x2B, 0xCB, 0x7C, 0x5B, 0x20, 0x3B, 0xDB, 0x00, 0xED, 0x5B, 0x3E, 0x67, 0x7F, 0xC7, 0x5B, 0xCF, 0xDF, 0x00, 0xFC, 0x4F, 0x00, 0xDC, 0xDB, 0xF0, 0x2D, 0xCB, 0x80, 0x7F, 0x01, 0x2C, 0xDB, 0x30, 0x2F, 0x7F, 0xFB, 0x7F, 0xC8, 0x2F, 0x03, 0x7C, 0xDB, 0x5B, 0xE7, 0xAC, 0xDB, 0x00, 0x4C, 0x4F, 0x03, 0x3D, 0x67, 0x00, 0x1E, 0x67, 0xFF, 0xDD, 0x67, 0x04, 0x1C, 0x67, 0x41, 0xA3, 0x79, 0x93, 0x9D, 0x43, 0xCC, 0x67, 0x00, 0x60, 0x23, 0xCC, 0x67, 0xFF, 0x31, 0xEB, 0x89, 0x7B, 0x28, 0x2F, 0x00, 0x3C, 0x67, 0x00, 0x50, 0x23, 0xDC, 0x67, 0x00, 0x50, 0x8F, 0xDC, 0x67, 0xFE, 0x00, 0x60, 0x23, 0x00, 0x10, 0x8F, 0x79, 0x4B, 0x30, 0x8F, 0x00, 0x2C, 0x67, 0x00, 0x50, 0x23, 0x04, 0x1C, 0x67, 0x70, 0x7F, 0xC2, 0xA9, 0x33, 0x00, 0x81, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0xFF, 0x03, 0x81, 0x63, 0x01, 0x5C, 0x67, 0x01, 0x9F, 0x2F, 0x43, 0xEB, 0x6F, 0x2F, 0x9F, 0x97, 0xDF, 0x2F, 0x00, 0x60, 0x23, 0xFF, 0xCF, 0x2F, 0x34, 0x33, 0x7F, 0x2F, 0x38, 0x2F, 0x00, 0x3F, 0x2F, 0x00, 0x50, 0x23, 0xDF, 0x2F, 0x00, 0x50, 0x8F, 0xFF, 0xDF, 0x2F, 0x00, 0x60, 0x23, 0x00, 0x10, 0x8F, 0x6F, 0x2F, 0x40, 0x8F, 0x00, 0x2F, 0x2F, 0x00, 0x50, 0x23, 0x01, 0x7C, 0x07, 0xFF, 0x01, 0xB1, 0x63, 0x9F, 0x2F, 0x00, 0x91, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0xFF, 0x03, 0x81, 0x63, 0x01, 0x5B, 0xA7, 0x01, 0x95, 0x8F, 0x46, 0x27, 0x6F, 0x23, 0x9F, 0xDF, 0xD5, 0x8F, 0x00, 0x60, 0x23, 0xFF, 0xC5, 0x8F, 0x4F, 0xDF, 0x6F, 0x0B, 0x4F, 0xDF, 0x00, 0x25, 0x8F, 0x00, 0x50, 0x23, 0xD5, 0x8F, 0x00, 0x50, 0x8F, 0xFF, 0xD5, 0x8F, 0x00, 0x60, 0x23, 0x00, 0x10, 0x8F, 0x6E, 0xDB, 0x40, 0x8F, 0x00, 0x25, 0x8F, 0x00, 0x50, 0x23, 0x01, 0x7C, 0x07, 0xFF, 0x01, 0xB1, 0x63, 0x9E, 0xC3, 0x00, 0x91, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0xDE, 0x03, 0x61, 0x63, 0x00, 0x7C, 0x5F, 0x4C, 0x2C, 0x5C, 0xBC, 0x5F, 0x3E, 0x51, 0x7C, 0x5F, 0x65, 0x31, 0x00, 0x73, 0xCC, 0x5F, 0x3B, 0x9C, 0x47, 0x5F, 0x43, 0x00, 0x4C, 0x5F, 0x5E, 0xFC, 0x2E, 0xBB, 0x0F, 0x5B, 0x58, 0x4C, 0x5F, 0x3C, 0x82, 0x3B, 0xAB, 0xBC, 0xAA, 0x2F, 0xFF, 0xFC, 0x2F, 0xF8, 0x3C, 0x2E, 0xDB, 0x7C, 0x2E, 0xDF, 0xBC, 0xF9, 0x2E, 0xE3, 0x00, 0x3C, 0x47, 0x3E, 0xC7, 0x5E, 0xFB, 0x00, 0x7A, 0x3B, 0x80, 0xBF, 0x9A, 0x3B, 0x7B, 0x60, 0x88, 0xC7, 0x00, 0x3C, 0x2B, 0x00, 0x70, 0x4B, 0x9F, 0x2B, 0xCA, 0x2A, 0xB7, 0x00, 0x9B, 0xCB, 0xBE, 0x01, 0x10, 0x3F, 0xF2, 0xA0, 0x3F, 0x00, 0x1B, 0xA3, 0x01, 0xD0, 0x3F, 0x00, 0x29, 0xEF, 0x01, 0x00, 0xBF, 0x8E, 0xF7, 0x2B, 0x77, 0x70, 0xFF, 0x00, 0x27, 0x67, 0x01, 0x00, 0xFF, 0x24, 0xF0, 0x3F, 0xDF, 0x83, 0x01, 0x01, 0x3F, 0x65, 0x30, 0x00, 0x8E, 0xBB, 0x5E, 0xBF, 0x59, 0x54, 0x7E, 0xBF, 0x94, 0x2F, 0xF4, 0x86, 0x3E, 0x1F, 0x6C, 0x79, 0x74, 0x31, 0x3E, 0xD1, 0x4A, 0x9E, 0x00, 0x40, 0xA0, 0x2D, 0xE7, 0x70, 0x43, 0x74, 0x78, 0x6C, 0x31, 0xD8, 0x3F, 0xDF, 0x3F, 0xBF, 0x04, 0x2F, 0xFF, 0x2D, 0x55, 0x74, 0x65, 0x6E, 0x00, 0x64, 0x6F, 0x5F, 0x31, 0x32, 0x38, 0x78, 0x36, 0x01, 0x34, 0x2E, 0x62, 0x63, 0x6C, 0x69, 0x6D, 0x2F, 0xFF, 0x0C, 0x66, 0x6E, 0x6C, 0x31, 0x3E, 0x63, 0x70, 0x27, 0x63, 0x62, 0x04, 0x66, 0x5F, 0x73, 0x74, 0x64, 0x20, 0x1F, 0x66, 0x6E, 0x5B, 0x74, 0x2F, 0xFB, 0x6D, 0x2F, 0x1B, 0x3B, 0xE4, 0x0D, 0x35, 0x11, 0x2F, 0xFC, 0x56, 0x90, 0x2F, 0xFF, 0xC4, 0x2F, 0xFB, 0xF8, 0x3E, 0x1F, 0x2F, 0xEC, 0x60, 0xAD, 0x2F, 0xF0, 0x94, 0x2F, 0xF4, 0xC8, 0x2F, 0xF8, 0x32, 0xA7, 0x30, 0x2F, 0x50, 0x56, 0x64, 0x2F, 0x54, 0x98, 0x2F, 0x58, 0xCC, 0x2F, 0x5C, 0x4D, 0xCF, 0x4C, 0x11, 0x6F, 0x67, 0x6F, 0xAF, 0x39, 0xFF, 0xFF, 0xFF, 0x30, 0x03, 0xBE, 0x00, 0x40, 0x02, 0x15, 0x5A, 0xF8, 0x30, 0xB2, 0xAF, 0xC2, 0x3E, 0x57, 0x5E, 0x5B, 0x54, 0x0E, 0x69, 0x74, 0x6C, 0x65, 0x00, 0x2F, 0xDC, 0x00, 0x70, 0x4F, 0x3F, 0xFF, 0x48, 0x08, 0x65, 0x61, 0x74, 0x68, 0x01, 0xE0, 0x33, 0x50, 0x75, 0x62, 0x02, 0x6C, 0x69, 0x73, 0x68, 0x65, 0x72, 0x01, 0xA0, 0x67, 0x49, 0x18, 0x53, 0x42, 0x4E, 0x00, 0x31, 0xBB, 0x00, 0xF0, 0x33, 0x5F, 0x4E, 0x75, 0xC0, 0x31, 0x8A, 0x01, 0x80, 0xCF, 0x43, 0x6F, 0x6E, 0x74, 0x72, 0x61, 0x78, 0x63, 0x31, 0x9E, 0x02, 0x00, 0x33, 0xF0, 0x6B, 0x00, 0xB1, 0x37, 0x4E, 0x65, 0x77, 0x66, 0x73, 0x21, 0x07, 0x01, 0xC1, 0x6B, 0x4C, 0x53, 0x9A, 0x3E, 0x01, 0xE0, 0x67, 0x5F, 0x6A, 0x4C, 0xE1, 0x08, 0x00, 0xB1, 0xD3, 0x52, 0x02, 0xA0, 0x67, 0x52, 0x01, 0xA0, 0x67, 0x70, 0x10, 0x61, 0x6E, 0x31, 0x3E, 0x0F, 0x01, 0x04, 0xFF, 0x00, 0x01, 0x52, 0x6F, 0x6F, 0x74, 0x50, 0x61, 0x6E, 0x00, 0x32, 0x7E, 0xE1, 0x00, 0x63, 0xB2, 0x72, 0xB7, 0x53, 0x93, 0x70, 0x61, 0x73, 0x31, 0x3E, 0x63, 0xA7, 0x70, 0x53, 0x03, 0x20, 0x53, 0x4E, 0x5F, 0x30, 0x55, 0x00, 0x05, 0xF6, 0x01, 0x20, 0x53, 0xA1, 0x4F, 0x93, 0x42, 0x80, 0x53, 0x69, 0x63, 0x31, 0x80, 0x3E, 0x56, 0x3F, 0x07, 0xFF, 0x00, 0x43, 0x73, 0x73, 0x48, 0x2F, 0xD7, 0x84, 0xDF, 0x00, 0x23, 0x5F, 0x2F, 0xB3, 0x3C, 0x80, 0x42, 0x00, 0x13, 0x43, 0x54, 0x59, 0x93, 0x8B, 0xF3, 0x97, 0x80, 0x3F, 0xBE, 0x71, 0x27, 0x07, 0x40, 0xD3, 0x00, 0x73, 0x09, 0x30, 0x7F, 0x40, 0x03, 0x00, 0x61, 0x27, 0x96, 0xA0, 0x2F, 0xA7, 0xC8, 0x80, 0xD3, 0x74, 0x78, 0x74, 0x31, 0x84, 0xEC, 0x61, 0x7B, 0x00, 0x73, 0xF7, 0x5F, 0xEE, 0xC4, 0x00, 0x22, 0x74, 0x54, 0x33, 0xCE, 0xCC, 0x41, 0xF4, 0x2F, 0xFF, 0xCC, 0x41, 0x0E, 0x00, 0x0E, 0x85, 0x0B, 0xD4, 0x34, 0xD7, 0x94, 0x1F, 0xAA, 0x2F, 0xB7, 0xCC, 0x8F, 0xBB, 0x65, 0x50, 0x00, 0xB7, 0x5E, 0x38, 0x6E, 0x0F, 0x62, 0xE0, 0x5F, 0x3F, 0x4A, 0x54, 0x3F, 0xF6, 0x30, 0x83, 0x37, 0x63, 0x31, 0xFF, 0x00, 0x74, 0x47, 0x5F, 0xF7, 0x44, 0x38, 0x00, 0x80, 0x83, 0x67, 0x66, 0x68, 0x27, 0xDE, 0x9C, 0x42, 0x1A, 0x88, 0x00, 0x88, 0x4F, 0xF3, 0x00, 0x10, 0x83, 0x8C, 0x2F, 0xAB, 0xA8, 0x80, 0x7F, 0xAF, 0xC0, 0xB5, 0x62, 0x36, 0x52, 0x0D, 0x4E, 0x2C, 0x6F, 0x82, 0x30, 0x87, 0x20, 0x25, 0xE1, 0x30, 0x03, 0xD2, 0x62, 0x02, 0xDD, 0x7E, 0xD7, 0x76, 0x48, 0x72, 0x30, 0x9B, 0x0A, 0x00, 0x00, 0xE8, 0x6C, 0x0F, 0x61, 0xEA, 0x81, 0x11, 0x08, 0x62, 0xDD, 0x4F, 0xA4, 0x80, 0x21, 0x28, 0x8C, 0x32, 0x00, 0x96, 0xD7, 0x53, 0x97, 0x9A, 0x0A, 0x4E, 0x53, 0x02, 0x5F, 0x0A, 0x00, 0x02, 0x90, 0xA6, 0x40, 0xC7, 0xCA, 0x10, 0x76, 0x11, 0x81, 0x70, 0x43, 0x89, 0x6C, 0xF7, 0x8F, 0x80, 0x30, 0xDB, 0x24, 0x4F, 0xAB, 0x8E, 0x0A, 0x00, 0x08, 0x00, 0x54, 0x06, 0x74, 0x89, 0x5B, 0x92, 0x63, 0xF6, 0x10, 0x65, 0xF4, 0x95, 0x70, 0x65, 0xAB, 0x4E, 0xD7, 0x53, 0x8F, 0x31, 0x01, 0x1F, 0x75, 0x3B, 0x26, 0x1C, 0x31, 0x7F, 0x3F, 0x9F, 0x32, 0xFB, 0xD8, 0x00, 0x75, 0x0F, 0x52, 0x53, 0xA0, 0x00, 0x09, 0x07, 0x75, 0xB3, 0x02, 0x00, 0x7C, 0x9C, 0x28, 0xDA, 0xA8, 0x41, 0x30, 0xC7, 0x26, 0x46, 0x00, 0xF0, 0xFB, 0x00, 0x5F, 0x00, 0x6C, 0xCF, 0x82, 0xE4, 0x51, 0xF0, 0x51, 0x35, 0x00, 0x75, 0x50, 0x5B, 0xF3, 0x97, 0xCF, 0x50, 0xFA, 0x00, 0x51, 0x48, 0x72, 0x3E, 0x79, 0x09, 0x67, 0x50, 0x06, 0x96, 0x6C, 0x51, 0xF8, 0x53, 0x52, 0x13, 0x32, 0xE7, 0x01, 0x22, 0x00, 0xFF, 0x00, 0x85, 0x6F, 0x00, 0x00, 0xBE, 0x2F, 0xEB, 0x70, 0xD0, 0x00, 0x27, 0x47, 0x76, 0x47, 0x14, 0x2E, 0xE3, 0x9C, 0x41, 0x0A, 0x00, 0x75, 0x0A, 0x47, 0x1B, 0x41, 0xE7, 0xC2, 0x13, 0x82, 0x2F, 0xD7, 0x9C, 0x8F, 0xDB, 0x03, 0x49, 0x00, 0x53, 0x00, 0x42, 0x00, 0x55, 0xDA, 0x32, 0x93, 0x62, 0x98, 0xA0, 0x7F, 0x00, 0x35, 0xBB, 0x00, 0x00, 0x58, 0x00, 0xE0, 0x7F, 0x34, 0x81, 0x32, 0x0F, 0x41, 0x24, 0x00, 0x24, 0x00, 0x05, 0x01, 0x20, 0x7F, 0x5F, 0x30, 0x40, 0x01, 0x2D, 0x60, 0x03, 0x70, 0x01, 0x70, 0x0B, 0x30, 0x17, 0xA3, 0x2B, 0xC5, 0x21, 0x17, 0x00, 0x76, 0x1F, 0x00, 0x00, 0xC2, 0x29, 0x9B, 0x04, 0x00, 0xA3, 0xFF, 0x68, 0xBE, 0x41, 0x17, 0x33, 0x2B, 0x06, 0x01, 0x21, 0x17, 0x08, 0x54, 0x0C, 0x00, 0x54, 0x7B, 0x76, 0xB0, 0x8B, 0xF7, 0x53, 0x1A, 0xFB, 0x47, 0x67, 0x33, 0xAF, 0x38, 0x1F, 0xB0, 0x83, 0x00, 0x16, 0xDB, 0xE0, 0x2F, 0x83, 0x00, 0xB0, 0x83, 0x47, 0x0C, 0x41, 0x1B, 0x1A, 0x00, 0x1A, 0x2A, 0xED, 0x01, 0xB1, 0x1B, 0xD1, 0x15, 0xF5, 0x73, 0xBB, 0x72, 0x2B, 0x00, 0x76, 0xCB, 0x51, 0x13, 0x4C, 0x00, 0xA5, 0x13, 0x80, 0x82, 0x2B, 0xC0, 0x3F, 0xF3, 0x00, 0xF2, 0x2B, 0xB0, 0x65, 0xFA, 0x51, 0xA1, 0x5B, 0x2F, 0x57, 0x5B, 0x74, 0x3B, 0x78, 0x62, 0xAB, 0x00, 0x77, 0x17, 0x21, 0x0F, 0x2F, 0xCF, 0x6B, 0x4A, 0x00, 0xB5, 0x93, 0x42, 0x8B, 0x04, 0x29, 0xC5, 0x09, 0x01, 0x22, 0xAB, 0x30, 0x78, 0xFE, 0x00, 0x20, 0xF7, 0x00, 0x07, 0x5B, 0x20, 0xA9, 0x2F, 0xB7, 0x00, 0xB0, 0xF7, 0x36, 0x5F, 0x53, 0x23, 0x0A, 0xFE, 0x01, 0x82, 0xA3, 0x91, 0x77, 0x70, 0xF7, 0x00, 0x77, 0xA7, 0x2A, 0xB5, 0x2C, 0x67, 0x01, 0x50, 0xF7, 0x0B, 0xBE, 0x01, 0x23, 0xA3, 0x5D, 0x00, 0x60, 0xF7, 0xF7, 0xEB, 0x21, 0xA1, 0x2C, 0xDF, 0x00, 0xB1, 0xEF, 0xA0, 0xBA, 0x44, 0x1B, 0x0C, 0x2F, 0xE5, 0x7F, 0xE7, 0x01, 0x30, 0xF7, 0xF7, 0x24, 0x9B, 0x70, 0x30, 0x61, 0x65, 0x67, 0xDF, 0xD0, 0x07, 0x67, 0x72, 0x70, 0x31, 0xC3, 0x3F, 0x6F, 0x38, 0x3F, 0x47, 0x72, 0x6F, 0x75, 0x3F, 0x67, 0x7F, 0xFA, 0x38, 0x67, 0x72, 0x58, 0x13, 0x30, 0x23, 0x3F, 0x83, 0x47, 0x5F, 0x41, 0xFE, 0xCE, 0x03, 0x35, 0x33, 0xF8, 0x23, 0xFB, 0x53, 0xF7, 0x6F, 0x30, 0x6F, 0x3E, 0x6F, 0x47, 0x3B, 0x5F, 0x42, 0xCE, 0x4F, 0x3F, 0xC3, 0x01, 0x30, 0x3B, 0x2C, 0x00, 0x2E, 0x8B, 0x3E, 0xAB, 0x98, 0xF8, 0xAB, 0x67, 0x72, 0x50, 0xEF, 0x00, 0x7C, 0x9F, 0x3C, 0x10, 0x00, 0x2F, 0x00, 0x22, 0x00, 0x0C, 0x9F, 0xC8, 0x8C, 0x9F, 0x36, 0x5B, 0x33, 0xE3, 0x3F, 0x13, 0x57, 0x2D, 0x2F, 0xFC, 0x3E, 0x2F, 0xFF, 0x4F, 0x3E, 0x81, 0x3C, 0xD3, 0x2F, 0xFF, 0x8E, 0x33, 0x3B, 0x33, 0x64, 0x73, 0x6C, 0x3D, 0x6C, 0xB2, 0x80, 0x10, 0x31, 0xA9, 0xF0, 0x10, 0x32, 0xF0, 0x21, 0x33, 0x6C, 0xE5, 0x4C, 0x54, 0x90, 0x3E, 0xC0, 0x30, 0x0B, 0x70, 0x39, 0x4C, 0x54, 0x4D, 0x61, 0x73, 0x6B, 0xDA, 0x90, 0x5A, 0x3C, 0xEB, 0xA8, 0x24, 0xF8, 0x32, 0x6F, 0x38, 0x2F, 0xFC, 0x88, 0xD5, 0x34, 0xE3, 0x2F, 0xA4, 0x88, 0x2F, 0xA8, 0x08, 0x2F, 0xCB, 0x88, 0x2F, 0xCF, 0x55, 0x4C, 0x2D, 0x0B, 0xE8, 0x2D, 0x0F, 0xAC, 0x2D, 0x54, 0x48, 0x25, 0xBC, 0x6D, 0x0C, 0x25, 0x28, 0x00, 0x3F, 0x27, 0xAA, 0x00, 0xAC, 0x93, 0x3C, 0xE3, 0x02, 0x00, 0xAC, 0xE3, 0xDB, 0x00, 0x3F, 0x37, 0x00, 0xBD, 0x33, 0xD5, 0x45, 0xAC, 0x00, 0x9D, 0x33, 0x40, 0x2E, 0x00, 0x30, 0x03, 0x46, 0x11, 0x39, 0x53, 0x06, 0x00, 0x04, 0x30, 0x03, 0x30, 0x0B, 0x65, 0x1C, 0x06, 0x00, 0x01, 0x30, 0x03, 0x30, 0x17, 0x75, 0x6B, 0x01, 0x04, 0x4D, 0x05, 0x2F, 0xF7, 0x4F, 0x5F, 0x31, 0x32, 0x01, 0xB0, 0x7F, 0x01, 0x03, 0xE0, 0x7F, 0xC9, 0xD2, 0xB9, 0x29, 0x21, 0x8C, 0x8C, 0x05, 0xA0, 0x7F, 0x44, 0x73, 0xFB, 0x91, 0xA3, 0x00, 0xF1, 0x7F, 0x03, 0x03, 0xC1, 0x7F, 0x52, 0x65, 0x64, 0x00, 0x2C, 0x12, 0x2E, 0xCC, 0x4E, 0x40, 0x00, 0x2F, 0x37, 0x80, 0x3F, 0x27, 0x28, 0x26, 0x1F, 0x2F, 0x34, 0x04, 0x00, 0x04, 0x06, 0x00, 0x06, 0x06, 0x73, 0x09, 0xED, 0x61, 0xBE, 0x30, 0x03, 0x3F, 0x6F, 0x3A, 0x57, 0xDE, 0x40, 0x30, 0x03, 0xB8, 0xE0, 0x13, 0xC0, 0x30, 0x03, 0x00, 0x7F, 0x63, 0x73, 0xF0, 0x10, 0x04, 0x00, 0x05, 0x01, 0x10, 0x04, 0x10, 0x02, 0xA2, 0x37, 0x46, 0xF2, 0x37, 0x06, 0x26, 0x06, 0x02, 0x05, 0x66, 0x28, 0x2C, 0x00, 0x12, 0x43, 0x42, 0x65, 0x6C, 0x33, 0x5A, 0x01, 0x6F, 0xAA, 0x80, 0xEA, 0x28, 0x70, 0x05, 0x2F, 0xF7, 0x87, 0x30, 0x03, 0x30, 0x8E, 0xE3, 0xBE, 0x30, 0x03, 0xB0, 0xBF, 0xE0, 0x13, 0xDA, 0xC0, 0xBF, 0x50, 0xA7, 0x00, 0x00, 0xC0, 0xA7, 0x00, 0x21, 0x5F, 0x31, 0x02, 0x71, 0x5F, 0x2F, 0x18, 0xA1, 0xBD, 0xBF, 0x30, 0x03, 0x3F, 0xF3, 0xCE, 0x95, 0x17, 0x6F, 0x41, 0x30, 0x03, 0xE0, 0x13, 0xC1, 0x30, 0x03, 0x05, 0x21, 0x5F, 0x00, 0x00, 0xC3, 0x01, 0x31, 0x5F, 0x0F, 0x61, 0x0B, 0xB6, 0xBF, 0x30, 0x03, 0xB0, 0xBF, 0xE0, 0x13, 0xC0, 0xBF, 0xBF, 0x02, 0x61, 0x5F, 0x32, 0x02, 0x72, 0xBF, 0x2E, 0xDB, 0x2C, 0x4F, 0x30, 0x03, 0x44, 0xBD, 0x2D, 0x9F, 0xFE, 0x30, 0x03, 0xC0, 0x13, 0x2B, 0xDB, 0x30, 0x03, 0x05, 0x02, 0xBF, 0x00, 0x00, 0xC3, 0x01, 0x32, 0xBF, 0x9A, 0x1F, 0x99, 0x19, 0xC0, 0x30, 0x03, 0xB0, 0xBF, 0xE0, 0x13, 0xC0, 0xBF, 0x01, 0xF2, 0xBF, 0xE3, 0x7F, 0x6B, 0x3F, 0x17, 0x38, 0x53, 0x50, 0x61, 0x6E, 0x00, 0x9F, 0x1A, 0x00, 0x8F, 0xEB, 0xEB, 0x57, 0x87, 0x7F, 0x6B, 0x7F, 0xBF, 0x03, 0x4F, 0xBF, 0x57, 0x00, 0x53, 0xB9, 0x01, 0x0F, 0xBF, 0xE1, 0x2D, 0x26, 0x20, 0x03, 0x80, 0x53, 0x69, 0x63, 0x31, 0xA0, 0x4F, 0xBF, 0x63, 0xF5, 0x00, 0x84, 0xD3, 0x70, 0x53, 0x46, 0x31, 0x32, 0x00, 0x63, 0x2F, 0x58, 0x2F, 0xA0, 0xF7, 0x4B, 0x05, 0x4F, 0x49, 0x00, 0x00, 0xCD, 0xCC, 0x4C, 0x9F, 0x28, 0x36, 0x80, 0x3F, 0x50, 0x07, 0x40, 0x0F, 0x4F, 0xF7, 0x50, 0x07, 0x8F, 0xAC, 0x7F, 0x40, 0xE0, 0x0B, 0x40, 0x03, 0xB0, 0xA7, 0x4E, 0x53, 0x3E, 0xE7, 0x00, 0x94, 0xB7, 0x60, 0xFB, 0x7D, 0x20, 0x01, 0xC0, 0xA7, 0x27, 0x62, 0x01, 0x00, 0xA7, 0x8A, 0x37, 0x81, 0x2F, 0x91, 0x00, 0x84, 0xA3, 0x8B, 0x71, 0x83, 0x10, 0xF4, 0xBF, 0x01, 0xC1, 0x2F, 0x07, 0x04, 0xD1, 0x2F, 0x00, 0x80, 0xA7, 0xBF, 0x01, 0xF1, 0x2F, 0x08, 0x02, 0x41, 0x2F, 0x3B, 0x13, 0x00, 0x54, 0x73, 0xA1, 0xB7, 0xEE, 0xF7, 0x00, 0xD2, 0x5F, 0x77, 0x09, 0x04, 0xD2, 0x5F, 0x00, 0xB0, 0xA7, 0x01, 0xC3, 0x07, 0x0A, 0x01, 0xE2, 0x5F, 0x92, 0xE7, 0x00, 0x1A, 0xB3, 0xAE, 0xD3, 0xE7, 0xA0, 0x00, 0x68, 0x1F, 0x10, 0x43, 0xE3, 0xFA, 0xDB, 0x5C, 0x21, 0x50, 0x8F, 0x43, 0x83, 0x00, 0x00, 0x44, 0x68, 0x47, 0x30, 0x0F, 0x3F, 0xD7, 0x30, 0x0F, 0x27, 0x80, 0x3F, 0x73, 0x67, 0x03, 0x05, 0x33, 0x67, 0x00, 0x1A, 0xE3, 0x5F, 0xEE, 0x7B, 0xF8, 0x37, 0x37, 0x00, 0xA0, 0x7F, 0x3F, 0x8F, 0x00, 0x10, 0x7F, 0x01, 0x6C, 0x5D, 0x9F, 0xBB, 0xEE, 0x00, 0x0F, 0xC7, 0x23, 0x67, 0xE3, 0xEF, 0x07, 0x33, 0xEF, 0x00, 0x1A, 0xEB, 0x01, 0x94, 0xEB, 0x80, 0x5B, 0x41, 0xFB, 0xE3, 0x02, 0x01, 0x30, 0x87, 0x74, 0x6F, 0x01, 0x50, 0x7F, 0xFA, 0xEB, 0xBD, 0x02, 0xB0, 0x7F, 0x03, 0x81, 0x07, 0x90, 0xF7, 0xF1, 0x17, 0x00, 0x02, 0x0F, 0x03, 0x34, 0xF7, 0xDF, 0x00, 0x1A, 0xF3, 0x01, 0x51, 0x8F, 0x00, 0x2D, 0xCF, 0x00, 0x12, 0x0F, 0x2A, 0x3A, 0x01, 0x21, 0x8F, 0x02, 0x5F, 0x27, 0x7F, 0xDC, 0x00, 0x2F, 0x27, 0x3F, 0xAB, 0xF6, 0xB7, 0xFD, 0x97, 0xFD, 0x57, 0xFC, 0xE7, 0xFC, 0x77, 0xFF, 0xFC, 0x07, 0xFB, 0x97, 0xFA, 0xE3, 0xFA, 0x57, 0xF9, 0xA3, 0xF9, 0x17, 0xF8, 0x63, 0x3F, 0xB7, 0x75, 0xCC, 0x00, 0x2F, 0xB7, 0x3E, 0x8F, 0x0A, 0x30, 0xCB, 0x2C, 0x41, 0xA7, 0x43, 0xCF, 0x1B, 0xCC, 0x37, 0x0D, 0xF8, 0x5F, 0x67, 0x72, 0x56, 0xFF, 0x08, 0x40, 0x02, 0x60, 0x00, 0x1E, 0x5A, 0xF8, 0xFA, 0x34, 0xDF, 0x2C, 0x9F, 0x4F, 0x67, 0x00, 0x0C, 0xD1, 0x82, 0x00, 0xA0, 0xFC, 0xFF, 0x5F, 0x00, 0xFE, 0x00, 0xFF, 0x60, 0x5A, 0x48, 0xFE, 0xED, 0xB5, 0xDF, 0x00, 0x28, 0xF9, 0x20, 0x26, 0xFF, 0xFE, 0x3F, 0xEB, 0x1A, 0xEF, 0x68, 0xB4, 0x08, 0x40, 0xEB, 0x20, 0x42, 0x50, 0x3F, 0xFF, 0xF6, 0x40, 0xFF, 0x26, 0x2F, 0xF7, 0x63, 0x00, 0x03, 0x00, 0xC0, 0xF4, 0x00, 0x10, 0xFD, 0xFF, 0x40, 0xE8, 0x2F, 0xF8, 0xF5, 0xF0, 0xFF, 0xFF, 0x20, 0x50, 0x09, 0xFF, 0xFF, 0x30, 0x20, 0x58, 0x49, 0x9F, 0x6F, 0x9F, 0xE9, 0x02, 0x4F, 0x4F, 0x00, 0x00, 0x6F, 0xAF, 0xBF, 0xF9, 0xF2, 0x43, 0x60, 0x5F, 0x2F, 0x0E, 0x8F, 0xFF, 0xF9, 0x51, 0x37, 0x3F, 0xDA, 0x06, 0xF5, 0xF2, 0xFF, 0xFF, 0xF2, 0x20, 0x03, 0x4F, 0xE6, 0x26, 0x32, 0x00, 0x22, 0x4F, 0xEE, 0x29, 0xC2, 0xFF, 0x58, 0x29, 0x23, 0x06, 0x03, 0xFF, 0xFF, 0x2F, 0x2F, 0x00, 0x00, 0x30, 0x03, 0x4F, 0xF3, 0x50, 0x22, 0xA0, 0x1F, 0xC1, 0x50, 0x77, 0x0A, 0x0A, 0x00, 0x30, 0x0A, 0x0A, 0x0A, 0xD0, 0xF3, 0x6F, 0xE3, 0x64, 0x4F, 0xEB, 0x46, 0x10, 0x00, 0x00, 0xE3, 0x24, 0x6A, 0x8F, 0x9F, 0x00, 0x66, 0x03, 0xFF, 0xF4, 0x2D, 0xDF, 0xC0, 0xC6, 0x90, 0x6F, 0xBF, 0xBC, 0x63, 0x04, 0x01, 0x52, 0x5C, 0x20, 0xB7, 0x20, 0x00, 0xF0, 0x20, 0xEB, 0x30, 0x03, 0xB0, 0x2F, 0xF1, 0xF8, 0x30, 0xCB, 0x20, 0xB6, 0xFF, 0x66, 0x00, 0x66, 0x38, 0x00, 0x02, 0x20, 0xE3, 0x20, 0x6E, 0x2E, 0xBC, 0x00, 0x04, 0xFF, 0x10, 0xFF, 0x0D, 0x8F, 0x7F, 0xEB, 0xF7, 0x30, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x30, 0x00, 0x19, 0xFF, 0x00, 0xAA, 0x60, 0xE6, 0x61, 0xE7, 0x2F, 0x39, 0xC0, 0xF5, 0xF9, 0xFF, 0xDF, 0x80, 0x20, 0xD5, 0x07, 0x10, 0xFC, 0xFC, 0xAF, 0xDF, 0xFF, 0x10, 0x02, 0x9F, 0x6F, 0x3A, 0xAE, 0x35, 0x00, 0xD7, 0x02, 0x8C, 0x30, 0x41, 0x00, 0xFF, 0xFD, 0x40, 0xEF, 0x21, 0x3B, 0x00, 0x00, 0x00, 0xF9, 0xF2, 0x01, 0x0B, 0x20, 0x00, 0xCF, 0xFF, 0x01, 0x21, 0xFF, 0xA8, 0x00, 0x5A, 0x00, 0x20, 0x21, 0x63, 0x40, 0x20, 0x2F, 0xE5, 0x0B, 0x0A, 0xF6, 0xF6, 0x0A, 0x0C, 0x00, 0xF6, 0xF2, 0xF7, 0x8E, 0xFF, 0xFF, 0x21, 0x00, 0x01, 0x69, 0x00, 0x8F, 0xFF, 0xA2, 0x06, 0x12, 0x3F, 0x3C, 0x00, 0x4F, 0xFF, 0x00, 0xDF, 0xFF, 0x00, 0x1C, 0xFF, 0x80, 0x3E, 0xAD, 0x00, 0x00, 0xC3, 0xFF, 0xFC, 0xFF, 0xFF, 0x00, 0x40, 0x00, 0xA9, 0x00, 0xFB, 0xFF, 0xFF, 0x4F, 0x55, 0x6A, 0x2F, 0xB4, 0x0A, 0x3F, 0xBA, 0x09, 0x9F, 0xD9, 0x03, 0x04, 0x83, 0x57, 0xC0, 0xE8, 0x1E, 0x7F, 0xDC, 0xF6, 0xFF, 0xFF, 0x10, 0x00, 0xC6, 0x8E, 0x3F, 0xE4, 0x6F, 0xFF, 0x00, 0xA0, 0x88, 0x05, 0x00, 0x8F, 0x01, 0x5D, 0x01, 0x43, 0x02, 0x4C, 0x49, 0x4D, 0xFF, 0xFE, 0x14, 0x32, 0x7C, 0x02, 0x60, 0x28, 0x2A, 0x37, 0x3B, 0x9D, 0x69, 0x6D, 0x61, 0x67, 0x10, 0x8C, 0x4C, 0x24, 0x20, 0x00, 0x0D, 0x42, 0x30, 0x07, 0x03, 0x8B, 0xA0, 0x00, 0x02, 0x71, 0x00, 0x88, 0xFE, 0xFF, 0xFF, 0x26, 0x0E, 0xC0, 0x80, 0x2F, 0x0B, 0xC0, 0xC0, 0xAF, 0x9F, 0x00, 0x00, 0x9F, 0x81, 0x20, 0x03, 0x00, 0x88, 0x00, 0x88, 0xFF, 0xCC, 0x20, 0x17, 0xC0, 0x70, 0x07, 0xFF, 0xFF, 0x78, 0x00, 0x02, 0xFF, 0xFC, 0x3E, 0xC3, 0x4F, 0xDB, 0x3F, 0xDF, 0x90, 0x90, 0xDF, 0xDF, 0x30, 0x03, 0x01, 0xA1, 0xD7, 0xE4, 0x40, 0x6F, 0x30, 0x6B, 0x40, 0x6F, 0x00, 0xB0, 0x43, 0xCF, 0xDF, 0xFF, 0x05, 0x55, 0xFF, 0xD7, 0x00, 0xEE, 0x00, 0x0F, 0x0E, 0x55, 0x20, 0x17, 0x74, 0xEE, 0x20, 0x17, 0x70, 0x07, 0x40, 0x6F, 0x80, 0x90, 0x6F, 0xC5, 0xFF, 0x0F, 0xCF, 0x7F, 0xDE, 0x00, 0x95, 0xDD, 0xC1, 0x7F, 0x2F, 0xA3, 0xB1, 0x7F, 0x1D, 0x20, 0x00, 0x10, 0x51, 0x7F, 0xB9, 0xCA, 0x06, 0xC6, 0x17, 0x50, 0xA8, 0x82, 0x61, 0x70, 0x28, 0x8E, 0x2E, 0x46, 0x10, 0x00, 0x43, 0xFD, 0x3A, 0xEF, 0x12, 0x76, 0x00, 0x98, 0x6F, 0xFF, 0xCE, 0x47, 0x2D, 0xE3, 0xFF, 0x11, 0x7A, 0xFF, 0x45, 0x4F, 0xEF, 0xAA, 0x00, 0xBB, 0x4B, 0x0F, 0x45, 0xBB, 0x50, 0x07, 0xFF, 0x23, 0xEF, 0x3F, 0xD6, 0x00, 0x23, 0xDE, 0x45, 0x53, 0x4F, 0xFB, 0x9A, 0x00, 0x68, 0x4B, 0x2F, 0x24, 0x35, 0x23, 0x0A, 0xAD, 0xFF, 0xFF, 0xC8, 0x3B, 0x3B, 0xB3, 0x33, 0x2F, 0xFF, 0x43, 0xFF, 0x66, 0x67, 0x27, 0xFF, 0x00, 0x4B, 0x83, 0x4F, 0x7B, 0xE7, 0xF0, 0x21, 0xD1, 0x2E, 0x4D, 0x38, 0x0A, 0x08, 0x47, 0x29, 0x21, 0xF6, 0x22, 0xFF, 0x22, 0xF7, 0xF7, 0x00, 0x15, 0x7F, 0x22, 0xFF, 0x32, 0x4F, 0xBA, 0x43, 0x30, 0xFF, 0x97, 0x6C, 0x27, 0x36, 0x6A, 0x10, 0xE7, 0xF2, 0xF4, 0x7C, 0xFF, 0x34, 0xBA, 0x40, 0x03, 0x9F, 0xDB, 0x25, 0x32, 0x8F, 0xE8, 0x0C, 0x09, 0x20, 0xFF, 0x4F, 0x25, 0x2D, 0xAD, 0xBF, 0x04, 0x28, 0xFF, 0x31, 0x00, 0x6C, 0x06, 0xF4, 0x37, 0xFF, 0x87, 0xD6, 0x00, 0xDD, 0x00, 0x4D, 0x3C, 0x1A, 0xDD, 0x00, 0xEE, 0x34, 0x4A, 0x31, 0xEF, 0x54, 0x00, 0x45, 0x1F, 0xB8, 0xA4, 0x38, 0x0B, 0x51, 0x41, 0xEF, 0xFD, 0xA0, 0x97, 0x1F, 0x10, 0x00, 0x0C, 0xFE, 0xFC, 0x10, 0xA0, 0x23, 0xF1, 0x6F, 0xB8, 0x2C, 0xEF, 0x02, 0x00, 0x03, 0xFF, 0xFF, 0x1E, 0x8F, 0xA1, 0x1B, 0xEF, 0xE7, 0x21, 0x1F, 0xC7, 0x69, 0x04, 0xD9, 0x32, 0xA1, 0xF2, 0x27, 0xCB, 0x20, 0x03, 0x7F, 0xD9, 0x42, 0xE1, 0x40, 0xD7, 0x37, 0xFF, 0x01, 0xBE, 0x4D, 0xEF, 0x58, 0x22, 0x00, 0x23, 0x4F, 0xBB, 0x64, 0xFF, 0xA7, 0x47, 0xEF, 0xDC, 0x2C, 0xFF, 0xED, 0x79, 0xE0, 0xDE, 0x24, 0xA0, 0x37, 0x04, 0xCC, 0xFF, 0x88, 0x50, 0xCF, 0x21, 0x00, 0x32, 0x42, 0xDF, 0x33, 0x00, 0x33, 0x09, 0x00, 0x00, 0x73, 0x30, 0x26, 0xAA, 0xFF, 0xFF, 0x40, 0x04, 0xCE, 0x63, 0x3F, 0x46, 0xD7, 0x7A, 0xEF, 0x35, 0x94, 0x72, 0xEF, 0x26, 0xF5, 0x2F, 0x2E, 0x05, 0x4D, 0x2E, 0xDA, 0x6B, 0x03, 0xE4, 0x0C, 0x09, 0x55, 0xFF, 0x08, 0xC0, 0x7F, 0x91, 0x00, 0x00, 0x00, 0xF3, 0xF3, 0x00, 0x99, 0x00, 0x99, 0xFE, 0x5F, 0xF7, 0x20, 0x0B, 0x20, 0x0F, 0x7F, 0x8F, 0x80, 0x17, 0x60, 0x1F, 0x8F, 0xA7, 0x56, 0x1A, 0xFF, 0x55, 0x01, 0x3A, 0xFD, 0x90, 0x1F, 0x78, 0x4F, 0xC3, 0x55, 0x23, 0xFF, 0x65, 0x4A, 0x2F, 0x97, 0xFF, 0xFC, 0x35, 0x5C, 0x29, 0x23, 0x63, 0x02, 0x34, 0x07, 0x3F, 0xFB, 0x8B, 0xFF, 0x03, 0x44, 0x10, 0x28, 0x4D, 0x68, 0xD4, 0x80, 0x5F, 0x3F, 0xE5, 0x17, 0x9F, 0xEA, 0xEF, 0xFF, 0x07, 0x68, 0xCF, 0x45, 0x6F, 0x2B, 0x59, 0x3E, 0xFB, 0x5F, 0x30, 0x20, 0xFB, 0x89, 0x5F, 0xC7, 0xF3, 0xF9, 0xF8, 0x90, 0x3F, 0x31, 0xB7, 0x22, 0x97, 0x30, 0x00, 0x75, 0x85, 0xBF, 0x2F, 0xC2, 0xAF, 0x0D, 0xFF, 0x9E, 0x22, 0xFF, 0x45, 0x4F, 0xB9, 0xA9, 0x00, 0x9A, 0x45, 0xBF, 0x89, 0x88, 0x55, 0xA7, 0xFF, 0x22, 0xFF, 0x3E, 0xDF, 0x00, 0xFF, 0x75, 0x29, 0xFF, 0xDA, 0x4F, 0xFF, 0x23, 0x3A, 0xDB, 0x5E, 0x7F, 0x95, 0x9F, 0x1F, 0x7F, 0x8F, 0x52, 0x23, 0x0C, 0x0D, 0x92, 0x31, 0xE1, 0xEF, 0xE1, 0xFF, 0x7F, 0xFF, 0x7C, 0x02, 0x2C, 0xE9, 0x30, 0x03, 0xF0, 0x0F, 0x01, 0x1D, 0xE6, 0x45, 0x3E, 0x00, 0xFB, 0x5B, 0xB0, 0x3A, 0x47, 0xFE, 0x2B, 0x83, 0x8C, 0x57, 0xD0, 0x28, 0x8B, 0x25, 0x31, 0xB0, 0x77, 0x11, 0x0D, 0xA5, 0x1B, 0x96, 0x44, 0x00, 0x00, 0xFC, 0xFB, 0x18, 0x01, 0x07, 0xF8, 0x3B, 0xB6, 0x56, 0x45, 0x0E, 0x50, 0x00, 0x28, 0x2F, 0x3F, 0x2C, 0x8F, 0xE5, 0x2C, 0xC3, 0x00, 0xFA, 0x30, 0xA1, 0x2B, 0xBB, 0x6F, 0x76, 0x87, 0x18, 0xEF, 0x00, 0x38, 0x77, 0x77, 0xC2, 0xC2, 0x5F, 0xAE, 0x8B, 0x6B, 0xFF, 0x01, 0xAF, 0x47, 0xCF, 0x15, 0xEE, 0x32, 0x6B, 0x26, 0x89, 0x00, 0x3E, 0xA7, 0x3A, 0x0D, 0xB4, 0x2F, 0x04, 0xF1, 0xFF, 0x7F, 0xFF, 0xA0, 0x50, 0xB0, 0x26, 0x73, 0xF4, 0x79, 0x7C, 0x00, 0x60, 0xFB, 0xFF, 0xE0, 0x28, 0x32, 0x00, 0xB0, 0x01, 0x24, 0x07, 0x4F, 0x08, 0x2F, 0x1F, 0x00, 0x39, 0x00, 0x0D, 0x3D, 0x04, 0x7D, 0xFB, 0xFE, 0xE5, 0x00, 0xD8, 0x5C, 0xA7, 0x5B, 0xA5, 0x3F, 0x93, 0x61, 0x00, 0x1C, 0xBF, 0x38, 0x93, 0x40, 0x96, 0x9E, 0x2A, 0x03, 0xA5, 0x4F, 0xF4, 0xFE, 0x28, 0xAF, 0xD0, 0xE1, 0x3E, 0xFF, 0x1A, 0x27, 0x87, 0x8C, 0x3E, 0x05, 0x00, 0x00, 0x3F, 0x2B, 0x55, 0x98, 0xBE, 0x04, 0x07, 0x0B, 0xFF, 0xFF, 0x08, 0x06, 0x0E, 0x53, 0xFF, 0x20, 0x4A, 0xBF, 0x3F, 0xB6, 0x8E, 0xB3, 0xFF, 0xDE, 0xFF, 0xDD, 0x55, 0x42, 0x60, 0x17, 0x7F, 0xD6, 0xDD, 0x01, 0xFF, 0xED, 0xFF, 0x00, 0x31, 0x00, 0x95, 0x7A, 0xDB, 0x92, 0x60, 0x37, 0xEE, 0x12, 0x2E, 0xBF, 0x50, 0xFD, 0xDA, 0x11, 0xFF, 0x12, 0xBD, 0xFF, 0x69, 0x45, 0xE7, 0x14, 0x6B, 0x9B, 0x0F, 0x8E, 0x1A, 0x5E, 0x01, 0x9F, 0x6F, 0xD3, 0x00, 0x1C, 0x2A, 0x35, 0x2F, 0x8F, 0xFC, 0x04, 0xFC, 0x00, 0xAD, 0x00, 0x47, 0x5A, 0x6F, 0xFD, 0x74, 0x8F, 0x4E, 0x97, 0xB9, 0xFF, 0xDC, 0x4F, 0xFF, 0x2F, 0x44, 0x2B, 0xB2, 0x4F, 0x3C, 0x35, 0xBB, 0xFF, 0x2B, 0xAA, 0x2D, 0x64, 0x10, 0x60, 0xB7, 0x32, 0x35, 0xDC, 0x0A, 0x10, 0x00, 0xB4, 0xEC, 0x2F, 0xF3, 0xF9, 0x7B, 0x78, 0xEF, 0x88, 0x68, 0x9F, 0x8B, 0xFF, 0x25, 0xAB, 0x8F, 0x6D, 0xFF, 0x8F, 0x5E, 0x02, 0x4E, 0xDD, 0x6C, 0x01, 0xEC, 0xAC, 0xCE, 0x7F, 0x2D, 0x16, 0xBE, 0x7F, 0x80, 0xE0, 0x7E, 0x7F, 0x9D, 0x2E, 0x04, 0x0F, 0xBD, 0xFF, 0xEF, 0xEF, 0x8A, 0xAF, 0x00, 0x8E, 0x47, 0x24, 0xDD, 0x78, 0xDD, 0x77, 0x33, 0x00, 0x11, 0x33, 0x11, 0x8D, 0x7D, 0x13, 0x13, 0x7D, 0xDF, 0x20, 0x03, 0x8A, 0xBF, 0x77, 0x50, 0x17, 0x70, 0x07, 0xFF, 0xFF, 0x30, 0x2B, 0xB0, 0x2F, 0xDB, 0xF0, 0x0F, 0x01, 0xBF, 0x7F, 0xA8, 0x6D, 0xEA, 0x7F, 0x7F, 0x10, 0x6D, 0xFF, 0x27, 0xB0, 0xD0, 0x04, 0xA1, 0x00, 0x0D, 0xB0, 0x01, 0x02, 0x60, 0xED, 0x61, 0xFF, 0x2C, 0xFF, 0x1A, 0xBE, 0xFF, 0xF0, 0x3E, 0xB7, 0x00, 0xC0, 0xFF, 0x19, 0x00, 0x21, 0x1D, 0x01, 0x8C, 0x28, 0xFA, 0xCC, 0xFF, 0x3A, 0x3B, 0x92, 0x40, 0x3F, 0x17, 0xFF, 0x46, 0x6B, 0x27, 0x4C, 0x84, 0xFF, 0xE9, 0xBD, 0xB9, 0x3C, 0xB8, 0xFD, 0xF1, 0x23, 0x34, 0x30, 0x62, 0x4C, 0xDA, 0x40, 0x13, 0xF7, 0xFF, 0xF1, 0x20, 0x03, 0x04, 0xEF, 0xFF, 0xE8, 0xFF, 0xE0, 0x20, 0x03, 0xE1, 0xFF, 0x1C, 0xD9, 0xFF, 0xD3, 0x50, 0x95, 0x2E, 0xE1, 0x21, 0x87, 0x57, 0xFF, 0x1A, 0x86, 0xFF, 0xD1, 0x93, 0x69, 0x30, 0x41, 0xFA, 0x31, 0x9F, 0xAC, 0x22, 0xFF, 0xC7, 0x41, 0xA5, 0xD9, 0xFF, 0xE4, 0x50, 0x5B, 0xF6, 0x20, 0xFF, 0xF2, 0x20, 0x5D, 0xFB, 0xFF, 0xEE, 0xFF, 0xEA, 0xAA, 0x2F, 0x23, 0xF5, 0x20, 0x05, 0xE4, 0x23, 0x97, 0xEA, 0x2E, 0x2E, 0xDA, 0x08, 0xFF, 0xDB, 0xFF, 0xD5, 0x2C, 0x6E, 0xC6, 0xFF, 0xD0, 0x02, 0xFF, 0xCB, 0xFF, 0xC1, 0xFF, 0xBC, 0x27, 0xE7, 0xE1, 0xA0, 0x20, 0x11, 0xD2, 0x24, 0x7A, 0xDA, 0xFF, 0xCD, 0xFF, 0xCA, 0x82, 0x20, 0x19, 0xC1, 0xFF, 0xB7, 0xFF, 0xB3, 0x20, 0xFE, 0xBA, 0x0A, 0xFF, 0xAF, 0xFF, 0xAB, 0x05, 0xD1, 0xFF, 0x5F, 0x62, 0x6D, 0x03, 0x28, 0xFF, 0x29, 0x20, 0xC2, 0xC2, 0xE1, 0x7F, 0x05, 0xFF, 0x9F, 0xAD, 0x22, 0x8D, 0x07, 0x21, 0x61, 0xA7, 0x20, 0x9A, 0x5F, 0xE9, 0x8A, 0xD9, 0x48, 0xA8, 0x38, 0x99, 0xFE, 0x41, 0x01, 0xF7, 0x25, 0x34, 0xEA, 0xFF, 0xE0, 0x51, 0x8D, 0xD1, 0x73, 0xF6, 0x80, 0x27, 0xF7, 0xFF, 0xEB, 0x25, 0x56, 0x54, 0xE0, 0x21, 0x1D, 0xE9, 0x21, 0x25, 0xDE, 0x2F, 0x4A, 0xD4, 0xFF, 0x14, 0xD3, 0xFF, 0xC9, 0x2F, 0x52, 0xD3, 0x2B, 0x3D, 0xC9, 0xFF, 0x54, 0xC8, 0x25, 0x49, 0xBD, 0x21, 0x07, 0xFC, 0x27, 0x46, 0xF0, 0xFF, 0x51, 0xE6, 0x20, 0x2D, 0xE2, 0x25, 0x9E, 0xD5, 0xFF, 0xE3, 0x21, 0x95, 0x55, 0xD6, 0x2D, 0xB0, 0xD0, 0x20, 0x21, 0xC3, 0x25, 0x10, 0xDA, 0x21, 0x3B, 0x14, 0xCD, 0xFF, 0xC5, 0x21, 0x4D, 0xC4, 0x25, 0x7B, 0xB6, 0xFF, 0x40, 0xBF, 0x21, 0x3D, 0xB2, 0xFF, 0xAB, 0xFF, 0xB0, 0xFF, 0x05, 0xA9, 0xFF, 0xA3, 0xFF, 0x9C, 0x21, 0x51, 0xC0, 0x22, 0x4A, 0x54, 0xB5, 0x21, 0x53, 0xAE, 0x21, 0xA8, 0xA2, 0x21, 0x59, 0xAA, 0xFF, 0x50, 0xA8, 0x20, 0xC8, 0xA0, 0x2F, 0xE0, 0x95, 0xFF, 0x8C, 0xFF, 0x40, 0xA6, 0x2B, 0x49, 0x9A, 0xFF, 0x92, 0xFF, 0x96, 0xFF, 0x54, 0x8F, 0x25, 0x33, 0x84, 0x20, 0x05, 0x87, 0x22, 0x2C, 0x7C, 0xFF, 0x15, 0x7F, 0xFF, 0x79, 0x2B, 0x43, 0x6E, 0x22, 0x86, 0xB8, 0x20, 0x4B, 0x46, 0xAA, 0x20, 0x53, 0xAD, 0xFF, 0xA4, 0x21, 0x00, 0x30, 0x53, 0x96, 0x2A, 0xFF, 0x90, 0x2B, 0xFF, 0x92, 0x20, 0xFC, 0x85, 0x20, 0x4B, 0xA4, 0x20, 0xFF, 0x9B, 0x20, 0x3D, 0xA0, 0xFF, 0x9D, 0xFF, 0x93, 0x82, 0x20, 0x17, 0x8D, 0xFF, 0x89, 0xFF, 0x80, 0x20, 0x3F, 0x86, 0x28, 0xFF, 0x83, 0x20, 0x41, 0x76, 0x20, 0x0D, 0x83, 0xFF, 0x7D, 0x0A, 0xFF, 0x77, 0xFF, 0x7E, 0x20, 0x4F, 0x72, 0x25, 0x87, 0x72, 0x02, 0xFF, 0x6C, 0xFF, 0x67, 0xFF, 0x62, 0x40, 0x03, 0x5C, 0x00, 0xFF, 0x58, 0xFF, 0x74, 0xFF, 0x70, 0xFF, 0x69, 0x28, 0xFF, 0x65, 0x25, 0xA1, 0x6A, 0x20, 0x15, 0x5F, 0xFF, 0x5E, 0x02, 0xFF, 0x5A, 0xFF, 0x53, 0xFF, 0x50, 0x22, 0x6C, 0x54, 0x0A, 0xFF, 0x4D, 0xFF, 0x4A, 0x00, 0xD3, 0xFF, 0x16, 0x24, 0x1D, 0x6B, 0x35, 0xFF, 0x15, 0x22, 0x66, 0x72, 0xD7, 0x85, 0x2F, 0xA8, 0xED, 0x5F, 0x95, 0x55, 0xF9, 0x2E, 0xCE, 0xF0, 0x94, 0x3F, 0x75, 0x21, 0xBF, 0xD5, 0x84, 0x4D, 0x6A, 0x3D, 0x2F, 0xD0, 0xAF, 0xAC, 0xFD, 0x22, 0xFB, 0xE8, 0x26, 0x3B, 0xE0, 0xAA, 0x2F, 0xE7, 0xF8, 0x2F, 0x06, 0xF1, 0x23, 0x03, 0xD9, 0x23, 0x01, 0xD3, 0xAA, 0x21, 0x7F, 0xF0, 0x28, 0xC8, 0xE6, 0x21, 0x77, 0xD6, 0x23, 0x0F, 0xCC, 0xAA, 0x22, 0xD1, 0xDD, 0x21, 0x89, 0xD5, 0x22, 0xBF, 0xC3, 0x22, 0xF6, 0xBB, 0xAA, 0x22, 0xB1, 0xBF, 0x21, 0x61, 0xB5, 0x22, 0xB1, 0xA8, 0x21, 0x59, 0x9F, 0xAA, 0x22, 0xBB, 0xAB, 0x21, 0x69, 0xA2, 0x21, 0x5F, 0x95, 0x2D, 0x23, 0x8C, 0xAD, 0x42, 0xD5, 0xD2, 0x21, 0x9F, 0xBF, 0x21, 0x95, 0x30, 0x1B, 0xCB, 0x27, 0x21, 0x55, 0xC4, 0x21, 0xA7, 0xB0, 0x21, 0x9D, 0xA9, 0x21, 0x9F, 0xA6, 0x21, 0x7D, 0x55, 0x9E, 0x21, 0x7F, 0x8F, 0x23, 0xA2, 0x87, 0x21, 0x77, 0x96, 0x26, 0xB9, 0xA8, 0x30, 0x0B, 0x7F, 0x21, 0x19, 0x78, 0x21, 0x7F, 0x9E, 0xFF, 0x94, 0xA2, 0x20, 0x01, 0x8A, 0x26, 0xCF, 0x82, 0xFF, 0x81, 0x20, 0x11, 0x8B, 0xB1, 0x20, 0x05, 0x82, 0x20, 0x19, 0x30, 0x1B, 0x6E, 0xFF, 0x66, 0x21, 0xA5, 0x51, 0x71, 0x21, 0x41, 0x68, 0x21, 0x3D, 0x63, 0xFF, 0x60, 0x21, 0x3B, 0x50, 0x66, 0x21, 0x41, 0x5E, 0x2D, 0xBD, 0x57, 0xFF, 0x51, 0xFF, 0x15, 0x4F, 0xFF, 0x48, 0x21, 0xC5, 0x70, 0x20, 0x21, 0x68, 0x80, 0x17, 0x55, 0x6A, 0x20, 0x25, 0x63, 0x21, 0x63, 0x57, 0x20, 0x1D, 0x50, 0x20, 0x1F, 0x10, 0x55, 0xFF, 0x4E, 0x20, 0x01, 0x46, 0xFF, 0x47, 0xFF, 0x05, 0x40, 0xFF, 0x3F, 0xFF, 0x39, 0x20, 0x07, 0x3F, 0x20, 0x09, 0x51, 0x39, 0x20, 0x09, 0x32, 0x20, 0x01, 0x2C, 0xFF, 0x5D, 0x23, 0xF6, 0x60, 0x53, 0x20, 0x23, 0x30, 0x03, 0x49, 0xFF, 0x44, 0xFF, 0x4B, 0x08, 0xFF, 0x45, 0xFF, 0x42, 0x21, 0x3E, 0x40, 0xFF, 0x3C, 0x02, 0xFF, 0x38, 0xFF, 0x34, 0xFF, 0x4A, 0x20, 0x39, 0x41, 0xA8, 0x21, 0x4E, 0x43, 0x20, 0x05, 0x3B, 0x20, 0x11, 0x38, 0xFF, 0x35, 0x00, 0xFF, 0x31, 0xFF, 0x2E, 0xFF, 0x33, 0xFF, 0x30, 0x2A, 0xFF, 0x2B, 0x23, 0x46, 0x3B, 0x20, 0x0F, 0x33, 0x20, 0x0F, 0x30, 0x82, 0x24, 0xD2, 0x2A, 0xFF, 0x26, 0xFF, 0x2D, 0x2B, 0x94, 0x27, 0x80, 0x2D, 0xA5, 0x23, 0xFF, 0x20, 0xFF, 0x1E, 0xFF, 0x1B, 0xA8, 0x23, 0x68, 0x26, 0x40, 0x0B, 0x24, 0x2D, 0xB9, 0x1E, 0xFF, 0x1C, 0x02, 0xFF, 0x1D, 0xFF, 0x1A, 0xFF, 0x18, 0x21, 0xD2, 0x18, 0x8A, 0x24, 0xB8, 0x13, 0xFF, 0x12, 0x33, 0x8B, 0x00, 0x20, 0x36, 0xD2, 0xDA, 0x6B, 0xF6, 0x34, 0x85, 0x00, 0x24, 0x87, 0x64, 0xB3, 0xFA, 0x2C, 0x0B, 0xEA, 0xAA, 0x24, 0x61, 0xE4, 0x24, 0x57, 0xCC, 0x24, 0x59, 0xC6, 0x27, 0xFF, 0xDF, 0xA9, 0x24, 0x75, 0xDA, 0x24, 0x5F, 0xC1, 0x24, 0x4D, 0xBC, 0x00, 0x22, 0xB6, 0x62, 0x00, 0x23, 0x56, 0x43, 0x7B, 0xFE, 0xFF, 0xF2, 0x34, 0xA5, 0x00, 0xD5, 0x23, 0x4E, 0x24, 0xFD, 0xED, 0x2A, 0x35, 0xEA, 0x2C, 0x67, 0xD5, 0x24, 0xE9, 0x55, 0xD2, 0x24, 0x91, 0xB7, 0x24, 0x8F, 0xB2, 0x29, 0x02, 0xCD, 0x24, 0xA5, 0x55, 0xCA, 0x25, 0x7E, 0xAF, 0x24, 0x81, 0xAB, 0x25, 0x86, 0xB0, 0x23, 0x01, 0x55, 0xAA, 0x23, 0x4B, 0x96, 0x23, 0x4D, 0x90, 0x23, 0x5B, 0xA4, 0x23, 0x09, 0x55, 0x9F, 0x2E, 0xFF, 0x8A, 0x23, 0x35, 0x85, 0x22, 0xED, 0x7D, 0x22, 0xE9, 0x55, 0x77, 0x22, 0xDB, 0x67, 0x22, 0xD9, 0x62, 0x22, 0xE7, 0x72, 0x23, 0x39, 0x55, 0x6D, 0x22, 0xE3, 0x5C, 0x22, 0xE5, 0x57, 0x23, 0x6B, 0x9A, 0x23, 0x37, 0x55, 0x96, 0x23, 0x17, 0x80, 0x23, 0x19, 0x7C, 0x23, 0x77, 0x93, 0x23, 0x29, 0x55, 0x90, 0x25, 0x4A, 0x79, 0x23, 0x21, 0x76, 0x22, 0xFF, 0x6A, 0x23, 0x01, 0x55, 0x65, 0x24, 0x7A, 0x53, 0x22, 0xF9, 0x50, 0x28, 0xA9, 0x62, 0x23, 0x09, 0x55, 0x5F, 0x25, 0x6C, 0x4D, 0x23, 0x01, 0x4A, 0x21, 0x7F, 0x53, 0x25, 0x78, 0x51, 0x4E, 0x21, 0x77, 0x42, 0x21, 0x79, 0x3D, 0xFF, 0x52, 0x21, 0x85, 0x55, 0x4E, 0x21, 0x87, 0x40, 0x21, 0x7D, 0x3C, 0x21, 0x7F, 0x3A, 0x21, 0x69, 0x55, 0x35, 0x21, 0x6F, 0x2D, 0x25, 0xA4, 0x28, 0x2E, 0xFD, 0x30, 0x21, 0x65, 0x55, 0x2C, 0x41, 0x53, 0x1E, 0x21, 0x61, 0x1B, 0x21, 0x9F, 0x41, 0x21, 0xDD, 0x55, 0x3D, 0x21, 0xAB, 0x31, 0x21, 0x99, 0x2D, 0x21, 0xA7, 0x3B, 0x21, 0xAF, 0x55, 0x38, 0x21, 0x9F, 0x2B, 0x21, 0xA1, 0x29, 0x24, 0xE8, 0x23, 0x21, 0x95, 0x55, 0x20, 0x21, 0x77, 0x18, 0x21, 0x79, 0x15, 0x21, 0x87, 0x1E, 0x2F, 0x43, 0x55, 0x1C, 0x21, 0x83, 0x13, 0x23, 0x5E, 0x12, 0x2F, 0x4F, 0x1D, 0x40, 0x1B, 0x45, 0x19, 0x23, 0x6C, 0x14, 0xFF, 0x11, 0x26, 0x72, 0x14, 0x23, 0x76, 0x54, 0x11, 0x20, 0x09, 0x0E, 0x20, 0x01, 0x0B, 0x21, 0xA3, 0x10, 0xFF, 0x10, 0x0F, 0xFF, 0x0D, 0x40, 0x03, 0x0B, 0xFF, 0x0A, 0xFF, 0x55, 0x0C, 0x20, 0x03, 0x09, 0x25, 0x24, 0x08, 0x25, 0x28, 0x06, 0x25, 0x32, 0x55, 0x13, 0x20, 0x1D, 0x10, 0x20, 0x1F, 0x0C, 0x20, 0x15, 0x0A, 0x25, 0x3C, 0x55, 0x0F, 0x20, 0x33, 0x0D, 0x20, 0x27, 0x08, 0x20, 0x1D, 0x07, 0x25, 0x52, 0xAB, 0x50, 0x25, 0x04, 0x20, 0x01, 0x03, 0x25, 0x76, 0x02, 0x80, 0x07, 0x50, 0x01, 0x56, 0x01, 0x00, 0xB9, 0x7F, 0x20, 0x2C, 0x1D, 0x03, 0x04, 0xE9, 0x7F, 0x10, 0x04, 0x80, 0x59, 0x30, 0x18, 0xC2, 0xFE, 0xE2, 0x2C, 0x3A, 0x3A, 0x46, 0x20, 0xF8, 0xE9, 0x06, 0xFF, 0x00, 0x95, 0x00, 0xDC, 0x00, 0x3E, 0x2E, 0x03, 0x1F, 0xA9, 0x80, 0x0C, 0xF2, 0x00, 0x10, 0xF9, 0x38, 0xEF, 0x4F, 0x02, 0x50, 0x90, 0x0F, 0xFF, 0xFF, 0xC0, 0xD0, 0x00, 0xDE, 0x98, 0xBF, 0x1B, 0xCB, 0xFF, 0x2F, 0x23, 0xF1, 0xF2, 0x7F, 0x4B, 0xFF, 0x01, 0xCF, 0x27, 0x10, 0x5B, 0x20, 0x2B, 0x10, 0x00, 0x11, 0x49, 0x71, 0x7E, 0x11, 0x60, 0x07, 0xF9, 0x7E, 0x70, 0x17, 0x0B, 0x10, 0x1F, 0x3A, 0x6E, 0x0C, 0xBA, 0x5C, 0x40, 0x80, 0x41, 0xCD, 0x30, 0xE3, 0xFF, 0x20, 0xF9, 0xB7, 0xFF, 0x00, 0xFF, 0xAF, 0xCF, 0x03, 0xD1, 0xF8, 0xFF, 0x7F, 0x00, 0xFE, 0xFF, 0x0C, 0x05, 0x06, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x90, 0x80, 0xED, 0xFF, 0xEE, 0xFF, 0x05, 0x79, 0x00, 0x77, 0x00, 0xEE, 0x20, 0x07, 0x77, 0x20, 0x07, 0x00, 0x00, 0xAA, 0x00, 0x07, 0xFF, 0xFF, 0x3F, 0xCF, 0x83, 0x2B, 0x90, 0xA5, 0x00, 0x00, 0xF9, 0xF8, 0x70, 0x17, 0x80, 0x1F, 0x00, 0x4A, 0x00, 0xA0, 0x6F, 0x6F, 0xF0, 0x30, 0x00, 0x03, 0x9B, 0x00, 0x00, 0xEF, 0x23, 0x00, 0x80, 0x37, 0x80, 0x3F, 0xC5, 0xEA, 0x05, 0x00, 0x30, 0x1F, 0x80, 0xE8, 0xAB, 0x59, 0xF7, 0x59, 0x00, 0x60, 0x3F, 0xF0, 0x3B, 0xFC, 0x6B, 0xF2, 0x00, 0xE0, 0x5F, 0x00, 0x90, 0x7F, 0xA2, 0x00, 0x6A, 0xF4, 0x15, 0xF3, 0x9F, 0x8F, 0x90, 0xBF, 0xDE, 0x20, 0xDF, 0x97, 0xDC, 0x48, 0x00, 0x01, 0x20, 0x10, 0x7B, 0xFF, 0x02, 0xAF, 0xFC, 0x10, 0x30, 0xFF, 0xFA, 0x39, 0xE3, 0x4E, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x65, 0x50, 0x01, 0xA9, 0x88, 0x05, 0x04, 0x01, 0xFF, 0xF6, 0x1E, 0x8F, 0xB0, 0x50, 0xEF, 0x00, 0x4A, 0x9F, 0x25, 0x01, 0x05, 0x08, 0x3C, 0x8F, 0x70, 0x90, 0x21, 0xCF, 0x70, 0xA1, 0xFA, 0x86, 0x41, 0x45, 0xFF, 0xEF, 0x02, 0x00, 0x20, 0xC5, 0x2A, 0xD9, 0x80, 0x40, 0x80, 0x30, 0x03, 0xFF, 0xFE, 0x05, 0x0B, 0xF8, 0xE1, 0x40, 0x6F, 0x2B, 0x97, 0x80, 0x90, 0x00, 0x05, 0x60, 0x00, 0x80, 0x2F, 0x66, 0xB6, 0xFF, 0xFF, 0x25, 0x06, 0x06, 0x1F, 0x04, 0xF8, 0xF8, 0x9F, 0xF8, 0xF7, 0x2F, 0x73, 0x06, 0x07, 0x48, 0xBB, 0x21, 0x06, 0xD0, 0x40, 0x3B, 0xBB, 0xB8, 0x00, 0x6F, 0x00, 0x6F, 0x70, 0xF0, 0x6F, 0x6F, 0xE0, 0xE0, 0x68, 0x01, 0xDF, 0x50, 0xA0, 0xDF, 0xDF, 0x90, 0x90, 0x20, 0x0B, 0x04, 0xF0, 0x4B, 0x00, 0xB0, 0x00, 0x20, 0x0B, 0xA0, 0x9B, 0x00, 0x00, 0x70, 0x00, 0x89, 0xFF, 0xB6, 0x8D, 0xFF, 0x00, 0xFF, 0x04, 0x03, 0xAD, 0xFD, 0x23, 0x2F, 0xF3, 0x12, 0xF3, 0x9F, 0xAF, 0x20, 0x0B, 0x04, 0xBB, 0x2D, 0xB5, 0xF3, 0x00, 0xF3, 0xAF, 0xBF, 0xB2, 0x00, 0x8B, 0x00, 0xE8, 0x00, 0xB0, 0xFF, 0xEF, 0xC0, 0xC0, 0xFF, 0xFF, 0x49, 0x06, 0x10, 0x81, 0xFD, 0x90, 0xC1, 0x2B, 0x9B, 0x20, 0x0B, 0x90, 0x00, 0x00, 0xBB, 0x00, 0xA0, 0x21, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0xB3, 0x00, 0xCC, 0x07, 0x7C, 0xFA, 0x68, 0x00, 0xAC, 0xFB, 0x89, 0x00, 0x0A, 0x95, 0xFA, 0x5F, 0x00, 0x48, 0xF8, 0xF9, 0x03, 0x06, 0x72, 0xFA, 0xBD, 0x00, 0x21, 0x9D, 0x01, 0x17, 0x0D, 0xF9, 0xF9, 0x01, 0x00, 0x00, 0xB7, 0x00, 0x58, 0xDF, 0xDB, 0xD8, 0x4F, 0x00, 0x3F, 0x30, 0x20, 0x3A, 0xFF, 0x00, 0x03, 0xFF, 0x00, 0xFF, 0x38, 0x6A, 0x4F, 0x4F, 0x20, 0x30, 0x3B, 0x82, 0x2E, 0x19, 0xFF, 0xFF, 0x4A, 0x0B, 0xBB, 0x2E, 0x18, 0x70, 0x00, 0xFA, 0xCC, 0x5E, 0xFF, 0xFF, 0x09, 0x08, 0xFA, 0x00, 0xFA, 0x8F, 0x8F, 0xF3, 0xF3, 0x8F, 0x7F, 0xFF, 0x00, 0xFC, 0x08, 0x3D, 0x91, 0x00, 0xDD, 0x00, 0xF3, 0x00, 0xF9, 0x8F, 0x9F, 0xBA, 0x00, 0x6B, 0x00, 0x00, 0x00, 0xB0, 0xC7, 0xAF, 0xF4, 0xF7, 0x6F, 0x7F, 0xDC, 0x00, 0x70, 0x19, 0xDF, 0x30, 0x30, 0xFF, 0xFF, 0xF5, 0x00, 0xC0, 0x6F, 0x9F, 0x10, 0x00, 0xD8, 0x00, 0x30, 0x00, 0x60, 0xFF, 0xEF, 0xDB, 0x12, 0x2A, 0x00, 0x31, 0x90, 0x2E, 0x70, 0x09, 0x0C, 0x34, 0xF2, 0xFF, 0xFE, 0x00, 0x10, 0x11, 0xFD, 0xFF, 0x09, 0x5B, 0xEB, 0x40, 0x40, 0xB0, 0x20, 0x2B, 0x06, 0xFF, 0x9F, 0x1E, 0x08, 0x09, 0x20, 0x1F, 0xAE, 0x7F, 0x05, 0x84, 0x09, 0xE4, 0x31, 0x40, 0x00, 0xFF, 0xE4, 0x3F, 0x49, 0x9F, 0xFF, 0x03, 0x02, 0xBF, 0xFA, 0x30, 0xFF, 0xC8, 0x00, 0x0F, 0x49, 0x23, 0xFC, 0xBF, 0x24, 0x02, 0xEE, 0x24, 0x02, 0x40, 0x07, 0x00, 0x05, 0xFA, 0x60, 0x17, 0x70, 0x1F, 0x00, 0x05, 0xFA, 0xB0, 0x09, 0x90, 0x1F, 0x87, 0xD0, 0xBF, 0x55, 0xFA, 0x20, 0xFB, 0xF9, 0xFF, 0x01, 0xFF, 0x8C, 0xAF, 0x03, 0xFF, 0x5E, 0x04, 0x10, 0x16, 0x4D, 0xE6, 0x01, 0x43, 0x4C, 0x49, 0x4D, 0xFF, 0xFE, 0x14, 0x2F, 0xFF, 0x18, 0x02, 0x02, 0x28, 0x26, 0xF7, 0x38, 0x90, 0x69, 0x6D, 0x61, 0x54, 0x67, 0x37, 0x02, 0x80, 0x27, 0xBE, 0x0D, 0x67, 0x0F, 0x9C, 0x6D, 0x00, 0xF7, 0xA2, 0xC3, 0x19, 0x7A, 0x1E, 0xE4, 0xC4, 0x00, 0x31, 0xB6, 0x92, 0x11, 0x0E, 0x96, 0xE4, 0xD2, 0x00, 0xE7, 0xF3, 0x4C, 0xB3, 0xFF, 0x51, 0x7C, 0x7E, 0x00, 0x52, 0x2C, 0x8D, 0x15, 0xC5, 0xAB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static const unsigned char iQue_without_ISBN_LZ[0x2000] = -{ - 0x11, 0x48, 0x65, 0x00, 0x00, 0x64, 0x61, 0x72, 0x63, 0xFF, 0xFE, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x28, 0x65, 0x00, 0x00, 0x83, 0x30, 0x09, 0x1C, 0x04, 0x00, 0x00, 0x40, 0x20, 0x03, 0x30, 0x13, 0xAB, 0x30, 0x18, 0x15, 0x20, 0x1D, 0x02, 0xA0, 0x0B, 0x06, 0x20, 0x2B, 0x30, 0x18, 0x5A, 0x09, 0x20, 0x35, 0x10, 0x20, 0x39, 0x30, 0x2B, 0xF8, 0x20, 0x41, 0x54, 0x85, 0x30, 0x0B, 0x05, 0x00, 0x00, 0xEC, 0x20, 0x4D, 0x98, 0x30, 0x17, 0xD0, 0x20, 0x28, 0x30, 0x17, 0xDC, 0x30, 0x23, 0x07, 0x00, 0x00, 0xCC, 0x09, 0x0C, 0x00, 0x00, 0x20, 0x20, 0x51, 0x20, 0x14, 0x20, 0x2B, 0xA0, 0x20, 0x0B, 0x64, 0x20, 0x5D, 0x80, 0x20, 0x00, 0x00, 0x4C, 0x99, 0x20, 0x5C, 0xA8, 0x01, 0x50, 0x53, 0x20, 0x22, 0x00, 0xB2, 0x20, 0x75, 0x34, 0xE0, 0x22, 0x20, 0x13, 0x20, 0x74, 0xE2, 0x20, 0x81, 0xA0, 0x25, 0x13, 0x00, 0x00, 0x3C, 0x20, 0x68, 0x12, 0x02, 0x50, 0x77, 0x30, 0x8F, 0x41, 0x1C, 0x20, 0x90, 0x00, 0x36, 0x00, 0x00, 0x28, 0x20, 0xAB, 0x4D, 0x3E, 0x20, 0x9C, 0x80, 0x3A, 0x20, 0x0B, 0x20, 0xAD, 0x60, 0x30, 0x17, 0x54, 0x3C, 0x50, 0x17, 0x82, 0x30, 0x17, 0x40, 0x20, 0x23, 0x08, 0x00, 0x2D, 0x00, 0xA4, 0x30, 0x2F, 0x49, 0x20, 0x67, 0x20, 0xE9, 0xC4, 0x30, 0x3B, 0x56, 0x4A, 0x50, 0x17, 0xDC, 0x30, 0x3B, 0x52, 0x20, 0x47, 0x20, 0xE0, 0xF4, 0xB2, 0x30, 0x53, 0x55, 0x20, 0x53, 0x30, 0xD4, 0x00, 0x2E, 0x21, 0x13, 0x61, 0x02, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x6D, 0x21, 0x1D, 0x4E, 0x82, 0x20, 0x07, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x20, 0x11, 0x64, 0x0A, 0x00, 0x6F, 0x00, 0x4C, 0x20, 0x03, 0x67, 0x20, 0x07, 0x5F, 0x28, 0x00, 0x44, 0x20, 0x03, 0x30, 0x20, 0x01, 0x5F, 0x00, 0x53, 0x20, 0x00, 0x63, 0x40, 0x1F, 0x65, 0x00, 0x4F, 0x00, 0x75, 0xAB, 0x20, 0x2B, 0x41, 0x20, 0x43, 0x62, 0x20, 0x13, 0x6C, 0x40, 0x47, 0x02, 0x50, 0x43, 0x57, 0x42, 0x03, 0x20, 0x43, 0x43, 0x01, 0x80, 0x87, 0x55, 0x03, 0x20, 0xCB, 0x00, 0x90, 0x43, 0x01, 0x90, 0xCB, 0xD7, 0x00, 0x90, 0x87, 0xF0, 0xCB, 0x62, 0x21, 0x5D, 0x79, 0x21, 0x97, 0x01, 0x31, 0xA1, 0x71, 0x8D, 0xEA, 0x00, 0xF0, 0x2F, 0x71, 0x05, 0xD0, 0x2F, 0x74, 0x42, 0x09, 0x67, 0x23, 0x29, 0x33, 0xBD, 0x22, 0x01, 0x73, 0xA2, 0x01, 0xB0, 0x5B, 0x52, 0x2D, 0x00, 0x10, 0x21, 0x31, 0x01, 0x00, 0x21, 0x55, 0x32, 0x01, 0x00, 0x43, 0x33, 0xE0, 0x65, 0x4C, 0x23, 0x71, 0x4D, 0x22, 0xA3, 0x1F, 0x73, 0x00, 0x6B, 0x00, 0x40, 0x85, 0x30, 0x1F, 0x00, 0xB0, 0x17, 0xF0, 0x93, 0xF2, 0xE3, 0x41, 0x5F, 0x20, 0xB5, 0x32, 0x00, 0x38, 0x00, 0x78, 0x23, 0x68, 0x60, 0x34, 0xE0, 0xE1, 0x70, 0x02, 0x43, 0x4C, 0x41, 0x4E, 0xFF, 0x46, 0xFE, 0x23, 0xD0, 0x00, 0x02, 0x02, 0x34, 0x03, 0x33, 0x96, 0x70, 0x1D, 0x61, 0x74, 0x31, 0x23, 0x82, 0x44, 0x3E, 0x34, 0x59, 0x28, 0x33, 0x73, 0x10, 0xFF, 0xFF, 0xFF, 0x34, 0x4C, 0x53, 0x63, 0x65, 0x6E, 0x04, 0x65, 0x4F, 0x75, 0x74, 0x41, 0x24, 0x71, 0x47, 0x5F, 0x0C, 0x41, 0x5F, 0x30, 0x30, 0xA0, 0x4C, 0x40, 0x3B, 0x69, 0x31, 0xCD, 0x33, 0xA3, 0x50, 0x3F, 0x02, 0x00, 0x30, 0x59, 0x34, 0x9D, 0x68, 0x24, 0xA1, 0x00, 0x50, 0x5F, 0x4E, 0x69, 0x6E, 0x4C, 0x6F, 0x67, 0x70, 0x6F, 0xA0, 0x35, 0x34, 0xA0, 0x34, 0xBD, 0x43, 0x4C, 0x56, 0x43, 0x8F, 0x74, 0x3F, 0x00, 0x10, 0x02, 0x40, 0x87, 0x40, 0x0B, 0xD0, 0x5D, 0x20, 0x76, 0x20, 0x7F, 0x43, 0x34, 0xEC, 0x4E, 0x5F, 0x52, 0x6F, 0x6F, 0x73, 0x74, 0xD0, 0x7E, 0x00, 0x70, 0x4B, 0x80, 0x57, 0x00, 0x20, 0x20, 0x3B, 0x50, 0x3F, 0xF8, 0x00, 0x30, 0xFF, 0x34, 0xF7, 0xB0, 0xFF, 0x24, 0xD2, 0x80, 0xFF, 0x00, 0x00, 0x1E, 0xD5, 0x45, 0x4C, 0x70, 0xFF, 0x42, 0x40, 0xFF, 0x42, 0x00, 0x40, 0xFF, 0x9C, 0x80, 0x2D, 0xB2, 0x90, 0xFF, 0x5C, 0x01, 0xE0, 0xFF, 0x90, 0xB3, 0x34, 0xC2, 0x02, 0xD0, 0xF3, 0xC8, 0xFD, 0x20, 0xAA, 0xD0, 0xF3, 0x00, 0x70, 0xFF, 0xF1, 0xFF, 0x31, 0x39, 0x71, 0xFF, 0x65, 0x23, 0x31, 0xC5, 0xB1, 0xFF, 0x31, 0x84, 0x47, 0x5F, 0x43, 0x00, 0x81, 0xFF, 0x0F, 0xE1, 0xFF, 0x99, 0x02, 0x90, 0xFF, 0x12, 0xC3, 0x02, 0x31, 0xF3, 0x92, 0x3F, 0x80, 0xBF, 0x91, 0xF3, 0x7B, 0x60, 0x32, 0xB6, 0x00, 0x80, 0xFF, 0x36, 0xDF, 0x03, 0x32, 0xFF, 0x7C, 0x27, 0x27, 0x53, 0x3F, 0x55, 0x0D, 0x42, 0xFF, 0x48, 0x27, 0x9D, 0xB0, 0x27, 0xA1, 0xA4, 0x27, 0x8D, 0x60, 0x24, 0x27, 0x88, 0x36, 0xCB, 0x30, 0x03, 0x00, 0x00, 0xBC, 0xAD, 0x20, 0x03, 0x24, 0x27, 0xAB, 0x88, 0x37, 0x73, 0x27, 0x94, 0xB0, 0x26, 0xE7, 0x02, 0x74, 0x0A, 0x00, 0x00, 0x78, 0x0B, 0x32, 0xDF, 0x57, 0xF9, 0x00, 0x03, 0x5B, 0x37, 0x32, 0x27, 0x6E, 0x26, 0xB1, 0x33, 0xB7, 0x50, 0x41, 0x83, 0x2F, 0x71, 0x02, 0xF2, 0xE3, 0x73, 0xDB, 0x01, 0x13, 0x07, 0x50, 0x5F, 0x33, 0x00, 0x80, 0x67, 0x77, 0xB8, 0x60, 0x67, 0x20, 0xAA, 0x43, 0xC7, 0x38, 0x63, 0xC7, 0x30, 0x6F, 0x93, 0x9F, 0x53, 0xA0, 0x24, 0x0A, 0xA0, 0x27, 0xA5, 0x80, 0xBE, 0x24, 0x39, 0x23, 0x16, 0x23, 0xA0, 0xC0, 0x48, 0x79, 0x06, 0x02, 0x00, 0x30, 0x37, 0x70, 0x23, 0x00, 0x33, 0x33, 0xB3, 0x3F, 0xFC, 0x2D, 0xEC, 0xBC, 0x8C, 0x70, 0x0B, 0x0A, 0xD7, 0x23, 0x20, 0x0B, 0x30, 0x2F, 0x80, 0x3F, 0xBC, 0x48, 0xA9, 0x07, 0x01, 0xD0, 0x2F, 0xF4, 0x2F, 0xB0, 0x6B, 0x39, 0x0C, 0x40, 0x9D, 0x6F, 0x1C, 0x30, 0x97, 0x61, 0xEF, 0xCC, 0x28, 0x45, 0x30, 0x9B, 0x70, 0xF3, 0x24, 0x87, 0xDC, 0xE4, 0xB9, 0x71, 0x5B, 0x50, 0xF1, 0x5B, 0x29, 0x39, 0xD4, 0x8B, 0x70, 0xC1, 0x14, 0xCD, 0xCC, 0xCC, 0x20, 0xEB, 0x20, 0x24, 0x02, 0xF8, 0xC1, 0xF9, 0x00, 0x31, 0x67, 0x00, 0x14, 0xBB, 0x30, 0x7F, 0x30, 0x2F, 0x71, 0x73, 0x44, 0x73, 0xF5, 0x38, 0x94, 0x01, 0x90, 0x7F, 0x3C, 0xC2, 0x20, 0x7F, 0x3E, 0x02, 0xD0, 0x7F, 0x52, 0x65, 0x70, 0x64, 0x01, 0x70, 0xFF, 0xC1, 0xEB, 0x45, 0x43, 0xC2, 0xB7, 0x6D, 0xDB, 0xAE, 0x20, 0x7F, 0x8C, 0x25, 0x02, 0x20, 0x00, 0x40, 0xFF, 0x91, 0xF7, 0xB6, 0x1B, 0x5C, 0xA0, 0xA4, 0x87, 0xB4, 0x35, 0x3E, 0x00, 0x92, 0x24, 0xE9, 0xC0, 0xBD, 0x60, 0x8B, 0x31, 0x00, 0x32, 0xE7, 0x35, 0x33, 0xF2, 0xE7, 0x92, 0x53, 0xF0, 0x26, 0x82, 0x7F, 0x20, 0x25, 0x1B, 0x90, 0x0B, 0x50, 0x97, 0x34, 0xEF, 0x00, 0x50, 0x97, 0x96, 0x53, 0x30, 0x3B, 0xAF, 0x77, 0x04, 0xAA, 0xF1, 0x17, 0x32, 0x02, 0x13, 0x73, 0x32, 0xF7, 0x50, 0x8B, 0x00, 0x96, 0x7B, 0xF9, 0x33, 0x1B, 0x57, 0x78, 0x00, 0x31, 0x7F, 0x3B, 0x90, 0x57, 0x07, 0x54, 0x53, 0x2A, 0xEE, 0xB7, 0x47, 0x73, 0x4C, 0x37, 0x8B, 0x2B, 0xD9, 0x94, 0x63, 0x8B, 0x3B, 0x87, 0x3B, 0xD1, 0x61, 0x24, 0x4B, 0xD5, 0x00, 0x01, 0x97, 0xC0, 0x39, 0x8E, 0xE3, 0x2B, 0x39, 0xE8, 0x51, 0x5B, 0x5B, 0xFD, 0x01, 0x20, 0x23, 0x03, 0xF7, 0x6B, 0x40, 0x41, 0x9E, 0x11, 0x15, 0x8D, 0xBD, 0x31, 0xA3, 0x9A, 0x99, 0xB9, 0x2B, 0x7D, 0xAA, 0x2C, 0x5A, 0x04, 0x01, 0x10, 0x23, 0x01, 0x01, 0x20, 0x8F, 0x01, 0x01, 0x20, 0x8F, 0x01, 0xAD, 0x00, 0x10, 0x8F, 0xC1, 0x20, 0x8F, 0x3D, 0x60, 0x8F, 0x44, 0x5B, 0x01, 0x00, 0x10, 0x8F, 0x82, 0x00, 0x00, 0x23, 0x50, 0x5F, 0x42, 0x6C, 0x6B, 0x03, 0xE1, 0x63, 0x9A, 0x03, 0x99, 0x19, 0xC0, 0x0E, 0x74, 0xDA, 0x00, 0xC1, 0x63, 0x00, 0x40, 0x23, 0xFE, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0x00, 0x40, 0x23, 0x03, 0x81, 0x63, 0x00, 0x13, 0xBB, 0x00, 0x32, 0xC7, 0x58, 0xAA, 0x2E, 0x9D, 0x88, 0x66, 0x4F, 0xE8, 0x2E, 0xA9, 0x18, 0x2E, 0x95, 0x48, 0xBE, 0x2E, 0x99, 0x78, 0x62, 0xC7, 0xE3, 0xD3, 0x56, 0x3F, 0x60, 0x0B, 0x52, 0xD3, 0xF0, 0xF7, 0xC2, 0xD3, 0x01, 0xC0, 0x2F, 0x22, 0xDF, 0xD4, 0x33, 0x40, 0x68, 0x03, 0x50, 0x0B, 0x52, 0xEB, 0x7F, 0xF0, 0xC2, 0xEB, 0x01, 0xB0, 0x2F, 0x32, 0xF7, 0x01, 0xB0, 0xBF, 0x33, 0x03, 0x01, 0xC0, 0x2F, 0x00, 0x10, 0xBF, 0xFF, 0x46, 0x73, 0x70, 0x0B, 0x53, 0x1B, 0x40, 0xBF, 0x83, 0x1B, 0x01, 0xB0, 0x2F, 0x63, 0x27, 0x03, 0xC1, 0xC3, 0xFF, 0x33, 0x27, 0x75, 0x97, 0x93, 0x33, 0x00, 0x91, 0xC3, 0x01, 0x00, 0x2F, 0x05, 0xE1, 0xC3, 0x00, 0xF0, 0xBF, 0xF1, 0xC3, 0xFF, 0x01, 0x00, 0x2F, 0x05, 0x01, 0xC3, 0x00, 0x16, 0xB7, 0x00, 0x36, 0x4F, 0x35, 0xCC, 0x33, 0x8B, 0x36, 0x53, 0x33, 0x8F, 0x5F, 0xA0, 0x69, 0xE3, 0xD0, 0x6D, 0xAB, 0xE6, 0xCF, 0x59, 0xC7, 0x26, 0x43, 0x00, 0x40, 0x17, 0xFF, 0x26, 0x37, 0xD6, 0xFF, 0x63, 0x57, 0x26, 0x2B, 0x00, 0x30, 0x17, 0x36, 0x1F, 0x00, 0x30, 0x5F, 0x36, 0x13, 0xFF, 0x00, 0x40, 0x17, 0x00, 0x10, 0x5F, 0x49, 0x6B, 0x35, 0xFB, 0x00, 0x30, 0x17, 0x65, 0xEF, 0x03, 0xC1, 0x03, 0x82, 0xC7, 0xFF, 0xE1, 0x03, 0x82, 0xDF, 0x02, 0xE1, 0x03, 0x73, 0x27, 0xF1, 0x03, 0x80, 0x17, 0x01, 0xE1, 0x03, 0x00, 0xFD, 0xDF, 0x6E, 0x54, 0xEC, 0xDF, 0x02, 0x7E, 0xDF, 0x04, 0x2F, 0xA4, 0x5F, 0x0D, 0xDC, 0xDF, 0x50, 0xAA, 0x2F, 0xCC, 0xB8, 0x2F, 0xD0, 0x20, 0x2F, 0xBC, 0xA0, 0x2F, 0xC0, 0x2C, 0xAA, 0x2C, 0xE3, 0xAC, 0x2C, 0xE7, 0x10, 0x2C, 0xDF, 0x74, 0x2C, 0xDF, 0xD8, 0x5F, 0x07, 0x2D, 0x17, 0x09, 0x2C, 0x31, 0x2C, 0xE3, 0x02, 0x9C, 0xDF, 0x3E, 0xCF, 0x00, 0xFC, 0xDF, 0xD7, 0x9E, 0xF3, 0x00, 0xBC, 0xDF, 0x7C, 0xEC, 0xDF, 0x2C, 0x6D, 0x5B, 0xDD, 0x4F, 0x4C, 0xE3, 0xFF, 0x8C, 0xD3, 0xD0, 0x17, 0x9C, 0xBB, 0x00, 0x30, 0x17, 0x00, 0x9F, 0xD3, 0x3F, 0xFD, 0x01, 0x1C, 0x8B, 0x00, 0x0D, 0xE7, 0xBF, 0xC3, 0xA3, 0xA0, 0x2C, 0x7B, 0x00, 0x5C, 0x7F, 0xD0, 0x23, 0x01, 0x1C, 0x73, 0x03, 0xD0, 0x67, 0x02, 0x7C, 0x5B, 0x6F, 0x70, 0x2B, 0xCB, 0x7C, 0x5B, 0x20, 0x3B, 0xDB, 0x00, 0xED, 0x5B, 0x3E, 0x67, 0x7F, 0xD7, 0xEF, 0x5B, 0xCF, 0x00, 0xFC, 0x4F, 0x00, 0xDC, 0xDB, 0xF0, 0x2D, 0xCB, 0x80, 0x7F, 0x01, 0x2C, 0xDB, 0x30, 0x2F, 0xBF, 0x7F, 0xFB, 0xC8, 0x2F, 0x03, 0x7C, 0xDB, 0x5B, 0xE7, 0xAC, 0xDB, 0x00, 0x4C, 0x4F, 0x03, 0x3D, 0x67, 0xFF, 0x00, 0x1E, 0x67, 0xDD, 0x67, 0x04, 0x1C, 0x67, 0x41, 0xA3, 0x79, 0x93, 0x9D, 0x43, 0xCC, 0x67, 0x00, 0x60, 0x23, 0xFF, 0xCC, 0x67, 0x31, 0xEB, 0x89, 0x7B, 0x28, 0x2F, 0x00, 0x3C, 0x67, 0x00, 0x50, 0x23, 0xDC, 0x67, 0x00, 0x50, 0x8F, 0xFF, 0xDC, 0x67, 0x00, 0x60, 0x23, 0x00, 0x10, 0x8F, 0x79, 0x4B, 0x30, 0x8F, 0x00, 0x2C, 0x67, 0x00, 0x50, 0x23, 0x04, 0x1C, 0x67, 0x3F, 0x70, 0xC2, 0xA9, 0x33, 0x00, 0x81, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0xFF, 0x00, 0x40, 0x23, 0x03, 0x81, 0x63, 0x01, 0x5C, 0x67, 0x01, 0x9F, 0x2F, 0x43, 0xEB, 0x6F, 0x2F, 0x9F, 0x97, 0xDF, 0x2F, 0xFF, 0x00, 0x60, 0x23, 0xCF, 0x2F, 0x34, 0x33, 0x7F, 0x2F, 0x38, 0x2F, 0x00, 0x3F, 0x2F, 0x00, 0x50, 0x23, 0xDF, 0x2F, 0xFF, 0x00, 0x50, 0x8F, 0xDF, 0x2F, 0x00, 0x60, 0x23, 0x00, 0x10, 0x8F, 0x6F, 0x2F, 0x40, 0x8F, 0x00, 0x2F, 0x2F, 0x00, 0x50, 0x23, 0xFF, 0x01, 0x7C, 0x07, 0x01, 0xB1, 0x63, 0x9F, 0x2F, 0x00, 0x91, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0xFF, 0x00, 0x40, 0x23, 0x03, 0x81, 0x63, 0x01, 0x5B, 0xA7, 0x01, 0x95, 0x8F, 0x46, 0x27, 0x6F, 0x23, 0x9F, 0xDF, 0xD5, 0x8F, 0xFF, 0x00, 0x60, 0x23, 0xC5, 0x8F, 0x4F, 0xDF, 0x6F, 0x0B, 0x4F, 0xDF, 0x00, 0x25, 0x8F, 0x00, 0x50, 0x23, 0xD5, 0x8F, 0xFF, 0x00, 0x50, 0x8F, 0xD5, 0x8F, 0x00, 0x60, 0x23, 0x00, 0x10, 0x8F, 0x6E, 0xDB, 0x40, 0x8F, 0x00, 0x25, 0x8F, 0x00, 0x50, 0x23, 0xFF, 0x01, 0x7C, 0x07, 0x01, 0xB1, 0x63, 0x9E, 0xC3, 0x00, 0x91, 0x63, 0x00, 0x40, 0x23, 0x04, 0x61, 0x63, 0x00, 0x30, 0x8F, 0xF1, 0x63, 0xEF, 0x00, 0x40, 0x23, 0x03, 0x61, 0x63, 0x00, 0x7C, 0x5F, 0x4C, 0x2C, 0x5C, 0xBC, 0x5F, 0x3E, 0x51, 0x7C, 0x5F, 0x18, 0x65, 0x00, 0x73, 0xCC, 0x5F, 0x3B, 0x9C, 0x47, 0x5F, 0x43, 0xAF, 0x00, 0x4C, 0x5F, 0xFC, 0x2E, 0xBB, 0x0F, 0x5B, 0x58, 0x4C, 0x5F, 0x3C, 0x82, 0x3B, 0xAB, 0x55, 0xBC, 0x2F, 0xFF, 0xFC, 0x2F, 0xF8, 0x3C, 0x2E, 0xDB, 0x7C, 0x2E, 0xDF, 0x7C, 0xBC, 0x2E, 0xE3, 0x00, 0x3C, 0x47, 0x3E, 0xC7, 0x5E, 0xFB, 0x00, 0x7A, 0x3B, 0x80, 0xBF, 0xBD, 0x9A, 0x3B, 0x60, 0x88, 0xC7, 0x00, 0x3C, 0x2B, 0x00, 0x70, 0x4B, 0x9F, 0x2B, 0xCA, 0x2A, 0xB7, 0xDF, 0x00, 0x9B, 0xCB, 0x01, 0x10, 0x3F, 0xF2, 0xA0, 0x3F, 0x00, 0x1B, 0xA3, 0x01, 0xD0, 0x3F, 0x00, 0x29, 0xEF, 0x01, 0x00, 0xBF, 0x7B, 0x8E, 0x2B, 0x77, 0x70, 0xFF, 0x00, 0x27, 0x67, 0x01, 0x00, 0xFF, 0x24, 0xF0, 0x3F, 0xDF, 0x83, 0xB2, 0x01, 0x01, 0x3F, 0x30, 0x00, 0x8E, 0xBB, 0x5E, 0xBF, 0x59, 0x54, 0x7E, 0xBF, 0xA8, 0xA1, 0x2E, 0xBC, 0x10, 0x2F, 0xFB, 0x6C, 0x79, 0x74, 0x31, 0x3E, 0xD1, 0x90, 0x4A, 0x9E, 0x00, 0xA0, 0x2D, 0xE7, 0x70, 0x43, 0x74, 0x78, 0x36, 0x6C, 0x31, 0x3F, 0xDF, 0x3F, 0xBF, 0x04, 0x2F, 0xFF, 0x2D, 0x55, 0x74, 0x00, 0x65, 0x6E, 0x64, 0x6F, 0x5F, 0x31, 0x32, 0x38, 0x00, 0x78, 0x36, 0x34, 0x2E, 0x62, 0x63, 0x6C, 0x69, 0x57, 0x6D, 0x2F, 0xFF, 0x6D, 0x2E, 0xFB, 0x60, 0x62, 0x23, 0x30, 0x4B, 0x4D, 0x7F, 0x08, 0x4C, 0x6F, 0x67, 0x6F, 0xAE, 0xE9, 0xFF, 0xFF, 0xFF, 0xDF, 0x30, 0x03, 0x00, 0x40, 0x02, 0x15, 0x5F, 0xE0, 0x30, 0x62, 0xAF, 0x72, 0x3E, 0x07, 0x5E, 0x0B, 0x08, 0x70, 0x61, 0x6E, 0x31, 0x3B, 0x4F, 0x01, 0x04, 0xFF, 0x00, 0x00, 0x52, 0x6F, 0x6F, 0x74, 0x50, 0x61, 0x6E, 0x70, 0x65, 0x00, 0xB0, 0xDF, 0x00, 0x50, 0x47, 0x50, 0xD3, 0x70, 0x61, 0x73, 0x31, 0xD3, 0x3B, 0xA3, 0x70, 0x53, 0x03, 0x20, 0x53, 0x4E, 0x5F, 0x30, 0x55, 0x00, 0x0F, 0x96, 0xD0, 0x01, 0x20, 0x53, 0x4C, 0xD3, 0x42, 0x80, 0x53, 0x69, 0x63, 0x31, 0x80, 0x9F, 0x3C, 0x0F, 0x07, 0xFF, 0x00, 0x41, 0x03, 0x7E, 0xE0, 0x2D, 0x5B, 0x82, 0x1F, 0x00, 0x20, 0xEF, 0x9E, 0x2F, 0x63, 0x80, 0x42, 0xF1, 0x2B, 0x71, 0x99, 0xCF, 0x23, 0xC1, 0x27, 0x80, 0x0C, 0x3F, 0x70, 0x61, 0x65, 0x60, 0xDB, 0x50, 0x07, 0x67, 0x72, 0x30, 0x70, 0x31, 0x3C, 0x97, 0x31, 0x33, 0x47, 0x72, 0x6F, 0x75, 0xCE, 0x3C, 0x8F, 0x7F, 0xE7, 0x67, 0x72, 0x51, 0x07, 0x30, 0x23, 0x34, 0x57, 0x47, 0x3F, 0x5F, 0x41, 0xCF, 0xD3, 0x3F, 0xCF, 0xF1, 0x17, 0xF1, 0xD7, 0x30, 0x5F, 0x3F, 0xDF, 0x1F, 0x47, 0x5F, 0x42, 0xCF, 0x6D, 0x3F, 0xE7, 0x00, 0x90, 0x2B, 0xD4, 0x9F, 0x3F, 0xFB, 0x9A, 0xF1, 0x7F, 0x67, 0x72, 0x50, 0xC7, 0x01, 0x32, 0xBF, 0x3C, 0x22, 0xBC, 0x22, 0xB5, 0x00, 0x02, 0xBF, 0xC8, 0x82, 0xBF, 0x3D, 0x7F, 0x07, 0x64, 0xBB, 0x2D, 0x2F, 0xFF, 0x9D, 0x2F, 0x08, 0x00, 0x4F, 0x34, 0xA1, 0x32, 0xF3, 0x2F, 0xFF, 0x78, 0x2F, 0xFB, 0x1D, 0x33, 0x64, 0x73, 0x62, 0xAD, 0x62, 0xD2, 0x80, 0x10, 0x31, 0xF0, 0x10, 0x53, 0x32, 0xF0, 0x21, 0x33, 0x63, 0x05, 0x4C, 0x54, 0x90, 0x3E, 0x30, 0x0B, 0x83, 0x70, 0x39, 0x4C, 0x54, 0x4D, 0x61, 0x73, 0x3C, 0xCC, 0x63, 0x2D, 0x82, 0x33, 0x2B, 0xA8, 0x06, 0x00, 0x00, 0x0B, 0x2F, 0xFC, 0x38, 0xAA, 0x2F, 0xFF, 0x88, 0x2F, 0xFB, 0x08, 0x2F, 0xF4, 0x88, 0x2F, 0xF8, 0x08, 0xAA, 0x2F, 0xD4, 0x88, 0x2F, 0xD8, 0x4C, 0x2F, 0x10, 0xE8, 0x2F, 0x14, 0xAC, 0x9D, 0x23, 0x74, 0x48, 0x05, 0x2F, 0xD7, 0x20, 0x2F, 0x00, 0x35, 0x47, 0xAA, 0x53, 0x57, 0xBB, 0x00, 0x83, 0x53, 0x02, 0x00, 0xA3, 0x53, 0x00, 0x35, 0x57, 0x00, 0xB3, 0xA3, 0xD5, 0x20, 0xB3, 0x00, 0xB3, 0xA3, 0x68, 0x40, 0x24, 0x20, 0x30, 0x03, 0x11, 0x2F, 0xFB, 0x74, 0x06, 0x00, 0x61, 0x04, 0x30, 0x03, 0x30, 0x0B, 0x65, 0x06, 0x00, 0x01, 0x30, 0x03, 0xE9, 0x30, 0x17, 0x31, 0x87, 0x5E, 0x03, 0x05, 0x2F, 0x47, 0x4F, 0x5F, 0x31, 0x32, 0xB0, 0x01, 0xB0, 0x7F, 0x01, 0x03, 0xE0, 0x7F, 0xD2, 0xB5, 0x00, 0x00, 0x8C, 0x8C, 0x77, 0x8C, 0x05, 0xA0, 0x7F, 0x00, 0x16, 0x97, 0x00, 0xF1, 0x7F, 0x03, 0x03, 0xC1, 0x7F, 0x00, 0x16, 0xD7, 0x45, 0xA7, 0xCB, 0x2F, 0xB4, 0x00, 0x25, 0xA7, 0x80, 0x3F, 0x23, 0x44, 0x04, 0x25, 0xA3, 0x30, 0x03, 0x00, 0x06, 0x00, 0x06, 0x06, 0x73, 0x09, 0xED, 0xBE, 0xC3, 0x30, 0x03, 0x3F, 0xFB, 0x3A, 0x57, 0xDE, 0x40, 0x30, 0x03, 0xE0, 0x13, 0x70, 0xC0, 0x30, 0x03, 0x00, 0x75, 0xD3, 0x78, 0x54, 0x10, 0x04, 0x00, 0x01, 0x0A, 0x10, 0x04, 0x10, 0x02, 0xA2, 0x37, 0x46, 0xF2, 0x37, 0x26, 0x0F, 0x06, 0x02, 0x05, 0x66, 0x23, 0x33, 0x00, 0x12, 0x43, 0x4D, 0x5F, 0x00, 0x35, 0xB6, 0x96, 0x00, 0x36, 0x6A, 0x80, 0xEA, 0x23, 0x77, 0x05, 0x26, 0x67, 0x30, 0x03, 0x30, 0x1F, 0x8E, 0xE3, 0xBE, 0x30, 0x03, 0xB0, 0xBF, 0xE0, 0x13, 0xC0, 0xBF, 0x50, 0xA7, 0x78, 0x00, 0x00, 0xC0, 0xA7, 0x00, 0x21, 0x5F, 0xCF, 0x5F, 0x01, 0xB1, 0x5F, 0x2F, 0xA1, 0xBD, 0x61, 0xBF, 0x30, 0x03, 0x3F, 0xF7, 0xCE, 0x95, 0x17, 0x41, 0x30, 0x03, 0xBC, 0xE0, 0x13, 0xC1, 0x30, 0x03, 0x05, 0x21, 0x5F, 0x00, 0x00, 0xC3, 0x01, 0x31, 0x5F, 0x61, 0x0B, 0x3F, 0xB6, 0xBF, 0x30, 0x03, 0xB0, 0xBF, 0xE0, 0x13, 0xC0, 0xBF, 0x02, 0x61, 0x5F, 0xCD, 0xF7, 0xFF, 0x01, 0xB2, 0xBF, 0x3F, 0xF7, 0x50, 0x03, 0x5D, 0xA7, 0x50, 0x03, 0xC0, 0x13, 0x4F, 0xF7, 0x05, 0x22, 0xBF, 0xFF, 0x00, 0x00, 0xC3, 0x01, 0x32, 0xBF, 0x3F, 0xE3, 0x3F, 0xE7, 0xB0, 0xBF, 0xE0, 0x13, 0xC0, 0xBF, 0x01, 0xF2, 0xBF, 0xFF, 0x03, 0x59, 0x73, 0x57, 0x87, 0x00, 0x59, 0x73, 0x00, 0x1C, 0x63, 0x99, 0x1F, 0x40, 0x03, 0x00, 0x79, 0x1F, 0x3F, 0x93, 0xAC, 0xC9, 0x73, 0xA0, 0x4E, 0xC7, 0xF5, 0x00, 0x84, 0xD3, 0x70, 0x53, 0x46, 0x31, 0x74, 0x32, 0x00, 0x63, 0x2F, 0x58, 0x2F, 0xFA, 0x9F, 0x05, 0x4F, 0xF1, 0x00, 0x00, 0x13, 0xCD, 0xCC, 0x4C, 0x28, 0x36, 0x80, 0x3F, 0x50, 0x07, 0x40, 0x0F, 0xFF, 0x4A, 0x9B, 0x50, 0x07, 0x9F, 0xEC, 0xE0, 0x0B, 0x40, 0x03, 0x00, 0x0A, 0x1B, 0x2A, 0xC3, 0x00, 0xA4, 0xB7, 0xBE, 0x60, 0xFB, 0x20, 0x01, 0xC0, 0xA7, 0x27, 0x62, 0x01, 0x00, 0xA7, 0x8A, 0x1B, 0x81, 0x2F, 0x91, 0xC5, 0x00, 0x84, 0xA3, 0x71, 0x83, 0x10, 0xF4, 0xBF, 0x01, 0xC1, 0x2F, 0x07, 0x04, 0xD1, 0x2F, 0xDF, 0x00, 0x80, 0xA7, 0x01, 0xF1, 0x2F, 0x08, 0x02, 0x41, 0x2F, 0x00, 0x5D, 0x8B, 0xE1, 0xB7, 0xEB, 0xD7, 0x00, 0xD2, 0x5F, 0x77, 0x09, 0x04, 0xD2, 0x5F, 0x00, 0xB0, 0xA7, 0x01, 0xC3, 0x07, 0x0A, 0x01, 0xE2, 0x5F, 0x92, 0xE7, 0x00, 0x1F, 0xFB, 0xAD, 0xDD, 0x07, 0xA0, 0x00, 0x68, 0x1F, 0x10, 0x43, 0xE3, 0x00, 0x5D, 0x03, 0x50, 0x43, 0x83, 0x1F, 0x00, 0x00, 0x44, 0x6D, 0x03, 0x30, 0x0F, 0x3E, 0x2B, 0x30, 0x0F, 0x2D, 0x03, 0x9B, 0x6D, 0x83, 0x03, 0x05, 0x6D, 0x83, 0x00, 0x4D, 0xD6, 0xF8, 0x3F, 0x1F, 0x00, 0xA0, 0x7F, 0x5E, 0x80, 0x00, 0x40, 0x7F, 0x01, 0x01, 0x4D, 0x83, 0x00, 0x3E, 0x0B, 0x00, 0x1A, 0xEB, 0x01, 0x94, 0xEB, 0x80, 0x7B, 0x41, 0xFF, 0x37, 0x5F, 0xE9, 0x00, 0xEE, 0x0B, 0x7E, 0x8B, 0x01, 0x50, 0x7F, 0xFA, 0xEB, 0xBD, 0x02, 0xB0, 0x7F, 0x03, 0x8E, 0x8B, 0x9E, 0x7B, 0xFE, 0x9B, 0x00, 0x02, 0x0F, 0x03, 0x3F, 0x13, 0xFD, 0x00, 0x1A, 0xF3, 0x01, 0x51, 0x8F, 0x3F, 0x13, 0x00, 0x12, 0x0F, 0x2A, 0x3A, 0x04, 0x8F, 0x13, 0xDC, 0x00, 0x2F, 0x13, 0x7F, 0x0C, 0x4F, 0x13, 0xD6, 0xB7, 0xFD, 0x97, 0xFD, 0x57, 0xFC, 0xE7, 0xFC, 0x77, 0xFC, 0x07, 0xFE, 0xFB, 0x97, 0xFA, 0xE3, 0xFA, 0x57, 0xF9, 0xA3, 0xF9, 0x17, 0xF8, 0x63, 0x3F, 0xEF, 0xCC, 0xEB, 0x00, 0x2F, 0xB3, 0x3E, 0x8F, 0x0A, 0x30, 0xCB, 0x2C, 0x41, 0xA7, 0x43, 0xCF, 0x1B, 0x37, 0x0D, 0x98, 0xF8, 0x5F, 0x67, 0x72, 0x56, 0xFF, 0x04, 0x40, 0x02, 0x60, 0x00, 0x5A, 0x3C, 0xF8, 0xFA, 0x34, 0x9F, 0x2C, 0x5F, 0x4F, 0x27, 0x00, 0x0C, 0x91, 0x82, 0xA0, 0x00, 0xFC, 0xFF, 0x5F, 0x00, 0xFE, 0x00, 0xFF, 0x5A, 0xC0, 0x48, 0xBE, 0xED, 0x75, 0xDF, 0x00, 0x28, 0xF9, 0x20, 0xFF, 0x4C, 0xFE, 0x3F, 0xDD, 0x1A, 0xEF, 0x68, 0x74, 0x08, 0x40, 0x04, 0x20, 0x50, 0x84, 0x3F, 0xFF, 0xF6, 0x40, 0xFF, 0x26, 0x2F, 0xFF, 0x63, 0x03, 0x00, 0x00, 0xC0, 0xF4, 0x00, 0x10, 0xFD, 0xFF, 0xE8, 0x80, 0x2F, 0xB8, 0xF5, 0xF0, 0xFF, 0xFF, 0x20, 0x50, 0xFF, 0x12, 0xFF, 0x30, 0x20, 0x58, 0x09, 0x9F, 0x6F, 0x9F, 0xD9, 0x4F, 0x04, 0x4F, 0x00, 0x00, 0x6F, 0xAF, 0xBF, 0xE9, 0xF2, 0x60, 0x86, 0x5F, 0xEF, 0x0E, 0x8F, 0xFF, 0xF9, 0x51, 0x37, 0x3F, 0xFF, 0xF5, 0x0C, 0xF2, 0xFF, 0xFF, 0xF2, 0x20, 0x03, 0x4F, 0xE3, 0x26, 0x00, 0x64, 0x22, 0x4F, 0xEB, 0x29, 0x82, 0xFF, 0x58, 0x28, 0xE3, 0x06, 0xFF, 0x06, 0xFF, 0x2F, 0x2F, 0x00, 0x00, 0x30, 0x03, 0x4F, 0xFF, 0x22, 0xA0, 0xA0, 0x1F, 0xC1, 0x50, 0x77, 0x0A, 0x0A, 0x00, 0x30, 0x0A, 0x14, 0x0A, 0xD0, 0xF3, 0x6F, 0xE6, 0x64, 0x4F, 0xEE, 0x46, 0x00, 0x20, 0x00, 0xE3, 0x24, 0x2A, 0x8F, 0x9F, 0x00, 0x66, 0xFF, 0x06, 0xF4, 0x2D, 0xDF, 0xC0, 0xC6, 0x90, 0x6F, 0xBF, 0xFB, 0x04, 0xC7, 0x01, 0x52, 0x1C, 0x20, 0xB7, 0x20, 0x00, 0xF0, 0x20, 0xEB, 0x30, 0x03, 0x2F, 0xB1, 0x60, 0xF8, 0x30, 0xCB, 0x20, 0xB6, 0xFF, 0x66, 0x00, 0x66, 0x00, 0x70, 0x02, 0x20, 0xE3, 0x20, 0x6E, 0x2F, 0xC7, 0x00, 0x04, 0xFF, 0xFF, 0x20, 0x0D, 0x8F, 0x7F, 0xDC, 0xF7, 0x30, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x30, 0x00, 0x19, 0xFF, 0x00, 0xAA, 0xE6, 0xC1, 0x61, 0xE7, 0x2E, 0xF9, 0xC0, 0xF5, 0xF9, 0xFF, 0xDF, 0x20, 0xD5, 0x00, 0x07, 0x10, 0xFC, 0xFC, 0xAF, 0xDF, 0xFF, 0x02, 0x21, 0x9F, 0x6F, 0x3A, 0x6E, 0x35, 0x00, 0xD7, 0x02, 0x30, 0x41, 0x18, 0x00, 0xFF, 0xFD, 0x40, 0xEF, 0x21, 0x3B, 0x00, 0x00, 0xF9, 0x00, 0xF2, 0x01, 0x0B, 0x20, 0x00, 0xCF, 0xFF, 0x21, 0x02, 0xFF, 0xA8, 0x00, 0x5A, 0x00, 0x20, 0x21, 0x63, 0x20, 0x80, 0x2F, 0xA5, 0x0B, 0x0A, 0xF6, 0xF6, 0x0A, 0x0C, 0xF6, 0x00, 0xF2, 0xF7, 0x8E, 0xFF, 0xFF, 0x21, 0x00, 0x69, 0x02, 0x00, 0x8F, 0xFF, 0xA2, 0x06, 0x12, 0x3F, 0xC3, 0x4F, 0x01, 0xFF, 0x00, 0xDF, 0xFF, 0x00, 0x1C, 0xFF, 0x3F, 0xCD, 0x00, 0x00, 0x00, 0xC3, 0xFF, 0xFC, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0xA9, 0x00, 0xFB, 0xFF, 0xFF, 0x4F, 0x6A, 0xAB, 0x2F, 0x74, 0x0A, 0x3F, 0x7A, 0x09, 0x9F, 0xF9, 0x03, 0x04, 0x82, 0x70, 0xEF, 0xFE, 0x81, 0x7F, 0x9C, 0xF6, 0xFF, 0xFF, 0x10, 0x00, 0xC6, 0x3F, 0xA4, 0x1C, 0x6F, 0xFF, 0x00, 0xA0, 0x88, 0x05, 0x00, 0x8F, 0x01, 0x5C, 0xC1, 0x43, 0x4C, 0x04, 0x49, 0x4D, 0xFF, 0xFE, 0x14, 0x32, 0x7C, 0x02, 0x28, 0xC1, 0x29, 0xF7, 0x3B, 0x5D, 0x69, 0x6D, 0x61, 0x67, 0x10, 0x4B, 0xE4, 0x18, 0x20, 0x00, 0x0D, 0x42, 0x30, 0x07, 0x03, 0x8B, 0xA0, 0x00, 0x71, 0x05, 0x00, 0x88, 0xFE, 0xFF, 0xFF, 0x25, 0xCE, 0xC0, 0x2E, 0xCB, 0x01, 0xC0, 0xC0, 0xAF, 0x9F, 0x00, 0x00, 0x9F, 0x20, 0x03, 0x03, 0x00, 0x88, 0x00, 0x88, 0xFF, 0xCC, 0x20, 0x17, 0x70, 0x07, 0x81, 0xFF, 0xC0, 0x78, 0x00, 0x02, 0xFF, 0xFC, 0x3E, 0x4F, 0x9B, 0x87, 0x3F, 0xEE, 0x90, 0x90, 0xDF, 0xDF, 0x30, 0x03, 0x01, 0xA1, 0xD7, 0x40, 0x6F, 0xC8, 0x30, 0x6B, 0x40, 0x6F, 0x00, 0xB0, 0x43, 0xCF, 0xDF, 0xFF, 0x55, 0x0A, 0xFF, 0xD7, 0x00, 0xEE, 0x00, 0x0E, 0xCE, 0x55, 0x20, 0x17, 0xEE, 0xE8, 0x20, 0x17, 0x70, 0x07, 0x40, 0x6F, 0x80, 0x90, 0x6F, 0xC5, 0xFF, 0xCF, 0x1E, 0x7F, 0xDE, 0x00, 0x95, 0x9D, 0xC1, 0x7F, 0x2F, 0x63, 0xB1, 0x7F, 0x20, 0x3A, 0x00, 0x10, 0x51, 0x7F, 0xB9, 0x8A, 0x06, 0xC5, 0x30, 0x50, 0xA8, 0x42, 0x70, 0xC2, 0x28, 0x4E, 0x2E, 0x06, 0x10, 0x00, 0x43, 0xFD, 0x3A, 0xAF, 0x76, 0x24, 0x00, 0x98, 0x6F, 0xC8, 0xCE, 0x47, 0x2D, 0xA3, 0xFF, 0x7A, 0x22, 0xFF, 0x45, 0x4F, 0xFE, 0xAA, 0x00, 0xBB, 0x4A, 0xCF, 0xBB, 0x8A, 0x50, 0x07, 0xFF, 0x23, 0xEF, 0x3F, 0x96, 0x00, 0x23, 0xDE, 0x53, 0x8A, 0x4F, 0xFF, 0x9A, 0x00, 0x68, 0x4A, 0xEF, 0x24, 0x35, 0x23, 0xAD, 0x14, 0xFF, 0xFF, 0xC8, 0x3A, 0xFB, 0xB3, 0x33, 0x2F, 0xFF, 0xFF, 0x87, 0x66, 0x67, 0x27, 0xFF, 0x00, 0x4B, 0x83, 0x4F, 0x7B, 0xA7, 0x21, 0xD1, 0xE0, 0x2E, 0x0D, 0x37, 0xCA, 0x08, 0x46, 0x42, 0x21, 0xF6, 0x22, 0xFF, 0xF7, 0x44, 0xF7, 0x00, 0x15, 0x7F, 0x22, 0xFF, 0x32, 0x4F, 0x7A, 0x43, 0xFF, 0x60, 0x97, 0x6B, 0xE7, 0x36, 0x6A, 0x10, 0xE7, 0xF2, 0xF4, 0xFF, 0xF8, 0x34, 0xBA, 0x40, 0x03, 0x9F, 0x9B, 0x25, 0x32, 0x8F, 0xA8, 0x0C, 0x09, 0xFF, 0x40, 0x4F, 0x25, 0x2D, 0xAD, 0xBF, 0x04, 0x28, 0xFF, 0x00, 0x62, 0x6C, 0x06, 0xF4, 0x37, 0xFF, 0xCF, 0xD6, 0x00, 0xDD, 0x00, 0x4C, 0xFC, 0xDD, 0x35, 0x00, 0xEE, 0x34, 0x4A, 0x31, 0xEF, 0x54, 0x00, 0x45, 0x1F, 0xB8, 0x38, 0x0B, 0x48, 0x51, 0x41, 0xEF, 0xFD, 0xA0, 0x97, 0x1F, 0x10, 0x00, 0xFE, 0x18, 0xFC, 0x10, 0xA0, 0x23, 0xF1, 0x6F, 0xFF, 0x2C, 0xEF, 0x00, 0x05, 0x03, 0xFF, 0xFF, 0x1E, 0x8F, 0xA1, 0x1B, 0xEF, 0x21, 0x1F, 0xCE, 0xC7, 0x69, 0x04, 0xD8, 0x4B, 0xA1, 0xF2, 0x27, 0xCB, 0x20, 0x03, 0x7F, 0xD5, 0xE1, 0x84, 0x40, 0xD7, 0x37, 0xFF, 0x01, 0xBE, 0x4D, 0xAF, 0x58, 0x00, 0x44, 0x23, 0x4F, 0x7B, 0x64, 0xFF, 0xA7, 0x47, 0xEF, 0xDC, 0xFF, 0x59, 0xED, 0x79, 0xA0, 0xDE, 0x24, 0xA0, 0x37, 0x04, 0xCC, 0xFF, 0x50, 0xCF, 0x10, 0x21, 0x00, 0x32, 0x42, 0xDF, 0x33, 0x00, 0x33, 0x00, 0x13, 0x00, 0x73, 0x30, 0x26, 0xAA, 0xFF, 0xFF, 0x40, 0x04, 0x63, 0x3F, 0x9C, 0x46, 0xD7, 0x7A, 0xEF, 0x35, 0x94, 0x72, 0xEF, 0x26, 0xF5, 0x2F, 0x05, 0x5C, 0x4D, 0x2F, 0xCA, 0x6B, 0x03, 0xE4, 0x0C, 0x09, 0x55, 0xFF, 0x08, 0xC0, 0x7F, 0x91, 0x00, 0x01, 0x00, 0xF3, 0xF3, 0x00, 0x99, 0x00, 0x99, 0x5F, 0xB7, 0xFC, 0x20, 0x0B, 0x20, 0x0F, 0x8F, 0xC7, 0x70, 0x17, 0x60, 0x1F, 0x8F, 0xE7, 0x56, 0xFF, 0x34, 0x55, 0x01, 0x3A, 0xFD, 0x90, 0x1F, 0x78, 0x4F, 0xFF, 0x55, 0xFF, 0x46, 0x65, 0x4A, 0x2F, 0x97, 0xFF, 0xFC, 0x35, 0x5C, 0x29, 0x23, 0x02, 0xC6, 0x34, 0x07, 0x3F, 0xFF, 0x8B, 0xFF, 0x03, 0x44, 0x10, 0x28, 0x4D, 0xD4, 0xD0, 0x80, 0x5F, 0x3F, 0xF0, 0x17, 0x9F, 0xF5, 0xEF, 0xFF, 0x07, 0xCF, 0xD1, 0x45, 0x6F, 0x2B, 0x59, 0x3E, 0xFB, 0x5F, 0x30, 0x20, 0xFB, 0x5F, 0x87, 0x12, 0xF3, 0xF9, 0xF8, 0x90, 0x3F, 0x31, 0xB7, 0x22, 0x97, 0x00, 0x60, 0x75, 0x85, 0xBF, 0x2F, 0xFF, 0xAF, 0x0D, 0xFF, 0x9E, 0xFF, 0x45, 0x45, 0x4F, 0x79, 0xA9, 0x00, 0x9A, 0x45, 0xBF, 0x89, 0x55, 0xA7, 0x10, 0xFF, 0x22, 0xFF, 0x3E, 0x9F, 0x00, 0xFF, 0x75, 0xFF, 0x52, 0xDA, 0x4F, 0xE3, 0x23, 0x3A, 0xDB, 0x5E, 0x7F, 0x95, 0x9F, 0x7F, 0x3E, 0x8F, 0x52, 0x23, 0x0C, 0x0D, 0x92, 0x31, 0xE1, 0xEF, 0xE1, 0xFF, 0x7F, 0xC7, 0x02, 0xF8, 0x2C, 0xE9, 0x30, 0x03, 0xF0, 0x0F, 0x01, 0x1D, 0xA6, 0x45, 0x3E, 0x00, 0xFB, 0xB0, 0xB7, 0x3A, 0x47, 0xFE, 0x2B, 0x83, 0x8C, 0x57, 0xD0, 0x28, 0x8B, 0x25, 0x31, 0x77, 0x11, 0x60, 0x0D, 0xA5, 0x1B, 0x96, 0x44, 0x00, 0x00, 0xFC, 0xFB, 0x01, 0x30, 0x07, 0xF8, 0x3B, 0xB6, 0x56, 0x45, 0x0E, 0x50, 0x00, 0x2F, 0x51, 0x3F, 0x2C, 0x8F, 0xE5, 0x2C, 0xC3, 0x00, 0xFA, 0x30, 0x2B, 0xBB, 0x43, 0x6F, 0x76, 0x87, 0x18, 0xEF, 0x00, 0x38, 0x77, 0x77, 0xC2, 0x5F, 0x85, 0xAE, 0x4B, 0x6B, 0xFF, 0x01, 0xAF, 0x47, 0xCF, 0x15, 0x32, 0x6B, 0xDC, 0x26, 0x89, 0x00, 0x3E, 0x67, 0x3A, 0x0D, 0xB4, 0x2F, 0x04, 0xF1, 0xFF, 0x7F, 0xEB, 0xA0, 0xB0, 0xA1, 0x26, 0x73, 0xF4, 0x79, 0x7C, 0x00, 0x60, 0xFB, 0xFF, 0x28, 0x32, 0xC0, 0x00, 0xB0, 0x01, 0x24, 0x07, 0x4F, 0x08, 0x2F, 0x1F, 0x00, 0x00, 0x72, 0x0D, 0x3D, 0x04, 0x7D, 0xFB, 0xFE, 0xE5, 0x00, 0xD8, 0x5C, 0xA7, 0xA5, 0xB7, 0x3F, 0x93, 0x61, 0x00, 0x1C, 0xBF, 0x38, 0x93, 0x40, 0x96, 0x9E, 0x2A, 0x03, 0x4F, 0xF4, 0x4B, 0xFE, 0x28, 0xAF, 0xD0, 0xE1, 0x3E, 0xFF, 0x1A, 0x27, 0x87, 0x3E, 0x05, 0x18, 0x00, 0x00, 0x3F, 0x2B, 0x55, 0x98, 0xBE, 0x04, 0x07, 0xFF, 0x17, 0xFF, 0x08, 0x06, 0x0E, 0x53, 0xFF, 0x20, 0x4A, 0xBF, 0x3F, 0xB6, 0xB3, 0xFF, 0x1C, 0xDE, 0xFF, 0xDD, 0x55, 0x42, 0x60, 0x17, 0x7F, 0xD6, 0xDD, 0xFF, 0x03, 0xED, 0xFF, 0x00, 0x31, 0x00, 0x95, 0x7A, 0xDB, 0x60, 0x37, 0x24, 0xEE, 0x12, 0x2E, 0xBF, 0x50, 0xFD, 0xDA, 0x11, 0xFF, 0xBD, 0x24, 0xFF, 0x69, 0x45, 0xE7, 0x14, 0x6B, 0x9B, 0x0F, 0x8E, 0x5E, 0x34, 0x01, 0x9F, 0x6F, 0xD3, 0x00, 0x1C, 0x2A, 0x35, 0x2F, 0x8F, 0xFC, 0xFC, 0x09, 0x00, 0xAD, 0x00, 0x47, 0x5A, 0x6F, 0xFD, 0x74, 0x4E, 0x97, 0x1E, 0xB9, 0xFF, 0xDC, 0x4F, 0xFF, 0x2F, 0x44, 0x2B, 0xB2, 0x4F, 0x3C, 0xBB, 0x6A, 0xFF, 0x2B, 0xAA, 0x2D, 0x64, 0x10, 0x60, 0xB7, 0x32, 0x35, 0xDC, 0x10, 0x15, 0x00, 0xB4, 0xEC, 0x2F, 0xF3, 0xF9, 0x7B, 0x78, 0xEF, 0x68, 0x9F, 0x10, 0x8B, 0xFF, 0x25, 0xAB, 0x8F, 0x6D, 0xFF, 0x8F, 0x02, 0xBD, 0x4E, 0xDD, 0x6C, 0x01, 0xEC, 0xAC, 0xCE, 0x7F, 0x2D, 0x16, 0xBE, 0x7F, 0x80, 0x7E, 0x7F, 0xC0, 0x9D, 0x2E, 0x04, 0x0F, 0xBD, 0xFF, 0xEF, 0xEF, 0x8A, 0xAF, 0x8E, 0x00, 0x47, 0x24, 0xDD, 0x78, 0xDD, 0x77, 0x33, 0x11, 0x01, 0x33, 0x11, 0x8D, 0x7D, 0x13, 0x13, 0x7D, 0x20, 0x03, 0xBF, 0x8A, 0xBF, 0x77, 0x50, 0x17, 0x70, 0x07, 0xFF, 0xFF, 0x30, 0x2B, 0xB0, 0x2F, 0xF0, 0x0F, 0xB7, 0x01, 0xBF, 0x7F, 0xA8, 0x6D, 0xEA, 0x7F, 0x7F, 0x10, 0x6D, 0xFF, 0x27, 0xB0, 0x04, 0xA1, 0x00, 0xA0, 0x0D, 0xB0, 0x01, 0x02, 0x60, 0xED, 0x61, 0xFF, 0x2C, 0xFF, 0xBE, 0x35, 0xFF, 0xF0, 0x3E, 0xB7, 0x00, 0xC0, 0xFF, 0x19, 0x00, 0x21, 0x1D, 0x01, 0x28, 0xFA, 0x18, 0xCC, 0xFF, 0x3A, 0x3B, 0x92, 0x40, 0x3F, 0x17, 0xFF, 0x6B, 0x8D, 0x27, 0x4C, 0x84, 0xFF, 0xE9, 0xBD, 0xB9, 0x3C, 0xB8, 0xFD, 0x23, 0x34, 0xE2, 0x30, 0x62, 0x4C, 0xDA, 0x40, 0x13, 0xF7, 0xFF, 0xF1, 0x20, 0x03, 0xEF, 0x08, 0xFF, 0xE8, 0xFF, 0xE0, 0x20, 0x03, 0xE1, 0xFF, 0xD9, 0x38, 0xFF, 0xD3, 0x50, 0x95, 0x2E, 0xE1, 0x21, 0x87, 0x57, 0xFF, 0x86, 0x34, 0xFF, 0xD1, 0x93, 0x69, 0x30, 0x41, 0xFA, 0x31, 0x9F, 0xAC, 0xFF, 0x44, 0xC7, 0x41, 0xA5, 0xD9, 0xFF, 0xE4, 0x50, 0x5B, 0xF6, 0xFF, 0x41, 0xF2, 0x20, 0x5D, 0xFB, 0xFF, 0xEE, 0xFF, 0xEA, 0x2F, 0x23, 0x54, 0xF5, 0x20, 0x05, 0xE4, 0x23, 0x97, 0xEA, 0x2E, 0x2E, 0xDA, 0xFF, 0x10, 0xDB, 0xFF, 0xD5, 0x2C, 0x6E, 0xC6, 0xFF, 0xD0, 0xFF, 0x05, 0xCB, 0xFF, 0xC1, 0xFF, 0xBC, 0x27, 0xE7, 0xE1, 0x20, 0x11, 0x41, 0xD2, 0x24, 0x7A, 0xDA, 0xFF, 0xCD, 0xFF, 0xCA, 0x20, 0x19, 0x04, 0xC1, 0xFF, 0xB7, 0xFF, 0xB3, 0x20, 0xFE, 0xBA, 0xFF, 0x14, 0xAF, 0xFF, 0xAB, 0x05, 0xD1, 0xFF, 0x5F, 0x62, 0x6D, 0x03, 0xFF, 0x51, 0x29, 0x20, 0xC2, 0xC2, 0xE1, 0x7F, 0x05, 0xFF, 0x9F, 0x22, 0x8D, 0x5B, 0x07, 0x21, 0x61, 0xA7, 0x20, 0x9A, 0x5F, 0xE9, 0x8A, 0xD9, 0x48, 0x38, 0x99, 0x50, 0xFE, 0x41, 0x01, 0xF7, 0x25, 0x34, 0xEA, 0xFF, 0xE0, 0x8D, 0xA2, 0xD1, 0x73, 0xF6, 0x80, 0x27, 0xF7, 0xFF, 0xEB, 0x25, 0x56, 0xE0, 0xA8, 0x21, 0x1D, 0xE9, 0x21, 0x25, 0xDE, 0x2F, 0x4A, 0xD4, 0xFF, 0xD3, 0x28, 0xFF, 0xC9, 0x2F, 0x52, 0xD3, 0x2B, 0x3D, 0xC9, 0xFF, 0xC8, 0xA8, 0x25, 0x49, 0xBD, 0x21, 0x07, 0xFC, 0x27, 0x46, 0xF0, 0xFF, 0xE6, 0xA2, 0x20, 0x2D, 0xE2, 0x25, 0x9E, 0xD5, 0xFF, 0xE3, 0x21, 0x95, 0xD6, 0xAA, 0x2D, 0xB0, 0xD0, 0x20, 0x21, 0xC3, 0x25, 0x10, 0xDA, 0x21, 0x3B, 0xCD, 0x28, 0xFF, 0xC5, 0x21, 0x4D, 0xC4, 0x25, 0x7B, 0xB6, 0xFF, 0xBF, 0x80, 0x21, 0x3D, 0xB2, 0xFF, 0xAB, 0xFF, 0xB0, 0xFF, 0xA9, 0x0A, 0xFF, 0xA3, 0xFF, 0x9C, 0x21, 0x51, 0xC0, 0x22, 0x4A, 0xB5, 0xA8, 0x21, 0x53, 0xAE, 0x21, 0xA8, 0xA2, 0x21, 0x59, 0xAA, 0xFF, 0xA8, 0xA0, 0x20, 0xC8, 0xA0, 0x2F, 0xE0, 0x95, 0xFF, 0x8C, 0xFF, 0xA6, 0x80, 0x2B, 0x49, 0x9A, 0xFF, 0x92, 0xFF, 0x96, 0xFF, 0x8F, 0xA8, 0x25, 0x33, 0x84, 0x20, 0x05, 0x87, 0x22, 0x2C, 0x7C, 0xFF, 0x7F, 0x2A, 0xFF, 0x79, 0x2B, 0x43, 0x6E, 0x22, 0x86, 0xB8, 0x20, 0x4B, 0xAA, 0x8C, 0x20, 0x53, 0xAD, 0xFF, 0xA4, 0x21, 0x00, 0x30, 0x53, 0x96, 0xFF, 0x54, 0x90, 0x2B, 0xFF, 0x92, 0x20, 0xFC, 0x85, 0x20, 0x4B, 0xA4, 0xFF, 0x41, 0x9B, 0x20, 0x3D, 0xA0, 0xFF, 0x9D, 0xFF, 0x93, 0x20, 0x17, 0x04, 0x8D, 0xFF, 0x89, 0xFF, 0x80, 0x20, 0x3F, 0x86, 0xFF, 0x50, 0x83, 0x20, 0x41, 0x76, 0x20, 0x0D, 0x83, 0xFF, 0x7D, 0xFF, 0x14, 0x77, 0xFF, 0x7E, 0x20, 0x4F, 0x72, 0x25, 0x87, 0x72, 0xFF, 0x04, 0x6C, 0xFF, 0x67, 0xFF, 0x62, 0x40, 0x03, 0x5C, 0xFF, 0x00, 0x58, 0xFF, 0x74, 0xFF, 0x70, 0xFF, 0x69, 0xFF, 0x50, 0x65, 0x25, 0xA1, 0x6A, 0x20, 0x15, 0x5F, 0xFF, 0x5E, 0xFF, 0x04, 0x5A, 0xFF, 0x53, 0xFF, 0x50, 0x22, 0x6C, 0x54, 0xFF, 0x14, 0x4D, 0xFF, 0x4A, 0x00, 0xD3, 0xFF, 0x16, 0x24, 0x1D, 0x6B, 0xFF, 0x6A, 0x15, 0x22, 0x66, 0x72, 0xD7, 0x85, 0x2F, 0xA8, 0xED, 0x5F, 0x95, 0xF9, 0xAA, 0x2E, 0xCE, 0xF0, 0x94, 0x3F, 0x75, 0x21, 0xBF, 0xD5, 0x84, 0x4D, 0x3D, 0xD5, 0x2F, 0xD0, 0xAF, 0xAC, 0xFD, 0x22, 0xFB, 0xE8, 0x26, 0x3B, 0xE0, 0x2F, 0xE7, 0x55, 0xF8, 0x2F, 0x06, 0xF1, 0x23, 0x03, 0xD9, 0x23, 0x01, 0xD3, 0x21, 0x7F, 0x55, 0xF0, 0x28, 0xC8, 0xE6, 0x21, 0x77, 0xD6, 0x23, 0x0F, 0xCC, 0x22, 0xD1, 0x55, 0xDD, 0x21, 0x89, 0xD5, 0x22, 0xBF, 0xC3, 0x22, 0xF6, 0xBB, 0x22, 0xB1, 0x55, 0xBF, 0x21, 0x61, 0xB5, 0x22, 0xB1, 0xA8, 0x21, 0x59, 0x9F, 0x22, 0xBB, 0x55, 0xAB, 0x21, 0x69, 0xA2, 0x21, 0x5F, 0x95, 0x2D, 0x23, 0x8C, 0x42, 0xD5, 0x5A, 0xD2, 0x21, 0x9F, 0xBF, 0x21, 0x95, 0x30, 0x1B, 0xCB, 0x27, 0x21, 0xC4, 0xAA, 0x21, 0xA7, 0xB0, 0x21, 0x9D, 0xA9, 0x21, 0x9F, 0xA6, 0x21, 0x7D, 0x9E, 0xAB, 0x21, 0x7F, 0x8F, 0x23, 0xA2, 0x87, 0x21, 0x77, 0x96, 0x26, 0xB9, 0x30, 0x0B, 0x51, 0x7F, 0x21, 0x19, 0x78, 0x21, 0x7F, 0x9E, 0xFF, 0x94, 0x20, 0x01, 0x45, 0x8A, 0x26, 0xCF, 0x82, 0xFF, 0x81, 0x20, 0x11, 0x8B, 0x20, 0x05, 0x62, 0x82, 0x20, 0x19, 0x30, 0x1B, 0x6E, 0xFF, 0x66, 0x21, 0xA5, 0x71, 0xA2, 0x21, 0x41, 0x68, 0x21, 0x3D, 0x63, 0xFF, 0x60, 0x21, 0x3B, 0x66, 0xA0, 0x21, 0x41, 0x5E, 0x2D, 0xBD, 0x57, 0xFF, 0x51, 0xFF, 0x4F, 0x2A, 0xFF, 0x48, 0x21, 0xC5, 0x70, 0x20, 0x21, 0x68, 0x80, 0x17, 0x6A, 0xAA, 0x20, 0x25, 0x63, 0x21, 0x63, 0x57, 0x20, 0x1D, 0x50, 0x20, 0x1F, 0x55, 0x20, 0xFF, 0x4E, 0x20, 0x01, 0x46, 0xFF, 0x47, 0xFF, 0x40, 0x0A, 0xFF, 0x3F, 0xFF, 0x39, 0x20, 0x07, 0x3F, 0x20, 0x09, 0x39, 0xA2, 0x20, 0x09, 0x32, 0x20, 0x01, 0x2C, 0xFF, 0x5D, 0x23, 0xF6, 0x53, 0xC0, 0x20, 0x23, 0x30, 0x03, 0x49, 0xFF, 0x44, 0xFF, 0x4B, 0xFF, 0x10, 0x45, 0xFF, 0x42, 0x21, 0x3E, 0x40, 0xFF, 0x3C, 0xFF, 0x05, 0x38, 0xFF, 0x34, 0xFF, 0x4A, 0x20, 0x39, 0x41, 0x21, 0x4E, 0x50, 0x43, 0x20, 0x05, 0x3B, 0x20, 0x11, 0x38, 0xFF, 0x35, 0xFF, 0x00, 0x31, 0xFF, 0x2E, 0xFF, 0x33, 0xFF, 0x30, 0xFF, 0x55, 0x2B, 0x23, 0x46, 0x3B, 0x20, 0x0F, 0x33, 0x20, 0x0F, 0x30, 0x24, 0xD2, 0x05, 0x2A, 0xFF, 0x26, 0xFF, 0x2D, 0x2B, 0x94, 0x27, 0x2D, 0xA5, 0x01, 0x23, 0xFF, 0x20, 0xFF, 0x1E, 0xFF, 0x1B, 0x23, 0x68, 0x50, 0x26, 0x40, 0x0B, 0x24, 0x2D, 0xB9, 0x1E, 0xFF, 0x1C, 0xFF, 0x05, 0x1D, 0xFF, 0x1A, 0xFF, 0x18, 0x21, 0xD2, 0x18, 0x24, 0xB8, 0x15, 0x13, 0xFF, 0x12, 0x33, 0x8B, 0x00, 0x20, 0x36, 0xD2, 0x6B, 0xF6, 0xB5, 0x34, 0x85, 0x00, 0x24, 0x87, 0x64, 0xB3, 0xFA, 0x2C, 0x0B, 0xEA, 0x24, 0x61, 0x55, 0xE4, 0x24, 0x57, 0xCC, 0x24, 0x59, 0xC6, 0x27, 0xFF, 0xDF, 0x24, 0x75, 0x52, 0xDA, 0x24, 0x5F, 0xC1, 0x24, 0x4D, 0xBC, 0x00, 0x22, 0xB6, 0x00, 0xC5, 0x23, 0x56, 0x43, 0x7B, 0xFE, 0xFF, 0xF2, 0x34, 0xA5, 0x00, 0x23, 0x4E, 0xAA, 0x24, 0xFD, 0xED, 0x2A, 0x35, 0xEA, 0x2C, 0x67, 0xD5, 0x24, 0xE9, 0xD2, 0xAA, 0x24, 0x91, 0xB7, 0x24, 0x8F, 0xB2, 0x29, 0x02, 0xCD, 0x24, 0xA5, 0xCA, 0xAA, 0x25, 0x7E, 0xAF, 0x24, 0x81, 0xAB, 0x25, 0x86, 0xB0, 0x23, 0x01, 0xAA, 0xAA, 0x23, 0x4B, 0x96, 0x23, 0x4D, 0x90, 0x23, 0x5B, 0xA4, 0x23, 0x09, 0x9F, 0xAA, 0x2E, 0xFF, 0x8A, 0x23, 0x35, 0x85, 0x22, 0xED, 0x7D, 0x22, 0xE9, 0x77, 0xAA, 0x22, 0xDB, 0x67, 0x22, 0xD9, 0x62, 0x22, 0xE7, 0x72, 0x23, 0x39, 0x6D, 0xAA, 0x22, 0xE3, 0x5C, 0x22, 0xE5, 0x57, 0x23, 0x6B, 0x9A, 0x23, 0x37, 0x96, 0xAA, 0x23, 0x17, 0x80, 0x23, 0x19, 0x7C, 0x23, 0x77, 0x93, 0x23, 0x29, 0x90, 0xAA, 0x25, 0x4A, 0x79, 0x23, 0x21, 0x76, 0x22, 0xFF, 0x6A, 0x23, 0x01, 0x65, 0xAA, 0x24, 0x7A, 0x53, 0x22, 0xF9, 0x50, 0x28, 0xA9, 0x62, 0x23, 0x09, 0x5F, 0xAA, 0x25, 0x6C, 0x4D, 0x23, 0x01, 0x4A, 0x21, 0x7F, 0x53, 0x25, 0x78, 0x4E, 0xA2, 0x21, 0x77, 0x42, 0x21, 0x79, 0x3D, 0xFF, 0x52, 0x21, 0x85, 0x4E, 0xAA, 0x21, 0x87, 0x40, 0x21, 0x7D, 0x3C, 0x21, 0x7F, 0x3A, 0x21, 0x69, 0x35, 0xAA, 0x21, 0x6F, 0x2D, 0x25, 0xA4, 0x28, 0x2E, 0xFD, 0x30, 0x21, 0x65, 0x2C, 0xAA, 0x41, 0x53, 0x1E, 0x21, 0x61, 0x1B, 0x21, 0x9F, 0x41, 0x21, 0xDD, 0x3D, 0xAA, 0x21, 0xAB, 0x31, 0x21, 0x99, 0x2D, 0x21, 0xA7, 0x3B, 0x21, 0xAF, 0x38, 0xAA, 0x21, 0x9F, 0x2B, 0x21, 0xA1, 0x29, 0x24, 0xE8, 0x23, 0x21, 0x95, 0x20, 0xAA, 0x21, 0x77, 0x18, 0x21, 0x79, 0x15, 0x21, 0x87, 0x1E, 0x2F, 0x43, 0x1C, 0xAA, 0x21, 0x83, 0x13, 0x23, 0x5E, 0x12, 0x2F, 0x4F, 0x1D, 0x40, 0x1B, 0x19, 0x8A, 0x23, 0x6C, 0x14, 0xFF, 0x11, 0x26, 0x72, 0x14, 0x23, 0x76, 0x11, 0xA8, 0x20, 0x09, 0x0E, 0x20, 0x01, 0x0B, 0x21, 0xA3, 0x10, 0xFF, 0x0F, 0x20, 0xFF, 0x0D, 0x40, 0x03, 0x0B, 0xFF, 0x0A, 0xFF, 0x0C, 0xAA, 0x20, 0x03, 0x09, 0x25, 0x24, 0x08, 0x25, 0x28, 0x06, 0x25, 0x32, 0x13, 0xAA, 0x20, 0x1D, 0x10, 0x20, 0x1F, 0x0C, 0x20, 0x15, 0x0A, 0x25, 0x3C, 0x0F, 0xAB, 0x20, 0x33, 0x0D, 0x20, 0x27, 0x08, 0x20, 0x1D, 0x07, 0x25, 0x52, 0x50, 0x25, 0x56, 0x04, 0x20, 0x01, 0x03, 0x25, 0x76, 0x02, 0x80, 0x07, 0x50, 0x01, 0x01, 0xAC, 0x00, 0xB9, 0x7F, 0x20, 0x2C, 0x1D, 0x03, 0x04, 0xE9, 0x7F, 0x10, 0x04, 0x80, 0x59, 0x30, 0xC2, 0x30, 0xFE, 0xE2, 0x2C, 0x3A, 0x3A, 0x46, 0x20, 0xF8, 0xE9, 0xFF, 0x0C, 0x00, 0x95, 0x00, 0xDC, 0x00, 0x3E, 0x2E, 0x03, 0x1F, 0xA9, 0x80, 0xF2, 0x18, 0x00, 0x10, 0xF9, 0x38, 0xEF, 0x4F, 0x02, 0x50, 0x90, 0xFF, 0x1F, 0xFF, 0xC0, 0xD0, 0x00, 0xDE, 0x98, 0xBF, 0x1B, 0xCB, 0xFF, 0x2F, 0x23, 0xF2, 0x7F, 0xE2, 0x4B, 0xFF, 0x01, 0xCF, 0x27, 0x10, 0x5B, 0x20, 0x2B, 0x10, 0x00, 0x11, 0x49, 0x71, 0x11, 0xFD, 0x60, 0x07, 0xF9, 0x7E, 0x70, 0x17, 0x0B, 0x10, 0x1F, 0x3A, 0x6E, 0x0C, 0xBA, 0x5C, 0x40, 0x41, 0xCD, 0x00, 0x30, 0xE3, 0xFF, 0x20, 0xF9, 0xB7, 0xFF, 0xFF, 0x00, 0xAF, 0xCF, 0x03, 0xD1, 0xF8, 0xFF, 0x7F, 0xFE, 0x00, 0xFF, 0x0C, 0x05, 0x06, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x90, 0x80, 0xED, 0xFF, 0xEE, 0xFF, 0x79, 0x0A, 0x00, 0x77, 0x00, 0xEE, 0x20, 0x07, 0x77, 0x20, 0x07, 0x00, 0x01, 0xAA, 0x00, 0x07, 0xFF, 0xFF, 0x3F, 0xCF, 0x2B, 0x90, 0x06, 0xA5, 0x00, 0x00, 0xF9, 0xF8, 0x70, 0x17, 0x80, 0x1F, 0x4A, 0x00, 0x00, 0xA0, 0x6F, 0x6F, 0xF0, 0x30, 0x00, 0x9B, 0x07, 0x00, 0x00, 0xEF, 0x23, 0x00, 0x80, 0x37, 0x80, 0x3F, 0xEA, 0x05, 0x8B, 0x00, 0x30, 0x1F, 0x80, 0xE8, 0xAB, 0x59, 0xF7, 0x59, 0x00, 0x60, 0x3F, 0x3B, 0xFC, 0xE0, 0x6B, 0xF2, 0x00, 0xE0, 0x5F, 0x00, 0x90, 0x7F, 0xA2, 0x00, 0x6A, 0xF4, 0xF3, 0x2A, 0x9F, 0x8F, 0x90, 0xBF, 0xDE, 0x20, 0xDF, 0x97, 0xDC, 0x48, 0x01, 0x00, 0x20, 0x10, 0x7B, 0xFF, 0x02, 0xAF, 0xFC, 0x30, 0x20, 0xFF, 0xFA, 0x39, 0xE3, 0x4E, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x65, 0x50, 0x01, 0xA9, 0x88, 0x05, 0x04, 0xFF, 0x02, 0xF6, 0x1E, 0x8F, 0xB0, 0x50, 0xEF, 0x00, 0x4A, 0x9F, 0x01, 0x4B, 0x05, 0x08, 0x3C, 0x8F, 0x70, 0x90, 0x21, 0xCF, 0x70, 0xA1, 0xFA, 0x41, 0x45, 0x0C, 0xFF, 0xEF, 0x02, 0x00, 0x20, 0xC5, 0x2A, 0xD9, 0x80, 0x80, 0x80, 0x30, 0x03, 0xFF, 0xFE, 0x05, 0x0B, 0xF8, 0xE1, 0x6F, 0x81, 0x2B, 0x97, 0x80, 0x90, 0x00, 0x05, 0x60, 0x00, 0x2F, 0x66, 0x00, 0xB6, 0xFF, 0xFF, 0x25, 0x06, 0x06, 0x1F, 0xF8, 0x08, 0xF8, 0x9F, 0xF8, 0xF7, 0x2F, 0x73, 0x06, 0x07, 0xBB, 0x90, 0x21, 0x06, 0xD0, 0x40, 0x3B, 0xBB, 0xB8, 0x00, 0x6F, 0x6F, 0x00, 0x70, 0xF0, 0x6F, 0x6F, 0xE0, 0xE0, 0x68, 0xDF, 0x02, 0x50, 0xA0, 0xDF, 0xDF, 0x90, 0x90, 0x20, 0x0B, 0xF0, 0x08, 0x4B, 0x00, 0xB0, 0x00, 0x20, 0x0B, 0xA0, 0x9B, 0x00, 0x00, 0x70, 0x00, 0x89, 0xFF, 0xB6, 0x8D, 0xFF, 0xFF, 0x00, 0x04, 0x03, 0xAD, 0xFD, 0x23, 0x2F, 0xF3, 0xF3, 0x24, 0x9F, 0xAF, 0x20, 0x0B, 0x04, 0xBB, 0x2D, 0xB5, 0xF3, 0xF3, 0x00, 0xAF, 0xBF, 0xB2, 0x00, 0x8B, 0x00, 0xE8, 0xB0, 0x00, 0xFF, 0xEF, 0xC0, 0xC0, 0xFF, 0xFF, 0x49, 0x10, 0x0C, 0x81, 0xFD, 0x90, 0xC1, 0x2B, 0x9B, 0x20, 0x0B, 0x90, 0x00, 0x00, 0xBB, 0x00, 0xA0, 0x21, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0xB3, 0x00, 0xCC, 0x07, 0x7C, 0xFA, 0x68, 0xAC, 0x00, 0xFB, 0x89, 0x00, 0x0A, 0x95, 0xFA, 0x5F, 0x48, 0x00, 0xF8, 0xF9, 0x03, 0x06, 0x72, 0xFA, 0xBD, 0x21, 0x00, 0x9D, 0x01, 0x17, 0x0D, 0xF9, 0xF9, 0x01, 0x00, 0x00, 0xB7, 0x00, 0x58, 0xDF, 0xDB, 0xD8, 0x4F, 0x3F, 0x00, 0x30, 0x20, 0x3A, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x01, 0x38, 0x6A, 0x4F, 0x4F, 0x20, 0x30, 0x3B, 0x2E, 0x19, 0x04, 0xFF, 0xFF, 0x4A, 0x0B, 0xBB, 0x2E, 0x18, 0x70, 0xFA, 0x00, 0xCC, 0x5E, 0xFF, 0xFF, 0x09, 0x08, 0xFA, 0xFA, 0x00, 0x8F, 0x8F, 0xF3, 0xF3, 0x8F, 0x7F, 0xFF, 0xFC, 0x00, 0x08, 0x3D, 0x91, 0x00, 0xDD, 0x00, 0xF3, 0xF9, 0x00, 0x8F, 0x9F, 0xBA, 0x00, 0x6B, 0x00, 0x00, 0xB0, 0x00, 0xC7, 0xAF, 0xF4, 0xF7, 0x6F, 0x7F, 0xDC, 0x70, 0x00, 0x19, 0xDF, 0x30, 0x30, 0xFF, 0xFF, 0xF5, 0xC0, 0x00, 0x6F, 0x9F, 0x10, 0x00, 0xD8, 0x00, 0x30, 0x60, 0x01, 0xFF, 0xEF, 0xDB, 0x12, 0x2A, 0x00, 0x31, 0x2E, 0x70, 0x20, 0x09, 0x0C, 0x34, 0xF2, 0xFF, 0xFE, 0x00, 0x10, 0xFD, 0x22, 0xFF, 0x09, 0x5B, 0xEB, 0x40, 0x40, 0xB0, 0x20, 0x2B, 0xFF, 0x0D, 0x9F, 0x1E, 0x08, 0x09, 0x20, 0x1F, 0xAE, 0x7F, 0x05, 0x09, 0xE4, 0x31, 0x08, 0x40, 0x00, 0xFF, 0xE4, 0x3F, 0x49, 0x9F, 0xFF, 0x02, 0x07, 0xBF, 0xFA, 0x30, 0xFF, 0xC8, 0x00, 0x0F, 0x49, 0x23, 0xFC, 0x24, 0x02, 0x7F, 0xEE, 0x24, 0x02, 0x40, 0x07, 0x00, 0x05, 0xFA, 0x60, 0x17, 0x70, 0x1F, 0x00, 0x05, 0xFA, 0x09, 0x90, 0x1F, 0x60, 0x87, 0xD0, 0xBF, 0x55, 0xFA, 0x20, 0xFB, 0xF9, 0xFF, 0xFF, 0x02, 0x8C, 0xAF, 0x03, 0xFF, 0x5E, 0x04, 0x10, 0x16, 0x4D, 0xE6, 0x43, 0x02, 0x4C, 0x49, 0x4D, 0xFF, 0xFE, 0x14, 0x2F, 0xFF, 0x02, 0x30, 0x02, 0x28, 0x26, 0xF7, 0x38, 0x90, 0x69, 0x6D, 0x61, 0x67, 0xA8, 0x37, 0x02, 0x80, 0x27, 0xBE, 0x0D, 0x67, 0x0F, 0x47, 0x06, 0x16, 0x00, 0x8A, 0x12, 0x3A, 0x5B, 0x41, 0xDB, 0x11, 0xF4, 0x00, 0xAC, 0xCF, 0xDD, 0x96, 0xDB, 0x5F, 0xAA, 0xAE, 0x00, 0x6D, 0x3C, 0x2E, 0x7F, 0x8B, 0x72, 0xA3, 0x56, 0x00, 0x47, 0x7A, 0xF8, 0x43, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -#endif \ No newline at end of file diff --git a/makerom.c b/makerom.c deleted file mode 100644 index e1b1cdb..0000000 --- a/makerom.c +++ /dev/null @@ -1,126 +0,0 @@ -#include "lib.h" -#include "ncch.h" -#include "ncsd.h" -#include "cia.h" - -int main(int argc, char *argv[]) -{ - // Setting up user settings - user_settings *usrset = malloc(sizeof(user_settings)); - if(usrset == NULL) {fprintf(stderr,"[!] MEM ERROR\n"); return -1;} - init_UserSettings(usrset); - - int result; - -#ifdef DEBUG - printf("[DEBUG] Parseing Args\n"); -#endif - - // Parsing command args - result = ParseArgs(argc,argv,usrset); - if(result < 0) goto finish; - -#ifdef DEBUG - printf("[DEBUG] Importing Yaml Settings\n"); -#endif - - // Import RSF Settings if present - result = GetYamlSettings(usrset); - if(result < 0) goto finish; - - // Setup Content 0 - if(!usrset->IsBuildingNCCH0){ // Import Content 0 - if(usrset->Content0IsNcch){ -#ifdef DEBUG - printf("[DEBUG] Import NCCH0\n"); -#endif - FILE *ncch0 = fopen(usrset->ContentPath[0],"rb"); - if(!ncch0) {fprintf(stderr,"[MAKEROM ERROR] Failed to open Content 0: %s\n",usrset->ContentPath[0]); goto finish;} - fclose(ncch0); - usrset->Content0.size = GetFileSize_u64(usrset->ContentPath[0]); - usrset->Content0.buffer = malloc(usrset->Content0.size); - ncch0 = fopen(usrset->ContentPath[0],"rb"); - ReadFile_64(usrset->Content0.buffer, usrset->Content0.size,0,ncch0); - fclose(ncch0); - } - else if(usrset->Content0IsSrl){ -#ifdef DEBUG - printf("[DEBUG] Import SRL\n"); -#endif - FILE *srl = fopen(usrset->SrlPath,"rb"); - if(!srl) {fprintf(stderr,"[MAKEROM ERROR] Failed to open SRL: %s\n",usrset->SrlPath); goto finish;} - fclose(srl); - u64 size = GetFileSize_u64(usrset->SrlPath); - usrset->Content0.size = align_value(size,0x10); - usrset->Content0.buffer = malloc(usrset->Content0.size); - srl = fopen(usrset->SrlPath,"rb"); - ReadFile_64(usrset->Content0.buffer,size,0,srl); - fclose(srl); - } - else if(usrset->ConvertCci){ -#ifdef DEBUG - printf("[DEBUG] Import CCI\n"); -#endif - FILE *cci = fopen(usrset->CciPath,"rb"); - if(!cci) {fprintf(stderr,"[MAKEROM ERROR] Failed to open CCI: %s\n",usrset->CciPath); goto finish;} - fclose(cci); - usrset->Content0.size = GetFileSize_u64(usrset->CciPath); - usrset->Content0.buffer = malloc(usrset->Content0.size); - cci = fopen(usrset->CciPath,"rb"); - ReadFile_64(usrset->Content0.buffer, usrset->Content0.size,0,cci); - fclose(cci); - } - } - else{// Build Content 0 -#ifdef DEBUG - printf("[DEBUG] Build NCCH0\n"); -#endif - result = build_NCCH(usrset); - if(result < 0) { - //fprintf(stderr,"[ERROR] %s generation failed\n",usrset->build_ncch_type == CXI? "CXI" : "CFA"); - fprintf(stderr,"[RESULT] Failed to build outfile\n"); - goto finish; - } - } - // Make CCI - if(usrset->out_format == CCI){ -#ifdef DEBUG - printf("[DEBUG] Building CCI\n"); -#endif - result = build_CCI(usrset); - if(result < 0) { fprintf(stderr,"[RESULT] Failed to build CCI\n"); goto finish; } - } - // Make CIA - else if(usrset->out_format == CIA){ -#ifdef DEBUG - printf("[DEBUG] Building CIA\n"); -#endif - result = build_CIA(usrset); - if(result < 0) { fprintf(stderr,"[RESULT] Failed to build CIA\n"); goto finish; } - } - // No Container Raw CXI/CFA - else if(usrset->out_format == CXI || usrset->out_format == CFA){ -#ifdef DEBUG - printf("[DEBUG] Outputting NCCH, because No Container\n"); -#endif - FILE *ncch_out = fopen(usrset->outfile,"wb"); - if(!ncch_out) { - fprintf(stderr,"[ERROR] Failed to create '%s'\n",usrset->outfile); - fprintf(stderr,"[RESULT] Failed to build '%s'\n",usrset->out_format == CXI? "CXI" : "CFA"); - result = FAILED_TO_CREATE_OUTFILE; - goto finish; - } - WriteBuffer(usrset->Content0.buffer,usrset->Content0.size,0,ncch_out); - fclose(ncch_out); - } - -finish: -#ifdef DEBUG - printf("[DEBUG] Free Context\n"); -#endif - free_UserSettings(usrset); -#ifdef DEBUG - printf("[DEBUG] Finished returning (result=%d)\n",result); -#endif - return result; -} \ No newline at end of file diff --git a/makerom.exe b/makerom.exe new file mode 100644 index 0000000..6aa3dc2 Binary files /dev/null and b/makerom.exe differ diff --git a/ncch.c b/ncch.c deleted file mode 100644 index 409577a..0000000 --- a/ncch.c +++ /dev/null @@ -1,1087 +0,0 @@ -#include "lib.h" -#include "ncch.h" -#include "exheader.h" -#include "elf.h" -#include "exefs.h" -#include "romfs.h" -#include "titleid.h" - -#include "logo_data.h" // Contains Logos - -// Private Prototypes -int SignCFA(u8 *Signature, u8 *CFA_HDR, keys_struct *keys); -int CheckCFASignature(u8 *Signature, u8 *CFA_HDR, keys_struct *keys); -int SignCXI(u8 *Signature, u8 *CXI_HDR, u8 *PubK, u8 *PrivK); -int CheckCXISignature(u8 *Signature, u8 *CXI_HDR, u8 *PubK); - -void init_NCCHSettings(ncch_settings *set); -void free_NCCHSettings(ncch_settings *set); -int get_NCCHSettings(ncch_settings *ncchset, user_settings *usrset); -int SetBasicOptions(ncch_settings *ncchset, user_settings *usrset); -int CreateInputFilePtrs(ncch_settings *ncchset, user_settings *usrset); -int ImportNonCodeExeFsSections(ncch_settings *ncchset); -int ImportLogo(ncch_settings *ncchset); - -int SetCommonHeaderBasicData(ncch_settings *ncchset, NCCH_Header *hdr); -int SetCommonHeaderSectionData(ncch_settings *ncchset, NCCH_Header *hdr); -bool IsValidProductCode(char *ProductCode, bool FreeProductCode); - -int BuildCommonHeader(ncch_settings *ncchset); -int EncryptNCCHSections(ncch_settings *ncchset); -int WriteNCCHSectionsToBuffer(ncch_settings *ncchset); - -// Code - -int SignCFA(u8 *Signature, u8 *CFA_HDR, keys_struct *keys) -{ - return ctr_sig(CFA_HDR,sizeof(NCCH_Header),Signature,keys->rsa.CFA_Pub,keys->rsa.CFA_Priv,RSA_2048_SHA256,CTR_RSA_SIGN); -} - -int CheckCFASignature(u8 *Signature, u8 *CFA_HDR, keys_struct *keys) -{ - return ctr_sig(CFA_HDR,sizeof(NCCH_Header),Signature,keys->rsa.CFA_Pub,NULL,RSA_2048_SHA256,CTR_RSA_VERIFY); -} - -int SignCXI(u8 *Signature, u8 *CXI_HDR, u8 *PubK, u8 *PrivK) -{ - return ctr_sig(CXI_HDR,sizeof(NCCH_Header),Signature,PubK,PrivK,RSA_2048_SHA256,CTR_RSA_SIGN); -} - -int CheckCXISignature(u8 *Signature, u8 *CXI_HDR, u8 *PubK) -{ - int result = ctr_sig(CXI_HDR,sizeof(NCCH_Header),Signature,PubK,NULL,RSA_2048_SHA256,CTR_RSA_VERIFY); - return result; -} - -// NCCH Build Functions - -int build_NCCH(user_settings *usrset) -{ - int result; -#ifdef DEBUG - printf("[DEBUG] Init Settings\n"); -#endif - // Init Settings - ncch_settings *ncchset = malloc(sizeof(ncch_settings)); - if(!ncchset) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - init_NCCHSettings(ncchset); - -#ifdef DEBUG - printf("[DEBUG] Get Settings\n"); -#endif - // Get Settings - result = get_NCCHSettings(ncchset,usrset); - if(result) goto finish; -#ifdef DEBUG - printf("[DEBUG] Build ExeFS Code/PlainRegion\n"); -#endif - // Build ExeFs Code Section - result = BuildExeFsCode(ncchset); - if(result) goto finish; - -#ifdef ELF_DEBUG - FILE *code = fopen("code.bin","wb"); - fwrite(ncchset->ExeFs_Sections.Code.buffer,ncchset->ExeFs_Sections.Code.size,1,code); - fclose(code); - u8 hash[0x20]; - ctr_sha(ncchset->ExeFs_Sections.Code.buffer,ncchset->ExeFs_Sections.Code.size,hash,CTR_SHA_256); - printf("BSS Size: 0x%x\n",ncchset->CodeDetails.BSS_Size); - printf("Code Size: 0x%x\n",ncchset->ExeFs_Sections.Code.size); - memdump(stdout,"Code Hash: ",hash,0x20); -#endif - -#ifdef DEBUG - printf("[DEBUG] Build Exheader\n"); -#endif - // Build ExHeader - result = BuildExHeader(ncchset); - if(result) goto finish; - - -#ifdef DEBUG - printf("[DEBUG] Exefs\n"); -#endif - // Build ExeFs/RomFs - result = BuildExeFs(ncchset); - if(result) goto finish; -#ifdef DEBUG - printf("[DEBUG] Build Romfs\n"); -#endif - result = BuildRomFs(ncchset); - if(result) goto finish; - - // Final Steps -#ifdef DEBUG - printf("[DEBUG] Build common header\n"); -#endif - result = BuildCommonHeader(ncchset); - if(result) goto finish; -#ifdef DEBUG - printf("[DEBUG] Encrypt Sections\n"); -#endif - result = EncryptNCCHSections(ncchset); - if(result) goto finish; -#ifdef DEBUG - printf("[DEBUG] Write Sections\n"); -#endif - result = WriteNCCHSectionsToBuffer(ncchset); - if(result) goto finish; -finish: -#ifdef DEBUG - printf("[DEBUG] Finish Building\n"); -#endif - if(result) fprintf(stderr,"[NCCH ERROR] NCCH Build Process Failed\n"); - free_NCCHSettings(ncchset); - return result; -} - -void init_NCCHSettings(ncch_settings *set) -{ - memset(set,0,sizeof(ncch_settings)); -} - -void free_NCCHSettings(ncch_settings *set) -{ - if(set->CxiRsaKey.PrivK) free(set->CxiRsaKey.PrivK); - if(set->CxiRsaKey.PubK) free(set->CxiRsaKey.PubK); - - if(set->ComponentFilePtrs.elf) fclose(set->ComponentFilePtrs.elf); - if(set->ComponentFilePtrs.banner) fclose(set->ComponentFilePtrs.banner); - if(set->ComponentFilePtrs.icon) fclose(set->ComponentFilePtrs.icon); - if(set->ComponentFilePtrs.logo) fclose(set->ComponentFilePtrs.logo); - if(set->ComponentFilePtrs.code) fclose(set->ComponentFilePtrs.code); - if(set->ComponentFilePtrs.exheader) fclose(set->ComponentFilePtrs.exheader); - if(set->ComponentFilePtrs.romfs) fclose(set->ComponentFilePtrs.romfs); - if(set->ComponentFilePtrs.plainregion) fclose(set->ComponentFilePtrs.plainregion); - - if(set->ExeFs_Sections.Code.size) free(set->ExeFs_Sections.Code.buffer); - if(set->ExeFs_Sections.Banner.size) free(set->ExeFs_Sections.Banner.buffer); - if(set->ExeFs_Sections.Icon.size) free(set->ExeFs_Sections.Icon.buffer); - - if(set->Sections.CommonHeader.size) free(set->Sections.CommonHeader.buffer); - if(set->Sections.ExHeader.size) free(set->Sections.ExHeader.buffer); - if(set->Sections.Logo.size) free(set->Sections.Logo.buffer); - if(set->Sections.PlainRegion.size) free(set->Sections.PlainRegion.buffer); - if(set->Sections.ExeFs.size) free(set->Sections.ExeFs.buffer); - if(set->Sections.RomFs.size) free(set->Sections.RomFs.buffer); - - memset(set,0,sizeof(ncch_settings)); - - free(set); -} - -int get_NCCHSettings(ncch_settings *ncchset, user_settings *usrset) -{ - int result = 0; - ncchset->out = &usrset->Content0; - ncchset->yaml_set = &usrset->yaml_set; - ncchset->keys = &usrset->keys; - - result = SetBasicOptions(ncchset,usrset); - if(result) return result; - result = CreateInputFilePtrs(ncchset,usrset); - if(result) return result; - result = ImportNonCodeExeFsSections(ncchset); - if(result) return result; - result = ImportLogo(ncchset); - if(result) return result; - - - return 0; -} - -int SetBasicOptions(ncch_settings *ncchset, user_settings *usrset) -{ - int result = 0; - - /* Options */ - ncchset->Options.MediaSize = 0x200; - - ncchset->Options.IncludeExeFsLogo = usrset->include_exefs_logo; - - if(usrset->yaml_set.Option.EnableCompress != -1) ncchset->Options.CompressCode = usrset->yaml_set.Option.EnableCompress; - else ncchset->Options.CompressCode = true; - - if(usrset->yaml_set.Option.UseOnSD != -1) ncchset->Options.UseOnSD = usrset->yaml_set.Option.UseOnSD; - else ncchset->Options.UseOnSD = false; - usrset->yaml_set.Option.UseOnSD = ncchset->Options.UseOnSD; - - if(usrset->yaml_set.Option.EnableCrypt != -1) ncchset->Options.Encrypt = usrset->yaml_set.Option.EnableCrypt; - else ncchset->Options.Encrypt = true; - - if(usrset->yaml_set.Option.FreeProductCode != -1) ncchset->Options.FreeProductCode = usrset->yaml_set.Option.FreeProductCode; - else ncchset->Options.FreeProductCode = false; - - ncchset->Options.IsCfa = (usrset->build_ncch_type == CFA); - - ncchset->Options.IsBuildingCodeSection = (usrset->elf_path != NULL); - - ncchset->Options.UseRomFS = ((ncchset->yaml_set->Rom.HostRoot && strlen(ncchset->yaml_set->Rom.HostRoot) > 0) || usrset->romfs_path); - - if(ncchset->Options.IsCfa && !ncchset->Options.UseRomFS){ - fprintf(stderr,"[NCCH ERROR] 'Rom/HostRoot' must be set\n"); - return NCCH_BAD_YAML_SET; - } - - ncchset->CxiRsaKey.PrivK = malloc(0x100); - ncchset->CxiRsaKey.PubK = malloc(0x100); - - return result; -} - -int CreateInputFilePtrs(ncch_settings *ncchset, user_settings *usrset) -{ - if(usrset->romfs_path){ - ncchset->ComponentFilePtrs.romfs_size = GetFileSize_u64(usrset->romfs_path); - ncchset->ComponentFilePtrs.romfs = fopen(usrset->romfs_path,"rb"); - if(!ncchset->ComponentFilePtrs.romfs){ - fprintf(stderr,"[NCCH ERROR] Failed to open RomFs file '%s'\n",usrset->romfs_path); - return FAILED_TO_IMPORT_FILE; - } - } - if(ncchset->Options.IsCfa) return 0; - if(usrset->elf_path){ - ncchset->ComponentFilePtrs.elf_size = GetFileSize_u64(usrset->elf_path); - ncchset->ComponentFilePtrs.elf = fopen(usrset->elf_path,"rb"); - if(!ncchset->ComponentFilePtrs.elf){ - fprintf(stderr,"[NCCH ERROR] Failed to open elf file '%s'\n",usrset->elf_path); - return FAILED_TO_IMPORT_FILE; - } - } - if(usrset->banner_path){ - ncchset->ComponentFilePtrs.banner_size = GetFileSize_u64(usrset->banner_path); - ncchset->ComponentFilePtrs.banner = fopen(usrset->banner_path,"rb"); - if(!ncchset->ComponentFilePtrs.banner){ - fprintf(stderr,"[NCCH ERROR] Failed to open banner file '%s'\n",usrset->banner_path); - return FAILED_TO_IMPORT_FILE; - } - } - if(usrset->icon_path){ - ncchset->ComponentFilePtrs.icon_size = GetFileSize_u64(usrset->icon_path); - ncchset->ComponentFilePtrs.icon = fopen(usrset->icon_path,"rb"); - if(!ncchset->ComponentFilePtrs.icon){ - fprintf(stderr,"[NCCH ERROR] Failed to open icon file '%s'\n",usrset->icon_path); - return FAILED_TO_IMPORT_FILE; - } - } - if(usrset->logo_path){ - ncchset->ComponentFilePtrs.logo_size = GetFileSize_u64(usrset->logo_path); - ncchset->ComponentFilePtrs.logo = fopen(usrset->logo_path,"rb"); - if(!ncchset->ComponentFilePtrs.logo){ - fprintf(stderr,"[NCCH ERROR] Failed to open logo file '%s'\n",usrset->logo_path); - return FAILED_TO_IMPORT_FILE; - } - } - - if(usrset->exefs_code_path){ - ncchset->ComponentFilePtrs.code_size = GetFileSize_u64(usrset->exefs_code_path); - ncchset->ComponentFilePtrs.code = fopen(usrset->exefs_code_path,"rb"); - if(!ncchset->ComponentFilePtrs.code){ - fprintf(stderr,"[NCCH ERROR] Failed to open ExeFs Code file '%s'\n",usrset->exefs_code_path); - return FAILED_TO_IMPORT_FILE; - } - } - if(usrset->exheader_path){ - ncchset->ComponentFilePtrs.exheader_size = GetFileSize_u64(usrset->exheader_path); - ncchset->ComponentFilePtrs.exheader = fopen(usrset->exheader_path,"rb"); - if(!ncchset->ComponentFilePtrs.exheader){ - fprintf(stderr,"[NCCH ERROR] Failed to open ExHeader file '%s'\n",usrset->exheader_path); - return FAILED_TO_IMPORT_FILE; - } - } - if(usrset->plain_region_path){ - ncchset->ComponentFilePtrs.plainregion_size = GetFileSize_u64(usrset->plain_region_path); - ncchset->ComponentFilePtrs.plainregion = fopen(usrset->plain_region_path,"rb"); - if(!ncchset->ComponentFilePtrs.plainregion){ - fprintf(stderr,"[NCCH ERROR] Failed to open PlainRegion file '%s'\n",usrset->plain_region_path); - return FAILED_TO_IMPORT_FILE; - } - } - return 0; -} - -int ImportNonCodeExeFsSections(ncch_settings *ncchset) -{ - if(ncchset->Options.IsCfa) return 0; - if(ncchset->ComponentFilePtrs.banner){ - ncchset->ExeFs_Sections.Banner.size = ncchset->ComponentFilePtrs.banner_size; - ncchset->ExeFs_Sections.Banner.buffer = malloc(ncchset->ExeFs_Sections.Banner.size); - if(!ncchset->ExeFs_Sections.Banner.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - ReadFile_64(ncchset->ExeFs_Sections.Banner.buffer,ncchset->ExeFs_Sections.Banner.size,0,ncchset->ComponentFilePtrs.banner); - } - if(ncchset->ComponentFilePtrs.icon){ - ncchset->ExeFs_Sections.Icon.size = ncchset->ComponentFilePtrs.icon_size; - ncchset->ExeFs_Sections.Icon.buffer = malloc(ncchset->ExeFs_Sections.Icon.size); - if(!ncchset->ExeFs_Sections.Icon.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - ReadFile_64(ncchset->ExeFs_Sections.Icon.buffer,ncchset->ExeFs_Sections.Icon.size,0,ncchset->ComponentFilePtrs.icon); - } - return 0; -} - -int ImportLogo(ncch_settings *ncchset) -{ - if(ncchset->Options.IsCfa) return 0; - if(ncchset->ComponentFilePtrs.logo){ - ncchset->Sections.Logo.size = ncchset->ComponentFilePtrs.logo_size; - ncchset->Sections.Logo.buffer = malloc(ncchset->Sections.Logo.size); - if(!ncchset->Sections.Logo.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - ReadFile_64(ncchset->Sections.Logo.buffer,ncchset->Sections.Logo.size,0,ncchset->ComponentFilePtrs.logo); - } - else if(ncchset->yaml_set->BasicInfo.Logo){ - if(strcasecmp(ncchset->yaml_set->BasicInfo.Logo,"nintendo") == 0){ - ncchset->Sections.Logo.size = 0x2000; - ncchset->Sections.Logo.buffer = malloc(ncchset->Sections.Logo.size); - if(!ncchset->Sections.Logo.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - memcpy(ncchset->Sections.Logo.buffer,Nintendo_LZ,0x2000); - } - else if(strcasecmp(ncchset->yaml_set->BasicInfo.Logo,"licensed") == 0){ - ncchset->Sections.Logo.size = 0x2000; - ncchset->Sections.Logo.buffer = malloc(ncchset->Sections.Logo.size); - if(!ncchset->Sections.Logo.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - memcpy(ncchset->Sections.Logo.buffer,Nintendo_LicensedBy_LZ,0x2000); - } - else if(strcasecmp(ncchset->yaml_set->BasicInfo.Logo,"distributed") == 0){ - ncchset->Sections.Logo.size = 0x2000; - ncchset->Sections.Logo.buffer = malloc(ncchset->Sections.Logo.size); - if(!ncchset->Sections.Logo.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - memcpy(ncchset->Sections.Logo.buffer,Nintendo_DistributedBy_LZ,0x2000); - } - else if(strcasecmp(ncchset->yaml_set->BasicInfo.Logo,"ique") == 0){ - ncchset->Sections.Logo.size = 0x2000; - ncchset->Sections.Logo.buffer = malloc(ncchset->Sections.Logo.size); - if(!ncchset->Sections.Logo.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - memcpy(ncchset->Sections.Logo.buffer,iQue_with_ISBN_LZ,0x2000); - } - else if(strcasecmp(ncchset->yaml_set->BasicInfo.Logo,"iqueforsystem") == 0){ - ncchset->Sections.Logo.size = 0x2000; - ncchset->Sections.Logo.buffer = malloc(ncchset->Sections.Logo.size); - if(!ncchset->Sections.Logo.buffer) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - memcpy(ncchset->Sections.Logo.buffer,iQue_without_ISBN_LZ,0x2000); - } - else if(strcasecmp(ncchset->yaml_set->BasicInfo.Logo,"none") != 0){ - fprintf(stderr,"[NCCH ERROR] Invalid logo name\n"); - return NCCH_BAD_YAML_SET; - } - } - return 0; -} - -int SetCommonHeaderBasicData(ncch_settings *ncchset, NCCH_Header *hdr) -{ - /* NCCH Format Version */ - u16_to_u8(hdr->version,0x2,LE); - - /* Setting ProgramId/TitleId */ - u64 ProgramId = 0; - int result = GetProgramID(&ProgramId,ncchset->yaml_set,false); - if(result) return result; - - u64_to_u8(hdr->program_id,ProgramId,LE); - u64_to_u8(hdr->title_id,ProgramId,LE); - - /* Get Product Code and Maker Code */ - if(ncchset->yaml_set->BasicInfo.ProductCode){ - if(!IsValidProductCode((char*)ncchset->yaml_set->BasicInfo.ProductCode,ncchset->Options.FreeProductCode)){ - fprintf(stderr,"[NCCH ERROR] Invalid Product Code\n"); - return NCCH_BAD_YAML_SET; - } - memcpy(hdr->product_code,ncchset->yaml_set->BasicInfo.ProductCode,strlen((char*)ncchset->yaml_set->BasicInfo.ProductCode)); - } - else memcpy(hdr->product_code,"CTR-P-CTAP",10); - - if(ncchset->yaml_set->BasicInfo.CompanyCode){ - if(strlen((char*)ncchset->yaml_set->BasicInfo.CompanyCode) != 2){ - fprintf(stderr,"[NCCH ERROR] Company code length must be 2\n"); - return NCCH_BAD_YAML_SET; - } - memcpy(hdr->maker_code,ncchset->yaml_set->BasicInfo.CompanyCode,2); - } - else memcpy(hdr->maker_code,"00",2); - - /* Set ContentUnitSize */ - hdr->flags[ContentUnitSize] = 0; - - /* Setting ContentPlatform */ - if(ncchset->yaml_set->TitleInfo.Platform){ - if(strcasecmp(ncchset->yaml_set->TitleInfo.Platform,"ctr") == 0) hdr->flags[ContentPlatform] = 1; - else{ - fprintf(stderr,"[NCCH ERROR] Invalid Platform: %s\n",ncchset->yaml_set->TitleInfo.Platform); - return NCCH_BAD_YAML_SET; - } - } - else - hdr->flags[ContentPlatform] = 1; // CTR - - /* Setting OtherFlag */ - hdr->flags[OtherFlag] = FixedCryptoKey; - if(!ncchset->Options.Encrypt) hdr->flags[OtherFlag] |= NoCrypto; - if(!ncchset->Sections.RomFs.size) hdr->flags[OtherFlag] |= NoMountRomFs; - - - /* Setting ContentType */ - hdr->flags[ContentType] = 0; - if(ncchset->Sections.RomFs.size) hdr->flags[ContentType] |= RomFS; - if(ncchset->Sections.ExeFs.size) hdr->flags[ContentType] |= ExeFS; - if(ncchset->yaml_set->BasicInfo.ContentType){ - if(strcmp(ncchset->yaml_set->BasicInfo.ContentType,"Application") == 0) hdr->flags[ContentType] |= 0; - else if(strcmp(ncchset->yaml_set->BasicInfo.ContentType,"SystemUpdate") == 0) hdr->flags[ContentType] |= SystemUpdate; - else if(strcmp(ncchset->yaml_set->BasicInfo.ContentType,"Manual") == 0) hdr->flags[ContentType] |= Manual; - else if(strcmp(ncchset->yaml_set->BasicInfo.ContentType,"Child") == 0) hdr->flags[ContentType] |= Child; - else if(strcmp(ncchset->yaml_set->BasicInfo.ContentType,"Trial") == 0) hdr->flags[ContentType] |= Trial; - else{ - fprintf(stderr,"[NCCH ERROR] Invalid ContentType '%s'\n",ncchset->yaml_set->BasicInfo.ContentType); - return NCCH_BAD_YAML_SET; - } - } - - return 0; -} - -int SetCommonHeaderSectionData(ncch_settings *ncchset, NCCH_Header *hdr) -{ - /* Set Sizes/Hashes to Hdr */ - u32 ExHeaderSize = (u32) ncchset->Sections.ExHeader.size - 0x400; - u32 LogoSize = (u32) (ncchset->Sections.Logo.size/ncchset->Options.MediaSize); - u32 PlainRegionSize = (u32) (ncchset->Sections.PlainRegion.size/ncchset->Options.MediaSize); - u32 ExeFsSize = (u32) (ncchset->Sections.ExeFs.size/ncchset->Options.MediaSize); - u32 ExeFsHashSize = (u32) ExeFsSize? ncchset->Options.MediaSize/ncchset->Options.MediaSize : 0; - u32 RomFsSize = (u32) (ncchset->Sections.RomFs.size/ncchset->Options.MediaSize); - u32 RomFsHashSize = (u32) RomFsSize? ncchset->Options.MediaSize/ncchset->Options.MediaSize : 0; - - u32_to_u8(hdr->extended_header_size,ExHeaderSize,LE); - if(ExHeaderSize) ctr_sha(ncchset->Sections.ExHeader.buffer,ExHeaderSize,hdr->extended_header_sha_256_hash,CTR_SHA_256); - - u32_to_u8(hdr->logo_region_size,LogoSize,LE); - if(LogoSize) ctr_sha(ncchset->Sections.Logo.buffer,ncchset->Sections.Logo.size,hdr->logo_sha_256_hash,CTR_SHA_256); - - u32_to_u8(hdr->plain_region_size,PlainRegionSize,LE); - - u32_to_u8(hdr->exefs_size,ExeFsSize,LE); - u32_to_u8(hdr->exefs_hash_size,ExeFsHashSize,LE); - if(ExeFsSize) ctr_sha(ncchset->Sections.ExeFs.buffer,ncchset->Options.MediaSize,hdr->exefs_sha_256_hash,CTR_SHA_256); - - u32_to_u8(hdr->romfs_size,RomFsSize,LE); - u32_to_u8(hdr->romfs_hash_size,RomFsHashSize,LE); - if(RomFsSize) ctr_sha(ncchset->Sections.RomFs.buffer,ncchset->Options.MediaSize,hdr->romfs_sha_256_hash,CTR_SHA_256); - - - /* Get Section Offsets */ - u32 size = 1; - if (ExHeaderSize) - size += 4; - - if (LogoSize){ - u32_to_u8(hdr->logo_region_offset,size,LE); - ncchset->Sections.LogoOffset = size*ncchset->Options.MediaSize; - size += LogoSize; - } - - if(PlainRegionSize){ - u32_to_u8(hdr->plain_region_offset,size,LE); - ncchset->Sections.PlainRegionOffset = size*ncchset->Options.MediaSize; - size += PlainRegionSize; - } - - if (ExeFsSize){ - u32_to_u8(hdr->exefs_offset,size,LE); - ncchset->Sections.ExeFsOffset = size*ncchset->Options.MediaSize; - size += ExeFsSize; - } - - if (RomFsSize){ - u32_to_u8(hdr->romfs_offset,size,LE); - ncchset->Sections.RomFsOffset = size*ncchset->Options.MediaSize; - size += RomFsSize; - } - - u32_to_u8(hdr->content_size,size,LE); - - ncchset->Sections.TotalContentSize = size * ncchset->Options.MediaSize; - - return 0; -} - -bool IsValidProductCode(char *ProductCode, bool FreeProductCode) -{ - if(strlen(ProductCode) > 16) return false; - - if(FreeProductCode) - return true; - - if(strlen(ProductCode) < 10) return false; - if(strncmp(ProductCode,"CTR-",4) != 0) return false; - if(ProductCode[5] != '-') return false; - if(!isdigit(ProductCode[4]) && !isupper(ProductCode[4])) return false; - for(int i = 6; i < 10; i++){ - if(!isdigit(ProductCode[i]) && !isupper(ProductCode[i])) return false; - } - - return true; -} - -int BuildCommonHeader(ncch_settings *ncchset) -{ - int result = 0; - - // Initialising Header - ncchset->Sections.CommonHeader.size = 0x100 + sizeof(NCCH_Header); - ncchset->Sections.CommonHeader.buffer = malloc(ncchset->Sections.CommonHeader.size); - if(!ncchset->Sections.CommonHeader.buffer) { fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR; } - memset(ncchset->Sections.CommonHeader.buffer,0,ncchset->Sections.CommonHeader.size); - - // Creating Ptrs - u8 *sig = ncchset->Sections.CommonHeader.buffer; - NCCH_Header *hdr = (NCCH_Header*)(ncchset->Sections.CommonHeader.buffer+0x100); - - // Setting Data in Hdr - memcpy(hdr->magic,"NCCH",4); - - result = SetCommonHeaderBasicData(ncchset,hdr); - if(result) return result; - - result = SetCommonHeaderSectionData(ncchset,hdr); - if(result) return result; - - - // Signing Hdr - int sig_result = Good; - if(ncchset->Options.IsCfa) sig_result = SignCFA(sig,(u8*)hdr,ncchset->keys); - else sig_result = SignCXI(sig,(u8*)hdr,ncchset->CxiRsaKey.PubK,ncchset->CxiRsaKey.PrivK); - if(sig_result != Good){ - fprintf(stderr,"[NCCH ERROR] Failed to sign %s header\n",ncchset->Options.IsCfa ? "CFA" : "CXI"); - return sig_result; - } - - return 0; -} - -int EncryptNCCHSections(ncch_settings *ncchset) -{ - if(!ncchset->Options.Encrypt) return 0; - - /* Getting NCCH_STRUCT */ - NCCH_Header *hdr = GetNCCH_CommonHDR(NULL,NULL,ncchset->Sections.CommonHeader.buffer); - NCCH_STRUCT *ncch = malloc(sizeof(NCCH_STRUCT)); - if(!ncch) { fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - memset(ncch,0,sizeof(NCCH_STRUCT)); - GetCXIStruct(ncch,hdr); - - u8 *ncch_key = GetNCCHKey(hdr,ncchset->keys); - - if(ncchset->Sections.ExHeader.size) - CryptNCCHSection(ncchset->Sections.ExHeader.buffer,ncchset->Sections.ExHeader.size,0,ncch,ncch_key,ncch_ExHeader); - - if(ncchset->Sections.ExeFs.size) - CryptNCCHSection(ncchset->Sections.ExeFs.buffer,ncchset->Sections.ExeFs.size,0,ncch,ncch_key,ncch_exefs); - - if(ncchset->Sections.RomFs.size) - CryptNCCHSection(ncchset->Sections.RomFs.buffer,ncchset->Sections.RomFs.size,0,ncch,ncch_key,ncch_romfs); - - return 0; -} - -int WriteNCCHSectionsToBuffer(ncch_settings *ncchset) -{ - /* Allocating Memory for NCCH, and clearing */ - ncchset->out->size = ncchset->Sections.TotalContentSize; - ncchset->out->buffer = malloc(ncchset->out->size); - if(!ncchset->out->buffer) { fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} - memset(ncchset->out->buffer,0,ncchset->out->size); - - /* Copy Header+Sig */ - memcpy(ncchset->out->buffer,ncchset->Sections.CommonHeader.buffer,ncchset->Sections.CommonHeader.size); - - /* Copy Exheader+AccessDesc */ - if(ncchset->Sections.ExHeader.size) - memcpy(ncchset->out->buffer+0x200,ncchset->Sections.ExHeader.buffer,ncchset->Sections.ExHeader.size); - - /* Copy Logo */ - if(ncchset->Sections.Logo.size) - memcpy(ncchset->out->buffer+ncchset->Sections.LogoOffset,ncchset->Sections.Logo.buffer,ncchset->Sections.Logo.size); - - /* Copy PlainRegion */ - if(ncchset->Sections.PlainRegion.size) - memcpy(ncchset->out->buffer+ncchset->Sections.PlainRegionOffset,ncchset->Sections.PlainRegion.buffer,ncchset->Sections.PlainRegion.size); - - /* Copy ExeFs */ - if(ncchset->Sections.ExeFs.size) - memcpy(ncchset->out->buffer+ncchset->Sections.ExeFsOffset,ncchset->Sections.ExeFs.buffer,ncchset->Sections.ExeFs.size); - - /* Copy RomFs */ - if(ncchset->Sections.RomFs.size) - memcpy(ncchset->out->buffer+ncchset->Sections.RomFsOffset,ncchset->Sections.RomFs.buffer,ncchset->Sections.RomFs.size); - - return 0; -} - -// NCCH Read Functions - -int VerifyNCCH(u8 *ncch, keys_struct *keys, bool SuppressOutput) -{ - // Setup - u8 Hash[0x20]; - u8 *hdr_sig = ncch; - NCCH_Header* hdr = GetNCCH_CommonHDR(NULL,NULL,ncch); - - NCCH_STRUCT *ncch_ctx = malloc(sizeof(NCCH_STRUCT)); - if(!ncch_ctx){ fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR; } - memset(ncch_ctx,0x0,sizeof(NCCH_STRUCT)); - GetCXIStruct(ncch_ctx,hdr); - - if(IsCfa(hdr)){ - if(CheckCFASignature(hdr_sig,(u8*)hdr,keys) != Good && !keys->rsa.FalseSign){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CFA Sigcheck Failed\n"); - free(ncch_ctx); - return NCCH_HDR_SIG_BAD; - } - if(!ncch_ctx->romfs_size){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CFA is corrupt\n"); - free(ncch_ctx); - return NO_ROMFS_IN_CFA; - } - u8 *RomFs = malloc(ncch_ctx->romfs_hash_src_size); - if(!RomFs){ - fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); - free(ncch_ctx); - return MEM_ERROR; - } - int ret = GetNCCHSection(RomFs,ncch_ctx->romfs_hash_src_size,0,ncch,ncch_ctx,keys,ncch_romfs); - if(ret != 0 && ret != UNABLE_TO_LOAD_NCCH_KEY){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CFA is corrupt\n"); - free(ncch_ctx); - free(RomFs); - return CXI_CORRUPT; - } - else if(ret == UNABLE_TO_LOAD_NCCH_KEY){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] Failed to load ncch aes key.\n"); - free(ncch_ctx); - free(RomFs); - return UNABLE_TO_LOAD_NCCH_KEY; - } - - ctr_sha(RomFs,ncch_ctx->romfs_hash_src_size,Hash,CTR_SHA_256); - free(RomFs); - if(memcmp(Hash,hdr->romfs_sha_256_hash,0x20) != 0){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] RomFs Hashcheck Failed\n"); - free(ncch_ctx); - return ExeFs_Hashfail; - } - } - else{ // IsCxi - // Checking for necessary sections - if(!ncch_ctx->exheader_size){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CXI is corrupt\n"); - free(ncch_ctx); - return NO_EXHEADER_IN_CXI; - } - if(!ncch_ctx->exefs_size){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CXI is corrupt\n"); - free(ncch_ctx); - return NO_EXEFS_IN_CXI; - } - // Get ExHeader - ExtendedHeader_Struct *ExHeader = malloc(ncch_ctx->exheader_size); - if(!ExHeader){ - fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); - free(ncch_ctx); - return MEM_ERROR; - } - int ret = GetNCCHSection((u8*)ExHeader,ncch_ctx->exheader_size,0,ncch,ncch_ctx,keys,ncch_ExHeader); - if(ret != 0 && ret != UNABLE_TO_LOAD_NCCH_KEY){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CXI is corrupt\n"); - free(ncch_ctx); - free(ExHeader); - return CXI_CORRUPT; - } - else if(ret == UNABLE_TO_LOAD_NCCH_KEY){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] Failed to load ncch aes key.\n"); - free(ncch_ctx); - free(ExHeader); - return UNABLE_TO_LOAD_NCCH_KEY; - } - - // Checking Exheader Hash to see if decryption was sucessful - ctr_sha(ExHeader,0x400,Hash,CTR_SHA_256); - if(memcmp(Hash,hdr->extended_header_sha_256_hash,0x20) != 0){ - //memdump(stdout,"Expected Hash: ",hdr->extended_header_sha_256_hash,0x20); - //memdump(stdout,"Actual Hash: ",Hash,0x20); - //memdump(stdout,"Exheader: ",(u8*)ExHeader,0x400); - if(!SuppressOutput) { - fprintf(stderr,"[NCCH ERROR] ExHeader Hashcheck Failed\n"); - fprintf(stderr,"[NCCH ERROR] CXI is corrupt\n"); - } - free(ncch_ctx); - free(ExHeader); - return ExHeader_Hashfail; - } - - // Checking RSA Sigs - u8 *hdr_pubk = GetNcchHdrPubKey_frm_exhdr(ExHeader); - - if(CheckAccessDescSignature(ExHeader,keys) != 0 && !keys->rsa.FalseSign){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] AccessDesc Sigcheck Failed\n"); - free(ncch_ctx); - free(ExHeader); - return ACCESSDESC_SIG_BAD; - } - if(CheckCXISignature(hdr_sig,(u8*)hdr,hdr_pubk) != 0 /* && !keys->rsa.FalseSign*/){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] CXI Header Sigcheck Failed\n"); - free(ncch_ctx); - free(ExHeader); - return NCCH_HDR_SIG_BAD; - } - free(ExHeader); - - // It is assumed by this point, everything is fine - - /* Checking ExeFs Hash */ - u8 *ExeFs = malloc(ncch_ctx->exefs_hash_src_size); - if(!ExeFs){ - fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); - free(ncch_ctx); - return MEM_ERROR; - } - GetNCCHSection(ExeFs,ncch_ctx->exefs_hash_src_size,0,ncch,ncch_ctx,keys,ncch_exefs); - ctr_sha(ExeFs,ncch_ctx->exefs_hash_src_size,Hash,CTR_SHA_256); - free(ExeFs); - if(memcmp(Hash,hdr->exefs_sha_256_hash,0x20) != 0){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] ExeFs Hashcheck Failed\n"); - free(ncch_ctx); - return ExeFs_Hashfail; - } - - /* Checking RomFs hash, if present */ - if(ncch_ctx->romfs_size){ - u8 *RomFs = malloc(ncch_ctx->romfs_hash_src_size); - if(!RomFs){ - fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); - free(ncch_ctx); - return MEM_ERROR; - } - GetNCCHSection(RomFs,ncch_ctx->romfs_hash_src_size,0,ncch,ncch_ctx,keys,ncch_romfs); - ctr_sha(RomFs,ncch_ctx->romfs_hash_src_size,Hash,CTR_SHA_256); - free(RomFs); - if(memcmp(Hash,hdr->romfs_sha_256_hash,0x20) != 0){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] RomFs Hashcheck Failed\n"); - free(ncch_ctx); - return ExeFs_Hashfail; - } - } - - /* Checking the Logo Hash, if present */ - if(ncch_ctx->logo_size){ - u8 *logo = (ncch+ncch_ctx->logo_offset); - ctr_sha(logo,ncch_ctx->logo_size,Hash,CTR_SHA_256); - if(memcmp(Hash,hdr->logo_sha_256_hash,0x20) != 0){ - if(!SuppressOutput) fprintf(stderr,"[NCCH ERROR] Logo Hashcheck Failed\n"); - free(ncch_ctx); - return Logo_Hashfail; - } - } - } - - free(ncch_ctx); - return 0; -} - - -u8* RetargetNCCH(FILE *fp, u64 size, u8 *TitleId, u8 *ProgramId, keys_struct *keys) -{ - u8 *ncch = malloc(size); - if(!ncch){ - fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); - return NULL; - } - ReadFile_64(ncch,size,0,fp); // Importing - - if(!IsNCCH(NULL,ncch)){ - free(ncch); - return NULL; - } - - NCCH_Header *hdr = NULL; - hdr = GetNCCH_CommonHDR(NULL,NULL,ncch); - - if(/*keys->rsa.RequiresPresignedDesc && */!IsCfa(hdr)){ - fprintf(stderr,"[NCCH ERROR] CXI's ID cannot be modified without the ability to resign the AccessDesc\n"); // Not yet yet, requires AccessDesc Privk, may implement anyway later - free(ncch); - return NULL; - } - - if((memcmp(TitleId,hdr->title_id,8) == 0) && (memcmp(ProgramId,hdr->program_id,8) == 0)) - return ncch;// if no modification is required don't do anything - - if(memcmp(TitleId,hdr->title_id,8) == 0){ // If TitleID Same, no crypto required, just resign. - memcpy(hdr->program_id,ProgramId,8); - SignCFA(ncch,(u8*)hdr,keys); - return ncch; - } - - ncch_key_type keytype = GetNCCHKeyType(hdr); - u8 *key = NULL; - - if(keytype == KeyIsUnFixed || keytype == KeyIsUnFixed2){ - fprintf(stderr,"[NCCH ERROR] Unknown aes key\n"); - free(ncch); - return NULL; - } - - - NCCH_STRUCT ncch_struct; - if(keytype != NoKey){ //Decrypting if necessary - GetCXIStruct(&ncch_struct,hdr); - u8 *romfs = (ncch+ncch_struct.romfs_offset); - key = GetNCCHKey(hdr,keys); - if(key == NULL){ - fprintf(stderr,"[NCCH ERROR] Failed to load ncch aes key\n"); - free(ncch); - return NULL; - } - CryptNCCHSection(romfs,ncch_struct.romfs_size,0,&ncch_struct,key,ncch_romfs); - } - - - memcpy(hdr->title_id,TitleId,8); - memcpy(hdr->program_id,ProgramId,8); - - //Checking New Fixed Key Type - keytype = GetNCCHKeyType(hdr); - - if(keytype != NoKey){ // Re-encrypting if necessary - GetCXIStruct(&ncch_struct,hdr); - u8 *romfs = (ncch+ncch_struct.romfs_offset); - key = GetNCCHKey(hdr,keys); - if(key == NULL){ - fprintf(stderr,"[NCCH ERROR] Failed to load ncch aes key\n"); - free(ncch); - return NULL; - } - CryptNCCHSection(romfs,ncch_struct.romfs_size,0,&ncch_struct,key,ncch_romfs); - } - - SignCFA(ncch,(u8*)hdr,keys); - - return ncch; -} - - -NCCH_Header* GetNCCH_CommonHDR(void *out, FILE *fp, u8 *buf) -{ - if(!fp && !buf) return NULL; - if(fp){ - if(!out) return NULL; - ReadFile_64(out,0x100,0x100,fp); - return (NCCH_Header*)out; - } - else{ - return (NCCH_Header*)(buf+0x100); - } -} - - -bool IsNCCH(FILE *fp, u8 *buf) -{ - if(!fp && !buf) return false; - NCCH_Header *ncchHDR = NULL; - bool result; - if(fp) { - ncchHDR = malloc(sizeof(NCCH_Header)); - GetNCCH_CommonHDR(ncchHDR,fp,NULL); - result = (memcmp(ncchHDR->magic,"NCCH",4) == 0); - free(ncchHDR); - } - else { - ncchHDR = GetNCCH_CommonHDR(ncchHDR,NULL,buf); - result = (memcmp(ncchHDR->magic,"NCCH",4) == 0); - } - return result; -} - -bool IsCfa(NCCH_Header* hdr) -{ - return (((hdr->flags[ContentType] & RomFS) == RomFS) && ((hdr->flags[ContentType] & ExeFS) != ExeFS)); -} - -u32 GetNCCH_MediaUnitSize(NCCH_Header* hdr) -{ - u16 version = u8_to_u16(hdr->version,LE); - u32 ret = 0; - if (version == 1) - ret = 1; - else if (version == 2 || version == 0) - ret = 1 << (hdr->flags[ContentUnitSize] + 9); - return ret; - //return 0x200*pow(2,hdr->flags[ContentUnitSize]); -} - -u32 GetNCCH_MediaSize(NCCH_Header* hdr) -{ - return u8_to_u32(hdr->content_size,LE); -} - -ncch_key_type GetNCCHKeyType(NCCH_Header* hdr) -{ - // Non-Secure Key Options - if((hdr->flags[OtherFlag] & NoCrypto) == NoCrypto) return NoKey; - if((hdr->flags[OtherFlag] & FixedCryptoKey) == FixedCryptoKey){ - if((hdr->program_id[4] & 0x10) == 0x10) return KeyIsSystemFixed; - else return KeyIsNormalFixed; - } - - // Secure Key Options - if(hdr->flags[SecureCrypto2] == 1) return KeyIsUnFixed2; - return KeyIsUnFixed; -} - -u8* GetNCCHKey(NCCH_Header* hdr, keys_struct *keys) -{ - ncch_key_type keytype = GetNCCHKeyType(hdr); - switch(keytype){ - case NoKey: return NULL; - case KeyIsNormalFixed: return keys->aes.NormalKey; - case KeyIsSystemFixed: - if(!keys->aes.SystemFixedKey) fprintf(stderr,"[NCCH WARNING] Unable to load SystemFixed Key\n"); - return keys->aes.SystemFixedKey; - case KeyIsUnFixed: - if(!keys->aes.UnFixedKey) fprintf(stderr,"[NCCH WARNING] Unable to load UnFixed Key\n"); - return keys->aes.UnFixedKey; - case KeyIsUnFixed2: - fprintf(stderr,"[NCCH WARNING] Crypto method (Secure2) not supported yet\n"); - return NULL; - } - return NULL; -} - -int GetNCCHSection(u8 *dest, u64 dest_max_size, u64 src_pos, u8 *ncch, NCCH_STRUCT *ncch_ctx, keys_struct *keys, ncch_section section) -{ - if(!ncch) return MEM_ERROR; - u8 *key = NULL; - NCCH_Header* hdr = GetNCCH_CommonHDR(NULL,NULL,ncch); - ncch_key_type keytype = GetNCCHKeyType(hdr); - - if(keytype != NoKey && (section == ncch_ExHeader || section == ncch_exefs || section == ncch_romfs)){ - key = GetNCCHKey(hdr,keys); - if(key == NULL){ - //fprintf(stderr,"[NCCH ERROR] Failed to load ncch aes key.\n"); - return UNABLE_TO_LOAD_NCCH_KEY; - } - } - //printf("detecting section type\n"); - u64 offset = 0; - u64 size = 0; - switch(section){ - case ncch_ExHeader: - offset = ncch_ctx->exheader_offset; - size = ncch_ctx->exheader_size; - break; - case ncch_Logo: - offset = ncch_ctx->logo_offset; - size = ncch_ctx->logo_size; - break; - case ncch_PlainRegion: - offset = ncch_ctx->plain_region_offset; - size = ncch_ctx->plain_region_size; - break; - case ncch_exefs: - offset = ncch_ctx->exefs_offset; - size = ncch_ctx->exefs_size; - break; - case ncch_romfs: - offset = ncch_ctx->romfs_offset; - size = ncch_ctx->romfs_size; - break; - } - if(!offset || !size) return NCCH_SECTION_NOT_EXIST; - - if(src_pos > size) return DATA_POS_DNE; - - size = min_u64(size-src_pos,dest_max_size); - - //printf("Copying data\n"); - u8 *section_pos = (ncch + offset + src_pos); - memcpy(dest,section_pos,size); - - //printf("decrypting if needed\n"); - if(keytype != NoKey && (section == ncch_ExHeader || section == ncch_exefs || section == ncch_romfs)){ // Decrypt - //memdump(stdout,"Key: ",key,16); - CryptNCCHSection(dest,size,src_pos,ncch_ctx,key,section); - //printf("no cigar\n"); - } - - return 0; -} - -int GetCXIStruct(NCCH_STRUCT *ctx, NCCH_Header *header) -{ - memcpy(ctx->titleID,header->title_id,8); - memcpy(ctx->programID,header->program_id,8); - - - u32 media_unit = GetNCCH_MediaUnitSize(header); - - ctx->version = u8_to_u16(header->version,LE); - if(!IsCfa(header)){ - ctx->exheader_offset = 0x200; - ctx->exheader_size = u8_to_u32(header->extended_header_size,LE) + 0x400; - ctx->logo_offset = (u64)(u8_to_u32(header->logo_region_offset,LE)*media_unit); - ctx->logo_size = (u64)(u8_to_u32(header->logo_region_size,LE)*media_unit); - ctx->plain_region_offset = (u64)(u8_to_u32(header->plain_region_offset,LE)*media_unit); - ctx->plain_region_size = (u64)(u8_to_u32(header->plain_region_size,LE)*media_unit); - ctx->exefs_offset = (u64)(u8_to_u32(header->exefs_offset,LE)*media_unit); - ctx->exefs_size = (u64)(u8_to_u32(header->exefs_size,LE)*media_unit); - ctx->exefs_hash_src_size = (u64)(u8_to_u32(header->exefs_hash_size,LE)*media_unit); - } - ctx->romfs_offset = (u64) (u8_to_u32(header->romfs_offset,LE)*media_unit); - ctx->romfs_size = (u64) (u8_to_u32(header->romfs_size,LE)*media_unit); - ctx->romfs_hash_src_size = (u64)(u8_to_u32(header->romfs_hash_size,LE)*media_unit); - return 0; -} - -void CryptNCCHSection(u8 *buffer, u64 size, u64 src_pos, NCCH_STRUCT *ctx, u8 key[16], u8 type) -{ - if(type < 1 || type > 3) - return; - u8 counter[0x10]; - ncch_get_counter(ctx,counter,type); - ctr_aes_context aes_ctx; - memset(&aes_ctx,0x0,sizeof(ctr_aes_context)); - ctr_init_counter(&aes_ctx, key, counter); - if(src_pos > 0){ - u32 carry = 0; - carry = align_value(src_pos,0x10); - carry = carry/0x10; - ctr_add_counter(&aes_ctx,carry); - } - ctr_crypt_counter(&aes_ctx, buffer, buffer, size); - return; -} - -void ncch_get_counter(NCCH_STRUCT *ctx, u8 counter[16], u8 type) -{ - u8 *titleID = ctx->titleID; - u32 i; - u32 x = 0; - - memset(counter, 0, 16); - - if (ctx->version == 2 || ctx->version == 0) - { - for(i=0; i<8; i++) - counter[i] = titleID[7-i]; - counter[8] = type; - } - else if (ctx->version == 1) - { - switch(type){ - case ncch_ExHeader : x = ctx->exheader_offset; break; - case ncch_exefs : x = ctx->exefs_offset; break; - case ncch_romfs : x = ctx->romfs_offset; break; - } - for(i=0; i<8; i++) - counter[i] = titleID[i]; - for(i=0; i<4; i++) - counter[12+i] = x>>((3-i)*8); - } - - //memdump(stdout,"CTR: ",counter,16); -} \ No newline at end of file diff --git a/ncch.h b/ncch.h deleted file mode 100644 index 69f4728..0000000 --- a/ncch.h +++ /dev/null @@ -1,236 +0,0 @@ -#ifndef _NCCH_H_ -#define _NCCH_H_ - -typedef enum -{ - NCCH_MEMERROR = -1, - SAVE_DATA_TOO_LARGE = -2, - NCCH_SECTION_NOT_EXIST = -3, - UNABLE_TO_LOAD_NCCH_KEY = -4, - NCCH_EXPORT_BUFFER_TOO_SMALL = -5, - NO_ROMFS_IN_CFA = -6, - NO_EXHEADER_IN_CXI = -7, - NO_EXEFS_IN_CXI = -8, - // SigCheck Errors - CXI_CORRUPT = -9, - ACCESSDESC_SIG_BAD = -10, - NCCH_HDR_SIG_BAD = -11, - // HashCheck Errors - ExHeader_Hashfail = -12, - Logo_Hashfail = -13, - ExeFs_Hashfail = -14, - RomFs_Hashfail = -15, - // Others - NCCH_BAD_YAML_SET = -16, - DATA_POS_DNE = -17, -} ncch_errors; - -typedef enum -{ - ncch_ExHeader = 1, - ncch_exefs, - ncch_romfs, - ncch_Logo, - ncch_PlainRegion, -} ncch_section; - -typedef enum -{ - NoKey, - KeyIsNormalFixed, - KeyIsSystemFixed, - KeyIsUnFixed, - KeyIsUnFixed2, -} ncch_key_type; - -typedef enum -{ - SecureCrypto2 = 3, - ContentPlatform = 4, - ContentType = 5, - ContentUnitSize = 6, - OtherFlag = 7 -} ncch_flags; - -typedef enum -{ - FixedCryptoKey = 0x1, - NoMountRomFs = 0x2, - NoCrypto = 0x4, -} ncch_otherflag_bitmask; - -typedef enum -{ - RomFS = 0x1, - ExeFS = 0x2, - SystemUpdate = 0x4, - Manual = 0x8, - Child = (0x4|0x8), - Trial = 0x10 -} ncch_content_bitmask; - -typedef struct -{ - u16 version; - u32 exheader_offset; - u32 exheader_size; - u64 logo_offset; - u64 logo_size; - u64 plain_region_offset; - u64 plain_region_size; - u64 exefs_offset; - u64 exefs_size; - u64 exefs_hash_src_size; - u64 romfs_offset; - u64 romfs_size; - u64 romfs_hash_src_size; - u8 titleID[8]; - u8 programID[8]; -}NCCH_STRUCT; - -typedef struct -{ - u8 magic[4]; - u8 content_size[4]; - u8 title_id[8]; - u8 maker_code[2]; - u8 version[2]; - u8 reserved_0[4]; - u8 program_id[8]; - u8 reserved_1[0x10]; - u8 logo_sha_256_hash[0x20]; - u8 product_code[0x10]; - u8 extended_header_sha_256_hash[0x20]; - u8 extended_header_size[4]; - u8 reserved_2[4]; - u8 flags[8]; - u8 plain_region_offset[4]; - u8 plain_region_size[4]; - u8 logo_region_offset[4]; - u8 logo_region_size[4]; - u8 exefs_offset[4]; - u8 exefs_size[4]; - u8 exefs_hash_size[4]; - u8 reserved_4[4]; - u8 romfs_offset[4]; - u8 romfs_size[4]; - u8 romfs_hash_size[4]; - u8 reserved_5[4]; - u8 exefs_sha_256_hash[0x20]; - u8 romfs_sha_256_hash[0x20]; -} NCCH_Header; - - -typedef struct -{ - keys_struct *keys; - rsf_settings *yaml_set; - COMPONENT_STRUCT *out; - - struct{ - u8 *PubK; - u8 *PrivK; - } CxiRsaKey; - - struct - { - u32 MediaSize; - bool IncludeExeFsLogo; - bool CompressCode; - bool UseOnSD; - bool Encrypt; - bool FreeProductCode; - bool IsCfa; - bool IsBuildingCodeSection; - bool UseRomFS; - } Options; - - struct - { - FILE *elf; - u64 elf_size; - - FILE *banner; - u64 banner_size; - - FILE *icon; - u64 icon_size; - - FILE *logo; - u64 logo_size; - - FILE *code; - u64 code_size; - - FILE *exheader; - u64 exheader_size; - - FILE *romfs; - u64 romfs_size; - - FILE *plainregion; - u64 plainregion_size; - } ComponentFilePtrs; - - struct - { - COMPONENT_STRUCT Code; - COMPONENT_STRUCT Banner; - COMPONENT_STRUCT Icon; - } ExeFs_Sections; - - struct - { - u32 TextAddress; - u32 TextSize; - u32 TextMaxPages; - u32 ROAddress; - u32 ROSize; - u32 ROMaxPages; - u32 DataAddress; - u32 DataSize; - u32 DataMaxPages; - u32 BSS_Size; - } CodeDetails; - - struct - { - u64 TotalContentSize; - COMPONENT_STRUCT CommonHeader; - COMPONENT_STRUCT ExHeader; - u64 LogoOffset; - COMPONENT_STRUCT Logo; - u64 PlainRegionOffset; - COMPONENT_STRUCT PlainRegion; - u64 ExeFsOffset; - COMPONENT_STRUCT ExeFs; - u64 RomFsOffset; - COMPONENT_STRUCT RomFs; - } Sections; - -} ncch_settings; - -#endif - -// NCCH Build Functions -int build_NCCH(user_settings *usrset); - - -// NCCH Read Functions -int VerifyNCCH(u8 *ncch, keys_struct *keys, bool SuppressOutput); - -u8* RetargetNCCH(FILE *fp, u64 size, u8 *TitleId, u8 *ProgramId, keys_struct *keys); - -NCCH_Header* GetNCCH_CommonHDR(void *out, FILE *fp, u8 *buf); -bool IsNCCH(FILE *fp, u8 *buf); -bool IsCfa(NCCH_Header* hdr); -u32 GetNCCH_MediaUnitSize(NCCH_Header* hdr); -u32 GetNCCH_MediaSize(NCCH_Header* hdr); -ncch_key_type GetNCCHKeyType(NCCH_Header* hdr); - -int GetNCCHSection(u8 *dest, u64 dest_max_size, u64 src_pos, u8 *ncch, NCCH_STRUCT *ncch_ctx, keys_struct *keys, ncch_section section); -u8* GetNCCHKey(NCCH_Header* hdr, keys_struct *keys); - -int GetCXIStruct(NCCH_STRUCT *ctx, NCCH_Header *header); -void ncch_get_counter(NCCH_STRUCT *ctx, u8 counter[16], u8 type); -void CryptNCCHSection(u8 *buffer, u64 size, u64 src_pos, NCCH_STRUCT *ctx, u8 key[16], u8 type); \ No newline at end of file diff --git a/ncsd.c b/ncsd.c deleted file mode 100644 index aa23987..0000000 --- a/ncsd.c +++ /dev/null @@ -1,564 +0,0 @@ -#include "lib.h" -#include "ncch.h" -#include "exheader.h" -#include "ncsd.h" - -// Private Prototypes - -/* RSA Crypto */ -int SignCCI(u8 *Signature, u8 *NCSD_HDR); -int CheckCCISignature(u8 *Signature, u8 *NCSD_HDR); - -/* cci_settings tools */ -void init_CCISettings(cci_settings *set); -int get_CCISettings(cci_settings *cciset, user_settings *usrset); -void free_CCISettings(cci_settings *set); - -/* CCI Data Gen/Write */ -int BuildNCSDHeader(cci_settings *cciset, user_settings *usrset); -int BuildCardInfoHeader(cci_settings *cciset, user_settings *usrset); -int WriteCCI_HDR_ToFile(cci_settings *cciset); -int WriteCCI_Content_ToFile(cci_settings *cciset,user_settings *usrset); -int WriteCCI_DummyBytes(cci_settings *cciset); - -/* Get Data from Content Files */ -int CheckContent0(cci_settings *cciset, user_settings *usrset); -int GetDataFromContent0(cci_settings *cciset, user_settings *usrset); -int GetContentFP(cci_settings *cciset, user_settings *usrset); - -/* Get Data from YAML Settings */ -int GetNCSDFlags(cci_settings *cciset, rsf_settings *yaml); -int GetMediaSize(cci_settings *cciset, user_settings *usrset); -u64 GetUnusedSize(u64 MediaSize, u8 CardType); -int GetWriteableAddress(cci_settings *cciset, user_settings *usrset); -int GetCardInfoBitmask(cci_settings *cciset, user_settings *usrset); - -int CheckMediaSize(cci_settings *cciset); - -static InternalCCI_Context ctx; - -// Code -int build_CCI(user_settings *usrset) -{ - int result = 0; - - // Init Settings - cci_settings *cciset = malloc(sizeof(cci_settings)); - if(!cciset) {fprintf(stderr,"[CCI ERROR] MEM ERROR\n"); return MEM_ERROR;} - init_CCISettings(cciset); - - // Get Settings - result = get_CCISettings(cciset,usrset); - if(result) goto finish; - - // Create Output File - cciset->out = fopen(usrset->outfile,"wb"); - if(!cciset->out){ - fprintf(stderr,"[CCI ERROR] Failed to create '%s'\n",usrset->outfile); - result = FAILED_TO_CREATE_OUTFILE; - goto finish; - } - - // Generate NCSD Header and Additional Header - result = BuildNCSDHeader(cciset,usrset); - if(result) goto finish; - BuildCardInfoHeader(cciset,usrset); - - // Write to File - WriteCCI_HDR_ToFile(cciset); - result = WriteCCI_Content_ToFile(cciset,usrset); - if(result) goto finish; - - // Fill out file if necessary - if(cciset->MediaFootPadding) WriteCCI_DummyBytes(cciset); - - // Close output file -finish: - if(result != FAILED_TO_CREATE_OUTFILE && cciset->out) fclose(cciset->out); - free_CCISettings(cciset); - return result; -} - - -int SignCCI(u8 *Signature, u8 *NCSD_HDR) -{ - return ctr_sig(NCSD_HDR,sizeof(NCSD_Header),Signature,ctx.keys->rsa.CCI_Pub,ctx.keys->rsa.CCI_Priv,RSA_2048_SHA256,CTR_RSA_SIGN); -} - -int CheckCCISignature(u8 *Signature, u8 *NCSD_HDR) -{ - return ctr_sig(NCSD_HDR,sizeof(NCSD_Header),Signature,ctx.keys->rsa.CCI_Pub,NULL,RSA_2048_SHA256,CTR_RSA_VERIFY); -} - -void init_CCISettings(cci_settings *set) -{ - memset(set,0,sizeof(cci_settings)); - memset(&ctx,0,sizeof(InternalCCI_Context)); -} - -int get_CCISettings(cci_settings *cciset, user_settings *usrset) -{ - ctx.keys = &usrset->keys; - int result = 0; - - /* Importing Data from Content */ - result = CheckContent0(cciset,usrset); - if(result) return result; - - result = GetDataFromContent0(cciset,usrset); - if(result) return result; - - result = GetContentFP(cciset,usrset); - if(result) return result; - - - - /* Getting Data from YAML */ - result = GetNCSDFlags(cciset,&usrset->yaml_set); - if(result) return result; - - result = GetMediaSize(cciset,usrset); - if(result) return result; - - result = CheckMediaSize(cciset); - if(result) return result; - - /** Card Info Header Data **/ - result = GetWriteableAddress(cciset,usrset); - if(result) return result; - - result = GetCardInfoBitmask(cciset,usrset); - if(result) return result; - - /* All Done */ - return 0; -} - -void free_CCISettings(cci_settings *set) -{ - if(set->content){ - for(int i = 1; i < 8; i++) { - if(set->content[i]) fclose(set->content[i]); - } - free(set->content); - } - free(set); -} - -int BuildNCSDHeader(cci_settings *cciset, user_settings *usrset) -{ - memcpy((u8*)ctx.commonHDR.magic,"NCSD",4); - u32_to_u8((u8*)ctx.commonHDR.media_size,(cciset->MediaSize/cciset->MediaUnitSize),LE); - memcpy((u8*)ctx.commonHDR.title_id,cciset->MediaID,8); - for(int i = 0; i < 8; i++){ - u32_to_u8((u8*)ctx.commonHDR.offsetsize_table[i].offset,(cciset->ContentOffset[i]/cciset->MediaUnitSize),LE); - u32_to_u8((u8*)ctx.commonHDR.offsetsize_table[i].size,(cciset->ContentSize[i]/cciset->MediaUnitSize),LE); - memcpy((u8*)ctx.commonHDR.partition_id_table[i],cciset->ContentTitleID[i],8); - } - memcpy((u8*)ctx.commonHDR.partition_flags,cciset->NCSD_Flags,8); - if(SignCCI(ctx.Signature,(u8*)&ctx.commonHDR) != Good){ - fprintf(stderr,"[CCI ERROR] Failed to sign CCI\n"); - return CCI_SIG_FAIL; - } - return 0; -} - -int BuildCardInfoHeader(cci_settings *cciset, user_settings *usrset) -{ - u32_to_u8((u8*)ctx.CardInfoHDR.writable_address,(cciset->WritableAddress/cciset->MediaUnitSize),LE); - u32_to_u8((u8*)ctx.CardInfoHDR.card_info_bitmask,cciset->CardInfoBitmask,BE); - u32_to_u8((u8*)ctx.CardInfoHDR.media_size_used,cciset->TotalContentSize,LE); - memcpy((u8*)ctx.CardInfoHDR.ncch_0_title_id,cciset->ContentTitleID[0],8); - memcpy((u8*)ctx.CardInfoHDR.initial_data,cciset->InitialData,0x30); - if(!(usrset->OmitImportedNcchHdr && !usrset->IsBuildingNCCH0)) - memcpy((u8*)ctx.CardInfoHDR.ncch_0_header,cciset->NCCH_HDR,0x100); - memcpy((u8*)ctx.DevCardInfoHDR.TitleKey,cciset->TitleKey,0x10); - return 0; -} - -int WriteCCI_HDR_ToFile(cci_settings *cciset) -{ - WriteBuffer(ctx.Signature,0x100,0,cciset->out); - WriteBuffer((u8*)&ctx.commonHDR,sizeof(NCSD_Header),0x100,cciset->out); - WriteBuffer((u8*)&ctx.CardInfoHDR,sizeof(CardInfo_Header),0x200,cciset->out); - WriteBuffer((u8*)&ctx.DevCardInfoHDR,sizeof(Dev_CardInfo_Header),0x1200,cciset->out); - return 0; -} - -int WriteCCI_Content_ToFile(cci_settings *cciset,user_settings *usrset) -{ - // Write Content 0 - WriteBuffer(cciset->ncch0,cciset->ContentSize[0],cciset->ContentOffset[0],cciset->out); - free(usrset->Content0.buffer); - usrset->Content0.buffer = NULL; - usrset->Content0.size = 0; - - // Add additional contents, recreating them with their new TitleID - for(int i = 1; i < 8; i++){ - if(cciset->content[i]){ - u8 *ContentBuff = RetargetNCCH(cciset->content[i],cciset->ContentSize[i],cciset->ContentTitleID[i],cciset->MediaID,ctx.keys); - if(!ContentBuff){ - fprintf(stderr,"[CCI ERROR] Could not import content %d to CCI\n",i); - return FAILED_TO_IMPORT_FILE; - } - WriteBuffer(ContentBuff,cciset->ContentSize[i],cciset->ContentOffset[i],cciset->out); - free(ContentBuff); - } - } - return 0; -} - -int WriteCCI_DummyBytes(cci_settings *cciset) -{ - // Seeking end of CCI Data - fseek_64(cciset->out,cciset->TotalContentSize,SEEK_SET); - - // Determining Size of Dummy Bytes - u64 len = cciset->MediaSize - cciset->TotalContentSize; - - // Creating Buffer of Dummy Bytes - u8 dummy_bytes[cciset->MediaUnitSize]; - memset(&dummy_bytes,0xff,cciset->MediaUnitSize); - - // Writing Dummy Bytes to file - for(u64 i = 0; i < len; i += cciset->MediaUnitSize){ - fwrite(&dummy_bytes,cciset->MediaUnitSize,1,cciset->out); - } - - return 0; -} - -int GetContentFP(cci_settings *cciset, user_settings *usrset) -{ - cciset->content = malloc(sizeof(FILE*)*8); - if(!cciset->content){ - fprintf(stderr,"[CCI ERROR] MEM ERROR\n"); - return MEM_ERROR; - } - memset(cciset->content,0,sizeof(FILE*)*8); - - for(int i = 1; i < 8; i++){ - if(usrset->ContentPath[i]){ - cciset->content[i] = fopen(usrset->ContentPath[i],"rb"); - if(!cciset->content[i]){ // Checking if file could be opened - fprintf(stderr,"[CCI ERROR] Failed to create '%s'\n",usrset->outfile); - return FAILED_TO_OPEN_FILE; - } - if(!IsNCCH(cciset->content[i],NULL)){ // Checking if NCCH - fprintf(stderr,"[CCI ERROR] Content '%s' is invalid\n",usrset->ContentPath[i]); - return NCSD_INVALID_NCCH0; - } - - // Getting NCCH Header - NCCH_Header *hdr = malloc(sizeof(NCCH_Header));; - GetNCCH_CommonHDR(hdr,cciset->content[i],NULL); - - if(GetNCCH_MediaUnitSize(hdr) != cciset->MediaUnitSize){ // Checking if Media Unit Size matches CCI - fprintf(stderr,"[CCI ERROR] Content '%s' is invalid\n",usrset->ContentPath[i]); - return NCSD_INVALID_NCCH0; - } - - memcpy(&cciset->ContentTitleID[i],cciset->MediaID,8); // Set TitleID - - // Modify TitleID Accordingly - u16 tmp = u8_to_u16(&hdr->title_id[6],LE); - tmp |= (i+4); - u16_to_u8(&cciset->ContentTitleID[i][6],tmp,LE); - - cciset->ContentSize[i] = GetNCCH_MediaSize(hdr)*cciset->MediaUnitSize; - cciset->ContentOffset[i] = cciset->TotalContentSize; - - cciset->TotalContentSize += cciset->ContentSize[i]; - - free(hdr); - } - } - return 0; -} - -int CheckContent0(cci_settings *cciset, user_settings *usrset) -{ - if(!usrset->Content0.size) - return NCSD_NO_NCCH0; - cciset->ncch0 = usrset->Content0.buffer; - cciset->ncch0_FileLen = usrset->Content0.size; - - if(!IsNCCH(NULL,cciset->ncch0)) - return NCSD_INVALID_NCCH0; - - return 0; -} - -int GetDataFromContent0(cci_settings *cciset, user_settings *usrset) -{ - cciset->TotalContentSize = 0x4000; - - NCCH_Header *hdr; - - hdr = GetNCCH_CommonHDR(NULL,NULL,cciset->ncch0); - - cciset->NCCH_HDR = hdr; - - u16 ncch_format_ver = u8_to_u16(hdr->version,LE); - if(ncch_format_ver != 0 && ncch_format_ver != 2){ - fprintf(stderr,"[CCI ERROR] NCCH type %d Not Supported\n",ncch_format_ver); - return FAILED_TO_IMPORT_FILE; - } - - //memdump(stdout,"ncch0 head: ",(cciset->ncch0+0x100),0x100); - //memdump(stdout,"ncch0 head: ",(u8*)(hdr),0x100); - - memcpy(cciset->MediaID,hdr->title_id,8); - memcpy(&cciset->ContentTitleID[0],hdr->title_id,8); - if(usrset->GenSDKCardInfoHeader){ - memcpy(cciset->InitialData,Stock_InitialData,0x30); - memcpy(cciset->TitleKey,Stock_TitleKey,0x10); - } - else{ - u8 Hash[0x40]; - ctr_sha(cciset->ncch0,0x80,Hash,CTR_SHA_256); - ctr_sha((cciset->ncch0+0x80),0x80,(Hash+0x20),CTR_SHA_256); - memcpy(cciset->InitialData,Hash,0x2C); - //memcpy(cciset->TitleKey,(Hash+0x30),0x10); // Might Remove - } - - - cciset->NCSD_Flags[MediaUnitSize] = hdr->flags[ContentUnitSize]; - cciset->MediaUnitSize = GetNCCH_MediaUnitSize(hdr); - - cciset->ContentSize[0] = (u64)(GetNCCH_MediaSize(hdr) * cciset->MediaUnitSize); - cciset->ContentOffset[0] = cciset->TotalContentSize; - - cciset->TotalContentSize += cciset->ContentSize[0]; - return 0; -} - -int GetMediaSize(cci_settings *cciset, user_settings *usrset) -{ - char *MediaSizeStr = usrset->yaml_set.BasicInfo.MediaSize; - if(!MediaSizeStr) cciset->MediaSize = (u64)GB*2; - else{ - if(strcasecmp(MediaSizeStr,"128MB") == 0) cciset->MediaSize = (u64)MB*128; - else if(strcasecmp(MediaSizeStr,"256MB") == 0) cciset->MediaSize = (u64)MB*256; - else if(strcasecmp(MediaSizeStr,"512MB") == 0) cciset->MediaSize = (u64)MB*512; - else if(strcasecmp(MediaSizeStr,"1GB") == 0) cciset->MediaSize = (u64)GB*1; - else if(strcasecmp(MediaSizeStr,"2GB") == 0) cciset->MediaSize = (u64)GB*2; - else if(strcasecmp(MediaSizeStr,"4GB") == 0) cciset->MediaSize = (u64)GB*4; - else if(strcasecmp(MediaSizeStr,"8GB") == 0) cciset->MediaSize = (u64)GB*8; - else if(strcasecmp(MediaSizeStr,"16GB") == 0) cciset->MediaSize = (u64)GB*16; - else if(strcasecmp(MediaSizeStr,"32GB") == 0) cciset->MediaSize = (u64)GB*32; - else { - fprintf(stderr,"[CCI ERROR] Invalid MediaSize: %s\n",MediaSizeStr); - return INVALID_YAML_OPT; - } - } - - if(usrset->yaml_set.BasicInfo.MediaFootPadding != -1) cciset->MediaFootPadding = usrset->yaml_set.BasicInfo.MediaFootPadding; - - return 0; -} - -u64 GetUnusedSize(u64 MediaSize, u8 CardType) -{ - if(CardType == CARD1){ - switch(MediaSize){ - case (u64)MB*128: return (u64)2621440; - case (u64)MB*256: return (u64)5242880; - case (u64)MB*512: return (u64)10485760; - case (u64)GB*1: return (u64)73924608; - case (u64)GB*2: return (u64)147324928; - case (u64)GB*4: return (u64)294649856; - case (u64)GB*8: return (u64)587202560; - default: return (u64)((MediaSize/MB)*0x11800); // Aprox - } - } - else if(CardType == CARD2){ - switch(MediaSize){ - case (u64)MB*512: return (u64)37224448; - case (u64)GB*1: return (u64)73924608; - case (u64)GB*2: return (u64)147324928; - case (u64)GB*4: return (u64)294649856; - case (u64)GB*8: return (u64)587202560; - default: return (u64)((MediaSize/MB)*0x11800); // Aprox - } - } - return 0; -} - -int GetNCSDFlags(cci_settings *cciset, rsf_settings *yaml) -{ - /* BackupWriteWaitTime */ - cciset->NCSD_Flags[FW6x_BackupWriteWaitTime] = 0; - if(yaml->CardInfo.BackupWriteWaitTime){ - u32 WaitTime = strtoul(yaml->CardInfo.BackupWriteWaitTime,NULL,0); - if(WaitTime > 255){ - fprintf(stderr,"[CCI ERROR] Invalid Card BackupWriteWaitTime (%d) : must 0-255\n",WaitTime); - return EXHDR_BAD_YAML_OPT; - } - cciset->NCSD_Flags[FW6x_BackupWriteWaitTime] = (u8)WaitTime; - } - - /* FW6x SaveCrypto */ - cciset->NCSD_Flags[FW6x_SaveCryptoFlag] = 1; - - /* MediaType */ - if(!yaml->CardInfo.MediaType) cciset->NCSD_Flags[MediaTypeIndex] = CARD1; - else{ - if(strcasecmp(yaml->CardInfo.MediaType,"Card1") == 0) cciset->NCSD_Flags[MediaTypeIndex] = CARD1; - else if(strcasecmp(yaml->CardInfo.MediaType,"Card2") == 0) cciset->NCSD_Flags[MediaTypeIndex] = CARD2; - else { - fprintf(stderr,"[CCI ERROR] Invalid MediaType: %s\n",yaml->CardInfo.MediaType); - return INVALID_YAML_OPT; - } - } - - /* Platform */ - cciset->NCSD_Flags[MediaPlatformIndex] = CTR; - /* - if(!yaml->TitleInfo.Platform) cciset->NCSD_Flags[MediaPlatformIndex] = CTR; - else{ - if(strcasecmp(yaml->TitleInfo.Platform,"ctr") == 0) cciset->NCSD_Flags[MediaPlatformIndex] = CTR; - else { - fprintf(stderr,"[CCI ERROR] Invalid Platform: %s\n",yaml->TitleInfo.Platform); - return INVALID_YAML_OPT; - } - } - */ - - /* CardDevice */ - if(!yaml->CardInfo.CardDevice) cciset->NCSD_Flags[CardDeviceFlag] = CARD_DEVICE_NONE; - else{ - if(strcmp(yaml->CardInfo.CardDevice,"NorFlash") == 0) { - cciset->NCSD_Flags[CardDeviceFlag] = CARD_DEVICE_NOR_FLASH; - if(cciset->NCSD_Flags[MediaTypeIndex] == CARD2){ - fprintf(stderr,"[CCI WARNING] 'CardDevice: NorFlash' is invalid on Card2\n"); - cciset->NCSD_Flags[CardDeviceFlag] = CARD_DEVICE_NONE; - } - } - else if(strcmp(yaml->CardInfo.CardDevice,"None") == 0) cciset->NCSD_Flags[CardDeviceFlag] = CARD_DEVICE_NONE; - else if(strcmp(yaml->CardInfo.CardDevice,"BT") == 0) cciset->NCSD_Flags[CardDeviceFlag] = CARD_DEVICE_BT; - else { - fprintf(stderr,"[CCI ERROR] Invalid CardDevice: %s\n",yaml->CardInfo.CardDevice); - return INVALID_YAML_OPT; - } - } - return 0; -} - -int GetWriteableAddress(cci_settings *cciset, user_settings *usrset) -{ - int result = GetSaveDataSize_yaml(&cciset->SaveDataSize,usrset); - if(result) return result; - - char *WriteableAddressStr = usrset->yaml_set.CardInfo.WritableAddress;; - - cciset->WritableAddress = -1; - if(cciset->NCSD_Flags[MediaTypeIndex] != CARD2) return 0; // Can only be set for Card2 Media - - if(WriteableAddressStr){ - if(strncmp(WriteableAddressStr,"0x",2) != 0){ - fprintf(stderr,"[CCI ERROR] WritableAddress requires a Hexadecimal value\n"); - return INVALID_YAML_OPT; - } - cciset->WritableAddress = strtoul((WriteableAddressStr+2),NULL,16); - } - if(cciset->WritableAddress == -1){ // If not set manually or is max size - if ((cciset->MediaSize / 2) < cciset->SaveDataSize){ // If SaveData size is greater than half the MediaSize - u64 saveDataSize = cciset->SaveDataSize / KB; - fprintf(stderr,"[CCI ERROR] Too large SaveDataSize %luK\n",saveDataSize); - return SAVE_DATA_TOO_LARGE; - } - if (cciset->SaveDataSize > (u64)(2047*MB)){ // Limit set by Nintendo - u64 saveDataSize = cciset->SaveDataSize / KB; - fprintf(stderr,"[CCI ERROR] Too large SaveDataSize %luK\n",saveDataSize); - return SAVE_DATA_TOO_LARGE; - } - u64 UnusedSize = GetUnusedSize(cciset->MediaSize,cciset->NCSD_Flags[MediaTypeIndex]); // Need to look into this - cciset->WritableAddress = cciset->MediaSize - UnusedSize - cciset->SaveDataSize; - } - return 0; -} - -int GetCardInfoBitmask(cci_settings *cciset, user_settings *usrset) -{ - char *str = usrset->yaml_set.CardInfo.CardType; - if(!str) cciset->CardInfoBitmask |= 0; - else{ - if(strcasecmp(str,"s1") == 0) cciset->CardInfoBitmask |= 0; - else if(strcasecmp(str,"s2") == 0) cciset->CardInfoBitmask |= 0x20; - else { - fprintf(stderr,"[CCI ERROR] Invalid CardType: %s\n",str); - return INVALID_YAML_OPT; - } - } - - str = usrset->yaml_set.CardInfo.CryptoType; - if(!str) cciset->CardInfoBitmask |= (3*0x40); - else{ - int Value = strtol(str,NULL,10); - if(Value < 0 || Value > 3) { - fprintf(stderr,"[CCI ERROR] Invalid CryptoType: %s\n",str); - return INVALID_YAML_OPT; - } - if(Value != 3){ - fprintf(stderr,"[CCI WARNING] Card crypto type = '%d'\n",Value); - } - cciset->CardInfoBitmask |= (Value*0x40); - } - - return 0; -} - -int CheckMediaSize(cci_settings *cciset) -{ - if(cciset->TotalContentSize > cciset->MediaSize){ - char *MediaSizeStr = NULL; - switch(cciset->MediaSize){ - case (u64)128*MB: MediaSizeStr = " '128MB'"; break; - case (u64)256*MB: MediaSizeStr = " '256MB'"; break; - case (u64)512*MB: MediaSizeStr = " '512MB'"; break; - case (u64)1*GB: MediaSizeStr = " '1GB'"; break; - case (u64)2*GB: MediaSizeStr = " '2GB'"; break; - case (u64)4*GB: MediaSizeStr = " '4GB'"; break; - case (u64)8*GB: MediaSizeStr = " '8GB'"; break; - case (u64)16*GB: MediaSizeStr = " '16GB'"; break; - case (u64)32*GB: MediaSizeStr = " '32GB'"; break; - default: MediaSizeStr = ""; break; - } - fprintf(stderr,"[CCI ERROR] MediaSize%s is too Small\n",MediaSizeStr); - return INVALID_YAML_OPT; - } - return 0; -} - -bool IsCci(u8 *ncsd) -{ - NCSD_Header *hdr = (NCSD_Header*)(ncsd+0x100); - if(!hdr) return false; - if(memcmp(hdr->magic,"NCSD",4)!=0) return false; - if(hdr->partition_flags[MediaPlatformIndex] != CTR) return false; - if(hdr->partition_flags[MediaTypeIndex] != CARD1 && hdr->partition_flags[MediaTypeIndex] != CARD2) return false; - return true; -} - -u8* GetPartition(u8 *ncsd, u8 index) -{ - return (u8*)(ncsd+GetPartitionOffset(ncsd,index)); -} - - -u64 GetPartitionOffset(u8 *ncsd, u8 index) -{ - NCSD_Header *hdr = (NCSD_Header*)(ncsd+0x100); - u32 media_size = 0x200*pow(2,hdr->partition_flags[MediaUnitSize]); - u32 offset = u8_to_u64(hdr->offsetsize_table[index].offset,LE); - return offset*media_size; -} - -u64 GetPartitionSize(u8 *ncsd, u8 index) -{ - NCSD_Header *hdr = (NCSD_Header*)(ncsd+0x100); - u32 media_size = 0x200*pow(2,hdr->partition_flags[MediaUnitSize]); - u32 size = u8_to_u64(hdr->offsetsize_table[index].size,LE); - return size*media_size; -} diff --git a/ncsd.h b/ncsd.h deleted file mode 100644 index cb96145..0000000 --- a/ncsd.h +++ /dev/null @@ -1,163 +0,0 @@ -#ifndef _NCSD_H_ -#define _NCSD_H_ - - -// Enums -typedef enum -{ - NCSD_NO_NCCH0 = -1, - NCSD_INVALID_NCCH0 = -2, - INVALID_YAML_OPT = -3, - CCI_SIG_FAIL = -4, - -} ncsd_errors; - -typedef enum -{ - FW6x_BackupWriteWaitTime = 0, - FW6x_SaveCryptoFlag = 1, - CardDeviceFlag = 3, - MediaPlatformIndex = 4, - MediaTypeIndex = 5, - MediaUnitSize = 6, - OldCardDeviceFlag = 7 -} FlagIndex; - -typedef enum -{ - CARD_DEVICE_NOR_FLASH = 1, - CARD_DEVICE_NONE = 2, - CARD_DEVICE_BT = 3 -} _CardDevice; - -typedef enum -{ - CTR = 1, -} _PlatformIndex; - -typedef enum -{ - INNER_DEVICE, - CARD1, - CARD2, - EXTENDED_DEVICE -} _TypeIndex; - -// Structs -typedef struct -{ - u8 offset[4]; - u8 size[4]; -} partition_offsetsize; - -typedef struct -{ - u8 magic[4]; - u8 media_size[4]; - u8 title_id[8]; - u8 partitions_fs_type[8]; - u8 partitions_crypto_type[8]; - partition_offsetsize offsetsize_table[8]; - u8 exheader_hash[0x20]; - u8 additional_header_size[0x4]; - u8 sector_zero_offset[0x4]; - u8 partition_flags[8]; - u8 partition_id_table[8][8]; - u8 reserved[0x30]; -} NCSD_Header; - -typedef struct -{ - u8 writable_address[4]; - u8 card_info_bitmask[4]; - // Notes - u8 reserved_0[0xf8]; - u8 media_size_used[8]; - u8 reserved_1[0x18]; - u8 cver_title_id[8]; - u8 cver_title_version[2]; - u8 reserved_2[0xcd6]; - // - u8 ncch_0_title_id[8]; - u8 reserved_3[8]; - u8 initial_data[0x30]; - u8 reserved_4[0xc0]; - u8 ncch_0_header[0x100]; -} CardInfo_Header; - -typedef struct -{ - u8 CardDeviceReserved1[0x200]; - u8 TitleKey[0x10]; - u8 CardDeviceReserved2[0xf0]; -} Dev_CardInfo_Header; - -typedef struct -{ - u8 Signature[0x100]; - NCSD_Header commonHDR; - CardInfo_Header CardInfoHDR; - Dev_CardInfo_Header DevCardInfoHDR; - u8 *ContentImportBuffer; - keys_struct *keys; -} InternalCCI_Context; - -typedef struct -{ - u64 MediaSize; - u8 MediaID[8]; - u8 NCSD_Flags[8]; - u64 SaveDataSize; - u64 WritableAddress; - u32 CardInfoBitmask; - - u8 InitialData[0x30]; - NCCH_Header *NCCH_HDR; - u8 TitleKey[0x10]; - - u8 *ncch0; - u64 ncch0_FileLen; - FILE **content; - u64 ContentSize[CCI_MAX_CONTENT]; - u64 ContentOffset[CCI_MAX_CONTENT]; - u8 ContentTitleID[CCI_MAX_CONTENT][8]; - u64 TotalContentSize; - - bool MediaFootPadding; - u32 MediaUnitSize; - - FILE *out; -} cci_settings; - -static const u8 Stock_InitialData[0x30] = -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xAD, 0x88, - 0xAC, 0x41, 0xA2, 0xB1, 0x5E, 0x8F, - 0x66, 0x9C, 0x97, 0xE5, 0xE1, 0x5E, - 0xA3, 0xEB, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static const u8 Stock_TitleKey[0x10] = -{ - 0x6E, 0xC7, 0x5F, 0xB2, 0xE2, 0xB4, - 0x87, 0x46, 0x1E, 0xDD, 0xCB, 0xB8, - 0x97, 0x11, 0x92, 0xBA -}; - -#endif - -// Public Prototypes - - -// Build Functions -int build_CCI(user_settings *usrset); - -// Read Functions -bool IsCci(u8 *ncsd); -u8* GetPartition(u8 *ncsd, u8 index); -u64 GetPartitionOffset(u8 *ncsd, u8 index); -u64 GetPartitionSize(u8 *ncsd, u8 index); \ No newline at end of file diff --git a/romfs.c b/romfs.c deleted file mode 100644 index 7a0adcd..0000000 --- a/romfs.c +++ /dev/null @@ -1,39 +0,0 @@ -#include "lib.h" -#include "ncch.h" -#include "romfs.h" - -// RomFs Build Functions - -int ImportRomFsBinaryFromFile(ncch_settings *ncchset); - -int BuildRomFs(ncch_settings *ncchset) -{ - int result = 0; - - // If Not Using RomFS Return - if(!ncchset->Options.UseRomFS) return result; - - if(ncchset->ComponentFilePtrs.romfs){ // The user has specified a pre-built RomFs Binary - result = ImportRomFsBinaryFromFile(ncchset); - return result; - } - - // Need to implement RomFs generation - - return result; -} - -int ImportRomFsBinaryFromFile(ncch_settings *ncchset) -{ - ncchset->Sections.RomFs.size = ncchset->ComponentFilePtrs.romfs_size; - ncchset->Sections.RomFs.buffer = malloc(ncchset->Sections.RomFs.size); - if(!ncchset->Sections.RomFs.buffer) {fprintf(stderr,"[ROMFS ERROR] MEM ERROR\n"); return MEM_ERROR;} - ReadFile_64(ncchset->Sections.RomFs.buffer,ncchset->Sections.RomFs.size,0,ncchset->ComponentFilePtrs.romfs); - if(memcmp(ncchset->Sections.RomFs.buffer,"IVFC",4) != 0){ - fprintf(stderr,"[ROMFS ERROR] Invalid RomFS Binary.\n"); - return INVALID_ROMFS_FILE; - } - return 0; -} - -// RomFs Read Functions \ No newline at end of file diff --git a/romfs.h b/romfs.h deleted file mode 100644 index 34dcc1a..0000000 --- a/romfs.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef _ROMFS_H_ -#define _ROMFS_H_ - -typedef enum -{ - INVALID_ROMFS_FILE = -10, -} romfs_errors; - -#endif - -// RomFs Build Functions - -int BuildRomFs(ncch_settings *ncchset); - -// RomFs Read Functions \ No newline at end of file diff --git a/srl.h b/srl.h deleted file mode 100644 index e4d1661..0000000 --- a/srl.h +++ /dev/null @@ -1,96 +0,0 @@ -#ifndef _SRL_H_ -#define _SRL_H_ - -typedef struct -{ - u8 game_title[0xC]; - u8 game_code[4]; - u8 maker_code[2]; - u8 unit_code; - u8 encryption_seed_select; - u8 device_capacity; - u8 reserved_0[9]; - u8 rom_version; - u8 internal_flag; - u8 arm9_rom_offset[4]; - u8 arm9_entry_address[4]; - u8 arm9_ram_address[4]; - u8 arm9_size[4]; - u8 arm7_rom_offset[4]; - u8 arm7_entry_address[4]; - u8 arm7_ram_address[4]; - u8 arm7_size[4]; - u8 fnt_offset[4]; - u8 fnt_size[4]; - u8 fat_offset[4]; - u8 fat_size[4]; - u8 arm9_overlay_offset[4]; - u8 arm9_overlay_size[4]; - u8 arm7_overlay_offset[4]; - u8 arm7_overlay_size[4]; - u8 normal_card_control_reg_settings[4]; - u8 secure_card_control_reg_settings[4]; - u8 icon_banner_offset[4]; - u8 secure_area_crc[2]; - u8 secure_transfer_timeout[2]; - u8 arm9_autoload[4]; - u8 arm7_autoload[4]; - u8 secure_disable[8]; - u8 ntr_rom_size[4]; - u8 header_size[4]; - u8 reserved_1[0x38]; - u8 nintendo_logo[0x9C]; - u8 nintendo_logo_crc[2]; - u8 header_crc[2]; - u8 debug_reserved[0x20]; - - //TWL Only Data - u8 config_settings[0x34]; - u8 access_control[4]; - u8 arm7_scfg_ext_mask[4]; - u8 reserved_flags[4]; - u8 arm9i_rom_offset[4]; - u8 reserved_2[4]; - u8 arm9i_load_address[4]; - u8 arm9i_size[4]; - u8 arm7i_rom_offset[4]; - u8 struct_param_base_address[4]; - u8 arm7i_load_address[4]; - u8 arm7i_size[4]; - u8 digest_ntr_region_offset[4]; - u8 digest_ntr_region_size[4]; - u8 digest_twl_region_offset[4]; - u8 digest_twl_region_size[4]; - u8 digest_sector_hashtable_offset[4]; - u8 digest_sector_hashtable_size[4]; - u8 digest_block_hashtable_offset[4]; - u8 digest_block_hashtable_size[4]; - u8 digest_sector_size[4]; - u8 digest_block_sectorcount[4]; - u8 reserved_3[8]; - u8 twl_rom_size[8]; - u8 unknown[8]; - u8 modcrypt_area_1_offset[4]; - u8 modcrypt_area_1_size[4]; - u8 modcrypt_area_2_offset[4]; - u8 modcrypt_area_2_size[4]; - u8 title_id[8]; - u8 pub_save_data_size[4]; - u8 priv_save_data_size[4]; - u8 reserved_4[0xC0]; - - // TWL and Signed NTR - u8 arm9_with_sec_area_sha1_hmac[0x14]; - u8 arm7_sha1_hmac[0x14]; - u8 digest_master_sha1_hmac[0x14]; - u8 banner_sha1_hmac[0x14]; - u8 arm9i_sha1_hmac[0x14]; - u8 arm7i_sha1_hmac[0x14]; - u8 reserved_5[0x28]; - u8 arm9_sha1_hmac[0x14]; - u8 reserved_6[0xA4C]; - u8 reserved_7[0x180]; - u8 signature[0x80]; -} SRL_Header; - -#endif \ No newline at end of file diff --git a/tik.c b/tik.c deleted file mode 100644 index da05d53..0000000 --- a/tik.c +++ /dev/null @@ -1,86 +0,0 @@ -#include "lib.h" -#include "cia.h" -#include "tik.h" - -// Private Prototypes -int SetupTicketBuffer(COMPONENT_STRUCT *tik); -int SetupTicketHeader(TicketStruct *hdr, cia_settings *ciaset); -int SignTicketHeader(TicketStruct *hdr, TicketSignatureStruct *sig, keys_struct *keys); -void SetContentIndexData(u8 *dest); - - -int BuildTicket(cia_settings *ciaset) -{ - int result = 0; - result = SetupTicketBuffer(&ciaset->CIA_Sections.Ticket); - if(result) return result; - - // Setting Ticket Struct Ptrs - TicketSignatureStruct *sig = (TicketSignatureStruct*)ciaset->CIA_Sections.Ticket.buffer; - TicketStruct *hdr = (TicketStruct*)(ciaset->CIA_Sections.Ticket.buffer+sizeof(TicketSignatureStruct)); - - result = SetupTicketHeader(hdr,ciaset); - if(result) return result; - result = SignTicketHeader(hdr,sig,ciaset->keys); - return 0; -} - -int SetupTicketBuffer(COMPONENT_STRUCT *tik) -{ - tik->size = sizeof(TicketSignatureStruct) + sizeof(TicketStruct); - tik->buffer = malloc(tik->size); - if(!tik->buffer) { fprintf(stderr,"[ERROR] MEM ERROR\n"); return MEM_ERROR; } - memset(tik->buffer,0,tik->size); - return 0; -} - -int SetupTicketHeader(TicketStruct *hdr, cia_settings *ciaset) -{ - memset(hdr,0,sizeof(TicketStruct)); - - memcpy(hdr->Issuer,ciaset->tik.TicketIssuer,0x40); - hdr->TicketFormatVersion = ciaset->tik.ticket_format_ver; - hdr->ca_crl_version = ciaset->cert.ca_crl_version; - hdr->signer_crl_version = ciaset->cert.signer_crl_version; - if(ciaset->content.EncryptContents) - CryptTitleKey(hdr->EncryptedTitleKey, ciaset->tik.TitleKey,ciaset->TitleID,ciaset->keys,ENC); - memcpy(hdr->TicketID,ciaset->tik.TicketID,8); - memcpy(hdr->DeviceID,ciaset->tik.DeviceID,8); - memcpy(hdr->TitleID,ciaset->TitleID,8); - memcpy(hdr->TicketVersion,ciaset->tik.TicketVersion,2); - hdr->CommonKeyID = ciaset->keys->aes.CurrentCommonKey; - SetContentIndexData(hdr->StaticData); - return 0; -} - -int SignTicketHeader(TicketStruct *hdr, TicketSignatureStruct *sig, keys_struct *keys) -{ - memset(sig,0,sizeof(TicketSignatureStruct)); - u32_to_u8(sig->sig_type,RSA_2048_SHA256,BE); - return ctr_sig((u8*)hdr,sizeof(TicketStruct),sig->data,keys->rsa.TIK_Pub,keys->rsa.TIK_Priv,RSA_2048_SHA256,CTR_RSA_SIGN); -} - -int CryptTitleKey(u8 *EncTitleKey, u8 *DecTitleKey, u8 *TitleID, keys_struct *keys, u8 mode) -{ - //Generating IV - u8 iv[16]; - memset(&iv,0x0,16); - memcpy(iv,TitleID,0x8); - - //Setting up Aes Context - ctr_aes_context ctx; - memset(&ctx,0x0,sizeof(ctr_aes_context)); - - //Crypting TitleKey - ctr_init_aes_cbc(&ctx,keys->aes.CommonKey[keys->aes.CurrentCommonKey],iv,mode); - if(mode == ENC) ctr_aes_cbc(&ctx,DecTitleKey,EncTitleKey,0x10,ENC); - else ctr_aes_cbc(&ctx,EncTitleKey,DecTitleKey,0x10,DEC); - - // Return - return 0; -} - -void SetContentIndexData(u8 *dest) -{ - memcpy(dest,normal_static_ticket_data,0x30); -} diff --git a/tik.h b/tik.h deleted file mode 100644 index 694faac..0000000 --- a/tik.h +++ /dev/null @@ -1,80 +0,0 @@ -#ifndef _TIK_H_ -#define _TIK_H_ - -static const unsigned char normal_static_ticket_data[0x30] = -{ - 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0xAC, - 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x14, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x84, - 0x00, 0x00, 0x00, 0x84, 0x00, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 -}; - -/* -static const unsigned char system_static_ticket_data[0x30] = -{ - 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0xAC, - 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x14, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x84, - 0x00, 0x00, 0x00, 0x84, 0x00, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00 -}; -*/ -typedef enum -{ - lic_Permanent = 0, - lic_Demo = 1, - lic_Trial = 2, - lic_Rental = 3, - lic_Subscription = 4, - lic_Service = 5, - lic_Mask = 15 -} ticket_license_type; - -typedef enum -{ - right_Permanent = 1, - right_Subscription = 2, - right_Content = 3, - right_ContentConsumption = 4, - right_AccessTitle = 5 -} ticket_item_rights; - -typedef struct -{ - u8 sig_type[4]; - u8 data[0x100]; - u8 padding[0x3C]; -} TicketSignatureStruct; - -typedef struct -{ - u8 Issuer[0x40]; - u8 ECDH[0x3c]; - u8 TicketFormatVersion; - u8 ca_crl_version; - u8 signer_crl_version; - u8 EncryptedTitleKey[0x10]; - u8 unknown_0; - u8 TicketID[8]; - u8 DeviceID[4]; - u8 TitleID[8]; - u8 unknown_1[2]; - u8 TicketVersion[2]; - u8 unused_0[8]; - u8 unused_1; - u8 CommonKeyID; - u8 unused_2[0x2F]; - u8 unknown_2; - u8 unused_3[0x82]; - u8 StaticData[0x30]; - u8 unused_4[0x7C]; -} TicketStruct; - -#endif - -// Prototypes -int BuildTicket(cia_settings *ciaset); -int CryptTitleKey(u8 *EncTitleKey, u8 *DecTitleKey, u8 *TitleID, keys_struct *keys, u8 mode); \ No newline at end of file diff --git a/titleid.c b/titleid.c deleted file mode 100644 index dba5c67..0000000 --- a/titleid.c +++ /dev/null @@ -1,243 +0,0 @@ -#include "lib.h" -#include "ncch.h" -#include "titleid.h" - -u32 SetPIDCategoryFromName(char *Category); -u32 SetPIDCategoryFromFlags(char **CategoryFlags, u32 FlagNum); -u32 SetPIDCategoryFromFlag(u32 Category, u32 Flag, char *FlagName); -u32 SetPIDUniqueId(char *UniqueIdStr); -u16 SetTitleVariation(u16 Category, rsf_settings *yaml_set); - -u64 ConvertTwlIdToCtrId(u64 pgid) -{ - return 0x0004800000000000 | (pgid & 0x00007FFFFFFFFFFF); -} - -int GetProgramID(u64 *dest, rsf_settings *yaml, bool IsForExheader) -{ - if(yaml->TitleInfo.Category && yaml->TitleInfo.CategoryFlags){ - fprintf(stderr,"[ERROR] Can not set Cateory and CategoryFlags at the same time.\n"); - return PID_BAD_YAML_SET; - } - u16 Type = 0x0004; - u32 m_Category = 0; - u32 UniqueId = 0; - u16 m_Variation = 0; - - // Getting Category - if(yaml->TitleInfo.Category) - m_Category = SetPIDCategoryFromName(yaml->TitleInfo.Category); - else if(yaml->TitleInfo.CategoryFlags) - m_Category = SetPIDCategoryFromFlags(yaml->TitleInfo.CategoryFlags,yaml->TitleInfo.CategoryFlagsNum); - if(IsForExheader && yaml->TitleInfo.TargetCategory) - m_Category = SetPIDCategoryFromName(yaml->TitleInfo.TargetCategory); - if(m_Category == PID_INVALID_CATEGORY) // Error occured - return PID_BAD_YAML_SET; - - // Getting UniqueId - if(yaml->TitleInfo.UniqueId) UniqueId = SetPIDUniqueId(yaml->TitleInfo.UniqueId); - else{ - fprintf(stderr,"[ERROR] ParameterNotFound: TitleInfo/UniqueId\n"); - return PID_BAD_YAML_SET; - } - - m_Variation = SetTitleVariation(m_Category,yaml); - if(m_Variation == PID_INVALID_VARIATION) // Error occured - return PID_BAD_YAML_SET; - - u16 Category = (u16)m_Category; - u8 Variation = (u8)m_Variation; - - u64 ProgramID = 0; - ProgramID |= (u64)Variation<<0; - ProgramID |= (u64)UniqueId<<8; - ProgramID |= (u64)Category<<32; - ProgramID |= (u64)Type<<48; - - *dest = ProgramID; - - return 0; -} - -int GetUniqueID(u32 *dest, rsf_settings *yaml) -{ - if(yaml->TitleInfo.UniqueId) *dest = 0xffffff & SetPIDUniqueId(yaml->TitleInfo.UniqueId); - else{ - fprintf(stderr,"[ERROR] ParameterNotFound: TitleInfo/UniqueId\n"); - return PID_BAD_YAML_SET; - } - return 0; -} - -u32 SetPIDCategoryFromName(char *Category) -{ - if(strcmp(Category,"Application") == 0) return PROGRAM_ID_CATEGORY_APPLICATION; - else if(strcmp(Category,"SystemApplication") == 0) return PROGRAM_ID_CATEGORY_SYSTEM_APPLICATION; - else if(strcmp(Category,"Applet") == 0) return PROGRAM_ID_CATEGORY_APPLET; - else if(strcmp(Category,"Firmware") == 0) return PROGRAM_ID_CATEGORY_FIRMWARE; - else if(strcmp(Category,"Base") == 0) return PROGRAM_ID_CATEGORY_BASE; - else if(strcmp(Category,"DlpChild") == 0) return PROGRAM_ID_CATEGORY_DLP_CHILD; - else if(strcmp(Category,"Demo") == 0) return PROGRAM_ID_CATEGORY_DEMO; - else if(strcmp(Category,"Contents") == 0) return PROGRAM_ID_CATEGORY_CONTENTS; - else if(strcmp(Category,"SystemContents") == 0) return PROGRAM_ID_CATEGORY_SYSTEM_CONTENT; - else if(strcmp(Category,"SharedContents") == 0) return PROGRAM_ID_CATEGORY_SHARED_CONTENT; - else if(strcmp(Category,"AddOnContents") == 0) return PROGRAM_ID_CATEGORY_ADD_ON_CONTENTS; - else if(strcmp(Category,"Patch") == 0) return PROGRAM_ID_CATEGORY_PATCH; - else if(strcmp(Category,"AutoUpdateContents") == 0) return PROGRAM_ID_CATEGORY_AUTO_UPDATE_CONTENT; - else { - fprintf(stderr,"[ERROR] Invalid Category: %s\n",Category); - return PID_INVALID_CATEGORY; - } -} - -u32 SetPIDCategoryFromFlags(char **CategoryFlags, u32 FlagNum) -{ - u32 Category = 0; - for(u32 i = 0; i < FlagNum; i++){ - if(strcmp(CategoryFlags[i],"Normal") == 0) - Category = SetPIDCategoryFromFlag(Category,PROGRAM_ID_CATEGORY_FLAG_NORMAL,"Normal"); - else if(strcmp(CategoryFlags[i],"DlpChild") == 0) - Category = SetPIDCategoryFromFlag(Category,PROGRAM_ID_CATEGORY_FLAG_DLP_CHILD,"DlpChild"); - else if(strcmp(CategoryFlags[i],"Demo") == 0) - Category = SetPIDCategoryFromFlag(Category,PROGRAM_ID_CATEGORY_FLAG_DEMO,"Demo"); - else if(strcmp(CategoryFlags[i],"Contents") == 0) - Category = SetPIDCategoryFromFlag(Category,PROGRAM_ID_CATEGORY_FLAG_CONTENTS,"Contents"); - else if(strcmp(CategoryFlags[i],"AddOnContents") == 0) - Category = SetPIDCategoryFromFlag(Category,PROGRAM_ID_CATEGORY_FLAG_ADD_ON_CONTENTS,"AddOnContents"); - else if(strcmp(CategoryFlags[i],"Patch") == 0) - Category = SetPIDCategoryFromFlag(Category,PROGRAM_ID_CATEGORY_FLAG_PATCH,"Patch"); - else if(strcmp(CategoryFlags[i],"CannotExecution") == 0) - Category = SetPIDCategoryFromFlag(Category,PROGRAM_ID_CATEGORY_FLAG_CANNOT_EXECUTION,"CannotExecution"); - else if(strcmp(CategoryFlags[i],"System") == 0) - Category = SetPIDCategoryFromFlag(Category,PROGRAM_ID_CATEGORY_FLAG_SYSTEM,"System"); - else if(strcmp(CategoryFlags[i],"RequireBatchUpdate") == 0) - Category = SetPIDCategoryFromFlag(Category,PROGRAM_ID_CATEGORY_FLAG_REQUIRE_BATCH_UPDATE,"RequireBatchUpdate"); - else if(strcmp(CategoryFlags[i],"NotRequireUserApproval") == 0) - Category = SetPIDCategoryFromFlag(Category,PROGRAM_ID_CATEGORY_FLAG_NOT_REQUIRE_USER_APPROVAL,"NotRequireUserApproval"); - else if(strcmp(CategoryFlags[i],"NotRequireRightForMount") == 0) - Category = SetPIDCategoryFromFlag(Category,PROGRAM_ID_CATEGORY_FLAG_NOT_REQUIRE_RIGHT_FOR_MOUNT,"NotRequireRightForMount"); - else if(strcmp(CategoryFlags[i],"CanSkipConvertJumpId") == 0) - Category = SetPIDCategoryFromFlag(Category,PROGRAM_ID_CATEGORY_FLAG_CAN_SKIP_CONVERT_JUMP_ID,"CanSkipConvertJumpId"); - - else { - fprintf(stderr,"[ERROR] Invalid CategoryFlag: %s\n",CategoryFlags[i]); - return PID_INVALID_CATEGORY; - } - - if(Category == PID_INVALID_CATEGORY) return PID_INVALID_CATEGORY; - } - return Category; -} - -u32 SetPIDCategoryFromFlag(u32 Category, u32 Flag, char *FlagName) -{ - if(!Flag) return Category; - if((Category & Flag) == Flag){ - fprintf(stderr,"[ERROR] Failed to set '%s' for category. CategoryFlag was already set.\n",FlagName); - return PID_INVALID_CATEGORY; - } - return Category |= Flag; -} - -u32 SetPIDUniqueId(char *UniqueIdStr) -{ - return 0xffffff & strtoull(UniqueIdStr,NULL,0); -} - -u16 SetTitleVariation(u16 Category, rsf_settings *yaml_set) -{ - if(IsDemo(Category)){ - if(yaml_set->TitleInfo.DemoIndex){ - u16 DemoIndex = strtol(yaml_set->TitleInfo.DemoIndex,NULL,10); - if(DemoIndex > 255 || DemoIndex == 0){ - fprintf(stderr,"[ERROR] Invalid demo index '%d'\n",DemoIndex); - return PID_INVALID_VARIATION; - } - return DemoIndex; - } - else{ - fprintf(stderr,"[ERROR] ParameterNotFound: 'TitleInfo/DemoIndex'\n"); - return PID_INVALID_VARIATION; - } - } - - else if(IsDlpChild(Category)){ - if(yaml_set->TitleInfo.ChildIndex){ - u16 ChildIndex = strtol(yaml_set->TitleInfo.ChildIndex,NULL,10); - if(ChildIndex > 255){ - fprintf(stderr,"[ERROR] Invalid child index '%d'\n",ChildIndex); - return PID_INVALID_VARIATION; - } - return ChildIndex; - } - else - return 0; - } - else if(IsAddOnContent(Category)){ - if(yaml_set->TitleInfo.Variation){ // Might Rename to DataTitleIndex - u16 DataTitleIndex = strtol(yaml_set->TitleInfo.Variation,NULL,10); - if(DataTitleIndex > 255){ - fprintf(stderr,"[ERROR] Invalid variation '%d'\n",DataTitleIndex); - return PID_INVALID_VARIATION; - } - return DataTitleIndex; - } - else - return 0; - } - else if(IsContents(Category)){ - if(yaml_set->TitleInfo.ContentsIndex){ - u16 ContentsIndex = strtol(yaml_set->TitleInfo.ContentsIndex,NULL,10); - if(ContentsIndex > 255){ - fprintf(stderr,"[ERROR] Invalid content index '%d'\n",ContentsIndex); - return PID_INVALID_VARIATION; - } - return ContentsIndex; - } - else - return 0; - } - else{ - if(yaml_set->TitleInfo.Version){ - u16 Version = strtol(yaml_set->TitleInfo.Version,NULL,10); - if(Version > 255){ - fprintf(stderr,"[ERROR] Invalid version '%d'\n",Version); - return PID_INVALID_VARIATION; - } - return Version; - } - else - return 0; - } - return PID_INVALID_VARIATION; -} - -bool IsDemo(u16 Category) -{ - return Category == PROGRAM_ID_CATEGORY_DEMO; -} - -bool IsSystem(u16 Category) -{ - return (Category & PROGRAM_ID_CATEGORY_FLAG_SYSTEM) == PROGRAM_ID_CATEGORY_FLAG_SYSTEM; -} - -bool IsDlpChild(u16 Category) -{ - return Category == PROGRAM_ID_CATEGORY_DLP_CHILD; -} - -bool IsPatch(u16 Category) -{ - return Category == PROGRAM_ID_CATEGORY_PATCH; -} - -bool IsContents(u16 Category) -{ - return (Category & PROGRAM_ID_CATEGORY_FLAG_CONTENTS) == PROGRAM_ID_CATEGORY_FLAG_CONTENTS; -} - -bool IsAddOnContent(u16 Category) -{ - return Category == PROGRAM_ID_CATEGORY_ADD_ON_CONTENTS; -} \ No newline at end of file diff --git a/titleid.h b/titleid.h deleted file mode 100644 index c0a1228..0000000 --- a/titleid.h +++ /dev/null @@ -1,99 +0,0 @@ -#ifndef _TITLEID_H_ -#define _TITLEID_H_ - -typedef enum -{ - PID_BAD_YAML_SET = -1, - PID_INVALID_CATEGORY = 0x10000, - PID_INVALID_UNIQUE_ID = 0x1000000, - PID_INVALID_VARIATION = 0x100, -} Pid_Errors; - -typedef enum -{ - PROGRAM_ID_CATEGORY_FLAG_NORMAL = 0x0000, - PROGRAM_ID_CATEGORY_FLAG_DLP_CHILD = 0x0001, - PROGRAM_ID_CATEGORY_FLAG_DEMO = 0x0002, - PROGRAM_ID_CATEGORY_FLAG_CONTENTS = 0x0003, - PROGRAM_ID_CATEGORY_FLAG_ADD_ON_CONTENTS = 0x0004, - PROGRAM_ID_CATEGORY_FLAG_PATCH = 0x0006, - PROGRAM_ID_CATEGORY_FLAG_CANNOT_EXECUTION = 0x0008, - PROGRAM_ID_CATEGORY_FLAG_SYSTEM = 0x0010, - PROGRAM_ID_CATEGORY_FLAG_REQUIRE_BATCH_UPDATE = 0x0020, - PROGRAM_ID_CATEGORY_FLAG_NOT_REQUIRE_USER_APPROVAL = 0x0040, - PROGRAM_ID_CATEGORY_FLAG_NOT_REQUIRE_RIGHT_FOR_MOUNT = 0x0080, - PROGRAM_ID_CATEGORY_FLAG_CAN_SKIP_CONVERT_JUMP_ID = 0x0100, - PROGRAM_ID_CATEGORY_FLAG_TWL = 0x8000, -} ProgramIdCategoryFlag; - -typedef enum -{ - PROGRAM_ID_CATEGORY_APPLICATION = ( PROGRAM_ID_CATEGORY_FLAG_NORMAL ), - - PROGRAM_ID_CATEGORY_DLP_CHILD = ( PROGRAM_ID_CATEGORY_FLAG_DLP_CHILD ), - - PROGRAM_ID_CATEGORY_DEMO = ( PROGRAM_ID_CATEGORY_FLAG_DEMO ), - - PROGRAM_ID_CATEGORY_CONTENTS = ( PROGRAM_ID_CATEGORY_FLAG_CONTENTS ), - - PROGRAM_ID_CATEGORY_PATCH = ( PROGRAM_ID_CATEGORY_FLAG_CANNOT_EXECUTION - | PROGRAM_ID_CATEGORY_FLAG_PATCH), - - PROGRAM_ID_CATEGORY_ADD_ON_CONTENTS = ( PROGRAM_ID_CATEGORY_FLAG_ADD_ON_CONTENTS - | PROGRAM_ID_CATEGORY_FLAG_CANNOT_EXECUTION - | PROGRAM_ID_CATEGORY_FLAG_NOT_REQUIRE_RIGHT_FOR_MOUNT ), - - PROGRAM_ID_CATEGORY_FIRMWARE = ( PROGRAM_ID_CATEGORY_FLAG_NORMAL - | PROGRAM_ID_CATEGORY_FLAG_CANNOT_EXECUTION - | PROGRAM_ID_CATEGORY_FLAG_SYSTEM - | PROGRAM_ID_CATEGORY_FLAG_REQUIRE_BATCH_UPDATE - | PROGRAM_ID_CATEGORY_FLAG_CAN_SKIP_CONVERT_JUMP_ID ), - - - PROGRAM_ID_CATEGORY_BASE = ( PROGRAM_ID_CATEGORY_FLAG_NORMAL - | PROGRAM_ID_CATEGORY_FLAG_SYSTEM - | PROGRAM_ID_CATEGORY_FLAG_REQUIRE_BATCH_UPDATE - | PROGRAM_ID_CATEGORY_FLAG_CAN_SKIP_CONVERT_JUMP_ID ), - - - PROGRAM_ID_CATEGORY_APPLET = ( PROGRAM_ID_CATEGORY_FLAG_NORMAL - | PROGRAM_ID_CATEGORY_FLAG_SYSTEM - | PROGRAM_ID_CATEGORY_FLAG_REQUIRE_BATCH_UPDATE ), - - - PROGRAM_ID_CATEGORY_SYSTEM_APPLICATION = ( PROGRAM_ID_CATEGORY_FLAG_NORMAL - | PROGRAM_ID_CATEGORY_FLAG_SYSTEM ), - - - PROGRAM_ID_CATEGORY_SYSTEM_CONTENT = ( PROGRAM_ID_CATEGORY_FLAG_CONTENTS - | PROGRAM_ID_CATEGORY_FLAG_CANNOT_EXECUTION - | PROGRAM_ID_CATEGORY_FLAG_SYSTEM ), - - - PROGRAM_ID_CATEGORY_SHARED_CONTENT = ( PROGRAM_ID_CATEGORY_FLAG_CONTENTS - | PROGRAM_ID_CATEGORY_FLAG_CANNOT_EXECUTION - | PROGRAM_ID_CATEGORY_FLAG_SYSTEM - | PROGRAM_ID_CATEGORY_FLAG_NOT_REQUIRE_RIGHT_FOR_MOUNT ), - - - PROGRAM_ID_CATEGORY_AUTO_UPDATE_CONTENT = ( PROGRAM_ID_CATEGORY_FLAG_CONTENTS - | PROGRAM_ID_CATEGORY_FLAG_CANNOT_EXECUTION - | PROGRAM_ID_CATEGORY_FLAG_SYSTEM - | PROGRAM_ID_CATEGORY_FLAG_NOT_REQUIRE_USER_APPROVAL - | PROGRAM_ID_CATEGORY_FLAG_NOT_REQUIRE_RIGHT_FOR_MOUNT ), - -} ProgramIdCategory; - -#endif - -u64 ConvertTwlIdToCtrId(u64 pgid); - -int GetProgramID(u64 *dest, rsf_settings *yaml, bool IsForExheader); -int GetUniqueID(u32 *dest, rsf_settings *yaml); - -bool IsDemo(u16 Category); -bool IsSystem(u16 Category); -bool IsDlpChild(u16 Category); -bool IsPatch(u16 Category); -bool IsContents(u16 Category); -bool IsAddOnContent(u16 Category); diff --git a/tmd.c b/tmd.c deleted file mode 100644 index 2dadf12..0000000 --- a/tmd.c +++ /dev/null @@ -1,92 +0,0 @@ -#include "lib.h" -#include "cia.h" -#include "tmd.h" - -// Private Prototypes -int SetupTMDBuffer(COMPONENT_STRUCT *tik); -int SetupTMDHeader(TMD_Struct *hdr, TMD_CONTENT_INFO_RECORD *info_record, cia_settings *ciaset); -int SignTMDHeader(TMD_Struct *hdr, TMD_SignatureStruct *sig, keys_struct *keys); -int SetupTMDInfoRecord(TMD_CONTENT_INFO_RECORD *info_record, u8 *content_record, u16 ContentCount); -int SetupTMDContentRecord(u8 *content_record, cia_settings *ciaset); - -u32 PredictTMDSize(u16 ContentCount) -{ - return sizeof(TMD_SignatureStruct) + sizeof(TMD_Struct) + sizeof(TMD_CONTENT_INFO_RECORD)*64 + sizeof(TMD_CONTENT_CHUNK_STRUCT)*ContentCount; -} - -int BuildTMD(cia_settings *ciaset) -{ - int result = 0; - result = SetupTMDBuffer(&ciaset->CIA_Sections.TitleMetaData); - if(result) return result; - - // Setting TMD Struct Ptrs - TMD_SignatureStruct *sig = (TMD_SignatureStruct*)ciaset->CIA_Sections.TitleMetaData.buffer; - TMD_Struct *hdr = (TMD_Struct*)(ciaset->CIA_Sections.TitleMetaData.buffer+sizeof(TMD_SignatureStruct)); - TMD_CONTENT_INFO_RECORD *info_record = (TMD_CONTENT_INFO_RECORD*)(ciaset->CIA_Sections.TitleMetaData.buffer+sizeof(TMD_SignatureStruct)+sizeof(TMD_Struct)); - u8 *content_record = (u8*)(ciaset->CIA_Sections.TitleMetaData.buffer+sizeof(TMD_SignatureStruct)+sizeof(TMD_Struct)+sizeof(TMD_CONTENT_INFO_RECORD)*64); - - - SetupTMDContentRecord(content_record,ciaset); - SetupTMDInfoRecord(info_record,content_record,ciaset->content.ContentCount); - result = SetupTMDHeader(hdr,info_record,ciaset); - if(result) return result; - result = SignTMDHeader(hdr,sig,ciaset->keys); - return 0; -} - -int SetupTMDBuffer(COMPONENT_STRUCT *tmd) -{ - tmd->buffer = malloc(tmd->size); // already set before - if(!tmd->buffer) { fprintf(stderr,"[ERROR] MEM ERROR\n"); return MEM_ERROR; } - memset(tmd->buffer,0,tmd->size); - return 0; -} - -int SetupTMDHeader(TMD_Struct *hdr, TMD_CONTENT_INFO_RECORD *info_record, cia_settings *ciaset) -{ - memset(hdr,0,sizeof(TMD_Struct)); - - memcpy(hdr->Issuer,ciaset->tmd.TMDIssuer,0x40); - hdr->TMDFormatVersion = ciaset->tmd.tmd_format_ver; - hdr->ca_crl_version = ciaset->cert.ca_crl_version; - hdr->signer_crl_version = ciaset->cert.signer_crl_version; - memcpy(hdr->TitleID,ciaset->TitleID,8); - memcpy(hdr->TitleType,ciaset->Title_type,4); - memcpy(hdr->SaveDataSize,ciaset->tmd.SaveDataSize,4); - memcpy(hdr->PrivSaveDataSize,ciaset->tmd.PrivSaveDataSize,4); - hdr->TWL_Flag = ciaset->tmd.twl_flag; - memcpy(hdr->TitleVersion,ciaset->tmd.TitleVersion,2); - u16_to_u8(hdr->ContentCount,ciaset->content.ContentCount,BE); - ctr_sha(info_record,sizeof(TMD_CONTENT_INFO_RECORD)*64,hdr->sha_256_hash,CTR_SHA_256); - return 0; -} - -int SignTMDHeader(TMD_Struct *hdr, TMD_SignatureStruct *sig, keys_struct *keys) -{ - memset(sig,0,sizeof(TMD_SignatureStruct)); - u32_to_u8(sig->sig_type,RSA_2048_SHA256,BE); - return ctr_sig((u8*)hdr,sizeof(TMD_Struct),sig->data,keys->rsa.TMD_Pub,keys->rsa.TMD_Priv,RSA_2048_SHA256,CTR_RSA_SIGN); -} - -int SetupTMDInfoRecord(TMD_CONTENT_INFO_RECORD *info_record, u8 *content_record, u16 ContentCount) -{ - memset(info_record,0x0,sizeof(TMD_CONTENT_INFO_RECORD)*0x40); - u16_to_u8(info_record->content_index_offset,0x0,BE); - u16_to_u8(info_record->content_command_count,ContentCount,BE); - ctr_sha(content_record,sizeof(TMD_CONTENT_CHUNK_STRUCT)*ContentCount,info_record->sha_256_hash,CTR_SHA_256); - return 0; -} - -int SetupTMDContentRecord(u8 *content_record, cia_settings *ciaset) -{ - for(int i = 0; i < ciaset->content.ContentCount; i++){ - TMD_CONTENT_CHUNK_STRUCT *ptr = (TMD_CONTENT_CHUNK_STRUCT*)(content_record+sizeof(TMD_CONTENT_CHUNK_STRUCT)*i); - u32_to_u8(ptr->content_id,ciaset->content.ContentId[i],BE); - u16_to_u8(ptr->content_index,ciaset->content.ContentIndex[i],BE); - u16_to_u8(ptr->content_type,ciaset->content.ContentType[i],BE); - u64_to_u8(ptr->content_size,ciaset->content.ContentSize[i],BE); - memcpy(ptr->sha_256_hash,ciaset->content.ContentHash[i],0x20); - } - return 0; -} \ No newline at end of file diff --git a/tmd.h b/tmd.h deleted file mode 100644 index 4394c68..0000000 --- a/tmd.h +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef _TMD_H_ -#define _TMD_H_ - -typedef enum -{ - TYPE_CTR = 0x40, - TYPE_DATA = 0x8 -} title_type; - -typedef enum -{ - Encrypted = 0x0001, - Optional = 0x4000, - Shared = 0x8000 -} content_types; - -typedef struct -{ - u8 content_id[4]; - u8 content_index[2]; - u8 content_type[2]; - u8 content_size[8]; - u8 sha_256_hash[0x20]; -} TMD_CONTENT_CHUNK_STRUCT; - -typedef struct -{ - u8 content_index_offset[2]; - u8 content_command_count[2]; - u8 sha_256_hash[0x20]; -} TMD_CONTENT_INFO_RECORD; - -typedef struct -{ - u8 sig_type[4]; - u8 data[0x100]; - u8 padding[0x3C]; -} TMD_SignatureStruct; - -typedef struct -{ - u8 Issuer[0x40]; - u8 TMDFormatVersion; - u8 ca_crl_version; - u8 signer_crl_version; - u8 padding_1; - u8 SystemVersion[8]; - u8 TitleID[8]; - u8 TitleType[4]; - u8 GroupID[2]; - u8 SaveDataSize[4]; - u8 PrivSaveDataSize[4]; // Zero for CXI Content0 - u8 Reserved_0[4]; - u8 TWL_Flag; // Zero for CXI Content0 - u8 Reserved_1[0x31]; - u8 AccessRights[4]; - u8 TitleVersion[2]; - u8 ContentCount[2]; - u8 BootContent[2]; - u8 Padding[2]; - u8 sha_256_hash[0x20]; -} TMD_Struct; - -#endif - -// Prototypes -u32 PredictTMDSize(u16 ContentCount); -int BuildTMD(cia_settings *ciaset); \ No newline at end of file diff --git a/types.h b/types.h deleted file mode 100644 index 8c4123d..0000000 --- a/types.h +++ /dev/null @@ -1,39 +0,0 @@ -#include -#include -//Bools -typedef enum -{ - Good, - Fail -} return_basic; - -typedef enum -{ - MEM_ERROR = -1, - FAILED_TO_OPEN_FILE = -2, - FAILED_TO_IMPORT_FILE = -3, - FAILED_TO_CREATE_OUTFILE = -4, -} global_errors; - -typedef enum -{ - BE = 0, - LE = 1 -} endianness_flag; - -typedef enum -{ - KB = 1024, - MB = 1048576, - GB = 1073741824 -} file_unit_size; - -typedef unsigned char u8; -typedef unsigned short u16; -typedef unsigned int u32; -typedef unsigned long long u64; - -typedef signed char s8; -typedef signed short s16; -typedef signed int s32; -typedef signed long long s64; diff --git a/usersettings.c b/usersettings.c deleted file mode 100644 index 1123ade..0000000 --- a/usersettings.c +++ /dev/null @@ -1,847 +0,0 @@ -#include "lib.h" - -// Private Prototypes -void DisplayHelp(char *app_name); -void SetDefaults(user_settings *set); -int SetArgument(int argc, int i, char *argv[], user_settings *set); -int CheckArgumentCombination(user_settings *set); -void PrintNeedsArgument(char *arg); -void PrintArgumentInvalid(char *arg); -void PrintNeedsParam(char *arg); -void PrintNoNeedParam(char *arg); - -int ParseArgs(int argc, char *argv[], user_settings *usr_settings) -{ - if(argv == NULL || usr_settings == NULL) - return USR_PTR_PASS_FAIL; - - if(argc < 2){ - DisplayHelp(argv[0]); - return USR_HELP; - } - - // Detecting Help Requried - for(int i = 1; i < argc; i++){ - if(strcmp(argv[i],"-help") == 0){ - DisplayHelp(argv[0]); - return USR_HELP; - } - } - - // Allocating Memory for Content Path Ptrs - usr_settings->ContentPath = malloc(CIA_MAX_CONTENT*sizeof(char*)); - if(usr_settings->ContentPath == NULL){ - fprintf(stderr,"[SETTING ERROR] MEM ERROR\n"); - return USR_MEM_ERROR; - } - memset(usr_settings->ContentPath,0,CIA_MAX_CONTENT*sizeof(char*)); - - // Initialise Keys - InitKeys(&usr_settings->keys); - - // Setting Defaults - SetDefaults(usr_settings); - - // Parsing Arguments - int set_result; - int i = 1; - while(i < argc){ - set_result = SetArgument(argc,i,argv,usr_settings); - if(set_result < 1){ - fprintf(stderr,"[RESULT] Invalid arguments, see '%s -help'\n",argv[0]); - return set_result; - } - i += set_result; - } - - // Checking arguments - set_result = CheckArgumentCombination(usr_settings); - if(set_result) return set_result; - - // Setting Keys - SetKeys(&usr_settings->keys); - - if(!usr_settings->outfile){ - char *source_path = NULL; - if(usr_settings->IsBuildingNCCH0) source_path = usr_settings->rsf_path; - else if(usr_settings->ConvertCci) source_path = usr_settings->CciPath; - else if(usr_settings->Content0IsSrl) source_path = usr_settings->SrlPath; - else source_path = usr_settings->ContentPath[0]; - u16 outfile_len = strlen(source_path) + 3; - usr_settings->outfile = malloc(outfile_len); - if(!usr_settings->outfile){ - fprintf(stderr,"[SETTING ERROR] MEM ERROR\n"); - return USR_MEM_ERROR; - } - usr_settings->outfile_mallocd = true; - append_filextention(usr_settings->outfile,outfile_len,source_path,(char*)&output_extention[usr_settings->out_format-1]); - } - return 0; -} - -void SetDefaults(user_settings *set) -{ - // Target Info - set->keys.keyset = keyset_RETAIL; - - // Build NCCH Info - set->IsBuildingNCCH0 = true; - set->include_exefs_logo = false; - set->out_format = CXI; - set->build_ncch_type = format_not_set; - - // Yaml Settings - set->yaml_set.Option.EnableCompress = true; - set->yaml_set.Option.EnableCrypt = true; - set->yaml_set.Option.UseOnSD = false; - set->yaml_set.Option.FreeProductCode = false; - - // Content0 Info - set->Content0IsNcch = true; - set->ConvertCci = false; - set->Content0IsSrl = false; - - set->Version[0] = 0xffff; - - // CCI Info - set->GenSDKCardInfoHeader = false; - set->OmitImportedNcchHdr = false; - - // CIA Info - set->EncryptContents = true; - set->RandomTitleKey = false; - for(int i = 0; i < CIA_MAX_CONTENT; i++){ - set->ContentID[i] = 0x100000000; - } -} - -int SetArgument(int argc, int i, char *argv[], user_settings *set) -{ - bool IsLastArg = (i >= (argc -1)); - bool HasParam = false; - if(!IsLastArg){ - if(argv[i+1][0] != '-') HasParam = true; - } - if(strcmp(argv[i],"-elf") == 0){ - if(!HasParam){ - PrintNeedsParam("-elf"); - return USR_ARG_REQ_PARAM; - } - set->elf_path = argv[i+1]; - return 2; - } - else if(strcmp(argv[i],"-rsf") == 0){ - if(!HasParam){ - PrintNeedsParam("-rsf"); - return USR_ARG_REQ_PARAM; - } - set->rsf_path = argv[i+1]; - return 2; - } - else if(strcmp(argv[i],"-icon") == 0){ - if(!HasParam){ - PrintNeedsParam("-icon"); - return USR_ARG_REQ_PARAM; - } - set->icon_path = argv[i+1]; - return 2; - } - else if(strcmp(argv[i],"-banner") == 0){ - if(!HasParam){ - PrintNeedsParam("-banner"); - return USR_ARG_REQ_PARAM; - } - set->banner_path = argv[i+1]; - return 2; - } - else if(strcmp(argv[i],"-logo") == 0){ - if(!HasParam){ - PrintNeedsParam("-logo"); - return USR_ARG_REQ_PARAM; - } - set->logo_path = argv[i+1]; - return 2; - } - else if(strcmp(argv[i],"-o") == 0){ - if(!HasParam){ - PrintNeedsParam("-o"); - return USR_ARG_REQ_PARAM; - } - set->outfile = argv[i+1]; - set->outfile_mallocd = false; - return 2; - } - else if(strcmp(argv[i],"-exheader") == 0){ - if(!HasParam){ - PrintNeedsParam("-exheader"); - return USR_ARG_REQ_PARAM; - } - set->exheader_path = argv[i+1]; - return 2; - } - else if(strcmp(argv[i],"-code") == 0){ - if(!HasParam){ - PrintNeedsParam("-code"); - return USR_ARG_REQ_PARAM; - } - set->exefs_code_path = argv[i+1]; - return 2; - } - else if(strcmp(argv[i],"-romfs") == 0){ - if(!HasParam){ - PrintNeedsParam("-romfs"); - return USR_ARG_REQ_PARAM; - } - set->romfs_path = argv[i+1]; - return 2; - } - else if(strcmp(argv[i],"-plain-region") == 0){ - if(!HasParam){ - PrintNeedsParam("-plain-region"); - return USR_ARG_REQ_PARAM; - } - set->plain_region_path = argv[i+1]; - return 2; - } - else if(strcmp(argv[i],"-target") == 0){ - if(!HasParam){ - PrintNeedsParam("-target"); - return USR_ARG_REQ_PARAM; - } - if(strcasecmp(argv[i+1],"debug") == 0 || strcasecmp(argv[i+1],"dev") == 0) - set->keys.keyset = keyset_DEBUG; - else if(strcasecmp(argv[i+1],"retail") == 0 || strcasecmp(argv[i+1],"prod") == 0) - set->keys.keyset = keyset_RETAIL; - else{ - fprintf(stderr,"[SETTING ERROR] Unrecognised target '%s'\n",argv[i+1]); - return USR_BAD_ARG; - } - return 2; - } - else if(strcmp(argv[i],"-cci") == 0){ - if(!HasParam){ - PrintNeedsParam("-cci"); - return USR_ARG_REQ_PARAM; - } - set->ConvertCci = true; - set->Content0IsSrl = false; - set->Content0IsNcch = false; - set->IsBuildingNCCH0 = false; - set->out_format = CIA; - set->CciPath = argv[i+1]; - return 2; - } - else if(strcmp(argv[i],"-srl") == 0){ - if(!HasParam){ - PrintNeedsParam("-srl"); - return USR_ARG_REQ_PARAM; - } - set->ConvertCci = false; - set->Content0IsSrl = true; - set->Content0IsNcch = false; - set->IsBuildingNCCH0 = false; - set->out_format = CIA; - set->SrlPath = argv[i+1]; - return 2; - - } - else if(strcmp(argv[i],"-devcardcci") == 0){ - if(HasParam){ - PrintNoNeedParam("-devcardcci"); - return USR_BAD_ARG; - } - set->GenSDKCardInfoHeader = true; - return 1; - } - else if(strcmp(argv[i],"-omitncchhdr") == 0){ - if(HasParam){ - PrintNoNeedParam("-omitncchhdr"); - return USR_BAD_ARG; - } - set->OmitImportedNcchHdr = true; - return 1; - } - else if(strcmp(argv[i],"-cfa") == 0){ - if(HasParam){ - PrintNoNeedParam("-cfa"); - return USR_ARG_REQ_PARAM; - } - set->build_ncch_type = CFA; - - return 1; - } - else if(strcmp(argv[i],"-f") == 0){ - if(!HasParam){ - PrintNeedsParam("-f"); - return USR_ARG_REQ_PARAM; - } - if(strcasecmp(argv[i+1],"cxi") == 0 || strcasecmp(argv[i+1],"exec") == 0 ) set->out_format = CXI; - else if(strcasecmp(argv[i+1],"cfa") == 0 || strcasecmp(argv[i+1],"data") == 0 ) set->out_format = CFA; - else if(strcasecmp(argv[i+1],"cci") == 0 || strcasecmp(argv[i+1],"card") == 0 ) set->out_format = CCI; - else if(strcasecmp(argv[i+1],"cia") == 0) set->out_format = CIA; - else { - fprintf(stderr,"[-] Invalid output format '%s'\n",argv[i+1]); - return USR_BAD_ARG; - } - return 2; - } - else if(strcmp(argv[i],"-sysfixedkey") == 0){ - if(!HasParam){ - PrintNeedsParam("-sysfixedkey"); - return USR_ARG_REQ_PARAM; - } - if(strlen(argv[i+1]) != 32) { - fprintf(stderr,"[ERROR] Invalid SystemFixedKey '%s'\n",argv[i+1]); - return USR_BAD_ARG; - } - u8 *key = malloc(16); - if(!key){ - fprintf(stderr,"[ERROR] MEM ERROR\n"); - return USR_MEM_ERROR; - } - char_to_u8_array(key,argv[i+1],16,BE,16); - SetSystemFixedKey(&set->keys,key); - free(key); - return 2; - } - else if(strcmp(argv[i],"-commonkey") == 0){ - if(!HasParam){ - PrintNeedsParam("-commonkey"); - return USR_ARG_REQ_PARAM; - } - if(strlen(argv[i+1]) != 32) { - fprintf(stderr,"[ERROR] Invalid CommonKey '%s'\n",argv[i+1]); - return USR_BAD_ARG; - } - u8 *key = malloc(16); - if(!key){ - fprintf(stderr,"[ERROR] MEM ERROR\n"); - return USR_MEM_ERROR; - } - char_to_u8_array(key,argv[i+1],16,BE,16); - - if(i+2 < argc){ - u8 id = strtol(argv[i+2],NULL,10); - SetCommonKey(&set->keys,key,id); - SetCurrentCommonKey(&set->keys,id); - } - else SetCommonKey(&set->keys,key,0); - SetCurrentCommonKey(&set->keys,0); - free(key); - return 2; - } - else if(strcmp(argv[i],"-accessdesc") == 0){ - if(!HasParam){ - PrintNeedsParam("-accessdesc"); - return USR_ARG_REQ_PARAM; - } - char *tmp = argv[i+1]; - char *tmp2 = strstr(tmp,":"); - if(!tmp2){ - fprintf(stderr,"[SETTING ERROR] Bad argument '%s %s', correct format:\n",argv[i],argv[i+1]); - fprintf(stderr," -accessdesc :\n"); - } - if(strlen(tmp2) < 2){ - fprintf(stderr,"[SETTING ERROR] Bad argument '%s %s', correct format:\n",argv[i],argv[i+1]); - fprintf(stderr," -accessdesc :\n"); - } - - u32 app_type_len = (u32)(tmp2-tmp); - char *app_type = malloc(app_type_len+1); - memset(app_type,0,app_type_len+1); - memcpy(app_type,tmp,app_type_len); - - if(strcasecmp(app_type,"App") == 0 || strcasecmp(app_type,"SDApp") == 0) set->keys.AccessDescSign.PresetType = app; - else if(strcasecmp(app_type,"Demo") == 0) set->keys.AccessDescSign.PresetType = demo; - else if(strcasecmp(app_type,"DlpChild") == 0 || strcasecmp(app_type,"Dlp") == 0) set->keys.AccessDescSign.PresetType = dlp; - else{ - fprintf(stderr,"[SETTING ERROR] Accessdesc AppType preset '%s' not valid, please manually configure RSF\n",app_type); - return USR_BAD_ARG; - } - - - char *target_firmware = (tmp2+1); - set->keys.AccessDescSign.TargetFirmware = strtoul(target_firmware,NULL,10); - return 2; - } - - else if(strcmp(argv[i],"-exefslogo") == 0){ - if(HasParam){ - PrintNoNeedParam("-exefslogo"); - return USR_BAD_ARG; - } - set->include_exefs_logo = true; - return 1; - } - else if(strcmp(argv[i],"-rand") == 0){ - if(HasParam){ - PrintNoNeedParam("-rand"); - return USR_BAD_ARG; - } - set->RandomTitleKey = true; - return 1; - } - else if(strcmp(argv[i],"-nocryptcia") == 0){ - if(HasParam){ - PrintNoNeedParam("-nocryptcia"); - return USR_BAD_ARG; - } - set->EncryptContents = false; - return 1; - } - else if(strcmp(argv[i],"-major") == 0){ - if(!HasParam){ - PrintNeedsParam("-major"); - return USR_ARG_REQ_PARAM; - } - u32 tmp = strtoul(argv[i+1],NULL,10); - set->Version[0] = tmp > 63 ? 63 : tmp; - return 2; - } - else if(strcmp(argv[i],"-minor") == 0){ - if(!HasParam){ - PrintNeedsParam("-minor"); - return USR_ARG_REQ_PARAM; - } - u32 tmp = strtoul(argv[i+1],NULL,10); - set->Version[1] = tmp > 63 ? 63 : tmp; - return 2; - } - else if(strcmp(argv[i],"-micro") == 0){ - if(!HasParam){ - PrintNeedsParam("-micro"); - return USR_ARG_REQ_PARAM; - } - u32 tmp = strtoul(argv[i+1],NULL,10); - set->Version[2] = tmp > 15 ? 15 : tmp; - return 2; - } - - else if(strcmp(argv[i],"-content") == 0){ - if(!HasParam){ - PrintNeedsParam("-content"); - return USR_ARG_REQ_PARAM; - } - char *pos = strstr(argv[i+1],":"); - if(!pos){ - fprintf(stderr,"[SETTING ERROR] Bad argument '%s %s', correct format:\n",argv[i],argv[i+1]); - fprintf(stderr," -content :\n"); - fprintf(stderr," If generating a CIA, then use the format:\n"); - fprintf(stderr," -content ::\n"); - return USR_BAD_ARG; - } - if(strlen(pos) < 2){ - fprintf(stderr,"[SETTING ERROR] Bad argument '%s %s', correct format:\n",argv[i],argv[i+1]); - fprintf(stderr," -content :\n"); - fprintf(stderr," If generating a CIA, then use the format:\n"); - fprintf(stderr," -content ::\n"); - return USR_BAD_ARG; - } - - /* Getting Content Index */ - u16 content_index = strtol((char*)(pos+1),NULL,10); - - /* Storing Content Filepath */ - u32 path_len = (u32)(pos-argv[i+1])+1; - - if(content_index == 0) set->IsBuildingNCCH0 = false; - if(set->ContentPath[content_index] != NULL){ - fprintf(stderr,"[SETTING ERROR] Content %d is already specified\n",content_index); - return USR_BAD_ARG; - } - set->ContentPath[content_index] = malloc(path_len); - if(set->ContentPath[content_index] == NULL){ - fprintf(stderr,"[SETTING ERROR] MEM ERROR\n"); - return USR_MEM_ERROR; - } - memset(set->ContentPath[content_index],0,path_len); - strncpy(set->ContentPath[content_index],argv[i+1],path_len-1); - - /* Get ContentID for CIA gen */ - char *pos2 = strstr(pos+1,":"); - if(pos2) { - set->ContentID[content_index] = strtoul((pos2+1),NULL,16); - } - - /* Return Next Arg Pos*/ - return 2; - } - /* - else if(strncmp(argv[i],"-D",2) == 0){ - fprintf(stderr,"[WARNING] -DNAME=VALUE not implemented yet\n"); - } - */ - - // If not a valid argument - fprintf(stderr,"[SETTING ERROR] Unrecognised argument '%s'\n",argv[i]); - return USR_UNK_ARG; -} - -int CheckArgumentCombination(user_settings *set) -{ - for(int i = 0; i < CIA_MAX_CONTENT; i++){ - if( i > CCI_MAX_CONTENT-1 && set->ContentPath[i] && set->out_format == CCI){ - fprintf(stderr,"[SETTING ERROR] Content indexes > 7 are invalid for CCI\n"); - return USR_BAD_ARG; - } - if(set->ContentPath[i] && (set->out_format == CXI || set->out_format == CFA)){ - fprintf(stderr,"[SETTING ERROR] You cannot specify content while outputting CXI/CFA files\n"); - return USR_BAD_ARG; - } - } - if((set->out_format == CXI || set->out_format == CFA) && set->build_ncch_type > 0){ - fprintf(stderr,"[SETTING ERROR] Arguments '-f cxi|cfa' and '-ncch cxi|cfa' are invalid\n"); - return USR_BAD_ARG; - } - if(set->build_ncch_type > 0 && !set->IsBuildingNCCH0){ - fprintf(stderr,"[SETTING ERROR] Arguments '-content %s:0' and '-ncch cxi|cfa' cannot be used together\n",set->ContentPath[0]); - return USR_BAD_ARG; - } - - if(set->elf_path && set->exefs_code_path){ - fprintf(stderr,"[SETTING ERROR] Arguments '-elf' and '-code' cannot be used together\n"); - return USR_BAD_ARG; - } - - // Setting set->build_ncch_type if it isn't already set - if(set->IsBuildingNCCH0 && set->build_ncch_type == 0){ - if(set->out_format == CCI || set->out_format == CIA) set->build_ncch_type = CXI; - else set->build_ncch_type = set->out_format; - } - - bool buildCXI = (set->out_format == CXI || set->build_ncch_type == CXI) && set->IsBuildingNCCH0; - bool buildCFA = (set->out_format == CFA || set->build_ncch_type == CFA) && set->IsBuildingNCCH0; - // Detecting Required Arguments - if(buildCXI && !set->elf_path && !set->exefs_code_path){ - PrintNeedsArgument("-elf"); - return USR_BAD_ARG; - } - if((buildCXI || buildCFA) && !set->rsf_path){ - PrintNeedsArgument("-rsf"); - return USR_BAD_ARG; - } - if(buildCXI && !set->exheader_path && set->exefs_code_path){ - PrintNeedsArgument("-exheader"); - return USR_BAD_ARG; - } - - // Reporting bad arguments - if(!buildCXI && set->elf_path){ - PrintArgumentInvalid("-elf"); - return USR_BAD_ARG; - } - if(!buildCXI && set->exefs_code_path){ - PrintArgumentInvalid("-code"); - return USR_BAD_ARG; - } - if(!buildCXI && set->exheader_path){ - PrintArgumentInvalid("-exheader"); - return USR_BAD_ARG; - } - if(!buildCXI && set->plain_region_path){ - PrintArgumentInvalid("-plain-region"); - return USR_BAD_ARG; - } - if(!buildCXI && set->include_exefs_logo){ - PrintArgumentInvalid("-exefslogo"); - return USR_BAD_ARG; - } - if(!set->IsBuildingNCCH0 && set->romfs_path){ - PrintArgumentInvalid("-romfs"); - return USR_BAD_ARG; - } - - return 0; -} - -void init_UserSettings(user_settings *usr_settings) -{ - memset(usr_settings,0,sizeof(user_settings)); -} - - -void free_RsfSettings(rsf_settings *set) -{ - //Option - free(set->Option.PageSize); - for(u32 i = 0; i < set->Option.AppendSystemCallNum; i++){ - free(set->Option.AppendSystemCall[i]); - } - free(set->Option.AppendSystemCall); - - //AccessControlInfo - free(set->AccessControlInfo.ProgramId); - free(set->AccessControlInfo.IdealProcessor); - free(set->AccessControlInfo.Priority); - free(set->AccessControlInfo.MemoryType); - free(set->AccessControlInfo.SystemMode); - free(set->AccessControlInfo.CoreVersion); - free(set->AccessControlInfo.HandleTableSize); - free(set->AccessControlInfo.SystemSaveDataId1); - free(set->AccessControlInfo.SystemSaveDataId2); - free(set->AccessControlInfo.OtherUserSaveDataId1); - free(set->AccessControlInfo.OtherUserSaveDataId2); - free(set->AccessControlInfo.OtherUserSaveDataId3); - free(set->AccessControlInfo.ExtSaveDataId); - free(set->AccessControlInfo.SystemMode); - free(set->AccessControlInfo.AffinityMask); - free(set->AccessControlInfo.DescVersion); - free(set->AccessControlInfo.CryptoKey); - free(set->AccessControlInfo.ResourceLimitCategory); - free(set->AccessControlInfo.ReleaseKernelMajor); - free(set->AccessControlInfo.ReleaseKernelMinor); - free(set->AccessControlInfo.MaxCpu); - - for(u32 i = 0; i < set->AccessControlInfo.MemoryMappingNum; i++){ - free(set->AccessControlInfo.MemoryMapping[i]); - } - free(set->AccessControlInfo.MemoryMapping); - - for(u32 i = 0; i < set->AccessControlInfo.IORegisterMappingNum; i++){ - free(set->AccessControlInfo.IORegisterMapping[i]); - } - free(set->AccessControlInfo.IORegisterMapping); - - for(u32 i = 0; i < set->AccessControlInfo.FileSystemAccessNum; i++){ - free(set->AccessControlInfo.FileSystemAccess[i]); - } - free(set->AccessControlInfo.FileSystemAccess); - - for(u32 i = 0; i < set->AccessControlInfo.IoAccessControlNum; i++){ - free(set->AccessControlInfo.IoAccessControl[i]); - } - free(set->AccessControlInfo.IoAccessControl); - - for(u32 i = 0; i < set->AccessControlInfo.InterruptNumbersNum; i++){ - free(set->AccessControlInfo.InterruptNumbers[i]); - } - free(set->AccessControlInfo.InterruptNumbers); - - for(u32 i = 0; i < set->AccessControlInfo.SystemCallAccessNum; i++){ - free(set->AccessControlInfo.SystemCallAccess[i]); - } - free(set->AccessControlInfo.SystemCallAccess); - - for(u32 i = 0; i < set->AccessControlInfo.ServiceAccessControlNum; i++){ - free(set->AccessControlInfo.ServiceAccessControl[i]); - } - free(set->AccessControlInfo.ServiceAccessControl); - - for(u32 i = 0; i < set->AccessControlInfo.StorageIdNum; i++){ - free(set->AccessControlInfo.StorageId[i]); - } - free(set->AccessControlInfo.StorageId); - - for(u32 i = 0; i < set->AccessControlInfo.AccessibleSaveDataIdsNum; i++){ - free(set->AccessControlInfo.AccessibleSaveDataIds[i]); - } - free(set->AccessControlInfo.AccessibleSaveDataIds); - - //SystemControlInfo - free(set->SystemControlInfo.AppType); - free(set->SystemControlInfo.StackSize); - free(set->SystemControlInfo.RemasterVersion); - free(set->SystemControlInfo.JumpId); - - for(u32 i = 0; i < set->SystemControlInfo.DependencyNum; i++){ - free(set->SystemControlInfo.Dependency[i]); - } - free(set->SystemControlInfo.Dependency); - - //BasicInfo - free(set->BasicInfo.Title); - free(set->BasicInfo.CompanyCode); - free(set->BasicInfo.ProductCode); - free(set->BasicInfo.MediaSize); - free(set->BasicInfo.ContentType); - free(set->BasicInfo.Logo); - free(set->BasicInfo.BackupMemoryType); - free(set->BasicInfo.InitialCode); - - //Rom - free(set->Rom.HostRoot); - free(set->Rom.Padding); - free(set->Rom.SaveDataSize); - - for(u32 i = 0; i < set->Rom.DefaultRejectNum; i++){ - free(set->Rom.DefaultReject[i]); - } - free(set->Rom.DefaultReject); - - for(u32 i = 0; i < set->Rom.RejectNum; i++){ - free(set->Rom.Reject[i]); - } - free(set->Rom.Reject); - - for(u32 i = 0; i < set->Rom.IncludeNum; i++){ - free(set->Rom.Include[i]); - } - free(set->Rom.Include); - - for(u32 i = 0; i < set->Rom.FileNum; i++){ - free(set->Rom.File[i]); - } - free(set->Rom.File); - - //ExeFs - for(u32 i = 0; i < set->ExeFs.TextNum; i++){ - free(set->ExeFs.Text[i]); - } - free(set->ExeFs.Text); - - for(u32 i = 0; i < set->ExeFs.ReadOnlyNum; i++){ - free(set->ExeFs.ReadOnly[i]); - } - free(set->ExeFs.ReadOnly); - - for(u32 i = 0; i < set->ExeFs.ReadWriteNum; i++){ - free(set->ExeFs.ReadWrite[i]); - } - free(set->ExeFs.ReadWrite); - - //PlainRegion - for(u32 i = 0; i < set->PlainRegionNum; i++){ - free(set->PlainRegion[i]); - } - free(set->PlainRegion); - - //TitleInfo - free(set->TitleInfo.Platform); - free(set->TitleInfo.Category); - free(set->TitleInfo.UniqueId); - free(set->TitleInfo.Version); - free(set->TitleInfo.ContentsIndex); - free(set->TitleInfo.Variation); - free(set->TitleInfo.Use); - free(set->TitleInfo.ChildIndex); - free(set->TitleInfo.DemoIndex); - free(set->TitleInfo.TargetCategory); - - for(u32 i = 0; i < set->TitleInfo.CategoryFlagsNum; i++){ - free(set->TitleInfo.CategoryFlags[i]); - } - free(set->TitleInfo.CategoryFlags); - - //CardInfo - free(set->CardInfo.WritableAddress); - free(set->CardInfo.CardType); - free(set->CardInfo.CryptoType); - free(set->CardInfo.CardDevice); - free(set->CardInfo.MediaType); - free(set->CardInfo.BackupWriteWaitTime); - - //CommonHeaderKey - free(set->CommonHeaderKey.D); - free(set->CommonHeaderKey.P); - free(set->CommonHeaderKey.Q); - free(set->CommonHeaderKey.DP); - free(set->CommonHeaderKey.DQ); - free(set->CommonHeaderKey.InverseQ); - free(set->CommonHeaderKey.Modulus); - free(set->CommonHeaderKey.Exponent); - free(set->CommonHeaderKey.AccCtlDescSign); - free(set->CommonHeaderKey.AccCtlDescBin); -} - -void free_UserSettings(user_settings *usr_settings) -{ - // Free Content Paths - if(usr_settings->ContentPath){ - for(int i = 0; i < CIA_MAX_CONTENT; i++){ - free(usr_settings->ContentPath[i]); - } - free(usr_settings->ContentPath); - } - - // Free Spec File Setting - free_RsfSettings(&usr_settings->yaml_set); - - // Free Key Data - FreeKeys(&usr_settings->keys); - - // Free Content0 - free(usr_settings->Content0.buffer); - - // Free outfile path, if malloc'd - if(usr_settings->outfile_mallocd) free(usr_settings->outfile); - - // Clear settings - init_UserSettings(usr_settings); - - // Free - free(usr_settings); -} - -void PrintNeedsArgument(char *arg) -{ - fprintf(stderr,"[SETTING ERROR] Argument '%s' is required\n",arg); -} - -void PrintArgumentInvalid(char *arg) -{ - fprintf(stderr,"[SETTING ERROR] Argument '%s' is invalid\n",arg); -} - -void PrintNeedsParam(char *arg) -{ - fprintf(stderr,"[SETTING ERROR] '%s' requires a parameter\n",arg); -} - -void PrintNoNeedParam(char *arg) -{ - fprintf(stderr,"[SETTING ERROR] '%s' does not take a parameter\n",arg); -} - -void DisplayHelp(char *app_name) -{ - printf("CTR MAKEROM %d.%d",MAKEROM_VER_MAJOR,MAKEROM_VER_MINOR); -#ifndef PUBLIC_BUILD - printf(" PRIVATE BUILD"); -#endif - printf("\n(C) 3DSGuy 2014\n"); - printf("Usage: %s [options... ]\n",app_name); - printf("Option Parameter Explanation\n"); - printf("GLOBAL OPTIONS:\n"); - printf(" -help Display this text\n"); - printf(" -rsf RSF File\n"); - printf(" -f Output Format (cxi|cfa|cci|cia)\n"); - printf(" -o Output File\n"); - //printf(" -v Verbose\n"); - //printf(" -DNAME=VALUE Substitute values in Spec files\n"); - printf("KEY OPTIONS:\n"); - printf(" -sysfixedkey <32 hex chars> Specify SystemFixed Key\n"); - printf(" -commonkey <32 hex chars> Specify commonkey and index\n"); -#ifndef PUBLIC_BUILD - printf(" -target Debug or Retail(Default)\n"); -#endif - printf("NCCH OPTIONS:\n"); - printf(" -elf ELF File\n"); - printf(" -icon Icon File\n"); - printf(" -banner Banner File\n"); - printf(" -logo Logo File (Overrides \"BasicInfo/Logo\" in RSF)\n"); - printf(" -accessdesc : Specify AccessDesc Preset\n"); - printf(" -exefslogo Include Logo in ExeFs (Required for usage on <5.X Systems)\n"); - printf(" -cfa Specify if building a Data Archive when \"-f cia\"\n"); - printf("NCCH REBUILD OPTIONS:\n"); - printf(" -code Specify ExeFs code File\n"); - printf(" -exheader ExHeader Template File\n"); - printf(" -plain-region PlainRegion File\n"); - printf(" -romfs RomFS File\n"); - printf("CCI OPTIONS:\n"); -#ifndef PUBLIC_BUILD - printf(" -devcardcci Use SDK CardInfo Method\n"); - printf(" -omitncchhdr Omit NCCH Hdr for imported NCCH0\n"); -#endif - printf(" -content : Specify content files\n"); - printf("CIA OPTIONS:\n"); -#ifndef PUBLIC_BUILD - printf(" -cci Convert CCI to CIA\n"); - printf(" -srl Use TWL SRL as Content0\n"); -#endif - printf(" -content :: Specify content files\n"); - printf(" -major Specify Title Version Major\n"); - printf(" -minor Specify Title Version Minor\n"); - printf(" -micro Specify Title Version Micro\n"); - printf(" -rand Use a random title key\n"); - printf(" -nocryptcia Don't encrypt CIA contents\n"); -} diff --git a/usersettings.h b/usersettings.h deleted file mode 100644 index 609a1dd..0000000 --- a/usersettings.h +++ /dev/null @@ -1,265 +0,0 @@ -#ifndef _USERSETTINGS_H_ -#define _USERSETTINGS_H_ - -#define CCI_MAX_CONTENT 8 -#define CIA_MAX_CONTENT 65536 - - -typedef enum -{ - USR_PTR_PASS_FAIL = -1, - USR_HELP = -2, - USR_ARG_REQ_PARAM = -3, - USR_UNK_ARG = -4, - USR_BAD_ARG = -5, - USR_MEM_ERROR = -6, -} user_settings_errors; - -typedef enum -{ - format_not_set, - CXI, - CFA, - CCI, - CIA -} output_format; - -static const char output_extention[4][5] = {".cxi",".cfa",".cci",".cia"}; - -typedef struct -{ - struct{ - // Booleans - bool NoPadding; // DELETE - bool AllowUnalignedSection; - bool EnableCrypt; - bool EnableCompress; - bool FreeProductCode; - bool UseOnSD; - - // Strings - char *PageSize; - - // String Collections - u32 AppendSystemCallNum; // DELETE - char **AppendSystemCall; // DELETE - } Option; - - struct{ - // Booleans - bool DisableDebug; - bool EnableForceDebug; - bool CanWriteSharedPage; - bool CanUsePrivilegedPriority; - bool CanUseNonAlphabetAndNumber; - bool PermitMainFunctionArgument; - bool CanShareDeviceMemory; - bool UseOtherVariationSaveData; - bool UseExtSaveData; - bool UseExtendedSaveDataAccessControl; - bool RunnableOnSleep; - bool SpecialMemoryArrange; - - // Strings - char *ProgramId; // DELETE - char *IdealProcessor; - char *Priority; - char *MemoryType; - char *SystemMode; - char *CoreVersion; - char *HandleTableSize; - char *SystemSaveDataId1; - char *SystemSaveDataId2; - char *OtherUserSaveDataId1; - char *OtherUserSaveDataId2; - char *OtherUserSaveDataId3; - char *ExtSaveDataId; - char *AffinityMask; - // Strings From DESC - char *DescVersion; - char *CryptoKey; // DELETE - char *ResourceLimitCategory; - char *ReleaseKernelMajor; - char *ReleaseKernelMinor; - char *MaxCpu; - - // String Collections - u32 MemoryMappingNum; - char **MemoryMapping; - u32 IORegisterMappingNum; - char **IORegisterMapping; - u32 FileSystemAccessNum; - char **FileSystemAccess; - u32 IoAccessControlNum; - char **IoAccessControl; //Equiv to Arm9AccessControl - u32 InterruptNumbersNum; - char **InterruptNumbers; - u32 SystemCallAccessNum; - char **SystemCallAccess; - u32 ServiceAccessControlNum; - char **ServiceAccessControl; - u32 StorageIdNum; // DELETE - char **StorageId; // DELETE - u32 AccessibleSaveDataIdsNum; - char **AccessibleSaveDataIds; - } AccessControlInfo; - - struct{ - // Strings - char *AppType; - char *StackSize; - char *RemasterVersion; - char *JumpId; - - // String Collections - u32 DependencyNum; - char **Dependency; - } SystemControlInfo; - - struct{ - // Booleans - bool MediaFootPadding; - - // Strings - char *Title; - char *CompanyCode; - char *ProductCode; - char *MediaSize; - char *ContentType; - char *Logo; - char *BackupMemoryType;// Delete - char *InitialCode;// Delete - } BasicInfo; - - struct{ - // Strings - char *HostRoot; - char *Padding; // DELETE - char *SaveDataSize; - - // String Collections - u32 DefaultRejectNum; - char **DefaultReject; - u32 RejectNum; - char **Reject; - u32 IncludeNum; - char **Include; - u32 FileNum; - char **File; - } Rom; - - struct{ - u32 TextNum; - char **Text; - u32 ReadOnlyNum; - char **ReadOnly; - u32 ReadWriteNum; - char **ReadWrite; - } ExeFs; - - u32 PlainRegionNum; - char **PlainRegion; - - struct{ - // Strings - char *Platform; // DELETE - char *Category; - char *UniqueId; - char *Version; - char *ContentsIndex; - char *Variation; - char *Use; // DELETE - char *ChildIndex; - char *DemoIndex; - char *TargetCategory; - - // String Collections - u32 CategoryFlagsNum; - char **CategoryFlags; - } TitleInfo; - - struct{ - char *WritableAddress; - char *CardType; - char *CryptoType; - char *CardDevice; - char *MediaType; - char *BackupWriteWaitTime; - } CardInfo; - - struct{ - bool Found; - - char *D; - char *P; - char *Q; - char *DP; - char *DQ; - char *InverseQ; - char *Modulus; - char *Exponent; - - char *AccCtlDescSign; - char *AccCtlDescBin; - } CommonHeaderKey; -} rsf_settings; - -typedef struct -{ - // General Settings - char *rsf_path; - bool outfile_mallocd; - char *outfile; - output_format out_format; - - // Content0 - bool ConvertCci; - char *CciPath; - bool Content0IsSrl; - char *SrlPath; - - bool Content0IsNcch; - COMPONENT_STRUCT Content0; - char **ContentPath; - u64 ContentID[CIA_MAX_CONTENT]; // For CIA - - // Ncch0 Build - bool IsBuildingNCCH0; - output_format build_ncch_type; - char *elf_path; - char *icon_path; - char *banner_path; - char *logo_path; - - bool include_exefs_logo; - - char *exefs_code_path; - char *exheader_path; - char *plain_region_path; - char *romfs_path; - - // CCI Settings - bool GenSDKCardInfoHeader; - bool OmitImportedNcchHdr; - - // CIA Settings - bool RandomTitleKey; - bool EncryptContents; - u16 Version[3]; - - // Keys - keys_struct keys; - - // RSF/DESC Imported Settings - rsf_settings yaml_set; -} user_settings; -#endif - -// Prototypes - -void init_UserSettings(user_settings *usr_settings); -void free_UserSettings(user_settings *usr_settings); -int ParseArgs(int argc, char *argv[], user_settings *usr_settings); -void ReadYAMLtest(char *filepath); - -void free_RsfSettings(rsf_settings *set); diff --git a/utils.c b/utils.c deleted file mode 100644 index 6c78ea2..0000000 --- a/utils.c +++ /dev/null @@ -1,373 +0,0 @@ -#include "lib.h" - -//MISC -void char_to_u8_array(unsigned char destination[], char source[], int size, int endianness, int base) -{ - char tmp[size][2]; - unsigned char *byte_array = malloc(size*sizeof(unsigned char)); - memset(byte_array, 0, size); - memset(destination, 0, size); - memset(tmp, 0, size*2); - - for (int i = 0; i < size; i ++){ - tmp[i][0] = source[(i*2)]; - tmp[i][1] = source[((i*2)+1)]; - tmp[i][2] = '\0'; - byte_array[i] = (unsigned char)strtol(tmp[i], NULL, base); - } - endian_memcpy(destination,byte_array,size,endianness); - free(byte_array); -} - -void endian_memcpy(u8 *destination, u8 *source, u32 size, int endianness) -{ - for (u32 i = 0; i < size; i++){ - switch (endianness){ - case(BE): - destination[i] = source[i]; - break; - case(LE): - destination[i] = source[((size-1)-i)]; - break; - } - } -} - -void u8_hex_print_be(u8 *array, int len) -{ - for(int i = 0; i < len; i++) - printf("%02x",array[i]); -} - -void u8_hex_print_le(u8 *array, int len) -{ - for(int i = 0; i < len; i++) - printf("%02x",array[len - i - 1]); -} - -u64 align_value(u64 value, u64 alignment) -{ - u64 tmp = value; - while(tmp > alignment) - tmp -= alignment; - return (value + (alignment - tmp)); -} - -void resolve_flag(unsigned char flag, unsigned char *flag_bool) -{ - unsigned char bit_mask[8] = {0x80,0x40,0x20,0x10,0x8,0x4,0x2,0x1}; - for(int i = 0; i < 8; i++){ - if (flag >= bit_mask[i]){ - flag_bool[7-i] = true; - flag -= bit_mask[i]; - } - else - flag_bool[7-i] = false; - } -} - -void resolve_flag_u16(u16 flag, unsigned char *flag_bool) -{ - u16 bit_mask[16] = {0x8000,0x4000,0x2000,0x1000,0x800,0x400,0x200,0x100,0x80,0x40,0x20,0x10,0x8,0x4,0x2,0x1}; - for(int i = 0; i < 16; i++){ - if (flag >= bit_mask[i]){ - flag_bool[15-i] = true; - flag -= bit_mask[i]; - } - else - flag_bool[15-i] = false; - } -} - -int append_filextention(char *output, u16 max_outlen, char *input, char extention[]) -{ - if(output == NULL || input == NULL){ - printf("[!] Memory Error\n"); - return Fail; - } - memset(output,0,max_outlen); - u16 extention_point = strlen(input)+1; - for(int i = strlen(input)-1; i > 0; i--){ - if(input[i] == '.'){ - extention_point = i; - break; - } - } - if(extention_point+strlen(extention) >= max_outlen){ - printf("[!] Input File Name Too Large for Output buffer\n"); - return Fail; - } - memcpy(output,input,extention_point); - sprintf(output,"%s%s",output,extention); - return 0; -} - -int CopyData(u8 **dest, u8 *source, u64 size) -{ - if(!*dest){ - *dest = malloc(size); - if(!*dest) return -1; - } - memcpy(*dest,source,size); - return 0; -} - -u64 min_u64(u64 a, u64 b) -{ - if(a < b) return a; - return b; -} - -u64 max_u64(u64 a, u64 b) -{ - if(a > b) return a; - return b; -} - -//IO Related -void WriteBuffer(void *buffer, u64 size, u64 offset, FILE *output) -{ - fseek_64(output,offset,SEEK_SET); - fwrite(buffer,size,1,output); -} - -void ReadFile_64(void *outbuff, u64 size, u64 offset, FILE *file) -{ - fseek_64(file,offset,SEEK_SET); - fread(outbuff,size,1,file); -} - -u64 GetFileSize_u64(char *filename) -{ - u64 size; -#ifdef _WIN32 - /* Making sure file exists */ - FILE *tmp = fopen(filename,"rb"); - if(!tmp) return 0; - fclose(tmp); - - int fh; - u64 n; - fh = _open( filename, 0 ); - n = _lseeki64(fh, 0, SEEK_END); - _close(fh); - size = (n / sizeof(short))*2; -#else - FILE *file = fopen(filename,"rb"); - fseeko(file, 0L, SEEK_END); - size = ftello(file); - fclose(file); -#endif - return size; -} - -u32 GetFileSize_u32(FILE *file) -{ - u32 size = 0; - fseek(file, 0L, SEEK_END); - size = ftell(file); - fseek(file, 0L, SEEK_SET); - return size; -} - -int TruncateFile_u64(char *filename, u64 filelen) -{ -#ifdef _WIN32 - HANDLE fh; - - LARGE_INTEGER fp; - fp.QuadPart = filelen; - - fh = CreateFile(filename, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); - if (fh == INVALID_HANDLE_VALUE) { - printf("[!] Invalid File handle\n"); - return 1; - } - - if (SetFilePointerEx(fh, fp, NULL, FILE_BEGIN) == 0 || - SetEndOfFile(fh) == 0) { - printf("[!] truncate failed\n"); - CloseHandle(fh); - return 1; - } - - CloseHandle(fh); - return 0; -#else - return truncate(filename,filelen); -#endif -} - -int fseek_64(FILE *fp, u64 file_pos, int whence) -{ -#ifdef _WIN32 - if(whence != SEEK_SET) - printf("[!] fseek_64, whence has been overided to SEEK_SET\n"); - fpos_t pos = file_pos; - return fsetpos(fp,&pos); //I can't believe the 2gb problem with Windows & MINGW, maybe I have a bad installation :/ -#else - return fseeko(fp,file_pos,whence); -#endif -} - -int makedir(const char* dir) -{ -#ifdef _WIN32 - return _mkdir(dir); -#else - return mkdir(dir, 0777); -#endif -} - -char *getcwdir(char *buffer,int maxlen) -{ -#ifdef _WIN32 - return _getcwd(buffer,maxlen); -#else - return getcwd(buffer,maxlen); -#endif -} - -//Data Size conversion -u16 u8_to_u16(u8 *value, u8 endianness) -{ - u16 new_value; - switch(endianness){ - case(BE): new_value = (value[1]<<0) | (value[0]<<8); break; - case(LE): new_value = (value[0]<<0) | (value[1]<<8); break; - } - return new_value; -} - -u32 u8_to_u32(u8 *value, u8 endianness) -{ - u32 new_value; - switch(endianness){ - case(BE): new_value = (value[3]<<0) | (value[2]<<8) | (value[1]<<16) | (value[0]<<24); break; - case(LE): new_value = (value[0]<<0) | (value[1]<<8) | (value[2]<<16) | (value[3]<<24); break; - } - return new_value; -} - - -u64 u8_to_u64(u8 *value, u8 endianness) -{ - u64 u64_return = 0; - switch(endianness){ - case(BE): - u64_return |= (u64)value[7]<<0; - u64_return |= (u64)value[6]<<8; - u64_return |= (u64)value[5]<<16; - u64_return |= (u64)value[4]<<24; - u64_return |= (u64)value[3]<<32; - u64_return |= (u64)value[2]<<40; - u64_return |= (u64)value[1]<<48; - u64_return |= (u64)value[0]<<56; - break; - //return (value[7]<<0) | (value[6]<<8) | (value[5]<<16) | (value[4]<<24) | (value[3]<<32) | (value[2]<<40) | (value[1]<<48) | (value[0]<<56); - case(LE): - u64_return |= (u64)value[0]<<0; - u64_return |= (u64)value[1]<<8; - u64_return |= (u64)value[2]<<16; - u64_return |= (u64)value[3]<<24; - u64_return |= (u64)value[4]<<32; - u64_return |= (u64)value[5]<<40; - u64_return |= (u64)value[6]<<48; - u64_return |= (u64)value[7]<<56; - break; - //return (value[0]<<0) | (value[1]<<8) | (value[2]<<16) | (value[3]<<24) | (value[4]<<32) | (value[5]<<40) | (value[6]<<48) | (value[7]<<56); - } - return u64_return; -} - -int u16_to_u8(u8 *out_value, u16 in_value, u8 endianness) -{ - switch(endianness){ - case(BE): - out_value[0]=(in_value >> 8); - out_value[1]=(in_value >> 0); - break; - case(LE): - out_value[0]=(in_value >> 0); - out_value[1]=(in_value >> 8); - break; - } - return 0; -} - -int u32_to_u8(u8 *out_value, u32 in_value, u8 endianness) -{ - switch(endianness){ - case(BE): - out_value[0]=(in_value >> 24); - out_value[1]=(in_value >> 16); - out_value[2]=(in_value >> 8); - out_value[3]=(in_value >> 0); - break; - case(LE): - out_value[0]=(in_value >> 0); - out_value[1]=(in_value >> 8); - out_value[2]=(in_value >> 16); - out_value[3]=(in_value >> 24); - break; - } - return 0; -} - -int u64_to_u8(u8 *out_value, u64 in_value, u8 endianness) -{ - switch(endianness){ - case(BE): - out_value[0]=(in_value >> 56); - out_value[1]=(in_value >> 48); - out_value[2]=(in_value >> 40); - out_value[3]=(in_value >> 32); - out_value[4]=(in_value >> 24); - out_value[5]=(in_value >> 16); - out_value[6]=(in_value >> 8); - out_value[7]=(in_value >> 0); - break; - case(LE): - out_value[0]=(in_value >> 0); - out_value[1]=(in_value >> 8); - out_value[2]=(in_value >> 16); - out_value[3]=(in_value >> 24); - out_value[4]=(in_value >> 32); - out_value[5]=(in_value >> 40); - out_value[6]=(in_value >> 48); - out_value[7]=(in_value >> 56); - break; - } - return 0; -} - -//Copied from ctrtool -void memdump(FILE* fout, const char* prefix, const u8* data, u32 size) -{ - u32 i; - u32 prefixlen = strlen(prefix); - u32 offs = 0; - u32 line = 0; - while(size) - { - u32 max = 32; - - if (max > size) - max = size; - - if (line==0) - fprintf(fout, "%s", prefix); - else - fprintf(fout, "%*s", prefixlen, ""); - - - for(i=0; iyaml_set,0,sizeof(rsf_settings)); - int ret = 0; - if(set->rsf_path) { - FILE *tmp = fopen(set->rsf_path,"rb"); - if(!tmp) { - fprintf(stderr,"[YAML ERROR] Failed to open %s\n",set->rsf_path); - return FAILED_TO_OPEN_FILE; - } - fclose(tmp); - ret = ParseSpecFile(&set->yaml_set,set->rsf_path); - } - return ret; -} - -int ParseSpecFile(rsf_settings *set, char *path) -{ - ctr_yaml_context *ctx = malloc(sizeof(ctr_yaml_context)); - InitYamlContext(ctx); - - /* Set Specfile Type */ - - /* Create the Parser object. */ - yaml_parser_initialize(&ctx->parser); - - /* Set a file input. */ - FILE *input = fopen(path,"rb"); - yaml_parser_set_input_file(&ctx->parser, input); - - - ctx->IsSequence = false; - ctx->IsKey = true; - ctx->prev_event = 0; - ctx->Level = 0; - - - /* Read the event sequence. */ - while (!ctx->done) { - /* Get the next event. */ - GetEvent(ctx); - if(ctx->error) goto error; - - /* Proccess Event */ - - - if(EventIsScalar(ctx)){ - EvaluateRSF(set,ctx); - if(ctx->error) goto error; - break; - } - /* - if((ctx->event.type == YAML_SEQUENCE_START_EVENT|| ctx->event.type == YAML_MAPPING_START_EVENT) && ctx->prev_event == YAML_SCALAR_EVENT) printf(":\n"); - if(ctx->event.type == YAML_SCALAR_EVENT){ - if(ctx->IsSequence){ - printf(" - %s\n",ctx->event.data.scalar.value); - } - else{ - if(!ctx->IsKey) printf(": %s\n",ctx->event.data.scalar.value); - else printf("%s",ctx->event.data.scalar.value); - } - } - */ - - /* Finish Event */ - FinishEvent(ctx); - if(ctx->error) goto error; - } - - /* Destroy the Parser object. */ - yaml_parser_delete(&ctx->parser); - fclose(input); - return 0; - - /* On error. */ - error: - fprintf(stderr,"[-] Error Proccessing RSF file\n"); - - /* Destroy the Parser object. */ - yaml_parser_delete(&ctx->parser); - fclose(input); - return ctx->error; -} - -void InitYamlContext(ctr_yaml_context *ctx) -{ - memset(ctx,0,sizeof(ctr_yaml_context)); -} - -char *GetYamlString(ctr_yaml_context *ctx) -{ - /* - if(EventIsScalar(ctx)){ - if(!GetYamlStringSize(ctx) && !ctx->event.data.scalar.value) - return ctx->event.data.scalar.value; - } - - return NULL; - */ - return (char*)ctx->event.data.scalar.value; -} - - -u32 GetYamlStringSize(ctr_yaml_context *ctx) -{ - return ctx->event.data.scalar.length; -} - -void GetEvent(ctr_yaml_context *ctx) -{ - if (!yaml_parser_parse(&ctx->parser, &ctx->event)){ - ctx->error = YAML_API_ERROR; - return; - } - CheckEvent(ctx); -} - -void CheckEvent(ctr_yaml_context *ctx) -{ - switch(ctx->event.type){ - case YAML_SEQUENCE_START_EVENT: - ctx->IsSequence = true; - ctx->IsKey = true; - ctx->Level++; - //printf("[LEVEL] %d\n",ctx->Level); - break; - case YAML_SEQUENCE_END_EVENT: - ctx->IsSequence = false; - ctx->IsKey = true; - ctx->Level--; - //printf("[LEVEL] %d\n",ctx->Level); - break; - case YAML_MAPPING_START_EVENT: - ctx->IsKey = true; - ctx->Level++; - //printf("[LEVEL] %d\n",ctx->Level); - break; - case YAML_MAPPING_END_EVENT: - ctx->IsKey = true; - ctx->Level--; - //printf("[LEVEL] %d\n",ctx->Level); - break; - case YAML_DOCUMENT_END_EVENT: - case YAML_STREAM_END_EVENT: - ctx->done = true; - break; - default: break; - } -} - -void FinishEvent(ctr_yaml_context *ctx) -{ - if(ctx->event.type == YAML_SCALAR_EVENT) { - if(!ctx->IsSequence){ - if(!ctx->IsKey)ctx->IsKey = true; - else ctx->IsKey = false; - } - } - ctx->prev_event = ctx->event.type; - yaml_event_delete(&ctx->event); -} - -bool EventIsScalar(ctr_yaml_context *ctx) -{ - return (ctx->event.type == YAML_SCALAR_EVENT); -} - -bool EventIsMappingStart(ctr_yaml_context *ctx) -{ - return (ctx->event.type == YAML_MAPPING_START_EVENT); -} - -bool EventIsMappingEnd(ctr_yaml_context *ctx) -{ - return (ctx->event.type == YAML_MAPPING_END_EVENT); -} - -bool EventIsSequenceStart(ctr_yaml_context *ctx) -{ - return (ctx->event.type == YAML_SEQUENCE_START_EVENT); -} - -bool EventIsSequenceEnd(ctr_yaml_context *ctx) -{ - return (ctx->event.type == YAML_SEQUENCE_END_EVENT); -} - -bool CheckSequenceEvent(ctr_yaml_context *ctx) -{ - GetEvent(ctx); - if(!EventIsSequenceStart(ctx)){ - FinishEvent(ctx); - //fprintf(stderr,"[-] Bad formatting in Spec file (Expected Sequence)\n"); - //ctx->error = YAML_BAD_FORMATTING; - return false; - } - FinishEvent(ctx); - return true; -} - -bool CheckMappingEvent(ctr_yaml_context *ctx) -{ - GetEvent(ctx); - if(!EventIsMappingStart(ctx)){ - FinishEvent(ctx); - //fprintf(stderr,"[-] Bad formatting in Spec file (Expected Mapping)\n"); - //ctx->error = YAML_BAD_FORMATTING; - return false; - } - FinishEvent(ctx); - return true; -} - -void BadYamlFormatting(void) -{ - fprintf(stderr,"[-] Bad formatting in Spec file\n"); -} - - -bool cmpYamlValue(char *string,ctr_yaml_context *ctx) -{ - return (strcmp(GetYamlString(ctx),string) == 0); -} - -bool casecmpYamlValue(char *string,ctr_yaml_context *ctx) -{ - return (strcasecmp(GetYamlString(ctx),string) == 0); -} - -void SetSimpleYAMLValue(char **dest, char *key, ctr_yaml_context *ctx, u32 size_limit) -{ - if(*dest){ - fprintf(stderr,"[-] Item '%s' is already set\n",key); - ctx->error = YAML_MEM_ERROR; - return; - } - - GetEvent(ctx); - if(ctx->error || ctx->done) return; - if(!EventIsScalar(ctx)){ - fprintf(stderr,"[-] '%s' requires a value\n",key); - ctx->error = YAML_BAD_FORMATTING; - return; - } - if(!GetYamlStringSize(ctx)) return; - - u32 size = GetYamlStringSize(ctx); - if(size > size_limit && size_limit) size = size_limit; - - - char *tmp = *dest; - tmp = malloc(size+2); - if(!tmp) { - ctx->error = YAML_MEM_ERROR; - return; - } - memset(tmp,0,size+2); - memcpy(tmp,GetYamlString(ctx),size); - - //printf("Setting %s to %s (size of %d)\n",key,GetYamlString(ctx),size); - //printf("Check: %s & %x\n",tmp,tmp); - *dest = tmp; - -} - -bool SetBoolYAMLValue(char *key, ctr_yaml_context *ctx) -{ - GetEvent(ctx); - if(ctx->error || ctx->done) return false; - if(!EventIsScalar(ctx)){ - fprintf(stderr,"[-] '%s' requires a value\n",key); - ctx->error = YAML_BAD_FORMATTING; - return false; - } - if(!GetYamlStringSize(ctx)){ - fprintf(stderr,"[-] '%s' requires a value\n",key); - ctx->error = YAML_BAD_FORMATTING; - return false; - } - - if(casecmpYamlValue("true",ctx)) return true; - if(casecmpYamlValue("false",ctx)) return false; - - fprintf(stderr,"[-] Invalid '%s'\n",key); - ctx->error = YAML_BAD_FORMATTING; - return false; - -} - -u32 SetYAMLSequence(char ***dest, char *key, ctr_yaml_context *ctx) -{ - if(*dest){ - fprintf(stderr,"[-] %s already set\n",key); - ctx->error = YAML_MEM_ERROR; - return 0; - } - - u32 ActualCount = 0; - u32 SlotCount = 0; - char **tmp = *dest; - if(!CheckSequenceEvent(ctx)) return 0; - SlotCount = 10; - tmp = malloc((SlotCount+1)*sizeof(char*)); - if(!tmp){ - ctx->error = YAML_MEM_ERROR; - return 0; - } - memset(tmp,0,(SlotCount+1)*sizeof(char*)); - GetEvent(ctx); - if(ctx->error || ctx->done) return 0; - if(!EventIsScalar(ctx)){ - fprintf(stderr,"[-] '%s' requires a value\n",key); - ctx->error = YAML_BAD_FORMATTING; - return 0; - } - - - if(!GetYamlStringSize(ctx)) return 0; - u32 InitLevel = ctx->Level; - while(ctx->Level == InitLevel){ - if(ctx->error || ctx->done) return 0; - tmp[ActualCount] = malloc(GetYamlStringSize(ctx)+1); - memset(tmp[ActualCount],0,GetYamlStringSize(ctx)+1); - memcpy(tmp[ActualCount],GetYamlString(ctx),GetYamlStringSize(ctx)); - ActualCount++; - if(ActualCount >= SlotCount){ // if Exceeding Ptr capacity, expand buffer - SlotCount = SlotCount*2; - char **tmp1 = malloc((SlotCount+1)*sizeof(char*)); // allocate new buffer - if(!tmp1){ - ctx->error = YAML_MEM_ERROR; - return 0; - } - memset(tmp1,0,(SlotCount+1)*sizeof(char*)); - for(u32 i = 0; i < ActualCount; i++) tmp1[i] = tmp[i]; // Transfer ptrs - free(tmp); // free original buffer - tmp = tmp1; // transfer main ptr - } - FinishEvent(ctx); - GetEvent(ctx); - } - FinishEvent(ctx); - *dest = tmp; // Give main ptr to location - return ActualCount++; // return number of strings -} - -u32 SetYAMLSequenceFromMapping(char ***dest, char *key, ctr_yaml_context *ctx, bool StoreKey) -{ - if(*dest){ - fprintf(stderr,"[-] %s already set\n",key); - ctx->error = YAML_MEM_ERROR; - return 0; - } - - u32 ActualCount = 0; - u32 SlotCount = 0; - char **tmp = *dest; - if(!CheckMappingEvent(ctx)) return 0; - SlotCount = 10; - tmp = malloc((SlotCount+1)*sizeof(char*)); - if(!tmp){ - ctx->error = YAML_MEM_ERROR; - return 0; - } - memset(tmp,0,(SlotCount+1)*sizeof(char*)); - GetEvent(ctx); - if(ctx->error || ctx->done) return 0; - if(!EventIsScalar(ctx)){ - fprintf(stderr,"[-] '%s' requires a value\n",key); - ctx->error = YAML_BAD_FORMATTING; - return 0; - } - - - if(!GetYamlStringSize(ctx)) return 0; - u32 InitLevel = ctx->Level; - while(ctx->Level == InitLevel){ - if(ctx->error || ctx->done) return 0; - if(ctx->IsKey == StoreKey){ - tmp[ActualCount] = malloc(GetYamlStringSize(ctx)+1); - memset(tmp[ActualCount],0,GetYamlStringSize(ctx)+1); - memcpy(tmp[ActualCount],GetYamlString(ctx),GetYamlStringSize(ctx)); - ActualCount++; - if(ActualCount >= SlotCount){ // if Exceeding Ptr capacity, expand buffer - SlotCount = SlotCount*2; - char **tmp1 = malloc((SlotCount+1)*sizeof(char*)); // allocate new buffer - if(!tmp1){ - ctx->error = YAML_MEM_ERROR; - return 0; - } - memset(tmp1,0,(SlotCount+1)*sizeof(char*)); - for(u32 i = 0; i < ActualCount; i++) tmp1[i] = tmp[i]; // Transfer ptrs - free(tmp); // free original buffer - tmp = tmp1; // transfer main ptr - } - } - FinishEvent(ctx); - GetEvent(ctx); - } - FinishEvent(ctx); - *dest = tmp; // Give main ptr to location - return ActualCount++; // return number of strings -} - -void SkipYAMLGroup(ctr_yaml_context *ctx) // Why Nintendo? Why is this necessary? Why can't you just create valid .desc files? -{ - FinishEvent(ctx); - GetEvent(ctx); - if(!EventIsMappingStart(ctx) && !EventIsSequenceStart(ctx) && EventIsScalar(ctx)) return; - FinishEvent(ctx); - GetEvent(ctx); - - if(ctx->error || ctx->done) return; - if(!EventIsScalar(ctx)){ - fprintf(stderr,"[-] 'Format error\n"); - ctx->error = YAML_BAD_FORMATTING; - return; - } - if(!GetYamlStringSize(ctx)) return; - u32 InitLevel = ctx->Level; - while(ctx->Level == InitLevel){ - if(ctx->error || ctx->done) return; - FinishEvent(ctx); - GetEvent(ctx); - } - FinishEvent(ctx); -} \ No newline at end of file diff --git a/yaml_ctr.h b/yaml_ctr.h deleted file mode 100644 index 7f1cfaa..0000000 --- a/yaml_ctr.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef _YAML_H_ -#define _YAML_H_ - -typedef enum -{ - YAML_API_ERROR = -1, - YAML_BAD_GROUP_HEADER = -2, - YAML_BAD_FORMATTING = -3, - YAML_MEM_ERROR = -4, - YAML_UNKNOWN_KEY = -5, -} ctr_yaml_error; - -typedef struct -{ - // For Continued Parsing of file - yaml_parser_t parser; - yaml_event_t event; - bool done; - int error; - - // Important Details - bool IsSequence; - bool IsKey; - yaml_event_type_t prev_event; - u32 Level; - -} ctr_yaml_context; - -#endif - -// Public Prototypes -int GetYamlSettings(user_settings *set); - -// For scalar events -char *GetYamlString(ctr_yaml_context *ctx); -u32 GetYamlStringSize(ctr_yaml_context *ctx); -bool cmpYamlValue(char *string,ctr_yaml_context *ctx); // Compares a string to the current scalar event -bool casecmpYamlValue(char *string,ctr_yaml_context *ctx); // same as above but ignores case - -// Event Handlers -void GetEvent(ctr_yaml_context *ctx); -void FinishEvent(ctr_yaml_context *ctx); - - -// Event Type Checks -bool EventIsScalar(ctr_yaml_context *ctx); -bool EventIsMappingStart(ctr_yaml_context *ctx); -bool EventIsMappingEnd(ctr_yaml_context *ctx); -bool EventIsSequenceStart(ctr_yaml_context *ctx); -bool EventIsSequenceEnd(ctr_yaml_context *ctx); -bool CheckMappingEvent(ctr_yaml_context *ctx); // With extra implement, use if lazy -bool CheckSequenceEvent(ctr_yaml_context *ctx); // With extra implement, use if lazy - - -// Functions which store values -void SetSimpleYAMLValue(char **dest, char *key, ctr_yaml_context *ctx, u32 size_limit); -bool SetBoolYAMLValue(char *key, ctr_yaml_context *ctx); -u32 SetYAMLSequence(char ***dest, char *key, ctr_yaml_context *ctx); -u32 SetYAMLSequenceFromMapping(char ***dest, char *key, ctr_yaml_context *ctx, bool StoreKey); -void SkipYAMLGroup(ctr_yaml_context *ctx); \ No newline at end of file diff --git a/yamlsettings.c b/yamlsettings.c deleted file mode 100644 index 9b4ec15..0000000 --- a/yamlsettings.c +++ /dev/null @@ -1,374 +0,0 @@ -#include "lib.h" -#include "yamlsettings.h" - -void EvaluateRSF(rsf_settings *rsf, ctr_yaml_context *ctx) -{ - u32 start_level = ctx->Level-1; - - /* Check Group Key for Validity */ - CHECK_Group: - //printf("RSF Found: %s\n",GetYamlString(ctx)); - if(cmpYamlValue("Option",ctx)) {FinishEvent(ctx); GET_Option(ctx,rsf); goto GET_NextGroup;} - else if(cmpYamlValue("AccessControlInfo",ctx)) {FinishEvent(ctx); GET_AccessControlInfo(ctx,rsf); goto GET_NextGroup;} - else if(cmpYamlValue("SystemControlInfo",ctx)) {FinishEvent(ctx); GET_SystemControlInfo(ctx,rsf); goto GET_NextGroup;} - else if(cmpYamlValue("BasicInfo",ctx)) {FinishEvent(ctx); GET_BasicInfo(ctx,rsf); goto GET_NextGroup;} - else if(cmpYamlValue("Rom",ctx)) {FinishEvent(ctx); GET_Rom(ctx,rsf); goto GET_NextGroup;} - else if(cmpYamlValue("ExeFs",ctx)) {FinishEvent(ctx); GET_ExeFs(ctx,rsf); goto GET_NextGroup;} - else if(cmpYamlValue("PlainRegion",ctx)) {FinishEvent(ctx); GET_PlainRegion(ctx,rsf); goto GET_NextGroup;} - else if(cmpYamlValue("TitleInfo",ctx)) {FinishEvent(ctx); GET_TitleInfo(ctx,rsf); goto GET_NextGroup;} - else if(cmpYamlValue("CardInfo",ctx)) {FinishEvent(ctx); GET_CardInfo(ctx,rsf); goto GET_NextGroup;} - else if(cmpYamlValue("CommonHeaderKey",ctx)) {FinishEvent(ctx); GET_CommonHeaderKey(ctx,rsf); goto GET_NextGroup;} - - // If not recognised escape: - fprintf(stderr,"[-] Unrecognised Key: '%s'\n",GetYamlString(ctx)); - FinishEvent(ctx); - ctx->error = YAML_BAD_GROUP_HEADER; - return; - - /* Get Next Group and call check */ - GET_NextGroup: - // If done return - if(ctx->done || ctx->error) return; - - // Recursively getting events until done or has value - if(!ctx->event.type) GetEvent(ctx); - if(ctx->Level <= start_level) return; // No longer in RSF Domain - while(!EventIsScalar(ctx)){ - if(ctx->done || ctx->error) return; - if(ctx->Level <= start_level) return; // No longer in RSF Domain - FinishEvent(ctx); - GetEvent(ctx); - } - goto CHECK_Group; -} - -void GET_Option(ctr_yaml_context *ctx, rsf_settings *rsf) -{ - /* Checking That Group is in a map */ - if(!CheckMappingEvent(ctx)) return; - u32 InitLevel = ctx->Level; - /* Checking each child */ - GetEvent(ctx); - while(ctx->Level == InitLevel){ - if(ctx->error || ctx->done) return; - // Handle childs - if(cmpYamlValue("AllowUnalignedSection",ctx)) rsf->Option.AllowUnalignedSection = SetBoolYAMLValue("AllowUnalignedSection",ctx); - //else if(cmpYamlValue("NoPadding",ctx)) rsf->Option.NoPadding = SetBoolYAMLValue("NoPadding",ctx); - else if(cmpYamlValue("EnableCrypt",ctx)) rsf->Option.EnableCrypt = SetBoolYAMLValue("EnableCrypt",ctx); - else if(cmpYamlValue("EnableCompress",ctx)) rsf->Option.EnableCompress = SetBoolYAMLValue("EnableCompress",ctx); - else if(cmpYamlValue("FreeProductCode",ctx)) rsf->Option.FreeProductCode = SetBoolYAMLValue("FreeProductCode",ctx); - else if(cmpYamlValue("UseOnSD",ctx)) rsf->Option.UseOnSD = SetBoolYAMLValue("UseOnSD",ctx); - else if(cmpYamlValue("PageSize",ctx)) SetSimpleYAMLValue(&rsf->Option.PageSize,"PageSize",ctx,0); - //else if(cmpYamlValue("AppendSystemCall",ctx)) rsf->Option.AppendSystemCallNum = SetYAMLSequence(&rsf->Option.AppendSystemCall,"AppendSystemCall",ctx); - else{ - fprintf(stderr,"[-] Unrecognised key '%s'\n",GetYamlString(ctx)); - ctx->error = YAML_UNKNOWN_KEY; - FinishEvent(ctx); - return; - } - // Finish event start next - FinishEvent(ctx); - GetEvent(ctx); - } - FinishEvent(ctx); -} - -void GET_AccessControlInfo(ctr_yaml_context *ctx, rsf_settings *rsf) -{ - /* Checking That Group is in a map */ - if(!CheckMappingEvent(ctx)) return; - u32 InitLevel = ctx->Level; - /* Checking each child */ - GetEvent(ctx); - while(ctx->Level == InitLevel){ - if(ctx->error || ctx->done) return; - // Handle childs - if(cmpYamlValue("DisableDebug",ctx)) rsf->AccessControlInfo.DisableDebug = SetBoolYAMLValue("DisableDebug",ctx); - else if(cmpYamlValue("EnableForceDebug",ctx)) rsf->AccessControlInfo.EnableForceDebug = SetBoolYAMLValue("EnableForceDebug",ctx); - else if(cmpYamlValue("CanWriteSharedPage",ctx)) rsf->AccessControlInfo.CanWriteSharedPage = SetBoolYAMLValue("CanWriteSharedPage",ctx); - else if(cmpYamlValue("CanUsePrivilegedPriority",ctx)) rsf->AccessControlInfo.CanUsePrivilegedPriority = SetBoolYAMLValue("CanUsePrivilegedPriority",ctx); - else if(cmpYamlValue("CanUseNonAlphabetAndNumber",ctx)) rsf->AccessControlInfo.CanUseNonAlphabetAndNumber = SetBoolYAMLValue("CanUseNonAlphabetAndNumber",ctx); - else if(cmpYamlValue("PermitMainFunctionArgument",ctx)) rsf->AccessControlInfo.PermitMainFunctionArgument = SetBoolYAMLValue("PermitMainFunctionArgument",ctx); - else if(cmpYamlValue("CanShareDeviceMemory",ctx)) rsf->AccessControlInfo.CanShareDeviceMemory = SetBoolYAMLValue("CanShareDeviceMemory",ctx); - else if(cmpYamlValue("UseOtherVariationSaveData",ctx)) rsf->AccessControlInfo.UseOtherVariationSaveData = SetBoolYAMLValue("UseOtherVariationSaveData",ctx); - else if(cmpYamlValue("UseExtSaveData",ctx)) rsf->AccessControlInfo.UseExtSaveData = SetBoolYAMLValue("UseExtSaveData",ctx); - else if(cmpYamlValue("UseExtendedSaveDataAccessControl",ctx)) rsf->AccessControlInfo.UseExtendedSaveDataAccessControl = SetBoolYAMLValue("UseExtendedSaveDataAccessControl",ctx); - else if(cmpYamlValue("RunnableOnSleep",ctx)) rsf->AccessControlInfo.RunnableOnSleep = SetBoolYAMLValue("RunnableOnSleep",ctx); - else if(cmpYamlValue("SpecialMemoryArrange",ctx)) rsf->AccessControlInfo.SpecialMemoryArrange = SetBoolYAMLValue("SpecialMemoryArrange",ctx); - - - //else if(cmpYamlValue("ProgramId",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.ProgramId,"ProgramId",ctx,0); - else if(cmpYamlValue("IdealProcessor",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.IdealProcessor,"IdealProcessor",ctx,0); - else if(cmpYamlValue("Priority",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.Priority,"Priority",ctx,0); - else if(cmpYamlValue("MemoryType",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.MemoryType,"MemoryType",ctx,0); - else if(cmpYamlValue("SystemMode",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.SystemMode,"SystemMode",ctx,0); - else if(cmpYamlValue("CoreVersion",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.CoreVersion,"CoreVersion",ctx,0); - else if(cmpYamlValue("HandleTableSize",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.HandleTableSize,"HandleTableSize",ctx,0); - else if(cmpYamlValue("SystemSaveDataId1",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.SystemSaveDataId1,"SystemSaveDataId1",ctx,0); - else if(cmpYamlValue("SystemSaveDataId2",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.SystemSaveDataId2,"SystemSaveDataId2",ctx,0); - else if(cmpYamlValue("OtherUserSaveDataId1",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.OtherUserSaveDataId1,"OtherUserSaveDataId1",ctx,0); - else if(cmpYamlValue("OtherUserSaveDataId2",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.OtherUserSaveDataId2,"OtherUserSaveDataId2",ctx,0); - else if(cmpYamlValue("OtherUserSaveDataId3",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.OtherUserSaveDataId3,"OtherUserSaveDataId3",ctx,0); - else if(cmpYamlValue("ExtSaveDataId",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.ExtSaveDataId,"ExtSaveDataId",ctx,0); - else if(cmpYamlValue("AffinityMask",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.AffinityMask,"AffinityMask",ctx,0); - else if(cmpYamlValue("DescVersion",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.DescVersion,"DescVersion",ctx,0); - //else if(cmpYamlValue("CryptoKey",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.CryptoKey,"CryptoKey",ctx,0); - else if(cmpYamlValue("ResourceLimitCategory",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.ResourceLimitCategory,"ResourceLimitCategory",ctx,0); - else if(cmpYamlValue("ReleaseKernelMajor",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.ReleaseKernelMajor,"ReleaseKernelMajor",ctx,0); - else if(cmpYamlValue("ReleaseKernelMinor",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.ReleaseKernelMinor,"ReleaseKernelMinor",ctx,0); - else if(cmpYamlValue("MaxCpu",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.MaxCpu,"MaxCpu",ctx,0); - - - else if(cmpYamlValue("MemoryMapping",ctx)) rsf->AccessControlInfo.MemoryMappingNum = SetYAMLSequence(&rsf->AccessControlInfo.MemoryMapping,"MemoryMapping",ctx); - else if(cmpYamlValue("IORegisterMapping",ctx)) rsf->AccessControlInfo.IORegisterMappingNum = SetYAMLSequence(&rsf->AccessControlInfo.IORegisterMapping,"IORegisterMapping",ctx); - else if(cmpYamlValue("FileSystemAccess",ctx)) rsf->AccessControlInfo.FileSystemAccessNum = SetYAMLSequence(&rsf->AccessControlInfo.FileSystemAccess,"FileSystemAccess",ctx); - else if(cmpYamlValue("IoAccessControl",ctx)) rsf->AccessControlInfo.IoAccessControlNum = SetYAMLSequence(&rsf->AccessControlInfo.IoAccessControl,"IoAccessControl",ctx); - else if(cmpYamlValue("InterruptNumbers",ctx)) rsf->AccessControlInfo.InterruptNumbersNum = SetYAMLSequence(&rsf->AccessControlInfo.InterruptNumbers,"InterruptNumbers",ctx); - else if(cmpYamlValue("SystemCallAccess",ctx)) rsf->AccessControlInfo.SystemCallAccessNum = SetYAMLSequenceFromMapping(&rsf->AccessControlInfo.SystemCallAccess,"SystemCallAccess",ctx,false); - else if(cmpYamlValue("ServiceAccessControl",ctx)) rsf->AccessControlInfo.ServiceAccessControlNum = SetYAMLSequence(&rsf->AccessControlInfo.ServiceAccessControl,"ServiceAccessControl",ctx); - //else if(cmpYamlValue("StorageId",ctx)) rsf->AccessControlInfo.StorageIdNum = SetYAMLSequence(&rsf->AccessControlInfo.StorageId,"StorageId",ctx); - else if(cmpYamlValue("AccessibleSaveDataIds",ctx)) rsf->AccessControlInfo.AccessibleSaveDataIdsNum = SetYAMLSequence(&rsf->AccessControlInfo.AccessibleSaveDataIds,"AccessibleSaveDataIds",ctx); - - else{ - fprintf(stderr,"[-] Unrecognised key '%s'\n",GetYamlString(ctx)); - ctx->error = YAML_UNKNOWN_KEY; - FinishEvent(ctx); - return; - } - // Finish event start next - FinishEvent(ctx); - GetEvent(ctx); - } - FinishEvent(ctx); -} - -void GET_SystemControlInfo(ctr_yaml_context *ctx, rsf_settings *rsf) -{ - /* Checking That Group is in a map */ - if(!CheckMappingEvent(ctx)) return; - u32 InitLevel = ctx->Level; - /* Checking each child */ - GetEvent(ctx); - while(ctx->Level == InitLevel){ - if(ctx->error || ctx->done) return; - // Handle childs - - if(cmpYamlValue("AppType",ctx)) SetSimpleYAMLValue(&rsf->SystemControlInfo.AppType,"AppType",ctx,0); - else if(cmpYamlValue("StackSize",ctx)) SetSimpleYAMLValue(&rsf->SystemControlInfo.StackSize,"StackSize",ctx,0); - else if(cmpYamlValue("RemasterVersion",ctx)) SetSimpleYAMLValue(&rsf->SystemControlInfo.RemasterVersion,"RemasterVersion",ctx,0); - else if(cmpYamlValue("JumpId",ctx)) SetSimpleYAMLValue(&rsf->SystemControlInfo.JumpId,"JumpId",ctx,0); - else if(cmpYamlValue("Dependency",ctx)) rsf->SystemControlInfo.DependencyNum = SetYAMLSequenceFromMapping(&rsf->SystemControlInfo.Dependency,"Dependency",ctx,false); - else{ - fprintf(stderr,"[-] Unrecognised key '%s'\n",GetYamlString(ctx)); - ctx->error = YAML_UNKNOWN_KEY; - FinishEvent(ctx); - return; - } - // Finish event start next - FinishEvent(ctx); - GetEvent(ctx); - } - FinishEvent(ctx); -} - -void GET_BasicInfo(ctr_yaml_context *ctx, rsf_settings *rsf) -{ - /* Checking That Group is in a map */ - if(!CheckMappingEvent(ctx)) return; - u32 InitLevel = ctx->Level; - /* Checking each child */ - GetEvent(ctx); - while(ctx->Level == InitLevel){ - if(ctx->error || ctx->done) return; - // Handle childs - if(cmpYamlValue("MediaFootPadding",ctx)) rsf->BasicInfo.MediaFootPadding = SetBoolYAMLValue("MediaFootPadding",ctx); - else if(cmpYamlValue("Title",ctx)) SetSimpleYAMLValue(&rsf->BasicInfo.Title,"Title",ctx,0); - else if(cmpYamlValue("CompanyCode",ctx)) SetSimpleYAMLValue(&rsf->BasicInfo.CompanyCode,"CompanyCode",ctx,0); - else if(cmpYamlValue("ProductCode",ctx)) SetSimpleYAMLValue(&rsf->BasicInfo.ProductCode,"ProductCode",ctx,0); - else if(cmpYamlValue("MediaSize",ctx)) SetSimpleYAMLValue(&rsf->BasicInfo.MediaSize,"MediaSize",ctx,0); - else if(cmpYamlValue("ContentType",ctx)) SetSimpleYAMLValue(&rsf->BasicInfo.ContentType,"ContentType",ctx,0); - else if(cmpYamlValue("Logo",ctx)) SetSimpleYAMLValue(&rsf->BasicInfo.Logo,"Logo",ctx,0); - //else if(cmpYamlValue("BackupMemoryType",ctx)) SetSimpleYAMLValue(&rsf->BasicInfo.BackupMemoryType,"BackupMemoryType",ctx,0); - //else if(cmpYamlValue("InitialCode",ctx)) SetSimpleYAMLValue(&rsf->BasicInfo.InitialCode,"InitialCode",ctx,0); - else{ - fprintf(stderr,"[-] Unrecognised key '%s'\n",GetYamlString(ctx)); - ctx->error = YAML_UNKNOWN_KEY; - FinishEvent(ctx); - return; - } - // Finish event start next - FinishEvent(ctx); - GetEvent(ctx); - } - FinishEvent(ctx); -} - -void GET_Rom(ctr_yaml_context *ctx, rsf_settings *rsf) -{ - /* Checking That Group is in a map */ - if(!CheckMappingEvent(ctx)) return; - u32 InitLevel = ctx->Level; - /* Checking each child */ - GetEvent(ctx); - while(ctx->Level == InitLevel){ - if(ctx->error || ctx->done) return; - // Handle childs - - if(cmpYamlValue("HostRoot",ctx)) SetSimpleYAMLValue(&rsf->Rom.HostRoot,"HostRoot",ctx,0); - //else if(cmpYamlValue("Padding",ctx)) SetSimpleYAMLValue(&rsf->Rom.Padding,"Padding",ctx,0); - else if(cmpYamlValue("SaveDataSize",ctx)) SetSimpleYAMLValue(&rsf->Rom.SaveDataSize,"SaveDataSize",ctx,0); - - else if(cmpYamlValue("DefaultReject",ctx)) rsf->Rom.DefaultRejectNum = SetYAMLSequence(&rsf->Rom.DefaultReject,"DefaultReject",ctx); - else if(cmpYamlValue("Reject",ctx)) rsf->Rom.RejectNum = SetYAMLSequence(&rsf->Rom.Reject,"Reject",ctx); - else if(cmpYamlValue("Include",ctx)) rsf->Rom.IncludeNum = SetYAMLSequence(&rsf->Rom.Include,"Include",ctx); - else if(cmpYamlValue("File",ctx)) rsf->Rom.FileNum = SetYAMLSequence(&rsf->Rom.File,"File",ctx); - - else{ - fprintf(stderr,"[-] Unrecognised key '%s'\n",GetYamlString(ctx)); - ctx->error = YAML_UNKNOWN_KEY; - FinishEvent(ctx); - return; - } - // Finish event start next - FinishEvent(ctx); - GetEvent(ctx); - } - FinishEvent(ctx); -} - -void GET_ExeFs(ctr_yaml_context *ctx, rsf_settings *rsf) -{ - /* Checking That Group is in a map */ - if(!CheckMappingEvent(ctx)) return; - u32 InitLevel = ctx->Level; - /* Checking each child */ - GetEvent(ctx); - while(ctx->Level == InitLevel){ - if(ctx->error || ctx->done) return; - // Handle childs - - if(cmpYamlValue("Text",ctx)) rsf->ExeFs.TextNum = SetYAMLSequence(&rsf->ExeFs.Text,"Text",ctx); - else if(cmpYamlValue("ReadOnly",ctx)) rsf->ExeFs.ReadOnlyNum = SetYAMLSequence(&rsf->ExeFs.ReadOnly,"ReadOnly",ctx); - else if(cmpYamlValue("ReadWrite",ctx)) rsf->ExeFs.ReadWriteNum = SetYAMLSequence(&rsf->ExeFs.ReadWrite,"ReadWrite",ctx); - - else{ - fprintf(stderr,"[-] Unrecognised key '%s'\n",GetYamlString(ctx)); - ctx->error = YAML_UNKNOWN_KEY; - FinishEvent(ctx); - return; - } - // Finish event start next - FinishEvent(ctx); - GetEvent(ctx); - } - FinishEvent(ctx); -} - -void GET_PlainRegion(ctr_yaml_context *ctx, rsf_settings *rsf) -{ - rsf->PlainRegionNum = SetYAMLSequence(&rsf->PlainRegion,"PlainRegion",ctx); -} - -void GET_TitleInfo(ctr_yaml_context *ctx, rsf_settings *rsf) -{ - /* Checking That Group is in a map */ - if(!CheckMappingEvent(ctx)) return; - u32 InitLevel = ctx->Level; - /* Checking each child */ - GetEvent(ctx); - while(ctx->Level == InitLevel){ - if(ctx->error || ctx->done) return; - // Handle childs - - if(cmpYamlValue("Category",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.Category,"Category",ctx,0); - //else if(cmpYamlValue("Platform",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.Platform,"Platform",ctx,0); - else if(cmpYamlValue("UniqueId",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.UniqueId,"UniqueId",ctx,0); - else if(cmpYamlValue("Version",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.Version,"Version",ctx,0); - else if(cmpYamlValue("ContentsIndex",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.ContentsIndex,"ContentsIndex",ctx,0); - else if(cmpYamlValue("Variation",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.Variation,"Variation",ctx,0); - //else if(cmpYamlValue("Use",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.Use,"Use",ctx,0); - else if(cmpYamlValue("ChildIndex",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.ChildIndex,"ChildIndex",ctx,0); - else if(cmpYamlValue("DemoIndex",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.DemoIndex,"DemoIndex",ctx,0); - else if(cmpYamlValue("TargetCategory",ctx)) SetSimpleYAMLValue(&rsf->TitleInfo.TargetCategory,"TargetCategory",ctx,0); - - else if(cmpYamlValue("CategoryFlags",ctx)) rsf->TitleInfo.CategoryFlagsNum = SetYAMLSequence(&rsf->TitleInfo.CategoryFlags,"CategoryFlags",ctx); - - else{ - fprintf(stderr,"[-] Unrecognised key '%s'\n",GetYamlString(ctx)); - ctx->error = YAML_UNKNOWN_KEY; - FinishEvent(ctx); - return; - } - // Finish event start next - FinishEvent(ctx); - GetEvent(ctx); - } - FinishEvent(ctx); -} - -void GET_CardInfo(ctr_yaml_context *ctx, rsf_settings *rsf) -{ - /* Checking That Group is in a map */ - if(!CheckMappingEvent(ctx)) return; - u32 InitLevel = ctx->Level; - /* Checking each child */ - GetEvent(ctx); - while(ctx->Level == InitLevel){ - if(ctx->error || ctx->done) return; - // Handle childs - - if(cmpYamlValue("WritableAddress",ctx)) SetSimpleYAMLValue(&rsf->CardInfo.WritableAddress,"WritableAddress",ctx,0); - else if(cmpYamlValue("CardType",ctx)) SetSimpleYAMLValue(&rsf->CardInfo.CardType,"CardType",ctx,0); - else if(cmpYamlValue("CryptoType",ctx)) SetSimpleYAMLValue(&rsf->CardInfo.CryptoType,"CryptoType",ctx,0); - else if(cmpYamlValue("CardDevice",ctx)) SetSimpleYAMLValue(&rsf->CardInfo.CardDevice,"CardDevice",ctx,0); - else if(cmpYamlValue("MediaType",ctx)) SetSimpleYAMLValue(&rsf->CardInfo.MediaType,"MediaType",ctx,0); - else if(cmpYamlValue("BackupWriteWaitTime",ctx)) SetSimpleYAMLValue(&rsf->CardInfo.BackupWriteWaitTime,"BackupWriteWaitTime",ctx,0); - - else{ - fprintf(stderr,"[-] Unrecognised key '%s'\n",GetYamlString(ctx)); - ctx->error = YAML_UNKNOWN_KEY; - FinishEvent(ctx); - return; - } - // Finish event start next - FinishEvent(ctx); - GetEvent(ctx); - } - FinishEvent(ctx); -} - -void GET_CommonHeaderKey(ctr_yaml_context *ctx, rsf_settings *rsf) -{ - /* Checking That Group is in a map */ - if(!CheckMappingEvent(ctx)) return; - u32 InitLevel = ctx->Level; - /* Checking each child */ - GetEvent(ctx); - rsf->CommonHeaderKey.Found = true; - while(ctx->Level == InitLevel){ - if(ctx->error || ctx->done) return; - // Handle childs - - if(cmpYamlValue("D",ctx)) SetSimpleYAMLValue(&rsf->CommonHeaderKey.D,"D",ctx,0); - else if(cmpYamlValue("P",ctx)) SetSimpleYAMLValue(&rsf->CommonHeaderKey.P,"P",ctx,0); - else if(cmpYamlValue("Q",ctx)) SetSimpleYAMLValue(&rsf->CommonHeaderKey.Q,"Q",ctx,0); - else if(cmpYamlValue("DP",ctx)) SetSimpleYAMLValue(&rsf->CommonHeaderKey.DP,"DP",ctx,0); - else if(cmpYamlValue("DQ",ctx)) SetSimpleYAMLValue(&rsf->CommonHeaderKey.DQ,"DQ",ctx,0); - else if(cmpYamlValue("InverseQ",ctx)) SetSimpleYAMLValue(&rsf->CommonHeaderKey.InverseQ,"InverseQ",ctx,0); - else if(cmpYamlValue("Modulus",ctx)) SetSimpleYAMLValue(&rsf->CommonHeaderKey.Modulus,"Modulus",ctx,0); - else if(cmpYamlValue("Exponent",ctx)) SetSimpleYAMLValue(&rsf->CommonHeaderKey.Exponent,"Exponent",ctx,0); - else if(cmpYamlValue("Signature",ctx)) SetSimpleYAMLValue(&rsf->CommonHeaderKey.AccCtlDescSign,"Signature",ctx,0); - else if(cmpYamlValue("Descriptor",ctx)) SetSimpleYAMLValue(&rsf->CommonHeaderKey.AccCtlDescBin,"Descriptor",ctx,0); - - else{ - fprintf(stderr,"[-] Unrecognised key '%s'\n",GetYamlString(ctx)); - ctx->error = YAML_UNKNOWN_KEY; - FinishEvent(ctx); - return; - } - // Finish event start next - FinishEvent(ctx); - GetEvent(ctx); - } - FinishEvent(ctx); -} \ No newline at end of file diff --git a/yamlsettings.h b/yamlsettings.h deleted file mode 100644 index 2958c95..0000000 --- a/yamlsettings.h +++ /dev/null @@ -1,14 +0,0 @@ - -int MergeSpecData(rsf_settings *out, rsf_settings *desc, rsf_settings *rsf); -void EvaluateRSF(rsf_settings *rsf, ctr_yaml_context *ctx); - -void GET_Option(ctr_yaml_context *ctx, rsf_settings *rsf); -void GET_AccessControlInfo(ctr_yaml_context *ctx, rsf_settings *rsf); -void GET_SystemControlInfo(ctr_yaml_context *ctx, rsf_settings *rsf); -void GET_BasicInfo(ctr_yaml_context *ctx, rsf_settings *rsf); -void GET_Rom(ctr_yaml_context *ctx, rsf_settings *rsf); -void GET_ExeFs(ctr_yaml_context *ctx, rsf_settings *rsf); -void GET_PlainRegion(ctr_yaml_context *ctx, rsf_settings *rsf); -void GET_TitleInfo(ctr_yaml_context *ctx, rsf_settings *rsf); -void GET_CardInfo(ctr_yaml_context *ctx, rsf_settings *rsf); -void GET_CommonHeaderKey(ctr_yaml_context *ctx, rsf_settings *rsf); \ No newline at end of file