basic win64 PE support added

This commit is contained in:
László Molnár 2013-08-22 22:01:09 +02:00
parent 037c29d24a
commit 5b8a9c0b47
11 changed files with 5185 additions and 0 deletions

View File

@ -487,6 +487,8 @@ private:
#define UPX_F_MACH_AMD64 34
#define UPX_F_DYLIB_AMD64 35
#define UPX_F_WIN64_PEP 36
#define UPX_F_PLAIN_TEXT 127
#define UPX_F_ATARI_TOS 129

1568
src/p_w64pep.cpp Normal file

File diff suppressed because it is too large Load Diff

87
src/p_w64pep.h Normal file
View File

@ -0,0 +1,87 @@
/* p_w64pep.h --
This file is part of the UPX executable compressor.
Copyright (C) 1996-2013 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2013 Laszlo Molnar
All Rights Reserved.
UPX and the UCL library are free software; you can redistribute them
and/or modify them under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 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; see the file COPYING.
If not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Markus F.X.J. Oberhumer Laszlo Molnar
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
*/
#ifndef __UPX_P_W64PEP_H
#define __UPX_P_W64PEP_H 1
/*************************************************************************
// w64/pep
**************************************************************************/
class PackW64Pep : public PepFile
{
typedef PepFile super;
public:
PackW64Pep(InputFile *f);
virtual ~PackW64Pep();
virtual int getFormat() const { return UPX_F_WIN64_PEP; }
virtual const char *getName() const { return "win64/pep"; }
virtual const char *getFullName(const options_t *) const { return "AMD64-win64.pep"; }
virtual const int *getCompressionMethods(int method, int level) const;
virtual const int *getFilters() const;
virtual void pack(OutputFile *fo);
virtual bool canPack();
virtual int canUnpack();
protected:
virtual int readFileHeader();
virtual void buildLoader(const Filter *ft);
virtual Linker* newLinker() const;
virtual unsigned processImports();
virtual void processImports(unsigned, unsigned);
virtual void rebuildImports(upx_byte *&);
virtual void processTls(Interval *); //NEW: TLS callback handling - Stefan Widmann
void processTls(Reloc *, const Interval *, unsigned); //NEW: TLS callback handling - Stefan Widmann
void processLoadConf(Reloc *, const Interval *, unsigned);
void processLoadConf(Interval *);
upx_byte *oloadconf;
unsigned soloadconf;
unsigned tlscb_ptr; //NEW: TLS callback handling - Stefan Widmann
unsigned tls_handler_offset;
bool isrtm;
bool use_dep_hack;
bool use_clear_dirty_stack;
bool use_tls_callbacks; //NEW: TLS callback handling - Stefan Widmann
};
#endif /* already included */
/*
vi:ts=4:et
*/

View File

