diff --git a/src/p_lx_elf.cpp b/src/p_lx_elf.cpp index e407f30d..ecb8f22f 100644 --- a/src/p_lx_elf.cpp +++ b/src/p_lx_elf.cpp @@ -328,7 +328,8 @@ off_t PackLinuxElf::pack3(OutputFile *fo, Filter &ft) // return length of output : elf_unsigned_dynamic(Elf32_Dyn::DT_INIT) ); set_te32(&disp, firstpc_va - load_va); if (opt->o_unix.android_shlib) { // the extra page - set_te32(&disp, asl_delta + firstpc_va - load_va); + // Hacked in *-linux.shlib-init.S + //set_te32(&disp, asl_delta + firstpc_va - load_va); } fo->write(&disp, sizeof(disp)); // DT_INIT.d_val len += sizeof(disp); @@ -2953,8 +2954,13 @@ void PackLinuxElf64::pack1(OutputFile *fo, Filter & /*ft*/) // .p_filesz,.p_memsz are updated in ::pack3 } + Elf64_Ehdr *const ehdr = (Elf64_Ehdr *)&lowmem[0]; + upx_uint64_t e_entry = get_te64(&ehdr->e_entry); + if (xct_off < e_entry) { + set_te64(&ehdr->e_entry, asl_delta + e_entry); + } // Relocate Shdr; and Rela, Rel (below xct_off) - set_te64(&((Elf64_Ehdr *)&lowmem[0])->e_shoff, xct_off); + set_te64(&ehdr->e_shoff, xct_off); memcpy(&lowmem[xct_off], shdri, e_shnum * sizeof(Elf64_Ehdr)); Elf64_Shdr *const shdro = (Elf64_Shdr *)&lowmem[xct_off]; Elf64_Shdr *shdr = shdro; @@ -3574,6 +3580,49 @@ void PackLinuxElf64::pack4(OutputFile *fo, Filter &ft) } } +void +PackLinuxElf64::unRela64( + upx_uint64_t dt_rela, + Elf64_Rela *rela0, + unsigned relasz, + MemBuffer &ptload1, + upx_uint64_t const load_off, + OutputFile *fo +) +{ + Elf64_Rela *rela = rela0; + for (int k = relasz / sizeof(Elf64_Rela); --k >= 0; ++rela) { + upx_uint64_t r_addend = get_te64(&rela->r_addend); + upx_uint64_t r_offset = get_te64(&rela->r_offset); + upx_uint64_t r_info = get_te64(&rela->r_info); + unsigned r_type = ELF64_R_TYPE(r_info); + if (xct_off <= r_offset) { + set_te64(&rela->r_offset, r_offset - asl_delta); + } + if (Elf64_Ehdr::EM_AARCH64 == e_machine) { + if (R_AARCH64_RELATIVE == r_type) { + if (xct_off <= r_addend) { + set_te64(&rela->r_addend, r_addend - asl_delta); + } + } + if (R_AARCH64_JUMP_SLOT == r_type) { + ++n_jmp_slot; + // .rela.plt contains offset of the "first time" target + upx_uint64_t d = r_offset - load_off - asl_delta; + if (plt_off > d) { + plt_off = d; + } + upx_uint64_t w = get_te64(&ptload1[d]); + if (xct_off <= w) { + set_te64(&ptload1[d], w - asl_delta); + } + } + } + } + fo->seek(dt_rela, SEEK_SET); + fo->rewrite(rela0, relasz); +} + void PackLinuxElf64::unpack(OutputFile *fo) { if (e_phoff != sizeof(Elf64_Ehdr)) {// Phdrs not contiguous with Ehdr @@ -3613,7 +3662,6 @@ void PackLinuxElf64::unpack(OutputFile *fo) throwCantUnpack("b_info corrupted"); ph.filter_cto = bhdr.b_cto8; -#define MAX_ELF_HDR 1024 MemBuffer u(ph.u_len); Elf64_Ehdr *const ehdr = (Elf64_Ehdr *)&u[0]; Elf64_Phdr const *phdr = 0; @@ -3641,9 +3689,11 @@ void PackLinuxElf64::unpack(OutputFile *fo) unsigned total_out = 0; unsigned c_adler = upx_adler32(NULL, 0); unsigned u_adler = upx_adler32(NULL, 0); +#define MAX_ELF_HDR 1024 if ((MAX_ELF_HDR - sizeof(Elf64_Ehdr))/sizeof(Elf64_Phdr) < u_phnum) { throwCantUnpack("bad compressed e_phnum"); } +#undef MAX_ELF_HDR // Packed ET_EXE has no PT_DYNAMIC. // Packed ET_DYN has original PT_DYNAMIC for info needed by rtld. @@ -3781,6 +3831,7 @@ void PackLinuxElf64::unpack(OutputFile *fo) for (unsigned j= 0; j < u_phnum; ++j, ++phdr) { if (PT_LOAD64==get_te32(&phdr->p_type) && 0!=n_ptload++) { load_off = get_te64(&phdr->p_offset); + load_va = get_te64(&phdr->p_vaddr); fi->seek(old_data_off, SEEK_SET); fi->readx(ibuf, old_data_len); total_in += old_data_len; @@ -3793,24 +3844,68 @@ void PackLinuxElf64::unpack(OutputFile *fo) } // Restore DT_INIT.d_val phdr = (Elf64_Phdr *)&u[sizeof(*ehdr)]; + if (fo) for (unsigned j= 0; j < u_phnum; ++j, ++phdr) { if (phdr->PT_DYNAMIC==get_te32(&phdr->p_type)) { + upx_uint64_t dt_pltrelsz(0), dt_jmprel(0); + upx_uint64_t dt_relasz(0), dt_rela(0); unsigned const dyn_off = get_te64(&phdr->p_offset); unsigned const dyn_len = get_te64(&phdr->p_filesz); Elf64_Dyn *dyn = (Elf64_Dyn *)((unsigned char *)ibuf + (dyn_off - load_off)); for (unsigned j2= 0; j2 < dyn_len; ++dyn, j2 += sizeof(*dyn)) { - if (dyn->DT_INIT==get_te32(&dyn->d_tag)) { - if (fo) { - fo->seek(sizeof(upx_uint64_t) + j2 + dyn_off, SEEK_SET); - fo->rewrite(&old_dtinit, sizeof(old_dtinit)); - fo->seek(0, SEEK_END); - } - break; + upx_uint64_t const tag = get_te64(&dyn->d_tag); + upx_uint64_t val = get_te64(&dyn->d_val); + switch (tag) { + case dyn->DT_INIT: { + fo->seek(sizeof(upx_uint64_t) + j2 + dyn_off, SEEK_SET); + fo->rewrite(&old_dtinit, sizeof(old_dtinit)); + } break; + case dyn->DT_PREINIT_ARRAY: + case dyn->DT_INIT_ARRAY: + case dyn->DT_FINI_ARRAY: + case dyn->DT_FINI: + case dyn->DT_PLTGOT: { + fo->seek(sizeof(upx_uint64_t) + j2 + dyn_off, SEEK_SET); + val -= asl_delta; + fo->rewrite(&val, sizeof(val)); + } break; + case dyn->DT_PLTRELSZ: { // Size in bytes of PLT relocs + dt_pltrelsz = val; (void)dt_pltrelsz; + } break; + case dyn->DT_JMPREL: { // Address of PLT relocs + dt_jmprel = val; (void)dt_jmprel; + } break; + case dyn->DT_RELASZ: { // Total size of Rela relocs + dt_relasz = val; + } break; + case dyn->DT_RELA: { // Address of Rela relocs + dt_rela = val; + } break; + } // end switch() + } + + lowmem.alloc(xct_off); + fi->seek(0, SEEK_SET); + fi->read(lowmem, xct_off); // contains relocation tables + if (dt_relasz) { + Elf64_Rela *const rela0 = (Elf64_Rela *)lowmem.subref( + "bad Rela offset", dt_rela, dt_relasz); + unRela64(dt_rela, rela0, dt_relasz, ibuf, load_va, fo); + } + if (dt_pltrelsz) { + Elf64_Rela *const jmp0 = (Elf64_Rela *)lowmem.subref( + "bad Jmprel offset", dt_jmprel, dt_pltrelsz); + plt_off = ~0ull; n_jmp_slot = 0; + unRela64(dt_jmprel, jmp0, dt_pltrelsz, ibuf, load_va, fo); + if (~0ull != plt_off) { + fo->seek(plt_off + load_off, SEEK_SET); + fo->rewrite(&ibuf[plt_off], n_jmp_slot * sizeof(void *)); } } } } + if (fo) fo->seek(0, SEEK_END); } // update header with totals @@ -3824,7 +3919,6 @@ void PackLinuxElf64::unpack(OutputFile *fo) // finally test the checksums if (ph.c_adler != c_adler || ph.u_adler != u_adler) throwChecksumError(); -#undef MAX_ELF_HDR } diff --git a/src/p_lx_elf.h b/src/p_lx_elf.h index 836290df..34a217e3 100644 --- a/src/p_lx_elf.h +++ b/src/p_lx_elf.h @@ -250,6 +250,8 @@ protected: virtual off_t pack3(OutputFile *, Filter &); // append loader virtual void pack4(OutputFile *, Filter &); // append pack header virtual void unpack(OutputFile *fo); + virtual void unRela64(upx_uint64_t dt_rela, Elf64_Rela *rela0, unsigned relasz, + MemBuffer &membuf, upx_uint64_t const load_off, OutputFile *fo); virtual void generateElfHdr( OutputFile *, diff --git a/src/stub/arm64-linux.shlib-init.h b/src/stub/arm64-linux.shlib-init.h index e049d3dc..b3a9bd77 100644 --- a/src/stub/arm64-linux.shlib-init.h +++ b/src/stub/arm64-linux.shlib-init.h @@ -1,5 +1,5 @@ /* arm64-linux.shlib-init.h - created from arm64-linux.shlib-init.bin, 8654 (0x21ce) bytes + created from arm64-linux.shlib-init.bin, 8666 (0x21da) bytes This file is part of the UPX executable compressor. @@ -31,14 +31,14 @@ */ -#define STUB_ARM64_LINUX_SHLIB_INIT_SIZE 8654 -#define STUB_ARM64_LINUX_SHLIB_INIT_ADLER32 0x8c2f89f3 -#define STUB_ARM64_LINUX_SHLIB_INIT_CRC32 0x0cefe3fe +#define STUB_ARM64_LINUX_SHLIB_INIT_SIZE 8666 +#define STUB_ARM64_LINUX_SHLIB_INIT_ADLER32 0x4e8c8dcb +#define STUB_ARM64_LINUX_SHLIB_INIT_CRC32 0x8ca5386d -unsigned char stub_arm64_linux_shlib_init[8654] = { +unsigned char stub_arm64_linux_shlib_init[8666] = { /* 0x0000 */ 127, 69, 76, 70, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0010 */ 1, 0,183, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/* 0x0020 */ 0, 0, 0, 0, 0, 0, 0, 0,184, 24, 0, 0, 0, 0, 0, 0, +/* 0x0020 */ 0, 0, 0, 0, 0, 0, 0, 0,192, 24, 0, 0, 0, 0, 0, 0, /* 0x0030 */ 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, /* 0x0040 */ 224, 7,180,169,226, 3, 1,169,254, 23, 0,249, 0, 0, 0,148, /* 0x0050 */ 254, 15, 31,248,226, 15,191,169, 7, 64, 33,139, 5, 0,128, 18, @@ -335,246 +335,247 @@ unsigned char stub_arm64_linux_shlib_init[8654] = { /* 0x1280 */ 67,124, 80, 82, 79, 84, 95, 87, 82, 73, 84, 69, 32,102, 97,105, /* 0x1290 */ 108,101,100, 46, 10, 0, 67,132, 64,248,227,255,255,181, 3, 0, /* 0x12a0 */ 130,210, 64, 4,193,168, 96, 0, 0,180, 31, 24, 0,241,161,255, -/* 0x12b0 */ 255, 84, 33, 0,131,154,225, 3, 1,203,225,255,129,146,225, 19, -/* 0x12c0 */ 0,249,226, 3, 30,170, 65,144, 0,209, 36, 68, 64,184,227, 3, -/* 0x12d0 */ 4, 42,229, 3, 1,170, 36, 68, 64,184,165, 0, 4,203, 36, 68, -/* 0x12e0 */ 64,184,132, 0, 5,139,228, 15, 0,249, 36, 68, 64,184,132, 0, -/* 0x12f0 */ 5,139,228, 27, 0,249, 36, 68, 64,184,128, 0, 5,139, 97, 0, -/* 0x1300 */ 5,139, 36, 4, 64,185, 33, 48, 0,145, 33, 0, 4,139,229, 35, -/* 0x1310 */ 64,185, 36, 68, 64,184, 5, 0, 37, 10,165, 12, 0, 17,165,116, -/* 0x1320 */ 30, 18,132, 0, 5, 11, 0, 64, 37,203,224,147, 4,169, 0, 64, -/* 0x1330 */ 37,139,132, 0, 5, 75, 16, 0, 0,148, 99, 28, 0, 18,127, 72, -/* 0x1340 */ 1,113,129, 1, 0, 84, 33,252, 66,211, 65, 1, 0,180, 33, 4, -/* 0x1350 */ 0,209, 2,120, 97,184, 67,120, 26, 83,127, 20, 0,113,129, 0, -/* 0x1360 */ 0, 84, 67, 0, 1, 75, 98,100, 0, 51, 2,120, 33,184, 1,255, -/* 0x1370 */ 255,181,192, 3, 95,214,165,124, 2, 83,254,151, 5,169, 35, 20, -/* 0x1380 */ 64, 57, 38, 24, 64, 57,224,147, 6,169,230,143, 7,169, 36, 68, -/* 0x1390 */ 64,184,229, 3, 4, 42, 36, 68, 64,184,226,147, 8,169,227,195, -/* 0x13a0 */ 1,145,225,151, 9,169,224,143, 10,169,165, 12, 0,145,227, 99, -/* 0x13b0 */ 64,185, 98, 8, 69,139,227, 71, 64,249, 99, 0, 0,148,227, 47, -/* 0x13c0 */ 64,249, 97, 0, 0,148, 53, 0, 0,148, 5, 0,128,210, 4, 0, -/* 0x13d0 */ 128,146, 67, 6,128,210, 98, 0,128,210,224,135, 68,169,230, 3, -/* 0x13e0 */ 0,170,200, 27,128, 82, 1, 0, 0,212, 31, 0, 6,235, 64, 0, -/* 0x13f0 */ 0, 84, 0, 0, 32,212,229, 99, 64,185,225, 31, 64,249, 29, 0, -/* 0x1400 */ 0,148,228, 71, 64,249,224,135, 73,169,226,143, 74,169,128, 0, -/* 0x1410 */ 63,214, 4, 0, 0,148, 1, 0, 0,212,224, 7,204,168, 96, 0, -/* 0x1420 */ 31,214,228, 27, 64,249,192, 7, 64,169,128, 0, 0,249,129, 8, -/* 0x1430 */ 0,185,228, 47, 64,249,226,143, 71,169,224,135, 70,169, 67, 0, -/* 0x1440 */ 0,180,128, 0, 63,214,224,135, 68,169,162, 0,128,210, 72, 28, -/* 0x1450 */ 128, 82, 1, 0, 0,212,254,147, 66,169,224,135, 67,169,232, 26, -/* 0x1460 */ 128, 82,226, 15, 65,169,128, 0, 31,214, 37,192, 95,184,165, 92, -/* 0x1470 */ 0, 18,133, 0, 0, 54, 35, 68, 64,184,165, 4, 0, 81, 3, 68, -/* 0x1480 */ 0,184,165, 0, 0, 52, 34, 12,193, 40,165, 8, 0, 81, 2, 12, -/* 0x1490 */ 129, 40,165,255,255, 53,192, 3, 95,214,254, 95, 0,249,227, 3, -/* 0x14a0 */ 30,170, 41, 0, 0,148, 65,244,126,211, 5, 0,128,210, 4, 0, -/* 0x14b0 */ 128,146, 67, 4,128,210, 98, 0,128,210,225, 35, 0,249, 0, 0, -/* 0x14c0 */ 128,210,200, 27,128, 82, 1, 0, 0,212, 31, 4, 64,177, 67, 0, -/* 0x14d0 */ 0, 84, 0, 0, 32,212,224, 31, 0,249,225, 39, 64,249,229, 99, -/* 0x14e0 */ 64,185,228,255,255,151,225,151, 73,169,224, 79, 0,249,165, 12, -/* 0x14f0 */ 0, 17,165,124, 2, 83,223,255,255,151,226, 3, 0,170,225, 71, -/* 0x1500 */ 64,249,224, 71, 0,249,217,255,255,151,225, 47, 64,249,224, 47, -/* 0x1510 */ 0,249,214,255,255,151,225, 95, 64,249,224, 95, 0,249,211,255, -/* 0x1520 */ 255,151,224,135, 67,169,162, 0,128,210, 72, 28,128, 82, 1, 0, -/* 0x1530 */ 0,212, 31, 4, 64,177, 67, 0, 0, 84, 0, 0, 32,212,254, 95, -/* 0x1540 */ 64,249,192, 3, 31,214, 99,192, 95,184, 99, 92, 0, 18, 66, 0, -/* 0x1550 */ 3,139,192, 3, 95,214,102,105,108,101, 32,102,111,114,109, 97, -/* 0x1560 */ 116, 32,101,108,102, 54, 52, 45,108,105,116,116,108,101, 97, 97, -/* 0x1570 */ 114, 99,104, 54, 52, 10, 10, 83,101, 99,116,105,111,110,115, 58, -/* 0x1580 */ 10, 73,100,120, 32, 78, 97,109,101, 32, 32, 32, 32, 32, 32, 32, -/* 0x1590 */ 32, 32, 32, 83,105,122,101, 32, 32, 32, 32, 32, 32, 86, 77, 65, -/* 0x15a0 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 76, -/* 0x15b0 */ 77, 65, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, -/* 0x15c0 */ 32, 70,105,108,101, 32,111,102,102, 32, 32, 65,108,103,110, 32, -/* 0x15d0 */ 32, 70,108, 97,103,115, 10, 32, 32, 48, 32, 69, 76, 70, 77, 65, -/* 0x15e0 */ 73, 78, 88, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 49, -/* 0x15f0 */ 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1600 */ 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1610 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 52, 48, 32, -/* 0x1620 */ 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, -/* 0x1630 */ 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, -/* 0x1640 */ 10, 32, 32, 49, 32, 78, 82, 86, 95, 72, 69, 65, 68, 32, 32, 32, -/* 0x1650 */ 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, -/* 0x1660 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, -/* 0x1670 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, -/* 0x1680 */ 32, 48, 48, 48, 48, 48, 48, 53, 48, 32, 32, 50, 42, 42, 48, 32, -/* 0x1690 */ 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, -/* 0x16a0 */ 78, 76, 89, 10, 32, 32, 50, 32, 78, 82, 86, 95, 84, 65, 73, 76, -/* 0x16b0 */ 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, -/* 0x16c0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x16d0 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x16e0 */ 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 53, 48, 32, 32, 50, 42, -/* 0x16f0 */ 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, -/* 0x1700 */ 65, 68, 79, 78, 76, 89, 10, 32, 32, 51, 32, 78, 82, 86, 50, 69, -/* 0x1710 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 49, 50, -/* 0x1720 */ 56, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1730 */ 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1740 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 53, 48, 32, -/* 0x1750 */ 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, -/* 0x1760 */ 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 52, 32, 78, 82, -/* 0x1770 */ 86, 50, 68, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, -/* 0x1780 */ 48, 49, 49, 99, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1790 */ 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x17a0 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 49, -/* 0x17b0 */ 55, 56, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, -/* 0x17c0 */ 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 53, -/* 0x17d0 */ 32, 78, 82, 86, 50, 66, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, -/* 0x17e0 */ 48, 48, 48, 48, 48,102, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, -/* 0x17f0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, -/* 0x1800 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, -/* 0x1810 */ 48, 48, 50, 57, 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, -/* 0x1820 */ 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, -/* 0x1830 */ 32, 32, 54, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 32, 32, -/* 0x1840 */ 32, 32, 48, 48, 48, 48, 48, 48,100, 48, 32, 32, 48, 48, 48, 48, -/* 0x1850 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, -/* 0x1860 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, -/* 0x1870 */ 48, 48, 48, 48, 48, 51, 56, 52, 32, 32, 50, 42, 42, 48, 32, 32, -/* 0x1880 */ 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, -/* 0x1890 */ 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 55, 32, 76, 90, -/* 0x18a0 */ 77, 65, 95, 68, 69, 67, 50, 48, 32, 32, 32, 32, 48, 48, 48, 48, -/* 0x18b0 */ 48, 57, 54, 56, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x18c0 */ 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x18d0 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 52, -/* 0x18e0 */ 53, 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, -/* 0x18f0 */ 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 56, -/* 0x1900 */ 32, 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 32, 32, 32, 32, 48, -/* 0x1910 */ 48, 48, 48, 48, 52, 57, 99, 32, 32, 48, 48, 48, 48, 48, 48, 48, -/* 0x1920 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, -/* 0x1930 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, -/* 0x1940 */ 48, 48,100, 98, 99, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, -/* 0x1950 */ 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, -/* 0x1960 */ 32, 32, 57, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 32, 32, -/* 0x1970 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, -/* 0x1980 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, -/* 0x1990 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, -/* 0x19a0 */ 48, 48, 48, 48, 49, 50, 53, 56, 32, 32, 50, 42, 42, 48, 32, 32, -/* 0x19b0 */ 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, -/* 0x19c0 */ 76, 89, 10, 32, 49, 48, 32, 69, 76, 70, 77, 65, 73, 78, 89, 32, -/* 0x19d0 */ 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 51,101, 32, 32, 48, -/* 0x19e0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, -/* 0x19f0 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1a00 */ 48, 32, 32, 48, 48, 48, 48, 49, 50, 53, 56, 32, 32, 50, 42, 42, -/* 0x1a10 */ 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, -/* 0x1a20 */ 68, 79, 78, 76, 89, 10, 32, 49, 49, 32, 69, 76, 70, 77, 65, 73, -/* 0x1a30 */ 78, 90, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1a40 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1a50 */ 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1a60 */ 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 49, 50, 57, 54, 32, 32, -/* 0x1a70 */ 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, -/* 0x1a80 */ 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 49, 50, 32, 69, 76, 70, -/* 0x1a90 */ 77, 65, 74, 78, 90, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, -/* 0x1aa0 */ 48, 50, 52, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1ab0 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1ac0 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 49, 50, 57, -/* 0x1ad0 */ 54, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, -/* 0x1ae0 */ 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 49, 51, 32, -/* 0x1af0 */ 65, 78, 68, 77, 65, 74, 78, 90, 32, 32, 32, 32, 32, 32, 48, 48, -/* 0x1b00 */ 48, 48, 48, 48, 48, 52, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1b10 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, -/* 0x1b20 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, -/* 0x1b30 */ 49, 50, 98, 97, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, -/* 0x1b40 */ 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, -/* 0x1b50 */ 49, 52, 32, 69, 76, 70, 77, 65, 75, 78, 90, 32, 32, 32, 32, 32, -/* 0x1b60 */ 32, 48, 48, 48, 48, 48, 50, 57, 56, 32, 32, 48, 48, 48, 48, 48, -/* 0x1b70 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, -/* 0x1b80 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, -/* 0x1b90 */ 48, 48, 48, 49, 50, 98,101, 32, 32, 50, 42, 42, 48, 32, 32, 67, -/* 0x1ba0 */ 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, -/* 0x1bb0 */ 89, 10, 83, 89, 77, 66, 79, 76, 32, 84, 65, 66, 76, 69, 58, 10, -/* 0x1bc0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1bd0 */ 32,108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, -/* 0x1be0 */ 67, 51, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1bf0 */ 48, 48, 48, 48, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 10, -/* 0x1c00 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1c10 */ 32,108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, -/* 0x1c20 */ 90, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1c30 */ 48, 48, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 48, 48, 48, 48, -/* 0x1c40 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, -/* 0x1c50 */ 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 9, 48, 48, -/* 0x1c60 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 69, -/* 0x1c70 */ 76, 70, 77, 65, 73, 78, 88, 10, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1c80 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, -/* 0x1c90 */ 32, 78, 82, 86, 95, 72, 69, 65, 68, 9, 48, 48, 48, 48, 48, 48, -/* 0x1ca0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 95, 72, -/* 0x1cb0 */ 69, 65, 68, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1cc0 */ 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, -/* 0x1cd0 */ 95, 84, 65, 73, 76, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1ce0 */ 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 95, 84, 65, 73, 76, 10, -/* 0x1cf0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1d00 */ 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 50, 69, 9, 48, -/* 0x1d10 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, -/* 0x1d20 */ 78, 82, 86, 50, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1d30 */ 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, -/* 0x1d40 */ 82, 86, 50, 68, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1d50 */ 48, 48, 48, 48, 48, 32, 78, 82, 86, 50, 68, 10, 48, 48, 48, 48, -/* 0x1d60 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, -/* 0x1d70 */ 32, 32,100, 32, 32, 78, 82, 86, 50, 66, 9, 48, 48, 48, 48, 48, -/* 0x1d80 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 50, -/* 0x1d90 */ 66, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1da0 */ 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, -/* 0x1db0 */ 69, 76, 70, 48, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1dc0 */ 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48, -/* 0x1dd0 */ 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1de0 */ 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, -/* 0x1df0 */ 68, 69, 67, 50, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1e00 */ 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, 95, 68, 69, 67, 50, -/* 0x1e10 */ 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1e20 */ 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, -/* 0x1e30 */ 68, 69, 67, 49, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1e40 */ 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49, -/* 0x1e50 */ 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1e60 */ 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, -/* 0x1e70 */ 73, 78, 89, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1e80 */ 48, 48, 48, 48, 32, 69, 76, 70, 77, 65, 73, 78, 89, 10, 48, 48, -/* 0x1e90 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, -/* 0x1ea0 */ 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 74, 78, 90, 9, -/* 0x1eb0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1ec0 */ 32, 69, 76, 70, 77, 65, 74, 78, 90, 10, 48, 48, 48, 48, 48, 48, -/* 0x1ed0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32, -/* 0x1ee0 */ 100, 32, 32, 65, 78, 68, 77, 65, 74, 78, 90, 9, 48, 48, 48, 48, -/* 0x1ef0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 65, 78, 68, -/* 0x1f00 */ 77, 65, 74, 78, 90, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1f10 */ 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 69, -/* 0x1f20 */ 76, 70, 77, 65, 75, 78, 90, 9, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1f30 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 69, 76, 70, 77, 65, 75, 78, -/* 0x1f40 */ 90, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1f50 */ 48, 48, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, -/* 0x1f60 */ 73, 78, 88, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1f70 */ 48, 48, 48, 48, 32, 95,115,116, 97,114,116, 10, 48, 48, 48, 48, -/* 0x1f80 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, -/* 0x1f90 */ 32, 32, 32, 70, 32, 78, 82, 86, 50, 69, 9, 48, 48, 48, 48, 48, -/* 0x1fa0 */ 48, 48, 48, 48, 48, 48, 48, 48, 49, 50, 56, 32,117, 99,108, 95, -/* 0x1fb0 */ 110,114,118, 50,101, 95,100,101, 99,111,109,112,114,101,115,115, -/* 0x1fc0 */ 95, 51, 50, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1fd0 */ 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 70, 32, 78, 82, 86, -/* 0x1fe0 */ 50, 68, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1ff0 */ 49, 49, 99, 32,117, 99,108, 95,110,114,118, 50,100, 95,100,101, -/* 0x2000 */ 99,111,109,112,114,101,115,115, 95, 51, 50, 10, 48, 48, 48, 48, -/* 0x2010 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, -/* 0x2020 */ 32, 32, 32, 70, 32, 78, 82, 86, 50, 66, 9, 48, 48, 48, 48, 48, -/* 0x2030 */ 48, 48, 48, 48, 48, 48, 48, 48, 48,102, 48, 32,117, 99,108, 95, -/* 0x2040 */ 110,114,118, 50, 98, 95,100,101, 99,111,109,112,114,101,115,115, -/* 0x2050 */ 95, 51, 50, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x2060 */ 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 32, 32, 76, 90, 77, -/* 0x2070 */ 65, 95, 68, 69, 67, 49, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x2080 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 76,122,109, 97, 68,101, 99, -/* 0x2090 */ 111,100,101, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x20a0 */ 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, -/* 0x20b0 */ 77, 65, 73, 78, 89, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x20c0 */ 48, 48, 48, 48, 48, 48, 32,101,110,100, 95,100,101, 99,111,109, -/* 0x20d0 */ 112,114,101,115,115, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, -/* 0x20e0 */ 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, -/* 0x20f0 */ 76, 70, 77, 65, 73, 78, 88, 93, 58, 10, 79, 70, 70, 83, 69, 84, -/* 0x2100 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, -/* 0x2110 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, -/* 0x2120 */ 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x2130 */ 48, 48, 99, 32, 82, 95, 65, 65, 82, 67, 72, 54, 52, 95, 67, 65, -/* 0x2140 */ 76, 76, 50, 54, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 10, -/* 0x2150 */ 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, -/* 0x2160 */ 68, 83, 32, 70, 79, 82, 32, 91, 76, 90, 77, 65, 95, 69, 76, 70, -/* 0x2170 */ 48, 48, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, -/* 0x2180 */ 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, -/* 0x2190 */ 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, -/* 0x21a0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 32, 82, -/* 0x21b0 */ 95, 65, 65, 82, 67, 72, 54, 52, 95, 67, 79, 78, 68, 66, 82, 49, -/* 0x21c0 */ 57, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 10 +/* 0x12b0 */ 255, 84, 33, 0,131,154,225, 3, 1,203, 6, 0,128,210,225,255, +/* 0x12c0 */ 129,146, 6, 0,130,210,225, 19, 0,249,226, 3, 30,170, 65,144, +/* 0x12d0 */ 0,209, 36, 68, 64,184,227, 3, 4, 42,229, 3, 1,170, 36, 68, +/* 0x12e0 */ 64,184,165, 0, 4,203, 36, 68, 64,184,132, 0, 6,139,132, 0, +/* 0x12f0 */ 5,139,228, 15, 0,249, 36, 68, 64,184,132, 0, 5,139,228, 27, +/* 0x1300 */ 0,249, 36, 68, 64,184,128, 0, 5,139, 97, 0, 5,139, 36, 4, +/* 0x1310 */ 64,185, 33, 48, 0,145, 33, 0, 4,139,229, 35, 64,185, 36, 68, +/* 0x1320 */ 64,184, 5, 0, 37, 10,165, 12, 0, 17,165,116, 30, 18,132, 0, +/* 0x1330 */ 5, 11, 0, 64, 37,203,224,147, 4,169, 0, 64, 37,139,132, 0, +/* 0x1340 */ 5, 75, 16, 0, 0,148, 99, 28, 0, 18,127, 72, 1,113,129, 1, +/* 0x1350 */ 0, 84, 33,252, 66,211, 65, 1, 0,180, 33, 4, 0,209, 2,120, +/* 0x1360 */ 97,184, 67,120, 26, 83,127, 20, 0,113,129, 0, 0, 84, 67, 0, +/* 0x1370 */ 1, 75, 98,100, 0, 51, 2,120, 33,184, 1,255,255,181,192, 3, +/* 0x1380 */ 95,214,165,124, 2, 83,254,151, 5,169, 35, 20, 64, 57, 38, 24, +/* 0x1390 */ 64, 57,224,147, 6,169,230,143, 7,169, 36, 68, 64,184,229, 3, +/* 0x13a0 */ 4, 42, 36, 68, 64,184,226,147, 8,169,227,195, 1,145,225,151, +/* 0x13b0 */ 9,169,224,143, 10,169,165, 12, 0,145,227, 99, 64,185, 98, 8, +/* 0x13c0 */ 69,139,227, 71, 64,249, 99, 0, 0,148,227, 47, 64,249, 97, 0, +/* 0x13d0 */ 0,148, 53, 0, 0,148, 5, 0,128,210, 4, 0,128,146, 67, 6, +/* 0x13e0 */ 128,210, 98, 0,128,210,224,135, 68,169,230, 3, 0,170,200, 27, +/* 0x13f0 */ 128, 82, 1, 0, 0,212, 31, 0, 6,235, 64, 0, 0, 84, 0, 0, +/* 0x1400 */ 32,212,229, 99, 64,185,225, 31, 64,249, 29, 0, 0,148,228, 71, +/* 0x1410 */ 64,249,224,135, 73,169,226,143, 74,169,128, 0, 63,214, 4, 0, +/* 0x1420 */ 0,148, 1, 0, 0,212,224, 7,204,168, 96, 0, 31,214,228, 27, +/* 0x1430 */ 64,249,192, 7, 64,169,128, 0, 0,249,129, 8, 0,185,228, 47, +/* 0x1440 */ 64,249,226,143, 71,169,224,135, 70,169, 67, 0, 0,180,128, 0, +/* 0x1450 */ 63,214,224,135, 68,169,162, 0,128,210, 72, 28,128, 82, 1, 0, +/* 0x1460 */ 0,212,254,147, 66,169,224,135, 67,169,232, 26,128, 82,226, 15, +/* 0x1470 */ 65,169,128, 0, 31,214, 37,192, 95,184,165, 92, 0, 18,133, 0, +/* 0x1480 */ 0, 54, 35, 68, 64,184,165, 4, 0, 81, 3, 68, 0,184,165, 0, +/* 0x1490 */ 0, 52, 34, 12,193, 40,165, 8, 0, 81, 2, 12,129, 40,165,255, +/* 0x14a0 */ 255, 53,192, 3, 95,214,254, 95, 0,249,227, 3, 30,170, 41, 0, +/* 0x14b0 */ 0,148, 65,244,126,211, 5, 0,128,210, 4, 0,128,146, 67, 4, +/* 0x14c0 */ 128,210, 98, 0,128,210,225, 35, 0,249, 0, 0,128,210,200, 27, +/* 0x14d0 */ 128, 82, 1, 0, 0,212, 31, 4, 64,177, 67, 0, 0, 84, 0, 0, +/* 0x14e0 */ 32,212,224, 31, 0,249,225, 39, 64,249,229, 99, 64,185,228,255, +/* 0x14f0 */ 255,151,225,151, 73,169,224, 79, 0,249,165, 12, 0, 17,165,124, +/* 0x1500 */ 2, 83,223,255,255,151,226, 3, 0,170,225, 71, 64,249,224, 71, +/* 0x1510 */ 0,249,217,255,255,151,225, 47, 64,249,224, 47, 0,249,214,255, +/* 0x1520 */ 255,151,225, 95, 64,249,224, 95, 0,249,211,255,255,151,224,135, +/* 0x1530 */ 67,169,162, 0,128,210, 72, 28,128, 82, 1, 0, 0,212, 31, 4, +/* 0x1540 */ 64,177, 67, 0, 0, 84, 0, 0, 32,212,254, 95, 64,249,192, 3, +/* 0x1550 */ 31,214, 99,192, 95,184, 99, 92, 0, 18, 66, 0, 3,139,192, 3, +/* 0x1560 */ 95,214,102,105,108,101, 32,102,111,114,109, 97,116, 32,101,108, +/* 0x1570 */ 102, 54, 52, 45,108,105,116,116,108,101, 97, 97,114, 99,104, 54, +/* 0x1580 */ 52, 10, 10, 83,101, 99,116,105,111,110,115, 58, 10, 73,100,120, +/* 0x1590 */ 32, 78, 97,109,101, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 83, +/* 0x15a0 */ 105,122,101, 32, 32, 32, 32, 32, 32, 86, 77, 65, 32, 32, 32, 32, +/* 0x15b0 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 76, 77, 65, 32, 32, +/* 0x15c0 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 70,105,108, +/* 0x15d0 */ 101, 32,111,102,102, 32, 32, 65,108,103,110, 32, 32, 70,108, 97, +/* 0x15e0 */ 103,115, 10, 32, 32, 48, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, +/* 0x15f0 */ 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 49, 48, 32, 32, 48, +/* 0x1600 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, +/* 0x1610 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1620 */ 48, 32, 32, 48, 48, 48, 48, 48, 48, 52, 48, 32, 32, 50, 42, 42, +/* 0x1630 */ 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, +/* 0x1640 */ 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 49, +/* 0x1650 */ 32, 78, 82, 86, 95, 72, 69, 65, 68, 32, 32, 32, 32, 32, 32, 48, +/* 0x1660 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, +/* 0x1670 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, +/* 0x1680 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, +/* 0x1690 */ 48, 48, 48, 53, 48, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, +/* 0x16a0 */ 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, +/* 0x16b0 */ 32, 32, 50, 32, 78, 82, 86, 95, 84, 65, 73, 76, 32, 32, 32, 32, +/* 0x16c0 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, +/* 0x16d0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, +/* 0x16e0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, +/* 0x16f0 */ 48, 48, 48, 48, 48, 48, 53, 48, 32, 32, 50, 42, 42, 48, 32, 32, +/* 0x1700 */ 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, +/* 0x1710 */ 76, 89, 10, 32, 32, 51, 32, 78, 82, 86, 50, 69, 32, 32, 32, 32, +/* 0x1720 */ 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 49, 50, 56, 32, 32, 48, +/* 0x1730 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, +/* 0x1740 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1750 */ 48, 32, 32, 48, 48, 48, 48, 48, 48, 53, 48, 32, 32, 50, 42, 42, +/* 0x1760 */ 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, +/* 0x1770 */ 68, 79, 78, 76, 89, 10, 32, 32, 52, 32, 78, 82, 86, 50, 68, 32, +/* 0x1780 */ 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 49, 49, 99, +/* 0x1790 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x17a0 */ 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x17b0 */ 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 49, 55, 56, 32, 32, +/* 0x17c0 */ 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, +/* 0x17d0 */ 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 53, 32, 78, 82, 86, +/* 0x17e0 */ 50, 66, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, +/* 0x17f0 */ 48,102, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1800 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1810 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 50, 57, +/* 0x1820 */ 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, +/* 0x1830 */ 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 54, 32, +/* 0x1840 */ 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 32, 32, 32, 32, 48, 48, +/* 0x1850 */ 48, 48, 48, 48,100, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1860 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, +/* 0x1870 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, +/* 0x1880 */ 48, 51, 56, 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, +/* 0x1890 */ 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, +/* 0x18a0 */ 68, 79, 78, 76, 89, 10, 32, 32, 55, 32, 76, 90, 77, 65, 95, 68, +/* 0x18b0 */ 69, 67, 50, 48, 32, 32, 32, 32, 48, 48, 48, 48, 48, 57, 54, 56, +/* 0x18c0 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x18d0 */ 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x18e0 */ 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 52, 53, 52, 32, 32, +/* 0x18f0 */ 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, +/* 0x1900 */ 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 56, 32, 76, 90, 77, +/* 0x1910 */ 65, 95, 68, 69, 67, 49, 48, 32, 32, 32, 32, 48, 48, 48, 48, 48, +/* 0x1920 */ 52, 57, 99, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1930 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1940 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48,100, 98, +/* 0x1950 */ 99, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, +/* 0x1960 */ 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 57, 32, +/* 0x1970 */ 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 32, 32, 32, 32, 48, 48, +/* 0x1980 */ 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1990 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, +/* 0x19a0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, +/* 0x19b0 */ 49, 50, 53, 56, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, +/* 0x19c0 */ 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, +/* 0x19d0 */ 49, 48, 32, 69, 76, 70, 77, 65, 73, 78, 89, 32, 32, 32, 32, 32, +/* 0x19e0 */ 32, 48, 48, 48, 48, 48, 48, 51,101, 32, 32, 48, 48, 48, 48, 48, +/* 0x19f0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, +/* 0x1a00 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, +/* 0x1a10 */ 48, 48, 48, 49, 50, 53, 56, 32, 32, 50, 42, 42, 48, 32, 32, 67, +/* 0x1a20 */ 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, +/* 0x1a30 */ 89, 10, 32, 49, 49, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 32, +/* 0x1a40 */ 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, +/* 0x1a50 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, +/* 0x1a60 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1a70 */ 32, 32, 48, 48, 48, 48, 49, 50, 57, 54, 32, 32, 50, 42, 42, 48, +/* 0x1a80 */ 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, +/* 0x1a90 */ 79, 78, 76, 89, 10, 32, 49, 50, 32, 69, 76, 70, 77, 65, 74, 78, +/* 0x1aa0 */ 90, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 50, 56, 32, +/* 0x1ab0 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1ac0 */ 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1ad0 */ 48, 48, 48, 32, 32, 48, 48, 48, 48, 49, 50, 57, 54, 32, 32, 50, +/* 0x1ae0 */ 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, +/* 0x1af0 */ 69, 65, 68, 79, 78, 76, 89, 10, 32, 49, 51, 32, 65, 78, 68, 77, +/* 0x1b00 */ 65, 74, 78, 90, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, +/* 0x1b10 */ 48, 56, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1b20 */ 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1b30 */ 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 49, 50, 98,101, +/* 0x1b40 */ 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, +/* 0x1b50 */ 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 49, 52, 32, 69, +/* 0x1b60 */ 76, 70, 77, 65, 75, 78, 90, 32, 32, 32, 32, 32, 32, 48, 48, 48, +/* 0x1b70 */ 48, 48, 50, 57, 99, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1b80 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, +/* 0x1b90 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 49, +/* 0x1ba0 */ 50, 99, 54, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, +/* 0x1bb0 */ 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 83, 89, +/* 0x1bc0 */ 77, 66, 79, 76, 32, 84, 65, 66, 76, 69, 58, 10, 48, 48, 48, 48, +/* 0x1bd0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, +/* 0x1be0 */ 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 9, +/* 0x1bf0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1c00 */ 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 10, 48, 48, 48, 48, +/* 0x1c10 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, +/* 0x1c20 */ 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 9, 48, 48, +/* 0x1c30 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 69, +/* 0x1c40 */ 76, 70, 77, 65, 73, 78, 90, 10, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1c50 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, +/* 0x1c60 */ 32, 69, 76, 70, 77, 65, 73, 78, 88, 9, 48, 48, 48, 48, 48, 48, +/* 0x1c70 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 69, 76, 70, 77, 65, +/* 0x1c80 */ 73, 78, 88, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1c90 */ 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, +/* 0x1ca0 */ 95, 72, 69, 65, 68, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1cb0 */ 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 95, 72, 69, 65, 68, 10, +/* 0x1cc0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1cd0 */ 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 95, 84, 65, 73, +/* 0x1ce0 */ 76, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1cf0 */ 48, 48, 32, 78, 82, 86, 95, 84, 65, 73, 76, 10, 48, 48, 48, 48, +/* 0x1d00 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, +/* 0x1d10 */ 32, 32,100, 32, 32, 78, 82, 86, 50, 69, 9, 48, 48, 48, 48, 48, +/* 0x1d20 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 50, +/* 0x1d30 */ 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1d40 */ 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 50, 68, +/* 0x1d50 */ 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1d60 */ 48, 32, 78, 82, 86, 50, 68, 10, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1d70 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, +/* 0x1d80 */ 32, 78, 82, 86, 50, 66, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1d90 */ 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 50, 66, 10, 48, 48, +/* 0x1da0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, +/* 0x1db0 */ 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48, +/* 0x1dc0 */ 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1dd0 */ 48, 48, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 10, 48, 48, +/* 0x1de0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, +/* 0x1df0 */ 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 50, +/* 0x1e00 */ 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1e10 */ 48, 48, 32, 76, 90, 77, 65, 95, 68, 69, 67, 50, 48, 10, 48, 48, +/* 0x1e20 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, +/* 0x1e30 */ 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49, +/* 0x1e40 */ 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1e50 */ 48, 48, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 10, 48, 48, +/* 0x1e60 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, +/* 0x1e70 */ 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 89, 9, +/* 0x1e80 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1e90 */ 32, 69, 76, 70, 77, 65, 73, 78, 89, 10, 48, 48, 48, 48, 48, 48, +/* 0x1ea0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32, +/* 0x1eb0 */ 100, 32, 32, 69, 76, 70, 77, 65, 74, 78, 90, 9, 48, 48, 48, 48, +/* 0x1ec0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 69, 76, 70, +/* 0x1ed0 */ 77, 65, 74, 78, 90, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1ee0 */ 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 65, +/* 0x1ef0 */ 78, 68, 77, 65, 74, 78, 90, 9, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1f00 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 65, 78, 68, 77, 65, 74, 78, +/* 0x1f10 */ 90, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1f20 */ 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, +/* 0x1f30 */ 75, 78, 90, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1f40 */ 48, 48, 48, 48, 32, 69, 76, 70, 77, 65, 75, 78, 90, 10, 48, 48, +/* 0x1f50 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, +/* 0x1f60 */ 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 9, +/* 0x1f70 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1f80 */ 32, 95,115,116, 97,114,116, 10, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1f90 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 70, +/* 0x1fa0 */ 32, 78, 82, 86, 50, 69, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1fb0 */ 48, 48, 48, 48, 49, 50, 56, 32,117, 99,108, 95,110,114,118, 50, +/* 0x1fc0 */ 101, 95,100,101, 99,111,109,112,114,101,115,115, 95, 51, 50, 10, +/* 0x1fd0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x1fe0 */ 32,103, 32, 32, 32, 32, 32, 70, 32, 78, 82, 86, 50, 68, 9, 48, +/* 0x1ff0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 99, 32, +/* 0x2000 */ 117, 99,108, 95,110,114,118, 50,100, 95,100,101, 99,111,109,112, +/* 0x2010 */ 114,101,115,115, 95, 51, 50, 10, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x2020 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 70, +/* 0x2030 */ 32, 78, 82, 86, 50, 66, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x2040 */ 48, 48, 48, 48, 48,102, 48, 32,117, 99,108, 95,110,114,118, 50, +/* 0x2050 */ 98, 95,100,101, 99,111,109,112,114,101,115,115, 95, 51, 50, 10, +/* 0x2060 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x2070 */ 32,103, 32, 32, 32, 32, 32, 32, 32, 76, 90, 77, 65, 95, 68, 69, +/* 0x2080 */ 67, 49, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x2090 */ 48, 48, 48, 48, 32, 76,122,109, 97, 68,101, 99,111,100,101, 10, +/* 0x20a0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x20b0 */ 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, +/* 0x20c0 */ 89, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x20d0 */ 48, 48, 32,101,110,100, 95,100,101, 99,111,109,112,114,101,115, +/* 0x20e0 */ 115, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, +/* 0x20f0 */ 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, +/* 0x2100 */ 73, 78, 88, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, +/* 0x2110 */ 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, +/* 0x2120 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, +/* 0x2130 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 99, 32, +/* 0x2140 */ 82, 95, 65, 65, 82, 67, 72, 54, 52, 95, 67, 65, 76, 76, 50, 54, +/* 0x2150 */ 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 10, 82, 69, 76, 79, +/* 0x2160 */ 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, +/* 0x2170 */ 79, 82, 32, 91, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 93, 58, +/* 0x2180 */ 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, +/* 0x2190 */ 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, +/* 0x21a0 */ 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, +/* 0x21b0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 32, 82, 95, 65, 65, 82, +/* 0x21c0 */ 67, 72, 54, 52, 95, 67, 79, 78, 68, 66, 82, 49, 57, 32, 32, 76, +/* 0x21d0 */ 90, 77, 65, 95, 68, 69, 67, 51, 48, 10 }; diff --git a/src/stub/src/arm64-linux.shlib-init.S b/src/stub/src/arm64-linux.shlib-init.S index 41f16ecd..824c6150 100644 --- a/src/stub/src/arm64-linux.shlib-init.S +++ b/src/stub/src/arm64-linux.shlib-init.S @@ -126,7 +126,7 @@ sp_frame = 24 * NBPW // .long offset(escape_hatch) // .long offset(xct_off) dst of f_exp _start: .globl _start -// brk #0 // debugging +// brk #0 // debugging slot f_argc // 0 slot f_argv // 1 @@ -191,9 +191,12 @@ main: 5: // auxp cannot be empty (must have AT_UID), so 'cmp' above sets nzvc csel x1,x1,x3,eq // x1 if found, else x3 neg x1,x1 + mov tmp2x,#0 section ANDMAJNZ // Android passes junk args to DT_INIT? mov x1,#~0<<12 // -4096 +asl_delta= 1<<12 + mov tmp2x,#asl_delta section ELFMAKNZ str x1,[sp,#f_PMASK] @@ -222,7 +225,8 @@ main: lodsl; mov tmp,eax // offset(b_info) mov rcx,rsi lodsl; sub rcx,rcx,rax; //str ecx,[sp,#o_reloc] - lodsl; add rax,rax,rcx; str rax,[sp,#f_uinit] // reloc DT_INIT for step 12 + lodsl; add rax,rax,tmp2x // +asl_delta + add rax,rax,rcx; str rax,[sp,#f_uinit] // reloc DT_INIT for step 12 slot o_hatch // 6 lodsl; add rax,rax,rcx; str rax,[sp,#o_hatch] // reloc &hatch for step 10 lodsl; add rdi,rax,rcx // destination for decompress diff --git a/src/stub/tmp/arm64-linux.shlib-init.bin.dump b/src/stub/tmp/arm64-linux.shlib-init.bin.dump index 3fed5f09..75d5b3a8 100644 --- a/src/stub/tmp/arm64-linux.shlib-init.bin.dump +++ b/src/stub/tmp/arm64-linux.shlib-init.bin.dump @@ -14,9 +14,9 @@ Idx Name Size VMA LMA File off Algn 9 LZMA_DEC30 00000000 0000000000000000 0000000000000000 00001258 2**0 CONTENTS, READONLY 10 ELFMAINY 0000003e 0000000000000000 0000000000000000 00001258 2**0 CONTENTS, READONLY 11 ELFMAINZ 00000000 0000000000000000 0000000000000000 00001296 2**0 CONTENTS, READONLY - 12 ELFMAJNZ 00000024 0000000000000000 0000000000000000 00001296 2**0 CONTENTS, READONLY - 13 ANDMAJNZ 00000004 0000000000000000 0000000000000000 000012ba 2**0 CONTENTS, READONLY - 14 ELFMAKNZ 00000298 0000000000000000 0000000000000000 000012be 2**0 CONTENTS, READONLY + 12 ELFMAJNZ 00000028 0000000000000000 0000000000000000 00001296 2**0 CONTENTS, READONLY + 13 ANDMAJNZ 00000008 0000000000000000 0000000000000000 000012be 2**0 CONTENTS, READONLY + 14 ELFMAKNZ 0000029c 0000000000000000 0000000000000000 000012c6 2**0 CONTENTS, READONLY SYMBOL TABLE: 0000000000000000 l d LZMA_DEC30 0000000000000000 LZMA_DEC30 0000000000000000 l d ELFMAINZ 0000000000000000 ELFMAINZ