@ -32,6 +32,7 @@
#include "packer.h"
#include "lefile.h"
#include "pefile.h"
#include "pepfile.h"
#include "p_elf.h"
#include "p_com.h"
@ -50,6 +51,7 @@
#include "p_vxd.h"
#include "p_w16ne.h"
#include "p_w32pe.h"
#include "p_w64pep.h"
#include "p_vmlinz.h"
#include "p_vmlinx.h"
#include "p_ps1.h"
@ -179,6 +181,9 @@ Packer* PackMaster::visitAllPackers(visit_func_t func, InputFile *f, const optio
return p;
delete p; p = NULL;
#endif
if ((p = func(new PackW64Pep(f), user)) != NULL)
return p;
delete p; p = NULL;
if ((p = func(new PackW32Pe(f), user)) != NULL)
return p;
delete p; p = NULL;

1728
src/pepfile.cpp Normal file

File diff suppressed because it is too large Load Diff

386
src/pepfile.h Normal file
View File

@ -0,0 +1,386 @@
/* pepfile.h --
This file is part of the UPX executable compressor.
Copyright (C) 1996-2013 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2013 Laszlo Molnar
All Rights Reserved.
UPX and the UCL library are free software; you can redistribute them
and/or modify them under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 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; see the file COPYING.
If not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Markus F.X.J. Oberhumer Laszlo Molnar
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
-------------------------------------------------------------------
PE+ format extension changes (C) 2010 Stefan Widmann
changes in:
- pe_header_t
*/
#ifndef __UPX_PEPFILE_H
#define __UPX_PEPFILE_H 1
/*************************************************************************
// general/pe handling
**************************************************************************/
class PepFile : public Packer
{
typedef Packer super;
protected:
class Interval;
class Reloc;
class Resource;
class Export;
PepFile(InputFile *f);
virtual ~PepFile();
virtual int getVersion() const { return 13; }
virtual void unpack(OutputFile *fo);
// unpacker capabilities
virtual bool canUnpackVersion(int version) const
{ return (version >= 12 && version <= 13); }
protected:
virtual int readFileHeader();
virtual bool testUnpackVersion(int version) const;
unsigned pe_offset;
virtual unsigned processImports() = 0;
virtual void processImports(unsigned, unsigned) = 0;
virtual void rebuildImports(upx_byte *&) = 0;
upx_byte *oimport;
unsigned soimport;
upx_byte *oimpdlls;
unsigned soimpdlls;
void processRelocs();
void processRelocs(Reloc *);
void rebuildRelocs(upx_byte *&);
upx_byte *orelocs;
unsigned sorelocs;
upx_byte *oxrelocs;
unsigned soxrelocs;
void processExports(Export *);
void processExports(Export *,unsigned);
void rebuildExports();
upx_byte *oexport;
unsigned soexport;
void processResources(Resource *);
void processResources(Resource *, unsigned);
void rebuildResources(upx_byte *&);
upx_byte *oresources;
unsigned soresources;
// virtual void processTls(Interval *);
// void processTls(Reloc *, const Interval *, unsigned);
void rebuildTls();
upx_byte *otls;
unsigned sotls;
unsigned tlsindex;
unsigned stripDebug(unsigned);
unsigned icondir_offset;
int icondir_count;
bool importbyordinal;
bool kernel32ordinal;
unsigned rvamin;
unsigned cimports; // rva of preprocessed imports
unsigned crelocs; // rva of preprocessed fixups
int big_relocs;
__packed_struct(pe_header_t)
// 0x0
char _[4]; // pemagic
LE16 cpu;
LE16 objects; // number of sections
char __[12]; // timestamp + reserved
LE16 opthdrsize;
LE16 flags; // characteristics
// optional header
LE16 coffmagic; // NEW: Stefan Widmann
char ___[2]; // linkerversion
LE32 codesize;
// 0x20
LE32 datasize;
LE32 bsssize;
LE32 entry; // still a 32 bit RVA
LE32 codebase;
// 0x30
//LE32 database; // field does not exist in PE+!
// nt specific fields
LE64 imagebase; // LE32 -> LE64 - Stefan Widmann standard is 0x0000000140000000
LE32 objectalign;
LE32 filealign; // should set to 0x200 ?
// 0x40
char ____[16]; // versions
// 0x50
LE32 imagesize;
LE32 headersize;
LE32 chksum; // should set to 0
LE16 subsystem;
LE16 dllflags;
// 0x60
char _____[36]; // stack + heap sizes + loader flag
// 0x84
LE32 ddirsentries; // usually 16
__packed_struct(ddirs_t)
LE32 vaddr; // dir RVAs and sizes are still 32 bit
LE32 size;
__packed_struct_end()
ddirs_t ddirs[16];
__packed_struct_end()
__packed_struct(pe_section_t) // no change in section description structures
char name[8];
LE32 vsize;
LE32 vaddr;
LE32 size;
LE32 rawdataptr;
char _[12];
LE32 flags;
__packed_struct_end()
pe_header_t ih, oh;
pe_section_t *isection;
static unsigned virta2objnum (unsigned, pe_section_t *, unsigned);
unsigned tryremove (unsigned, unsigned);
enum {
PEDIR_EXPORT = 0,
PEDIR_IMPORT = 1,
PEDIR_RESOURCE = 2,
PEDIR_EXCEPTION = 3, // Exception table
PEDIR_SEC = 4, // Certificate table (file pointer)
PEDIR_RELOC = 5,
PEDIR_DEBUG = 6,
PEDIR_COPYRIGHT = 7, // Architecture-specific data
PEDIR_GLOBALPTR = 8, // Global pointer
PEDIR_TLS = 9,
PEDIR_LOADCONF = 10, // Load Config Table
PEDIR_BOUNDIM = 11,
PEDIR_IAT = 12,
PEDIR_DELAYIMP = 13, // Delay Import Descriptor
PEDIR_COMRT = 14 // Com+ Runtime Header
};
enum {
PEFL_CODE = 0x20,
PEFL_DATA = 0x40,
PEFL_BSS = 0x80,
PEFL_INFO = 0x200,
PEFL_EXTRELS = 0x01000000, // extended relocations
PEFL_DISCARD = 0x02000000,
PEFL_NOCACHE = 0x04000000,
PEFL_NOPAGE = 0x08000000,
PEFL_SHARED = 0x10000000,
PEFL_EXEC = 0x20000000,
PEFL_READ = 0x40000000,
PEFL_WRITE = 0x80000000
};
enum {
RELOCS_STRIPPED = 0x0001,
EXECUTABLE = 0x0002,
LNUM_STRIPPED = 0x0004,
LSYMS_STRIPPED = 0x0008,
AGGRESSIVE_TRIM = 0x0010,
TWO_GIGS_AWARE = 0x0020,
FLITTLE_ENDIAN = 0x0080,
BITS_32_MACHINE = 0x0100,
DEBUG_STRIPPED = 0x0200,
REMOVABLE_SWAP = 0x0400,
SYSTEM_PROGRAM = 0x1000,
DLL_FLAG = 0x2000,
FBIG_ENDIAN = 0x8000
};
//NEW: DLL characteristics definition for ASLR, ... - Stefan Widmann
enum {
IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE = 0x0040,
IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY = 0x0080,
IMAGE_DLL_CHARACTERISTICS_NX_COMPAT = 0x0100,
IMAGE_DLLCHARACTERISTICS_NO_ISOLATION = 0x0200,
IMAGE_DLLCHARACTERISTICS_NO_SEH = 0x0400,
IMAGE_DLLCHARACTERISTICS_NO_BIND = 0x0800,
IMAGE_DLLCHARACTERISTICS_WDM_DRIVER = 0x2000,
IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE = 0x8000
};
// predefined resource types
enum {
RT_CURSOR = 1, RT_BITMAP, RT_ICON, RT_MENU, RT_DIALOG, RT_STRING,
RT_FONTDIR, RT_FONT, RT_ACCELERATOR, RT_RCDATA, RT_MESSAGETABLE,
RT_GROUP_CURSOR, RT_GROUP_ICON = 14, RT_VERSION = 16, RT_DLGINCLUDE,
RT_PLUGPLAY = 19, RT_VXD, RT_ANICURSOR, RT_ANIICON, RT_HTML,
RT_MANIFEST, RT_LAST
};
class Interval : private noncopyable
{
unsigned capacity;
void *base;
public:
struct interval
{
unsigned start, len;
} *ivarr;
unsigned ivnum;
Interval(void *b);
~Interval();
void add(unsigned start,unsigned len);
void add(const void *start,unsigned len);
void add(const void *start,const void *end);
void add(const Interval *iv);
void flatten();
void clear();
void dump() const;
private:
static int __acc_cdecl_qsort compare(const void *p1,const void *p2);
};
class Reloc : private noncopyable
{
upx_byte *start;
unsigned size;
void newRelocPos(void *p);
struct reloc;
reloc *rel;
LE16 *rel1;
unsigned counts[16];
public:
Reloc(upx_byte *,unsigned);
Reloc(unsigned rnum);
//
bool next(unsigned &pos,unsigned &type);
const unsigned *getcounts() const { return counts; }
//
void add(unsigned pos,unsigned type);
void finish(upx_byte *&p,unsigned &size);
};
class Resource : private noncopyable
{
struct res_dir_entry;
struct res_dir;
struct res_data;
struct upx_rnode;
struct upx_rbranch;
struct upx_rleaf;
const upx_byte *start;
upx_byte *newstart;
upx_rnode *root;
upx_rleaf *head;
upx_rleaf *current;
unsigned dsize;
unsigned ssize;
void check(const res_dir*,unsigned);
upx_rnode *convert(const void *,upx_rnode *,unsigned);
void build(const upx_rnode *,unsigned &,unsigned &,unsigned);
void clear(upx_byte *,unsigned,Interval *);
void dump(const upx_rnode *,unsigned) const;
void destroy(upx_rnode *urd,unsigned level);
public:
Resource();
Resource(const upx_byte *p);
~Resource();
void init(const upx_byte *);
unsigned dirsize() const;
bool next();
unsigned itype() const;
const upx_byte *ntype() const;
unsigned size() const;
unsigned offs() const;
unsigned &newoffs();
upx_byte *build();
bool clear();
void dump() const;
unsigned iname() const;
const upx_byte *nname() const;
/*
unsigned ilang() const {return current->id;}
const upx_byte *nlang() const {return current->name;}
*/
};
class Export : private noncopyable
{
__packed_struct(export_dir_t)
char _[12]; // flags, timedate, version
LE32 name;
char __[4]; // ordinal base
LE32 functions;
LE32 names;
LE32 addrtable;
LE32 nameptrtable;
LE32 ordinaltable;
__packed_struct_end()
export_dir_t edir;
char *ename;
char *functionptrs;
char *ordinals;
char **names;
char *base;
unsigned size;
Interval iv;
public:
Export(char *_base);
~Export();
void convert(unsigned eoffs,unsigned esize);
void build(char *base,unsigned newoffs);
unsigned getsize() const { return size; }
};
};
#endif /* already included */
/*
vi:ts=4:et
*/

View File

@ -56,6 +56,7 @@ STUBS += amd64-linux.elf-fold.h
STUBS += amd64-linux.kernel.vmlinux-head.h
STUBS += amd64-linux.kernel.vmlinux.h
STUBS += amd64-linux.shlib-init.h
STUBS += amd64-win64.pep.h
STUBS += arm-darwin.macho-entry.h
STUBS += arm-darwin.macho-fold.h
STUBS += arm-linux.elf-entry.h
@ -369,6 +370,20 @@ amd64-linux.shlib-init.h : $(srcdir)/src/$$T.S
$(call tc,bin2h) tmp/$T.bin $@
# /***********************************************************************
# // amd64-win64.pep
# ************************************************************************/
amd64-win64.pep.h : tc_list = amd64-linux.elf default
amd64-win64.pep.h : tc_bfdname = elf64-x86-64
amd64-win64.pep.h : $(srcdir)/src/$$T.S
$(call tc,gcc) -c -x assembler-with-cpp $< -o tmp/$T.bin
# $(call tc,objdump) -Dr -M intel-mnemonic tmp/$T.bin | $(RTRIM) > tmp/$T.bin.disasmi
$(call tc,f-embed_objinfo,tmp/$T.bin)
$(call tc,bin2h) tmp/$T.bin $@
# /***********************************************************************
# // armel-eabi-linux.elf
# ************************************************************************/

766
src/stub/amd64-win64.pep.h Normal file
View File

@ -0,0 +1,766 @@
/* amd64-win64.pep.h
created from amd64-win64.pep.bin, 11619 (0x2d63) bytes
This file is part of the UPX executable compressor.
Copyright (C) 1996-2013 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2013 Laszlo Molnar
Copyright (C) 2000-2013 John F. Reiser
All Rights Reserved.
UPX and the UCL library are free software; you can redistribute them
and/or modify them under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 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; see the file COPYING.
If not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Markus F.X.J. Oberhumer Laszlo Molnar
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
John F. Reiser
<jreiser@users.sourceforge.net>
*/
#define STUB_AMD64_WIN64_PEP_SIZE 11619
#define STUB_AMD64_WIN64_PEP_ADLER32 0x2097635b
#define STUB_AMD64_WIN64_PEP_CRC32 0x71380939
unsigned char stub_amd64_win64_pep[11619] = {
/* 0x0000 */ 127, 69, 76, 70, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0010 */ 1, 0, 62, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0020 */ 0, 0, 0, 0, 0, 0, 0, 0,200, 4, 0, 0, 0, 0, 0, 0,
/* 0x0030 */ 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 64, 0, 59, 0, 56, 0,
/* 0x0040 */ 128,250, 1, 15,133, 0, 0, 0, 0, 83, 86, 87, 85, 72,190, 0,
/* 0x0050 */ 0, 0, 0, 0, 0, 0,128, 72,141,190, 0, 0, 0, 0,102,255,
/* 0x0060 */ 135, 0, 0, 0, 0,102,129,135, 0, 0, 0, 0, 0,128,199,135,
/* 0x0070 */ 0, 0, 0, 0, 0, 0, 0,128, 87, 49,219, 49,201, 72,131,205,
/* 0x0080 */ 255,232, 80, 0, 0, 0, 1,219,116, 2,243,195,139, 30, 72,131,
/* 0x0090 */ 238,252, 17,219,138, 22,243,195, 72,141, 4, 47,131,249, 5,138,
/* 0x00a0 */ 16,118, 33, 72,131,253,252,119, 27,131,233, 4,139, 16, 72,131,
/* 0x00b0 */ 192, 4,131,233, 4,137, 23, 72,141,127, 4,115,239,131,193, 4,
/* 0x00c0 */ 138, 16,116, 16, 72,255,192,136, 23,131,233, 1,138, 16, 72,141,
/* 0x00d0 */ 127, 1,117,240,243,195,252, 65, 91,235, 8, 72,255,198,136, 23,
/* 0x00e0 */ 72,255,199,138, 22, 1,219,117, 10,139, 30, 72,131,238,252, 17,
/* 0x00f0 */ 219,138, 22,114,230,141, 65, 1,235, 7,255,200, 65,255,211, 17,
/* 0x0100 */ 192, 65,255,211, 17,192, 1,219,117, 10,139, 30, 72,131,238,252,
/* 0x0110 */ 17,219,138, 22,115,228,131,232, 3,114, 29,193,224, 8, 15,182,
/* 0x0120 */ 210, 9,208, 72,255,198,131,240,255, 15,132, 0, 0, 0, 0,209,
/* 0x0130 */ 248, 72, 99,232,114, 56,235, 14, 1,219,117, 8,139, 30, 72,131,
/* 0x0140 */ 238,252, 17,219,114, 40,255,193, 1,219,117, 8,139, 30, 72,131,
/* 0x0150 */ 238,252, 17,219,114, 24, 65,255,211, 17,201, 1,219,117, 8,139,
/* 0x0160 */ 30, 72,131,238,252, 17,219,115,237,131,193, 2,235, 5, 65,255,
/* 0x0170 */ 211, 17,201, 72,129,253, 0,251,255,255,131,209, 2,232, 0, 0,
/* 0x0180 */ 0, 0,233, 92,255,255,255, 94, 72,141,190, 0, 0, 0, 0, 72,
/* 0x0190 */ 137,247,185, 0, 0, 0, 0, 72,141,190, 0, 0, 0, 0,139, 7,
/* 0x01a0 */ 9,192,116,255,139, 95, 4, 72,141,140, 48, 0, 0, 0, 0, 72,
/* 0x01b0 */ 1,243, 72,131,199, 8, 72,131,236, 40,255,150, 0, 0, 0, 0,
/* 0x01c0 */ 72,131,196, 40, 72,149,138, 7, 72,255,199, 8,192,116,207,121,
/* 0x01d0 */ 255,122, 16,139, 7, 72,131,199, 4, 72,139,132, 48, 0, 0, 0,
/* 0x01e0 */ 0,235,255, 72, 15,183, 23, 72,131,199, 2,235,255, 72,137,249,
/* 0x01f0 */ 72,137,250,255,200,242,174, 72,137,233, 72,131,236, 40,255,150,
/* 0x0200 */ 0, 0, 0, 0, 72,131,196, 40, 72, 9,192,116, 9, 72,137, 3,
/* 0x0210 */ 72,131,195, 8,235,255, 93, 95, 94, 91, 49,192,195, 72,131,236,
/* 0x0220 */ 40,255,150, 0, 0, 0, 0, 72,141,190, 0, 0, 0, 0, 72,131,
/* 0x0230 */ 199, 4, 72,141, 94,252, 72,139,174, 0, 0, 0, 0, 72,141,190,
/* 0x0240 */ 0, 0, 0, 0,187, 0, 0, 0,128, 80, 73,137,225, 65,184, 4,
/* 0x0250 */ 0, 0, 0, 72,137,218, 72,137,249, 72,131,236, 32,255,213, 72,
/* 0x0260 */ 141,135, 0, 0, 0, 0,128, 32,127,128, 96, 40,127, 76,141, 76,
/* 0x0270 */ 36, 32, 77,139, 1, 72,137,218, 72,137,249,255,213, 72,131,196,
/* 0x0280 */ 40, 72,141,142, 0, 0, 0, 0, 72,141,185, 0, 0, 0, 0, 49,
/* 0x0290 */ 192,170, 73,137,192,186, 1, 0, 0, 0, 80,255,215, 88, 93, 95,
/* 0x02a0 */ 94, 91, 72,141, 68, 36,128,106, 0, 72, 57,196,117,249, 72,131,
/* 0x02b0 */ 236,128,184, 1, 0, 0, 0,195,233, 0, 0, 0, 0,235, 40, 86,
/* 0x02c0 */ 72,190, 0, 0, 0, 0, 0, 0, 0,128,252, 72,173, 72,133,192,
/* 0x02d0 */ 116, 20, 81, 82, 65, 80, 72,131,236, 40,255,208, 72,131,196, 40,
/* 0x02e0 */ 65, 88, 90, 89,235,229, 94,195, 85, 80, 88, 33,161,216,208,213,
/* 0x02f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0300 */ 0, 0, 0, 0, 0, 0, 0, 45,102,105,108,101, 32,102,111,114,
/* 0x0310 */ 109, 97,116, 32,101,108,102, 54, 52, 45,120, 56, 54, 45, 54, 52,
/* 0x0320 */ 10, 10, 83,101, 99,116,105,111,110,115, 58, 10, 73,100,120, 32,
/* 0x0330 */ 78, 97,109,101, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 83,105,
/* 0x0340 */ 122,101, 32, 32, 32, 32, 32, 32, 86, 77, 65, 32, 32, 32, 32, 32,
/* 0x0350 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 76, 77, 65, 32, 32, 32,
/* 0x0360 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 70,105,108,101,
/* 0x0370 */ 32,111,102,102, 32, 32, 65,108,103,110, 32, 32, 70,108, 97,103,
/* 0x0380 */ 115, 10, 32, 32, 48, 32, 80, 69, 73, 83, 68, 76, 76, 49, 32, 32,
/* 0x0390 */ 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 57, 32, 32, 48, 48,
/* 0x03a0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32,
/* 0x03b0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x03c0 */ 32, 32, 48, 48, 48, 48, 48, 48, 52, 48, 32, 32, 50, 42, 42, 48,
/* 0x03d0 */ 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79,
/* 0x03e0 */ 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 49, 32,
/* 0x03f0 */ 80, 69, 77, 65, 73, 78, 48, 49, 32, 32, 32, 32, 32, 32, 48, 48,
/* 0x0400 */ 48, 48, 48, 48, 49, 53, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0410 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48,
/* 0x0420 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48,
/* 0x0430 */ 48, 48, 52, 57, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84,
/* 0x0440 */ 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65,
/* 0x0450 */ 68, 79, 78, 76, 89, 10, 32, 32, 50, 32, 80, 69, 73, 67, 79, 78,
/* 0x0460 */ 83, 49, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 55,
/* 0x0470 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0480 */ 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0490 */ 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 53,101, 32, 32,
/* 0x04a0 */ 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32,
/* 0x04b0 */ 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10,
/* 0x04c0 */ 32, 32, 51, 32, 80, 69, 73, 67, 79, 78, 83, 50, 32, 32, 32, 32,
/* 0x04d0 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 57, 32, 32, 48, 48, 48, 48,
/* 0x04e0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48,
/* 0x04f0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32,
/* 0x0500 */ 48, 48, 48, 48, 48, 48, 54, 53, 32, 32, 50, 42, 42, 48, 32, 32,
/* 0x0510 */ 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44,
/* 0x0520 */ 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 52, 32, 80, 69,
/* 0x0530 */ 84, 76, 83, 72, 65, 75, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48,
/* 0x0540 */ 48, 48, 48, 97, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0550 */ 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0560 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48,
/* 0x0570 */ 54,101, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78,
/* 0x0580 */ 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79,
/* 0x0590 */ 78, 76, 89, 10, 32, 32, 53, 32, 80, 69, 77, 65, 73, 78, 48, 50,
/* 0x05a0 */ 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 49, 32, 32,
/* 0x05b0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x05c0 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x05d0 */ 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 55, 56, 32, 32, 50, 42,
/* 0x05e0 */ 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69,
/* 0x05f0 */ 65, 68, 79, 78, 76, 89, 10, 32, 32, 54, 32, 80, 69, 77, 65, 73,
/* 0x0600 */ 78, 48, 51, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48,
/* 0x0610 */ 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0620 */ 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0630 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 55, 57, 32,
/* 0x0640 */ 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44,
/* 0x0650 */ 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 55, 32, 78, 82,
/* 0x0660 */ 86, 95, 72, 69, 65, 68, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48,
/* 0x0670 */ 48, 48, 54, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0680 */ 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0690 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48,
/* 0x06a0 */ 55, 57, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78,
/* 0x06b0 */ 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 56,
/* 0x06c0 */ 32, 78, 82, 86, 50, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48,
/* 0x06d0 */ 48, 48, 48, 48, 48, 97,101, 32, 32, 48, 48, 48, 48, 48, 48, 48,
/* 0x06e0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48,
/* 0x06f0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48,
/* 0x0700 */ 48, 48, 48,100, 57, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78,
/* 0x0710 */ 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69,
/* 0x0720 */ 65, 68, 79, 78, 76, 89, 10, 32, 32, 57, 32, 80, 69, 77, 65, 73,
/* 0x0730 */ 78, 49, 48, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48,
/* 0x0740 */ 49, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0750 */ 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0760 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 49, 56, 55, 32,
/* 0x0770 */ 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44,
/* 0x0780 */ 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 49, 48, 32, 80, 69,
/* 0x0790 */ 67, 84, 84, 80, 79, 83, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48,
/* 0x07a0 */ 48, 48, 48, 55, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x07b0 */ 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x07c0 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 49,
/* 0x07d0 */ 56, 56, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78,
/* 0x07e0 */ 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79,
/* 0x07f0 */ 78, 76, 89, 10, 32, 49, 49, 32, 80, 69, 67, 84, 84, 78, 85, 76,
/* 0x0800 */ 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 51, 32, 32,
/* 0x0810 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0820 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0830 */ 48, 48, 32, 32, 48, 48, 48, 48, 48, 49, 56,102, 32, 32, 50, 42,
/* 0x0840 */ 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69,
/* 0x0850 */ 65, 68, 79, 78, 76, 89, 10, 32, 49, 50, 32, 99,116,111,107, 51,
/* 0x0860 */ 50, 46, 48, 48, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48,
/* 0x0870 */ 53, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0880 */ 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0890 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 49, 57, 50, 32,
/* 0x08a0 */ 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44,
/* 0x08b0 */ 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89,
/* 0x08c0 */ 10, 32, 49, 51, 32, 80, 69, 73, 77, 80, 79, 82, 84, 32, 32, 32,
/* 0x08d0 */ 32, 32, 32, 48, 48, 48, 48, 48, 48, 51, 56, 32, 32, 48, 48, 48,
/* 0x08e0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48,
/* 0x08f0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x0900 */ 32, 48, 48, 48, 48, 48, 49, 57, 55, 32, 32, 50, 42, 42, 48, 32,
/* 0x0910 */ 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67,
/* 0x0920 */ 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 49, 52, 32, 80,
/* 0x0930 */ 69, 73, 66, 89, 79, 82, 68, 32, 32, 32, 32, 32, 32, 48, 48, 48,
/* 0x0940 */ 48, 48, 48, 48, 50, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0950 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48,
/* 0x0960 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48,
/* 0x0970 */ 49, 99,102, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69,
/* 0x0980 */ 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68,
/* 0x0990 */ 79, 78, 76, 89, 10, 32, 49, 53, 32, 80, 69, 75, 51, 50, 79, 82,
/* 0x09a0 */ 68, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 49, 50, 32,
/* 0x09b0 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x09c0 */ 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x09d0 */ 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 49,100, 49, 32, 32, 50,
/* 0x09e0 */ 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82,
/* 0x09f0 */ 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32,
/* 0x0a00 */ 49, 54, 32, 80, 69, 73, 77, 79, 82, 68, 49, 32, 32, 32, 32, 32,
/* 0x0a10 */ 32, 48, 48, 48, 48, 48, 48, 48, 97, 32, 32, 48, 48, 48, 48, 48,
/* 0x0a20 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48,
/* 0x0a30 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48,
/* 0x0a40 */ 48, 48, 48, 48, 49,101, 51, 32, 32, 50, 42, 42, 48, 32, 32, 67,
/* 0x0a50 */ 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32,
/* 0x0a60 */ 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 49, 55, 32, 80, 69, 73,
/* 0x0a70 */ 77, 80, 79, 82, 50, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48,
/* 0x0a80 */ 48, 50, 57, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0a90 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0aa0 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 49,101,
/* 0x0ab0 */ 100, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84,
/* 0x0ac0 */ 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78,
/* 0x0ad0 */ 76, 89, 10, 32, 49, 56, 32, 80, 69, 73, 69, 82, 68, 76, 76, 32,
/* 0x0ae0 */ 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 55, 32, 32, 48,
/* 0x0af0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x0b00 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0b10 */ 48, 32, 32, 48, 48, 48, 48, 48, 50, 49, 54, 32, 32, 50, 42, 42,
/* 0x0b20 */ 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65,
/* 0x0b30 */ 68, 79, 78, 76, 89, 10, 32, 49, 57, 32, 80, 69, 73, 69, 82, 69,
/* 0x0b40 */ 88, 69, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 97,
/* 0x0b50 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0b60 */ 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0b70 */ 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 50, 49,100, 32, 32,
/* 0x0b80 */ 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32,
/* 0x0b90 */ 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10,
/* 0x0ba0 */ 32, 50, 48, 32, 80, 69, 73, 77, 68, 79, 78, 69, 32, 32, 32, 32,
/* 0x0bb0 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48,
/* 0x0bc0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48,
/* 0x0bd0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32,
/* 0x0be0 */ 48, 48, 48, 48, 48, 50, 50, 55, 32, 32, 50, 42, 42, 48, 32, 32,
/* 0x0bf0 */ 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78,
/* 0x0c00 */ 76, 89, 10, 32, 50, 49, 32, 80, 69, 82, 69, 76, 79, 67, 49, 32,
/* 0x0c10 */ 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 55, 32, 32, 48,
/* 0x0c20 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x0c30 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0c40 */ 48, 32, 32, 48, 48, 48, 48, 48, 50, 50, 55, 32, 32, 50, 42, 42,
/* 0x0c50 */ 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76,
/* 0x0c60 */ 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 50, 50,
/* 0x0c70 */ 32, 80, 69, 82, 69, 76, 79, 67, 50, 32, 32, 32, 32, 32, 32, 48,
/* 0x0c80 */ 48, 48, 48, 48, 48, 48, 52, 32, 32, 48, 48, 48, 48, 48, 48, 48,
/* 0x0c90 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48,
/* 0x0ca0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48,
/* 0x0cb0 */ 48, 48, 50, 50,101, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78,
/* 0x0cc0 */ 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10,
/* 0x0cd0 */ 32, 50, 51, 32, 80, 69, 82, 69, 76, 79, 67, 51, 32, 32, 32, 32,
/* 0x0ce0 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 52, 32, 32, 48, 48, 48, 48,
/* 0x0cf0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48,
/* 0x0d00 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32,
/* 0x0d10 */ 48, 48, 48, 48, 48, 50, 51, 50, 32, 32, 50, 42, 42, 48, 32, 32,
/* 0x0d20 */ 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78,
/* 0x0d30 */ 76, 89, 10, 32, 50, 52, 32, 80, 69, 82, 76, 79, 72, 73, 48, 32,
/* 0x0d40 */ 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48,
/* 0x0d50 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x0d60 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0d70 */ 48, 32, 32, 48, 48, 48, 48, 48, 50, 51, 54, 32, 32, 50, 42, 42,
/* 0x0d80 */ 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65,
/* 0x0d90 */ 68, 79, 78, 76, 89, 10, 32, 50, 53, 32, 80, 69, 82, 69, 76, 76,
/* 0x0da0 */ 79, 48, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0db0 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0dc0 */ 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0dd0 */ 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 50, 51, 54, 32, 32,
/* 0x0de0 */ 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32,
/* 0x0df0 */ 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 50, 54, 32, 80, 69, 82,
/* 0x0e00 */ 69, 76, 72, 73, 48, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48,
/* 0x0e10 */ 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0e20 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0e30 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 50, 51,
/* 0x0e40 */ 54, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84,
/* 0x0e50 */ 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 50, 55, 32,
/* 0x0e60 */ 80, 69, 68, 69, 80, 72, 65, 75, 32, 32, 32, 32, 32, 32, 48, 48,
/* 0x0e70 */ 48, 48, 48, 48, 52, 98, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0e80 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48,
/* 0x0e90 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48,
/* 0x0ea0 */ 48, 50, 51, 54, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84,
/* 0x0eb0 */ 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65,
/* 0x0ec0 */ 68, 79, 78, 76, 89, 10, 32, 50, 56, 32, 80, 69, 84, 76, 83, 67,
/* 0x0ed0 */ 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 49,100,
/* 0x0ee0 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0ef0 */ 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0f00 */ 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 50, 56, 49, 32, 32,
/* 0x0f10 */ 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32,
/* 0x0f20 */ 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10,
/* 0x0f30 */ 32, 50, 57, 32, 80, 69, 77, 65, 73, 78, 50, 48, 32, 32, 32, 32,
/* 0x0f40 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 52, 32, 32, 48, 48, 48, 48,
/* 0x0f50 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48,
/* 0x0f60 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32,
/* 0x0f70 */ 48, 48, 48, 48, 48, 50, 57,101, 32, 32, 50, 42, 42, 48, 32, 32,
/* 0x0f80 */ 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78,
/* 0x0f90 */ 76, 89, 10, 32, 51, 48, 32, 67, 76, 69, 65, 82, 83, 84, 65, 67,
/* 0x0fa0 */ 75, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 49, 48, 32, 32, 48,
/* 0x0fb0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x0fc0 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x0fd0 */ 48, 32, 32, 48, 48, 48, 48, 48, 50, 97, 50, 32, 32, 50, 42, 42,
/* 0x0fe0 */ 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65,
/* 0x0ff0 */ 68, 79, 78, 76, 89, 10, 32, 51, 49, 32, 80, 69, 77, 65, 73, 78,
/* 0x1000 */ 50, 49, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1010 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1020 */ 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1030 */ 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 50, 98, 50, 32, 32,
/* 0x1040 */ 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32,
/* 0x1050 */ 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 51, 50, 32, 80, 69, 82,
/* 0x1060 */ 69, 84, 85, 82, 78, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48,
/* 0x1070 */ 48, 48, 54, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1080 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1090 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 50, 98,
/* 0x10a0 */ 50, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84,
/* 0x10b0 */ 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 51, 51, 32,
/* 0x10c0 */ 80, 69, 68, 79, 74, 85, 77, 80, 32, 32, 32, 32, 32, 32, 48, 48,
/* 0x10d0 */ 48, 48, 48, 48, 48, 53, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x10e0 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48,
/* 0x10f0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48,
/* 0x1100 */ 48, 50, 98, 56, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84,
/* 0x1110 */ 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65,
/* 0x1120 */ 68, 79, 78, 76, 89, 10, 32, 51, 52, 32, 80, 69, 84, 76, 83, 67,
/* 0x1130 */ 50, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 50, 98,
/* 0x1140 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1150 */ 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1160 */ 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 50, 98,100, 32, 32,
/* 0x1170 */ 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32,
/* 0x1180 */ 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10,
/* 0x1190 */ 32, 51, 53, 32, 85, 80, 88, 49, 72, 69, 65, 68, 32, 32, 32, 32,
/* 0x11a0 */ 32, 32, 48, 48, 48, 48, 48, 48, 50, 48, 32, 32, 48, 48, 48, 48,
/* 0x11b0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48,
/* 0x11c0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32,
/* 0x11d0 */ 48, 48, 48, 48, 48, 50,101, 56, 32, 32, 50, 42, 42, 48, 32, 32,
/* 0x11e0 */ 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78,
/* 0x11f0 */ 76, 89, 10, 83, 89, 77, 66, 79, 76, 32, 84, 65, 66, 76, 69, 58,
/* 0x1200 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1210 */ 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 95, 72, 69,
/* 0x1220 */ 65, 68, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1230 */ 48, 48, 48, 32, 78, 82, 86, 95, 72, 69, 65, 68, 10, 48, 48, 48,
/* 0x1240 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32,
/* 0x1250 */ 32, 32, 32,100, 32, 32, 80, 69, 77, 65, 73, 78, 49, 48, 9, 48,
/* 0x1260 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x1270 */ 80, 69, 77, 65, 73, 78, 49, 48, 10, 48, 48, 48, 48, 48, 48, 48,
/* 0x1280 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32, 32,
/* 0x1290 */ 32, 32, 80, 69, 73, 77, 68, 79, 78, 69, 9, 48, 48, 48, 48, 48,
/* 0x12a0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,105,109,112,111,
/* 0x12b0 */ 114,116,115, 95,100,111,110,101, 10, 48, 48, 48, 48, 48, 48, 48,
/* 0x12c0 */ 48, 48, 48, 48, 48, 48, 48, 50,102, 32,108, 32, 32, 32, 32, 32,
/* 0x12d0 */ 32, 32, 80, 69, 73, 77, 80, 79, 82, 84, 9, 48, 48, 48, 48, 48,
/* 0x12e0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,110,101,120,116,
/* 0x12f0 */ 95,102,117,110, 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1300 */ 48, 48, 48, 48, 48, 97, 32,108, 32, 32, 32, 32, 32, 32, 32, 80,
/* 0x1310 */ 69, 73, 77, 79, 82, 68, 49, 9, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1320 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 98,121,110, 97,109,101, 10,
/* 0x1330 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 48,
/* 0x1340 */ 32,108, 32, 32, 32, 32, 32, 32, 32, 80, 69, 73, 77, 80, 79, 82,
/* 0x1350 */ 50, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1360 */ 48, 48, 32,110,101,120,116, 95,105,109,112, 10, 48, 48, 48, 48,
/* 0x1370 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 97, 32,108, 32, 32,
/* 0x1380 */ 32, 32, 32, 32, 32, 80, 69, 73, 77, 80, 79, 82, 50, 9, 48, 48,
/* 0x1390 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,102,
/* 0x13a0 */ 105,114,115,116, 95,105,109,112, 10, 48, 48, 48, 48, 48, 48, 48,
/* 0x13b0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100,
/* 0x13c0 */ 32, 32, 80, 69, 77, 65, 73, 78, 50, 49, 9, 48, 48, 48, 48, 48,
/* 0x13d0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 80, 69, 77, 65,
/* 0x13e0 */ 73, 78, 50, 49, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x13f0 */ 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 80, 69,
/* 0x1400 */ 84, 76, 83, 67, 50, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1410 */ 48, 48, 48, 48, 48, 48, 32, 80, 69, 84, 76, 83, 67, 50, 10, 48,
/* 0x1420 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x1430 */ 108, 32, 32, 32, 32,100, 32, 32, 80, 69, 73, 83, 68, 76, 76, 49,
/* 0x1440 */ 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1450 */ 48, 32, 80, 69, 73, 83, 68, 76, 76, 49, 10, 48, 48, 48, 48, 48,
/* 0x1460 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32,
/* 0x1470 */ 32,100, 32, 32, 80, 69, 77, 65, 73, 78, 48, 49, 9, 48, 48, 48,
/* 0x1480 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 80, 69,
/* 0x1490 */ 77, 65, 73, 78, 48, 49, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x14a0 */ 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32,
/* 0x14b0 */ 80, 69, 73, 67, 79, 78, 83, 49, 9, 48, 48, 48, 48, 48, 48, 48,
/* 0x14c0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 80, 69, 73, 67, 79, 78,
/* 0x14d0 */ 83, 49, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x14e0 */ 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 80, 69, 73, 67,
/* 0x14f0 */ 79, 78, 83, 50, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1500 */ 48, 48, 48, 48, 48, 32, 80, 69, 73, 67, 79, 78, 83, 50, 10, 48,
/* 0x1510 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x1520 */ 108, 32, 32, 32, 32,100, 32, 32, 80, 69, 84, 76, 83, 72, 65, 75,
/* 0x1530 */ 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1540 */ 48, 32, 80, 69, 84, 76, 83, 72, 65, 75, 10, 48, 48, 48, 48, 48,
/* 0x1550 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32,
/* 0x1560 */ 32,100, 32, 32, 80, 69, 77, 65, 73, 78, 48, 50, 9, 48, 48, 48,
/* 0x1570 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 80, 69,
/* 0x1580 */ 77, 65, 73, 78, 48, 50, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1590 */ 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32,
/* 0x15a0 */ 80, 69, 77, 65, 73, 78, 48, 51, 9, 48, 48, 48, 48, 48, 48, 48,
/* 0x15b0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 80, 69, 77, 65, 73, 78,
/* 0x15c0 */ 48, 51, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x15d0 */ 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 50,
/* 0x15e0 */ 69, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x15f0 */ 48, 48, 32, 78, 82, 86, 50, 69, 10, 48, 48, 48, 48, 48, 48, 48,
/* 0x1600 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100,
/* 0x1610 */ 32, 32, 80, 69, 67, 84, 84, 80, 79, 83, 9, 48, 48, 48, 48, 48,
/* 0x1620 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 80, 69, 67, 84,
/* 0x1630 */ 84, 80, 79, 83, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1640 */ 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 80, 69,
/* 0x1650 */ 67, 84, 84, 78, 85, 76, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1660 */ 48, 48, 48, 48, 48, 48, 48, 32, 80, 69, 67, 84, 84, 78, 85, 76,
/* 0x1670 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1680 */ 48, 32,108, 32, 32, 32, 32,100, 32, 32, 99,116,111,107, 51, 50,
/* 0x1690 */ 46, 48, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x16a0 */ 48, 48, 48, 48, 32, 99,116,111,107, 51, 50, 46, 48, 48, 10, 48,
/* 0x16b0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x16c0 */ 108, 32, 32, 32, 32,100, 32, 32, 80, 69, 73, 77, 80, 79, 82, 84,
/* 0x16d0 */ 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x16e0 */ 48, 32, 80, 69, 73, 77, 80, 79, 82, 84, 10, 48, 48, 48, 48, 48,
/* 0x16f0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32,
/* 0x1700 */ 32,100, 32, 32, 80, 69, 73, 66, 89, 79, 82, 68, 9, 48, 48, 48,
/* 0x1710 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 80, 69,
/* 0x1720 */ 73, 66, 89, 79, 82, 68, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1730 */ 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32,
/* 0x1740 */ 80, 69, 75, 51, 50, 79, 82, 68, 9, 48, 48, 48, 48, 48, 48, 48,
/* 0x1750 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 80, 69, 75, 51, 50, 79,
/* 0x1760 */ 82, 68, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1770 */ 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 80, 69, 73, 77,
/* 0x1780 */ 79, 82, 68, 49, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1790 */ 48, 48, 48, 48, 48, 32, 80, 69, 73, 77, 79, 82, 68, 49, 10, 48,
/* 0x17a0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x17b0 */ 108, 32, 32, 32, 32,100, 32, 32, 80, 69, 73, 77, 80, 79, 82, 50,
/* 0x17c0 */ 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x17d0 */ 48, 32, 80, 69, 73, 77, 80, 79, 82, 50, 10, 48, 48, 48, 48, 48,
/* 0x17e0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32,
/* 0x17f0 */ 32,100, 32, 32, 80, 69, 73, 69, 82, 68, 76, 76, 9, 48, 48, 48,
/* 0x1800 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 80, 69,
/* 0x1810 */ 73, 69, 82, 68, 76, 76, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1820 */ 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32,
/* 0x1830 */ 80, 69, 73, 69, 82, 69, 88, 69, 9, 48, 48, 48, 48, 48, 48, 48,
/* 0x1840 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 80, 69, 73, 69, 82, 69,
/* 0x1850 */ 88, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1860 */ 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 80, 69, 73, 77,
/* 0x1870 */ 68, 79, 78, 69, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1880 */ 48, 48, 48, 48, 48, 32, 80, 69, 73, 77, 68, 79, 78, 69, 10, 48,
/* 0x1890 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x18a0 */ 108, 32, 32, 32, 32,100, 32, 32, 80, 69, 82, 69, 76, 79, 67, 49,
/* 0x18b0 */ 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x18c0 */ 48, 32, 80, 69, 82, 69, 76, 79, 67, 49, 10, 48, 48, 48, 48, 48,
/* 0x18d0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32,
/* 0x18e0 */ 32,100, 32, 32, 80, 69, 82, 69, 76, 79, 67, 50, 9, 48, 48, 48,
/* 0x18f0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 80, 69,
/* 0x1900 */ 82, 69, 76, 79, 67, 50, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1910 */ 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32,
/* 0x1920 */ 80, 69, 82, 69, 76, 79, 67, 51, 9, 48, 48, 48, 48, 48, 48, 48,
/* 0x1930 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 80, 69, 82, 69, 76, 79,
/* 0x1940 */ 67, 51, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1950 */ 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 80, 69, 82, 76,
/* 0x1960 */ 79, 72, 73, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1970 */ 48, 48, 48, 48, 48, 32, 80, 69, 82, 76, 79, 72, 73, 48, 10, 48,
/* 0x1980 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x1990 */ 108, 32, 32, 32, 32,100, 32, 32, 80, 69, 82, 69, 76, 76, 79, 48,
/* 0x19a0 */ 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x19b0 */ 48, 32, 80, 69, 82, 69, 76, 76, 79, 48, 10, 48, 48, 48, 48, 48,
/* 0x19c0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32,
/* 0x19d0 */ 32,100, 32, 32, 80, 69, 82, 69, 76, 72, 73, 48, 9, 48, 48, 48,
/* 0x19e0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 80, 69,
/* 0x19f0 */ 82, 69, 76, 72, 73, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1a00 */ 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32,
/* 0x1a10 */ 80, 69, 68, 69, 80, 72, 65, 75, 9, 48, 48, 48, 48, 48, 48, 48,
/* 0x1a20 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 80, 69, 68, 69, 80, 72,
/* 0x1a30 */ 65, 75, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1a40 */ 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 80, 69, 84, 76,
/* 0x1a50 */ 83, 67, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1a60 */ 48, 48, 48, 32, 80, 69, 84, 76, 83, 67, 10, 48, 48, 48, 48, 48,
/* 0x1a70 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32,
/* 0x1a80 */ 32,100, 32, 32, 80, 69, 77, 65, 73, 78, 50, 48, 9, 48, 48, 48,
/* 0x1a90 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 80, 69,
/* 0x1aa0 */ 77, 65, 73, 78, 50, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1ab0 */ 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32,
/* 0x1ac0 */ 67, 76, 69, 65, 82, 83, 84, 65, 67, 75, 9, 48, 48, 48, 48, 48,
/* 0x1ad0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 67, 76, 69, 65,
/* 0x1ae0 */ 82, 83, 84, 65, 67, 75, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1af0 */ 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32,
/* 0x1b00 */ 80, 69, 82, 69, 84, 85, 82, 78, 9, 48, 48, 48, 48, 48, 48, 48,
/* 0x1b10 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 80, 69, 82, 69, 84, 85,
/* 0x1b20 */ 82, 78, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1b30 */ 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 80, 69, 68, 79,
/* 0x1b40 */ 74, 85, 77, 80, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1b50 */ 48, 48, 48, 48, 48, 32, 80, 69, 68, 79, 74, 85, 77, 80, 10, 48,
/* 0x1b60 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x1b70 */ 108, 32, 32, 32, 32,100, 32, 32, 85, 80, 88, 49, 72, 69, 65, 68,
/* 0x1b80 */ 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1b90 */ 48, 32, 85, 80, 88, 49, 72, 69, 65, 68, 10, 48, 48, 48, 48, 48,
/* 0x1ba0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32,
/* 0x1bb0 */ 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48,
/* 0x1bc0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,115,116, 97,114,116,
/* 0x1bd0 */ 95,111,102, 95, 99,111,109,112,114,101,115,115,101,100, 10, 48,
/* 0x1be0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x1bf0 */ 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48,
/* 0x1c00 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,115,
/* 0x1c10 */ 116, 97,114,116, 95,111,102, 95,117,110, 99,111,109,112,114,101,
/* 0x1c20 */ 115,115,101,100, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1c30 */ 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85,
/* 0x1c40 */ 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1c50 */ 48, 48, 48, 48, 32,105, 99,111,110, 95,111,102,102,115,101,116,
/* 0x1c60 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1c70 */ 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9,
/* 0x1c80 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1c90 */ 32,105, 99,111,110, 95,100,101,108,116, 97, 10, 48, 48, 48, 48,
/* 0x1ca0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32,
/* 0x1cb0 */ 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48,
/* 0x1cc0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,116,108,115, 95,
/* 0x1cd0 */ 97,100,100,114,101,115,115, 10, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1ce0 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x1cf0 */ 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1d00 */ 48, 48, 48, 48, 48, 48, 48, 32,116,108,115, 95,118, 97,108,117,
/* 0x1d10 */ 101, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1d20 */ 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42,
/* 0x1d30 */ 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1d40 */ 48, 32,102,105,108,116,101,114, 95, 98,117,102,102,101,114, 95,
/* 0x1d50 */ 115,116, 97,114,116, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1d60 */ 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42,
/* 0x1d70 */ 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1d80 */ 48, 48, 48, 48, 48, 32,102,105,108,116,101,114, 95,108,101,110,
/* 0x1d90 */ 103,116,104, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1da0 */ 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78,
/* 0x1db0 */ 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1dc0 */ 48, 48, 48, 32, 99,111,109,112,114,101,115,115,101,100, 95,105,
/* 0x1dd0 */ 109,112,111,114,116,115, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1de0 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x1df0 */ 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1e00 */ 48, 48, 48, 48, 48, 48, 32,115,116, 97,114,116, 95,111,102, 95,
/* 0x1e10 */ 105,109,112,111,114,116,115, 10, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1e20 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x1e30 */ 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1e40 */ 48, 48, 48, 48, 48, 48, 48, 32, 76,111, 97,100, 76,105, 98,114,
/* 0x1e50 */ 97,114,121, 65, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1e60 */ 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85,
/* 0x1e70 */ 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1e80 */ 48, 48, 48, 48, 32,107,101,114,110,101,108, 51, 50, 95,111,114,
/* 0x1e90 */ 100,105,110, 97,108,115, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1ea0 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x1eb0 */ 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1ec0 */ 48, 48, 48, 48, 48, 48, 32, 71,101,116, 80,114,111, 99, 65,100,
/* 0x1ed0 */ 100,114,101,115,115, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1ee0 */ 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42,
/* 0x1ef0 */ 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1f00 */ 48, 48, 48, 48, 48, 32, 69,120,105,116, 80,114,111, 99,101,115,
/* 0x1f10 */ 115, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1f20 */ 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42,
/* 0x1f30 */ 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1f40 */ 48, 32,115,116, 97,114,116, 95,111,102, 95,114,101,108,111, 99,
/* 0x1f50 */ 115, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1f60 */ 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42,
/* 0x1f70 */ 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1f80 */ 48, 32, 86,105,114,116,117, 97,108, 80,114,111,116,101, 99,116,
/* 0x1f90 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1fa0 */ 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9,
/* 0x1fb0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1fc0 */ 32,118,112, 95, 98, 97,115,101, 10, 48, 48, 48, 48, 48, 48, 48,
/* 0x1fd0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32,
/* 0x1fe0 */ 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1ff0 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,118,112, 95,115,105,122,101,
/* 0x2000 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x2010 */ 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9,
/* 0x2020 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x2030 */ 32,115,119,114,105, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x2040 */ 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42,
/* 0x2050 */ 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x2060 */ 48, 48, 48, 48, 48, 32,116,108,115, 95,109,111,100,117,108,101,
/* 0x2070 */ 95, 98, 97,115,101, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x2080 */ 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42,
/* 0x2090 */ 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x20a0 */ 48, 48, 48, 48, 48, 32,111,114,105,103,105,110, 97,108, 95,101,
/* 0x20b0 */ 110,116,114,121, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x20c0 */ 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85,
/* 0x20d0 */ 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x20e0 */ 48, 48, 48, 48, 32,116,108,115, 95, 99, 97,108,108, 98, 97, 99,
/* 0x20f0 */ 107,115, 95,112,116,114, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73,
/* 0x2100 */ 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91,
/* 0x2110 */ 80, 69, 73, 83, 68, 76, 76, 49, 93, 58, 10, 79, 70, 70, 83, 69,
/* 0x2120 */ 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69,
/* 0x2130 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65,
/* 0x2140 */ 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x2150 */ 48, 48, 48, 53, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67,
/* 0x2160 */ 51, 50, 32, 32, 32, 32, 32, 80, 69, 77, 65, 73, 78, 50, 49, 43,
/* 0x2170 */ 48,120,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
/* 0x2180 */ 102, 99, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82,
/* 0x2190 */ 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 80, 69, 77, 65,
/* 0x21a0 */ 73, 78, 48, 49, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32,
/* 0x21b0 */ 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32,
/* 0x21c0 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10,
/* 0x21d0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 54,
/* 0x21e0 */ 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 54, 52, 32, 32, 32, 32,
/* 0x21f0 */ 32, 32, 32,115,116, 97,114,116, 95,111,102, 95, 99,111,109,112,
/* 0x2200 */ 114,101,115,115,101,100, 43, 48,120, 56, 48, 48, 48, 48, 48, 48,
/* 0x2210 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 10, 48, 48, 48, 48, 48, 48,
/* 0x2220 */ 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 32, 82, 95, 88, 56, 54,
/* 0x2230 */ 95, 54, 52, 95, 51, 50, 83, 32, 32, 32, 32, 32, 32,115,116, 97,
/* 0x2240 */ 114,116, 95,111,102, 95,117,110, 99,111,109,112,114,101,115,115,
/* 0x2250 */ 101,100, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82,
/* 0x2260 */ 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 80, 69, 73, 67,
/* 0x2270 */ 79, 78, 83, 49, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32,
/* 0x2280 */ 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32,
/* 0x2290 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10,
/* 0x22a0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 51,
/* 0x22b0 */ 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 83, 32, 32, 32,
/* 0x22c0 */ 32, 32, 32,105, 99,111,110, 95,111,102,102,115,101,116, 10, 10,
/* 0x22d0 */ 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82,
/* 0x22e0 */ 68, 83, 32, 70, 79, 82, 32, 91, 80, 69, 73, 67, 79, 78, 83, 50,
/* 0x22f0 */ 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32,
/* 0x2300 */ 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x2310 */ 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48,
/* 0x2320 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 51, 32, 82, 95, 88,
/* 0x2330 */ 56, 54, 95, 54, 52, 95, 51, 50, 83, 32, 32, 32, 32, 32, 32,105,
/* 0x2340 */ 99,111,110, 95,111,102,102,115,101,116, 10, 48, 48, 48, 48, 48,
/* 0x2350 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 55, 32, 82, 95, 88, 56,
/* 0x2360 */ 54, 95, 54, 52, 95, 49, 54, 32, 32, 32, 32, 32, 32, 32,105, 99,
/* 0x2370 */ 111,110, 95,100,101,108,116, 97, 43, 48,120, 48, 48, 48, 48, 48,
/* 0x2380 */ 48, 48, 48, 48, 48, 48, 48, 56, 48, 48, 48, 10, 10, 82, 69, 76,
/* 0x2390 */ 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32,
/* 0x23a0 */ 70, 79, 82, 32, 91, 80, 69, 84, 76, 83, 72, 65, 75, 93, 58, 10,
/* 0x23b0 */ 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x23c0 */ 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x23d0 */ 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48,
/* 0x23e0 */ 48, 48, 48, 48, 48, 48, 48, 48, 50, 32, 82, 95, 88, 56, 54, 95,
/* 0x23f0 */ 54, 52, 95, 51, 50, 83, 32, 32, 32, 32, 32, 32,116,108,115, 95,
/* 0x2400 */ 97,100,100,114,101,115,115, 10, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x2410 */ 48, 48, 48, 48, 48, 48, 48, 54, 32, 82, 95, 88, 56, 54, 95, 54,
/* 0x2420 */ 52, 95, 51, 50, 32, 32, 32, 32, 32, 32, 32,116,108,115, 95,118,
/* 0x2430 */ 97,108,117,101, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 48, 56,
/* 0x2440 */ 48, 48, 48, 48, 48, 48, 48, 10, 10, 82, 69, 76, 79, 67, 65, 84,
/* 0x2450 */ 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32,
/* 0x2460 */ 91, 78, 82, 86, 50, 69, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32,
/* 0x2470 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32,
/* 0x2480 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85,
/* 0x2490 */ 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x24a0 */ 97, 53, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50,
/* 0x24b0 */ 32, 32, 32, 32, 32, 78, 82, 86, 95, 72, 69, 65, 68, 43, 48,120,
/* 0x24c0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 98,
/* 0x24d0 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53,
/* 0x24e0 */ 50, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32,
/* 0x24f0 */ 32, 32, 32, 32, 80, 69, 77, 65, 73, 78, 49, 48, 43, 48,120,102,
/* 0x2500 */ 102,102,102,102,102,102,102,102,102,102,102,102,102,102, 99, 10,
/* 0x2510 */ 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79,
/* 0x2520 */ 82, 68, 83, 32, 70, 79, 82, 32, 91, 80, 69, 67, 84, 84, 80, 79,
/* 0x2530 */ 83, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32,
/* 0x2540 */ 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32,
/* 0x2550 */ 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48,
/* 0x2560 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 51, 32, 82, 95,
/* 0x2570 */ 88, 56, 54, 95, 54, 52, 95, 51, 50, 83, 32, 32, 32, 32, 32, 32,
/* 0x2580 */ 102,105,108,116,101,114, 95, 98,117,102,102,101,114, 95,115,116,
/* 0x2590 */ 97,114,116, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32,
/* 0x25a0 */ 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 99,116,111,
/* 0x25b0 */ 107, 51, 50, 46, 48, 48, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32,
/* 0x25c0 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32,
/* 0x25d0 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85,
/* 0x25e0 */ 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x25f0 */ 48, 49, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32,
/* 0x2600 */ 32, 32, 32, 32, 32,102,105,108,116,101,114, 95,108,101,110,103,
/* 0x2610 */ 116,104, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82,
/* 0x2620 */ 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 80, 69, 73, 77,
/* 0x2630 */ 80, 79, 82, 84, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32,
/* 0x2640 */ 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32,
/* 0x2650 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10,
/* 0x2660 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 51,
/* 0x2670 */ 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 83, 32, 32, 32,
/* 0x2680 */ 32, 32, 32, 99,111,109,112,114,101,115,115,101,100, 95,105,109,
/* 0x2690 */ 112,111,114,116,115, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x26a0 */ 48, 48, 48, 48, 48, 99, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95,
/* 0x26b0 */ 80, 67, 56, 32, 32, 32, 32, 32, 32,105,109,112,111,114,116,115,
/* 0x26c0 */ 95,100,111,110,101, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x26d0 */ 48, 48, 48, 48, 49, 52, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95,
/* 0x26e0 */ 51, 50, 83, 32, 32, 32, 32, 32, 32,115,116, 97,114,116, 95,111,
/* 0x26f0 */ 102, 95,105,109,112,111,114,116,115, 10, 48, 48, 48, 48, 48, 48,
/* 0x2700 */ 48, 48, 48, 48, 48, 48, 48, 48, 50, 53, 32, 82, 95, 88, 56, 54,
/* 0x2710 */ 95, 54, 52, 95, 51, 50, 83, 32, 32, 32, 32, 32, 32, 76,111, 97,
/* 0x2720 */ 100, 76,105, 98,114, 97,114,121, 65, 10, 10, 82, 69, 76, 79, 67,
/* 0x2730 */ 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79,
/* 0x2740 */ 82, 32, 91, 80, 69, 73, 66, 89, 79, 82, 68, 93, 58, 10, 79, 70,
/* 0x2750 */ 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84,
/* 0x2760 */ 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x2770 */ 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x2780 */ 48, 48, 48, 48, 48, 48, 49, 32, 82, 95, 88, 56, 54, 95, 54, 52,
/* 0x2790 */ 95, 80, 67, 56, 32, 32, 32, 32, 32, 32, 98,121,110, 97,109,101,
/* 0x27a0 */ 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67,
/* 0x27b0 */ 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 80, 69, 75, 51, 50, 79,
/* 0x27c0 */ 82, 68, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32,
/* 0x27d0 */ 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32,
/* 0x27e0 */ 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48,
/* 0x27f0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 99, 32, 82,
/* 0x2800 */ 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 83, 32, 32, 32, 32, 32,
/* 0x2810 */ 32,107,101,114,110,101,108, 51, 50, 95,111,114,100,105,110, 97,
/* 0x2820 */ 108,115, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x2830 */ 48, 49, 49, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 56,
/* 0x2840 */ 32, 32, 32, 32, 32, 32,110,101,120,116, 95,105,109,112, 10, 10,
/* 0x2850 */ 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82,
/* 0x2860 */ 68, 83, 32, 70, 79, 82, 32, 91, 80, 69, 73, 77, 79, 82, 68, 49,
/* 0x2870 */ 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32,
/* 0x2880 */ 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x2890 */ 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48,
/* 0x28a0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 57, 32, 82, 95, 88,
/* 0x28b0 */ 56, 54, 95, 54, 52, 95, 80, 67, 56, 32, 32, 32, 32, 32, 32,102,
/* 0x28c0 */ 105,114,115,116, 95,105,109,112, 10, 10, 82, 69, 76, 79, 67, 65,
/* 0x28d0 */ 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82,
/* 0x28e0 */ 32, 91, 80, 69, 73, 77, 80, 79, 82, 50, 93, 58, 10, 79, 70, 70,
/* 0x28f0 */ 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89,
/* 0x2900 */ 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x2910 */ 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x2920 */ 48, 48, 48, 48, 49, 51, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95,
/* 0x2930 */ 51, 50, 83, 32, 32, 32, 32, 32, 32, 71,101,116, 80,114,111, 99,
/* 0x2940 */ 65,100,100,114,101,115,115, 10, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x2950 */ 48, 48, 48, 48, 48, 48, 50, 56, 32, 82, 95, 88, 56, 54, 95, 54,
/* 0x2960 */ 52, 95, 80, 67, 56, 32, 32, 32, 32, 32, 32,110,101,120,116, 95,
/* 0x2970 */ 102,117,110, 99, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78,
/* 0x2980 */ 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 80, 69,
/* 0x2990 */ 73, 69, 82, 69, 88, 69, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32,
/* 0x29a0 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32,
/* 0x29b0 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85,
/* 0x29c0 */ 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x29d0 */ 48, 54, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 83, 32,
/* 0x29e0 */ 32, 32, 32, 32, 32, 69,120,105,116, 80,114,111, 99,101,115,115,
/* 0x29f0 */ 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67,
/* 0x2a00 */ 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 80, 69, 82, 69, 76, 79,
/* 0x2a10 */ 67, 49, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32,
/* 0x2a20 */ 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32,
/* 0x2a30 */ 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48,
/* 0x2a40 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 51, 32, 82,
/* 0x2a50 */ 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 83, 32, 32, 32, 32, 32,
/* 0x2a60 */ 32,115,116, 97,114,116, 95,111,102, 95,114,101,108,111, 99,115,
/* 0x2a70 */ 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67,
/* 0x2a80 */ 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 80, 69, 68, 69, 80, 72,
/* 0x2a90 */ 65, 75, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32,
/* 0x2aa0 */ 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32,
/* 0x2ab0 */ 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48,
/* 0x2ac0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 51, 32, 82,
/* 0x2ad0 */ 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 83, 32, 32, 32, 32, 32,
/* 0x2ae0 */ 32, 86,105,114,116,117, 97,108, 80,114,111,116,101, 99,116, 10,
/* 0x2af0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 97,
/* 0x2b00 */ 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 83, 32, 32, 32,
/* 0x2b10 */ 32, 32, 32,118,112, 95, 98, 97,115,101, 10, 48, 48, 48, 48, 48,
/* 0x2b20 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,102, 32, 82, 95, 88, 56,
/* 0x2b30 */ 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, 32, 32, 32,118,112,
/* 0x2b40 */ 95,115,105,122,101, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x2b50 */ 56, 48, 48, 48, 48, 48, 48, 48, 10, 48, 48, 48, 48, 48, 48, 48,
/* 0x2b60 */ 48, 48, 48, 48, 48, 48, 48, 50, 99, 32, 82, 95, 88, 56, 54, 95,
/* 0x2b70 */ 54, 52, 95, 51, 50, 83, 32, 32, 32, 32, 32, 32,115,119,114,105,
/* 0x2b80 */ 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67,
/* 0x2b90 */ 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 80, 69, 84, 76, 83, 67,
/* 0x2ba0 */ 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32,
/* 0x2bb0 */ 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x2bc0 */ 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48,
/* 0x2bd0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 51, 32, 82, 95, 88,
/* 0x2be0 */ 56, 54, 95, 54, 52, 95, 51, 50, 83, 32, 32, 32, 32, 32, 32,116,
/* 0x2bf0 */ 108,115, 95,109,111,100,117,108,101, 95, 98, 97,115,101, 10, 48,
/* 0x2c00 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 97, 32,
/* 0x2c10 */ 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 83, 32, 32, 32, 32,
/* 0x2c20 */ 32, 32, 80, 69, 84, 76, 83, 67, 50, 43, 48,120, 48, 48, 48, 48,
/* 0x2c30 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 10, 10, 82, 69,
/* 0x2c40 */ 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83,
/* 0x2c50 */ 32, 70, 79, 82, 32, 91, 80, 69, 68, 79, 74, 85, 77, 80, 93, 58,
/* 0x2c60 */ 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x2c70 */ 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x2c80 */ 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48,
/* 0x2c90 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 32, 82, 95, 88, 56, 54,
/* 0x2ca0 */ 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32,111,114,105,
/* 0x2cb0 */ 103,105,110, 97,108, 95,101,110,116,114,121, 43, 48,120,102,102,
/* 0x2cc0 */ 102,102,102,102,102,102,102,102,102,102,102,102,102, 99, 10, 10,
/* 0x2cd0 */ 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82,
/* 0x2ce0 */ 68, 83, 32, 70, 79, 82, 32, 91, 80, 69, 84, 76, 83, 67, 50, 93,
/* 0x2cf0 */ 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x2d00 */ 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x2d10 */ 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48,
/* 0x2d20 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 32, 82, 95, 88, 56,
/* 0x2d30 */ 54, 95, 54, 52, 95, 54, 52, 32, 32, 32, 32, 32, 32, 32,116,108,
/* 0x2d40 */ 115, 95, 99, 97,108,108, 98, 97, 99,107,115, 95,112,116,114, 43,
/* 0x2d50 */ 48,120, 56, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x2d60 */ 48, 48, 10
};

View File

@ -0,0 +1,431 @@
/*
; AMD64-win64.pep.S -- loader & decompressor for the w64/pe32+ format
;
; This file is part of the UPX executable compressor.
;
; Copyright (C) 1996-2009 Markus Franz Xaver Johannes Oberhumer
; Copyright (C) 1996-2009 Laszlo Molnar
; All Rights Reserved.
;
; UPX and the UCL library are free software; you can redistribute them
; and/or modify them under the terms of the GNU General Public License as
; published by the Free Software Foundation; either version 2 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; see the file COPYING.
; If not, write to the Free Software Foundation, Inc.,
; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
;
; Markus F.X.J. Oberhumer Laszlo Molnar
; <markus@oberhumer.com> <ml1050@users.sourceforge.net>
;
;---------------------------------------------------------------------
;
; 64 bit modifications (C) 2010 Stefan Widmann
;
; Major changes when porting 32 bit code to 64 bit:
; - there are no pusha/popa instructions
; - since we cannot use pusha/popa, we save rbx, rsi, rdi and rbp instead
; - inc <reg> are now being encoded in 2 byte instructions
; - functions use fast call calling convention (parameters are passed in registers)
; rcx, rdx, r8, r9
; - caller is responsible for stack allocation for callee
; - caller cleans up stack
; - caller must keep the stack 16 byte aligned, 32 bytes shadow space on stack
; For more information about the 64 bit calling convention see http://blogs.msdn.com/oldnewthing/archive/2004/01/14/58579.aspx
*/
#include "arch/amd64/macros.S"
#define IMM8(value) byte ptr 0; \
.reloc $ - 1, R_X86_64_8, value
#define IMM16(value) word ptr (1<<15); \
.reloc $ - 2, R_X86_64_16, (1<<15) + value
#define IMM32(value) dword ptr (1<<31); \
.reloc $ - 4, R_X86_64_32, (1<<31) + value
#define IMM64(value) qword ptr (1<<63); \
.reloc $ - 8, R_X86_64_64, (1<<63) + value
#define SHORT(label) $ + 1; .reloc $ - 1, R_X86_64_PC8, label
.intel_syntax noprefix
// =============
// ============= ENTRY POINT
// =============
section PEISDLL1
cmp dl, 1
jnz reloc_end_jmp
section PEMAIN01
//; remember to keep stack aligned!
push rbx
push rsi
push rdi
push rbp
movabs rsi, IMM64(start_of_compressed) //; relocated
lea rdi, [rsi + start_of_uncompressed]
section PEICONS1
incw [rdi + icon_offset]
section PEICONS2
add [rdi + icon_offset], IMM16(icon_delta)
section PETLSHAK
mov [rdi + tls_address], IMM32(tls_value)
section PEMAIN02
push rdi
section PEMAIN03
// =============
// ============= DECOMPRESSION
// =============
.att_syntax
section NRV_HEAD
/* Working registers */
#define off %eax /* XXX: 2GB */
#define len %ecx /* XXX: 2GB */
#define lenq %rcx
#define bits %ebx
#define disp %rbp
xor bits,bits // empty; force refill
xor len,len // create loop invariant
orq $(~0),disp // -1: initial displacement
call setup // push &getbit [TUNED]
ra_setup:
#define jnextb0np jnextb0yp
#define jnextb0yp GETBITp; jnc
#define jnextb1np jnextb1yp
#define jnextb1yp GETBITp; jc
#define GETBITp \
addl bits,bits; jnz 0f; \
movl (%rsi),bits; subq $-4,%rsi; \
adcl bits,bits; movb (%rsi),%dl; \
0:
/* Same, but without prefetch (not useful for length of match.) */
#define jnextb0n jnextb0y
#define jnextb0y GETBIT; jnc
#define jnextb1n jnextb1y
#define jnextb1y GETBIT; jc
#define GETBIT \
addl bits,bits; jnz 0f; \
movl (%rsi),bits; subq $-4,%rsi; \
adcl bits,bits; \
0:
/* rotate next bit into bottom bit of reg */
#define getnextbp(reg) call *%r11; adcl reg,reg
#define getnextb(reg) getnextbp(reg)
getbit:
addl bits,bits; jz refill // Carry= next bit
rep; ret
refill:
movl (%rsi),bits; subq $-4,%rsi // next 32 bits; set Carry
adcl bits,bits // LSB= 1 (CarryIn); CarryOut= next bit
movb (%rsi),%dl // speculate: literal, or bottom 8 bits of offset
rep; ret
copy: // In: len, %rdi, disp; Out: 0==len, %rdi, disp; trashes %rax, %rdx
leaq (%rdi,disp),%rax; cmpl $5,len // <=3 is forced
movb (%rax),%dl; jbe copy1 // <=5 for better branch predict
cmpq $-4,disp; ja copy1 // 4-byte chunks would overlap
subl $4,len // adjust for termination cases
copy4:
movl (%rax),%edx; addq $4, %rax; subl $4,len
movl %edx,(%rdi); leaq 4(%rdi),%rdi; jnc copy4
addl $4,len; movb (%rax),%dl; jz copy0
copy1:
incq %rax; movb %dl,(%rdi); subl $1,len
movb (%rax),%dl
leaq 1(%rdi),%rdi; jnz copy1
copy0:
rep; ret
setup:
cld
pop %r11 // addq $ getbit - ra_setup,%r11 # &getbit
#define NO_METHOD_CHECK
section NRV2E
#include "arch/amd64/nrv2e_d.S"
#if 0 //; FIXME
#include "arch/amd64/nrv2b_d.S"
#include "arch/amd64/nrv2d_d.S"
#include "arch/amd64/nrv2e_d.S"
#include "arch/amd64/lzma_d.S"
#endif
.intel_syntax noprefix
// =============
section PEMAIN10
eof:
pop rsi // load vaddr
// =============
// ============= CALLTRICK
// =============
section PECTTPOS
lea rdi, [rsi + filter_buffer_start]
section PECTTNUL
mov rdi, rsi
#if 0 //; FIXME use amd_bxx.S
cjt32 esi
#endif
section ctok32.00
mov ecx, offset filter_length
#if 0 //; FIXME
ctok32 esi, (offset filter_cto)
#endif
// =============
// ============= IMPORTS
// =============
section PEIMPORT
lea rdi, [rsi + compressed_imports]
next_dll:
mov eax, [rdi]
or eax, eax
jz SHORT(imports_done)
mov ebx, [rdi + 4] // iat
lea rcx, [rax + rsi + start_of_imports]
add rbx, rsi
add rdi, 8
sub rsp, 0x28
call [rsi + LoadLibraryA]
add rsp, 0x28
xchg rax, rbp
next_func:
mov al, [rdi]
inc rdi
or al, al
jz next_dll
section PEIBYORD
jns SHORT(byname)
section PEK32ORD
jpe not_kernel32
mov eax, [rdi]
add rdi, 4
mov rax, [rax + rsi + kernel32_ordinals]
jmp SHORT(next_imp)
not_kernel32:
section PEIMORD1
movzxw rdx, word ptr [rdi]
add rdi, 2
jmp SHORT(first_imp)
byname:
section PEIMPOR2
mov rcx, rdi // something > 0
mov rdx, rdi
dec eax
repne
scasb
first_imp:
mov rcx, rbp
sub rsp, 0x28
call [rsi + GetProcAddress]
add rsp, 0x28
or rax, rax
jz imp_failed
next_imp:
mov [rbx], rax
add rbx, 8
jmp SHORT(next_func)
imp_failed:
section PEIERDLL
pop rbp
pop rdi
pop rsi
pop rbx
xor eax, eax
ret
section PEIEREXE
// rcx contains garbage -> garbage return code
sub rsp, 0x28
call [rsi + ExitProcess]
section PEIMDONE
imports_done:
// =============
// ============= RELOCATION
// =============
section PERELOC1
lea rdi, [rsi + start_of_relocs]
section PERELOC2
add rdi, 4
section PERELOC3
lea rbx, [rsi - 4]
#if 0 //; FIXME
reloc64 rdi, rbx, rsi
#endif
// =============
// FIXME: depends on that in PERELOC1 edi is set!!
section PERLOHI0
#if 0
xchg edi, esi
lea ecx, [rdi + reloc_delt]
#endif
section PERELLO0
#if 0
.byte 0xA9 //test eax, XXXXXXXX
rello0:
add [rdi + rax], cx //why do we just use cx instead of ecx?
lodsd
or eax, eax
jnz rello0
#endif
// =============
section PERELHI0
#if 0
shr ecx, 16
.byte 0xA9 //test eax, XXXXXXXX
relhi0:
add [rdi + rax], cx //why do we just use cx instead of ecx?
lodsd
or eax, eax
jnz relhi0
#endif
// =============
section PEDEPHAK
mov rbp, [rsi + VirtualProtect]
lea rdi, [rsi + vp_base]
mov ebx, IMM32(vp_size) // 0x1000 or 0x2000
push rax // provide 8 bytes stack
mov r9, rsp
mov r8d, 4 // PAGE_READWRITE
mov rdx, rbx // size
mov rcx, rdi // address
sub rsp, 0x20
call rbp // VirtualProtect
lea rax, [rdi + swri]
andb [rax], 0x7f // marks UPX0 non writeable
andb [rax + 0x28], 0x7f // marks UPX1 non writeable
lea r9, [rsp + 0x20]
movq r8, [r9] // original protection
mov rdx, rbx
mov rcx, rdi
call rbp
add rsp, 0x28
// =============
section PETLSC
lea rcx, [rsi + tls_module_base] //;load module base to rcx
lea rdi, [rcx + tls_handler_start + 1] //;load offset of handler
//;remove jump from TLS handler entry (overwrite displacement)
xor eax, eax
stosb
//;emulate callbacks like PE loader would have done
mov r8, rax //;0 - reserved
mov edx, 1 //;DLL_PROCESS_ATTACH
push rax //;align stack
call rdi //;contains ptr to callback handler
pop rax
// =============
section PEMAIN20
pop rbp
pop rdi
pop rsi
pop rbx
// clear the dirty stack
.macro clearstack128 tmp_reg
.local loop
lea \tmp_reg, [rsp - 128]
loop:
push 0
cmp rsp, \tmp_reg
jnz loop
sub rsp, -128
.endm
section CLEARSTACK
clearstack128 rax
section PEMAIN21
reloc_end_jmp:
section PERETURN
mov eax, 1
ret
section PEDOJUMP
jmp original_entry
// =============
section PETLSC2
//;TLS_CALLBACK(hModule, reason, reserved)
tls_handler_start:
jmp end_of_tls_handler //;this jump is patched to EB 00 (jmp $+2) by stub
push rsi
movabs rsi, IMM64(tls_callbacks_ptr) //;must be relocated
cld //;you never know, this code gets called by the PE loader
walk_tlsc_chain2:
lodsq
test rax, rax
jz done_callbacks
push rcx
push rdx
push r8
sub rsp, 0x28
call rax
add rsp, 0x28
pop r8
pop rdx
pop rcx
jmp walk_tlsc_chain2
done_callbacks:
pop rsi
end_of_tls_handler:
ret
// =============
// ============= CUT HERE
// =============
#include "include/header.S"
// vi:ts=8:et:nowrap

View File

@ -29,7 +29,11 @@
<jreiser@users.sourceforge.net>
*/
#ifndef NO_METHOD_CHECK
cmpb $ M_NRV2E_LE32,methb; je top_n2e; jmp not_n2e
#else
jmp top_n2e
#endif
lit_n2e:
incq %rsi; movb %dl,(%rdi)

View File

@ -0,0 +1,193 @@
file format elf64-x86-64
Sections:
Idx Name Size VMA LMA File off Algn Flags
0 PEISDLL1 00000009 0000000000000000 0000000000000000 00000040 2**0 CONTENTS, RELOC, READONLY
1 PEMAIN01 00000015 0000000000000000 0000000000000000 00000049 2**0 CONTENTS, RELOC, READONLY
2 PEICONS1 00000007 0000000000000000 0000000000000000 0000005e 2**0 CONTENTS, RELOC, READONLY
3 PEICONS2 00000009 0000000000000000 0000000000000000 00000065 2**0 CONTENTS, RELOC, READONLY
4 PETLSHAK 0000000a 0000000000000000 0000000000000000 0000006e 2**0 CONTENTS, RELOC, READONLY
5 PEMAIN02 00000001 0000000000000000 0000000000000000 00000078 2**0 CONTENTS, READONLY
6 PEMAIN03 00000000 0000000000000000 0000000000000000 00000079 2**0 CONTENTS, READONLY
7 NRV_HEAD 00000060 0000000000000000 0000000000000000 00000079 2**0 CONTENTS, READONLY
8 NRV2E 000000ae 0000000000000000 0000000000000000 000000d9 2**0 CONTENTS, RELOC, READONLY
9 PEMAIN10 00000001 0000000000000000 0000000000000000 00000187 2**0 CONTENTS, READONLY
10 PECTTPOS 00000007 0000000000000000 0000000000000000 00000188 2**0 CONTENTS, RELOC, READONLY
11 PECTTNUL 00000003 0000000000000000 0000000000000000 0000018f 2**0 CONTENTS, READONLY
12 ctok32.00 00000005 0000000000000000 0000000000000000 00000192 2**0 CONTENTS, RELOC, READONLY
13 PEIMPORT 00000038 0000000000000000 0000000000000000 00000197 2**0 CONTENTS, RELOC, READONLY
14 PEIBYORD 00000002 0000000000000000 0000000000000000 000001cf 2**0 CONTENTS, RELOC, READONLY
15 PEK32ORD 00000012 0000000000000000 0000000000000000 000001d1 2**0 CONTENTS, RELOC, READONLY
16 PEIMORD1 0000000a 0000000000000000 0000000000000000 000001e3 2**0 CONTENTS, RELOC, READONLY
17 PEIMPOR2 00000029 0000000000000000 0000000000000000 000001ed 2**0 CONTENTS, RELOC, READONLY
18 PEIERDLL 00000007 0000000000000000 0000000000000000 00000216 2**0 CONTENTS, READONLY
19 PEIEREXE 0000000a 0000000000000000 0000000000000000 0000021d 2**0 CONTENTS, RELOC, READONLY
20 PEIMDONE 00000000 0000000000000000 0000000000000000 00000227 2**0 CONTENTS, READONLY
21 PERELOC1 00000007 0000000000000000 0000000000000000 00000227 2**0 CONTENTS, RELOC, READONLY
22 PERELOC2 00000004 0000000000000000 0000000000000000 0000022e 2**0 CONTENTS, READONLY
23 PERELOC3 00000004 0000000000000000 0000000000000000 00000232 2**0 CONTENTS, READONLY
24 PERLOHI0 00000000 0000000000000000 0000000000000000 00000236 2**0 CONTENTS, READONLY
25 PERELLO0 00000000 0000000000000000 0000000000000000 00000236 2**0 CONTENTS, READONLY
26 PERELHI0 00000000 0000000000000000 0000000000000000 00000236 2**0 CONTENTS, READONLY
27 PEDEPHAK 0000004b 0000000000000000 0000000000000000 00000236 2**0 CONTENTS, RELOC, READONLY
28 PETLSC 0000001d 0000000000000000 0000000000000000 00000281 2**0 CONTENTS, RELOC, READONLY
29 PEMAIN20 00000004 0000000000000000 0000000000000000 0000029e 2**0 CONTENTS, READONLY
30 CLEARSTACK 00000010 0000000000000000 0000000000000000 000002a2 2**0 CONTENTS, READONLY
31 PEMAIN21 00000000 0000000000000000 0000000000000000 000002b2 2**0 CONTENTS, READONLY
32 PERETURN 00000006 0000000000000000 0000000000000000 000002b2 2**0 CONTENTS, READONLY
33 PEDOJUMP 00000005 0000000000000000 0000000000000000 000002b8 2**0 CONTENTS, RELOC, READONLY
34 PETLSC2 0000002b 0000000000000000 0000000000000000 000002bd 2**0 CONTENTS, RELOC, READONLY
35 UPX1HEAD 00000020 0000000000000000 0000000000000000 000002e8 2**0 CONTENTS, READONLY
SYMBOL TABLE:
0000000000000000 l d NRV_HEAD 0000000000000000 NRV_HEAD
0000000000000000 l d PEMAIN10 0000000000000000 PEMAIN10
0000000000000000 l PEIMDONE 0000000000000000 imports_done
000000000000002f l PEIMPORT 0000000000000000 next_func
000000000000000a l PEIMORD1 0000000000000000 byname
0000000000000020 l PEIMPOR2 0000000000000000 next_imp
000000000000000a l PEIMPOR2 0000000000000000 first_imp
0000000000000000 l d PEMAIN21 0000000000000000 PEMAIN21
0000000000000000 l d PETLSC2 0000000000000000 PETLSC2
0000000000000000 l d PEISDLL1 0000000000000000 PEISDLL1
0000000000000000 l d PEMAIN01 0000000000000000 PEMAIN01
0000000000000000 l d PEICONS1 0000000000000000 PEICONS1
0000000000000000 l d PEICONS2 0000000000000000 PEICONS2
0000000000000000 l d PETLSHAK 0000000000000000 PETLSHAK
0000000000000000 l d PEMAIN02 0000000000000000 PEMAIN02
0000000000000000 l d PEMAIN03 0000000000000000 PEMAIN03
0000000000000000 l d NRV2E 0000000000000000 NRV2E
0000000000000000 l d PECTTPOS 0000000000000000 PECTTPOS
0000000000000000 l d PECTTNUL 0000000000000000 PECTTNUL
0000000000000000 l d ctok32.00 0000000000000000 ctok32.00
0000000000000000 l d PEIMPORT 0000000000000000 PEIMPORT
0000000000000000 l d PEIBYORD 0000000000000000 PEIBYORD
0000000000000000 l d PEK32ORD 0000000000000000 PEK32ORD
0000000000000000 l d PEIMORD1 0000000000000000 PEIMORD1
0000000000000000 l d PEIMPOR2 0000000000000000 PEIMPOR2
0000000000000000 l d PEIERDLL 0000000000000000 PEIERDLL
0000000000000000 l d PEIEREXE 0000000000000000 PEIEREXE
0000000000000000 l d PEIMDONE 0000000000000000 PEIMDONE
0000000000000000 l d PERELOC1 0000000000000000 PERELOC1
0000000000000000 l d PERELOC2 0000000000000000 PERELOC2
0000000000000000 l d PERELOC3 0000000000000000 PERELOC3
0000000000000000 l d PERLOHI0 0000000000000000 PERLOHI0
0000000000000000 l d PERELLO0 0000000000000000 PERELLO0
0000000000000000 l d PERELHI0 0000000000000000 PERELHI0
0000000000000000 l d PEDEPHAK 0000000000000000 PEDEPHAK
0000000000000000 l d PETLSC 0000000000000000 PETLSC
0000000000000000 l d PEMAIN20 0000000000000000 PEMAIN20
0000000000000000 l d CLEARSTACK 0000000000000000 CLEARSTACK
0000000000000000 l d PERETURN 0000000000000000 PERETURN
0000000000000000 l d PEDOJUMP 0000000000000000 PEDOJUMP
0000000000000000 l d UPX1HEAD 0000000000000000 UPX1HEAD
0000000000000000 *UND* 0000000000000000 start_of_compressed
0000000000000000 *UND* 0000000000000000 start_of_uncompressed
0000000000000000 *UND* 0000000000000000 icon_offset
0000000000000000 *UND* 0000000000000000 icon_delta
0000000000000000 *UND* 0000000000000000 tls_address
0000000000000000 *UND* 0000000000000000 tls_value
0000000000000000 *UND* 0000000000000000 filter_buffer_start
0000000000000000 *UND* 0000000000000000 filter_length
0000000000000000 *UND* 0000000000000000 compressed_imports
0000000000000000 *UND* 0000000000000000 start_of_imports
0000000000000000 *UND* 0000000000000000 LoadLibraryA
0000000000000000 *UND* 0000000000000000 kernel32_ordinals
0000000000000000 *UND* 0000000000000000 GetProcAddress
0000000000000000 *UND* 0000000000000000 ExitProcess
0000000000000000 *UND* 0000000000000000 start_of_relocs
0000000000000000 *UND* 0000000000000000 VirtualProtect
0000000000000000 *UND* 0000000000000000 vp_base
0000000000000000 *UND* 0000000000000000 vp_size
0000000000000000 *UND* 0000000000000000 swri
0000000000000000 *UND* 0000000000000000 tls_module_base
0000000000000000 *UND* 0000000000000000 original_entry
0000000000000000 *UND* 0000000000000000 tls_callbacks_ptr
RELOCATION RECORDS FOR [PEISDLL1]:
OFFSET TYPE VALUE
0000000000000005 R_X86_64_PC32 PEMAIN21+0xfffffffffffffffc
RELOCATION RECORDS FOR [PEMAIN01]:
OFFSET TYPE VALUE
0000000000000006 R_X86_64_64 start_of_compressed+0x8000000000000000
0000000000000011 R_X86_64_32S start_of_uncompressed
RELOCATION RECORDS FOR [PEICONS1]:
OFFSET TYPE VALUE
0000000000000003 R_X86_64_32S icon_offset
RELOCATION RECORDS FOR [PEICONS2]:
OFFSET TYPE VALUE
0000000000000003 R_X86_64_32S icon_offset
0000000000000007 R_X86_64_16 icon_delta+0x0000000000008000
RELOCATION RECORDS FOR [PETLSHAK]:
OFFSET TYPE VALUE
0000000000000002 R_X86_64_32S tls_address
0000000000000006 R_X86_64_32 tls_value+0x0000000080000000
RELOCATION RECORDS FOR [NRV2E]:
OFFSET TYPE VALUE
00000000000000a5 R_X86_64_PC32 NRV_HEAD+0x000000000000001b
0000000000000052 R_X86_64_PC32 PEMAIN10+0xfffffffffffffffc
RELOCATION RECORDS FOR [PECTTPOS]:
OFFSET TYPE VALUE
0000000000000003 R_X86_64_32S filter_buffer_start
RELOCATION RECORDS FOR [ctok32.00]:
OFFSET TYPE VALUE
0000000000000001 R_X86_64_32 filter_length
RELOCATION RECORDS FOR [PEIMPORT]:
OFFSET TYPE VALUE
0000000000000003 R_X86_64_32S compressed_imports
000000000000000c R_X86_64_PC8 imports_done
0000000000000014 R_X86_64_32S start_of_imports
0000000000000025 R_X86_64_32S LoadLibraryA
RELOCATION RECORDS FOR [PEIBYORD]:
OFFSET TYPE VALUE
0000000000000001 R_X86_64_PC8 byname
RELOCATION RECORDS FOR [PEK32ORD]:
OFFSET TYPE VALUE
000000000000000c R_X86_64_32S kernel32_ordinals
0000000000000011 R_X86_64_PC8 next_imp
RELOCATION RECORDS FOR [PEIMORD1]:
OFFSET TYPE VALUE
0000000000000009 R_X86_64_PC8 first_imp
RELOCATION RECORDS FOR [PEIMPOR2]:
OFFSET TYPE VALUE
0000000000000013 R_X86_64_32S GetProcAddress
0000000000000028 R_X86_64_PC8 next_func
RELOCATION RECORDS FOR [PEIEREXE]:
OFFSET TYPE VALUE
0000000000000006 R_X86_64_32S ExitProcess
RELOCATION RECORDS FOR [PERELOC1]:
OFFSET TYPE VALUE
0000000000000003 R_X86_64_32S start_of_relocs
RELOCATION RECORDS FOR [PEDEPHAK]:
OFFSET TYPE VALUE
0000000000000003 R_X86_64_32S VirtualProtect
000000000000000a R_X86_64_32S vp_base
000000000000000f R_X86_64_32 vp_size+0x0000000080000000
000000000000002c R_X86_64_32S swri
RELOCATION RECORDS FOR [PETLSC]:
OFFSET TYPE VALUE
0000000000000003 R_X86_64_32S tls_module_base
000000000000000a R_X86_64_32S PETLSC2+0x0000000000000001
RELOCATION RECORDS FOR [PEDOJUMP]:
OFFSET TYPE VALUE
0000000000000001 R_X86_64_PC32 original_entry+0xfffffffffffffffc
RELOCATION RECORDS FOR [PETLSC2]:
OFFSET TYPE VALUE
0000000000000005 R_X86_64_64 tls_callbacks_ptr+0x8000000000000000