This program is for mbed-Geiger counter system. It use OLED module, GPS module (with RTC), TextLCD, SD FileSystem and some Interrupt pin.
Revision 0:97f8ed953c0d, committed 2011-07-02
- Comitter:
- y_notsu
- Date:
- Sat Jul 02 22:05:27 2011 +0000
- Commit message:
- rev.0.0
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/FATFileSystem.lib Sat Jul 02 22:05:27 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_unsupported/code/fatfilesystem/ \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MARMEX_OB_oled.h Sat Jul 02 22:05:27 2011 +0000 @@ -0,0 +1,485 @@ +/** MARMEX_OB OLED screen drawing library + * + * @class MARMEX_OB_oled + * @author tedd + * @version 0.51 + * @date 08-Apr-2011 + * + * Released under the MIT License: http://mbed.org/license/mit + * + * MARMEX_OB_oled OLED screen drawing library for mbed + * This code has been written based on sample code and advises + * from Ochiai-san (Marutsu-Elec). Thank you! + * + * SPI mode: + * 9bit or 8bit SPI mode can be selected by disabling/enabling "#define MARMEX_OB_SPI_8BIT_MODE". + * See source code in this (MARMEX_OB_oled.h) file. + */ + +#ifndef MBED_MARMEX_OB_OLED +#define MBED_MARMEX_OB_OLED + +#include "mbed.h" +#include "NokiaLCD.h" + +/** @def MARMEX_OB_SPI_8BIT_MODE + * + * MARMEX_OB_oled_oled OLED screen SPI access length setting + * Enabling "MARMEX_OB_SPI_8BIT_MODE" makes 9bit SPI access by 8bit * 2 times. + * This may be useful if other 8bit access SPI device on same SPI bus. + * + * If disabled (just coment out the "#define MARMEX_OB_SPI_8BIT_MODE"), SPI access willbe done by 9 bit format. + */ +#define MARMEX_OB_SPI_8BIT_MODE + +/** MARMEX_OB_oled OLED screen drawing class + * + * This is a driver code for MARMEX_OB_oled board OLED screen. + * This class inherits NokiaLCD class of mbed.org. + * To use this class, import the NokiaLCD class from here.. + * http://mbed.org/users/simon/libraries/NokiaLCD/ + * + * Example: + * @code + * #include "mbed.h" + * #include "MARMEX_OB_oled.h" + * + * // oled1 is for MARMEX_OB_oled board on MAPLE slot 1 + * // oled1 is for MARMEX_OB_oled board on MAPLE slot 2 + * + * MARMEX_OB_oled oled1( p5, p7, p8, p30, p11 ); // mosi, sclk, cs, rst, power_control + * //MARMEX_OB_oled oled2( p5, p7, p26, p21, p17 ); // mosi, sclk, cs, rst, power_control + * + * + * int main() { + * oled1.background( 0x000000 ); + * oled1.cls(); + * + * int colorbar_width = MARMEX_OB_oled::WIDTH / 8; + * + * for ( int i = 0; i < 8; i++ ) + * oled1.fill( colorbar_width * i, 0, colorbar_width, MARMEX_OB_oled::HEIGHT, ((i & 0x4) ? 0xFF0000 : 0x000000) | ((i & 0x2) ? 0x00FF00 : 0x000000) | ((i & 0x1) ? 0x0000FF : 0x000000) ); + * + * oled1.fill( 50, 50, 64, 64, 0xCCCCCC );; + * + * oled1.locate( 0, 3 ); + * oled1.printf( "Hello World!" ); + * oled1.locate( 0, 4 ); + * oled1.printf( "SPI = %s", MERMEX_OB_SPI_MODE_STR ); + * + * for (int i = 0; i < MARMEX_OB_oled::WIDTH; i++ ) { + * oled1.pixel( i, 80 + sin( (float)i / 5.0 ) * 10, 0x000000 ); + * } + * } * @endcode + */ + +class MARMEX_OB_oled : public NokiaLCD { + +public: + + /** General parameters for MARMEX_OB_oled */ + enum { + ROWS = 15, /**< # of rows (lines) for displaying characters */ + COLS = 16, /**< # of columns (width) for displaying characters */ + WIDTH = 128, /**< screen width [pixels] */ + HEIGHT = 128, /**< screen height [pixels] */ + SPI_FREQUENCY = 20000000 /**< SPI (sclk) SPI_FREQUENCY */ + }; + + /** Constants for power() function */ + enum { + OFF = 0, /**< : to turning-OFF */ + ON /**< : to turning-ON */ + }; + + /** Create a MARMEX_OB_oled object connected to specified SPI and DigitalOut pins + * + * @param mosi SPI-MOSI pin (for MAPLE board, use p5) + * @param sclk SPI-SCLK pin (for MAPLE board, use p8) + * @param cs chip select signal (for MAPLE board, use p8(slot1), p26(slot2)) + * @param rst reset signal (for MAPLE board, use p30(slot1), p21(slot2)) + * @param power_pin backlight power control signal (for MAPLE board, use p11(slot1), p17(slot2)) + * + * Example of MARMEX_OB_oled on MAPLE board: + * @code + * #include "mbed.h" + * #include "MARMEX_OB_oled.h" + * + * MARMEX_OB_oled oled_on_maple_slot1( p5, p7, p8, p30, p11 ); // mosi, sclk, cs, rst, power_control + * MARMEX_OB_oled oled_on_maple_slot2( p5, p7, p26, p21, p17 ); // mosi, sclk, cs, rst, power_control + * ... + * .. + * @endcode + */ + + MARMEX_OB_oled( PinName mosi, PinName sclk, PinName cs, PinName rst, PinName power_pin ) : NokiaLCD( mosi, sclk, cs, rst, NokiaLCD::LCD6100 ), _power_pin( power_pin ) { + power( ON ); + reset(); + } + +#if DOXYGEN_ONLY + /** Write a character to the LCD + * + * @param c The character to write to the display + */ + int putc( int c ); + + /** Write a formated string to the LCD + * + * @param format A printf-style format string, followed by the + * variables to use in formating the string. + * + * !!! 16th character in the string will be disappeared + * !!! This problem is due to difference of screen size NokiaLCD library and its internal mechanism... + */ + int printf( const char* format, ... ); + + /** Set the foreground colour + * + * @param c 24-bit colour + */ + void foreground(int c); + + /** Set the background colour + * + * @param c 24-bit colour + */ + void background(int c); + +#endif + + /** reset MARMEX_OB_oled + * + * Executes hardware reset and initialize. + * See MARMEX_OB_oled manual for the initialization sequence and values + * For gamma correction table, using math function to make the code simple + */ + + void reset( void ) { + +#define GAMMA_LUT_SIZE 63 + unsigned char gamma_LUT[ GAMMA_LUT_SIZE ]; + + for ( int i = 0; i < GAMMA_LUT_SIZE; i++ ) + gamma_LUT[ i ] = (unsigned char)(powf( ((float)i / 62.0), (1.0 / 0.58) ) * 178.0 + 2.0); + + // setup the SPI interface and bring display out of reset + _cs = 1; + _rst = 0; +#ifdef MARMEX_OB_SPI_8BIT_MODE + _spi.format( 8 ); +#else + _spi.format( 9 ); +#endif + + _spi.frequency( SPI_FREQUENCY ); + wait_ms( 1 ); + _rst = 1; + wait_ms( 1 ); + + _cs = 0; + + command( SET_DISPLAY_MODE_ALL_OFF ); + command( SET_COMMAND_LOCK ); + data( 0x12 ); + + command( SET_COMMAND_LOCK ); + data( 0xb1 ); + + command( SET_SLEEP_MODE_ON ); + + command( FRONT_CLOCK_DRIVER_OSC_FREQ ); + data( 0xF1 ); + + command( SET_MUX_RATIO ); + data( 0x7F ); + + command( SET_DISPAY_OFFSET ); + data( 0x00 ); + + command( SET_DISPAY_START_LINE ); + data( 0x00 ); + + command( SET_REMAP_COLOR_DEPTH ); + data( 0x74 ); + + command( SET_GPIO ); + data( 0x00); + + command( FUNCTION_SELECTION ); + data( 0x01 ); + + command( SET_SEGMENT_LOW_VOLTAGE ); + data( 0xA0 ); + data( 0xB5 ); + data( 0x55 ); + + command( SET_CONTRAST_CURRENT_FOR_COLOR_ABC ); + data( 0xC8 ); + data( 0x80 ); + data( 0xC8 ); + + command( MASTER_CONTRAST_CURRENT_CONTROL ); + data( 0x0F ); + + command( LOOKUP_TABLE_FOR_GRAYSCALE_PULSE_WIDTH ); + for ( int i = 0; i < GAMMA_LUT_SIZE; i++ ) + data( gamma_LUT[ i ] ); + + command( SET_RESET_PRECHARGE_PERIOD ); + data( 0x32 ); + + command( ENHANCE_DRIVING_SCHEME_CAPABILITY ); + data( 0x04 ); + data( 0x00 ); + data( 0x00 ); + + command( SET_PRECHARGE_VOLTAGE ); + data( 0x17 ); + + command( SET_SECOND_PRECHARGE_VOLTAGE ); + data( 0x01 ); + + command( SET_VCOMH_VOLTAGE ); + data( 0x05 ); + + command( SET_DISPLAY_MODE_RESET ); + +#if 0 + command( SET_COLUMN_ADDRESS ); + data( 0x00 ); + data( 0x7F ); + + command( SET_ROW_ADDRESS ); + data( 0x00 ); + data( 0x7F); + + command( WRITE_RAM_COMMAND ); + for ( int i = 0; i < WIDTH * HEIGHT; i++ ) + data( 0x00 ); +#endif + _cs = 1; + + cls(); + wait_ms( 200 ); + + command( SET_SLEEP_MODE_OFF ); + } + + /** Clear the screen and locate to 0,0 */ + + void cls( void ) { + fill( 0, 0, WIDTH , HEIGHT, _background ); + _row = 0; + _column = 0; + } + + /** Set a pixel on te screen + * + * @param x horizontal position from left + * @param y vertical position from top + * @param colour 24-bit colour in format 0x00RRGGBB + */ + + virtual void pixel( int x, int y, int colour ) { + _cs = 0; + _window( x, y, 1, 1 ); + _putp( colour ); + _cs = 1; + } + + /** Fill an area of the screen + * + * @param x horizontal position from left + * @param y vertical position from top + * @param width width in pixels + * @param height height in pixels + * @param colour 24-bit colour in format 0x00RRGGBB + */ + + void fill( int x, int y, int width, int height, int colour ) { + _cs = 0; + _window( x, y, width, height ); + + for (int i = 0; i < width * height; i++ ) { + _putp( colour ); + } + + _window( 0, 0, WIDTH, HEIGHT ); + _cs = 1; + } + + void blit( int x, int y, int width, int height, const int* colour ) { + _cs = 0; + _window( x, y, width, height ); + + for (int i = 0; i < width * height; i++ ) { + _putp( colour[i] ); + } + _window( 0, 0, WIDTH, HEIGHT ); + _cs = 1; + } + + void bitblit( int x, int y, int width, int height, const char* bitstream ) { + _cs = 0; + _window( x, y, width, height ); + + for (int i = 0; i < height * width; i++ ) { + int byte = i / 8; + int bit = i % 8; + int colour = ((bitstream[ byte ] << bit) & 0x80) ? _foreground : _background; + _putp( colour ); + } + _window( 0, 0, _width, _height ); + _cs = 1; + } + + /** Screen width + * + * @return screen width [pixel] + */ + int width() { + return WIDTH; + } + + /** Screen height + * + * @return screen height [pixel] + */ + int height() { + return HEIGHT; + } + /** Columns + * + * @return screen columns + */ + int columns() { + return COLS; + } + + /** Rows + * + * @return screen rows + */ + int rows() { + return ROWS; + } + + /** Power switch for OLED backlight + * + * @param sw argument can be MARMEX_OB_oled::ON or MARMEX_OB_oled::OFF + */ + + void power( unsigned char sw ) { + _power_pin = sw; + } + +private: + /** Command list for the OLED controller */ + enum { + SET_DISPLAY_MODE_ALL_OFF = 0xA4, + SET_COMMAND_LOCK = 0xFD, + SET_SLEEP_MODE_ON = 0xAE, + FRONT_CLOCK_DRIVER_OSC_FREQ = 0xB3, + SET_MUX_RATIO = 0xCA, + SET_DISPAY_OFFSET = 0xA2, + SET_DISPAY_START_LINE = 0xA1, + SET_REMAP_COLOR_DEPTH = 0xA0, + SET_GPIO = 0xB5, + FUNCTION_SELECTION = 0xAB, + SET_SEGMENT_LOW_VOLTAGE = 0xB4, + SET_CONTRAST_CURRENT_FOR_COLOR_ABC = 0xC1, + MASTER_CONTRAST_CURRENT_CONTROL = 0xC7, + LOOKUP_TABLE_FOR_GRAYSCALE_PULSE_WIDTH = 0xB8, + SET_RESET_PRECHARGE_PERIOD = 0xB1, + ENHANCE_DRIVING_SCHEME_CAPABILITY = 0xB2, + SET_PRECHARGE_VOLTAGE = 0xBB, + SET_SECOND_PRECHARGE_VOLTAGE = 0xB6, + SET_VCOMH_VOLTAGE = 0xBE, + SET_DISPLAY_MODE_RESET = 0xA6, + SET_COLUMN_ADDRESS = 0x15, + SET_ROW_ADDRESS = 0x75, + WRITE_RAM_COMMAND = 0x5C, + SET_SLEEP_MODE_OFF = 0xAF + }; + +#ifdef MARMEX_OB_SPI_8BIT_MODE + void command( int value ) { + int tmp = value & 0x00ff; + _cs = 0; + _spi.write( tmp >> 1 ); + _spi.write( tmp << 7 ); + _cs = 1; + } + + void data( int value ) { + int tmp = value & 0x00ff; + tmp |= 0x0100; + _cs = 0; + _spi.write( tmp >> 1 ); + _spi.write( tmp << 7 ); + _cs = 1; + } +#else + void command( int value ) { + _cs = 0; + _spi.write( value & 0xFF ); + _cs = 1; + } + + void data(int value) { + _cs = 0; + _spi.write( value | 0x100 ); + _cs = 1; + } +#endif + + virtual void _window( int x, int y, int width, int height ) { + int x1 = x + 0; + int y1 = y + 0; + int x2 = x1 + width - 1; + int y2 = y1 + height - 1; + + command( SET_COLUMN_ADDRESS ); + data( x1 ); + data( x2 ); + command( SET_ROW_ADDRESS ); + data( y1 ); + data( y2 ); + command( WRITE_RAM_COMMAND ); + } + + void window( int x, int y, int width, int height ) { + _cs = 0; + _window( x, y, width, height ); + _cs = 1; + } + + virtual void _putp( int colour ) { + int cnv = 0; + + cnv = (colour >> 8) & 0xf800; + cnv |= (colour >> 5) & 0x07e0; + cnv |= (colour >> 3) & 0x001f; + + data( cnv >> 8); + data( cnv ); + } + + DigitalOut _power_pin; +} +; + +#ifdef MARMEX_OB_SPI_8BIT_MODE +#define MERMEX_OB_SPI_MODE_STR "8bit mode" +#else +#define MERMEX_OB_SPI_MODE_STR "9bit mode" +#endif +#endif // MBED_MARMEX_OB_OLED + +/* + * history: + * 0.5 (2011-Apr-07) : initial published version + * 0.51 (2011-Apr-08) : a. "virtual" had been added on "_putp()" function definition to surpress warning when compiling (is this correct way?) + * b. sample code (for Doxygen) is changed from new "main.cpp (ver 0.51)" + */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/NokiaLCD/NokiaLCD.cpp Sat Jul 02 22:05:27 2011 +0000 @@ -0,0 +1,438 @@ +/* mbed Nokia LCD Library + * Copyright (c) 2007-2010, sford + */ + +#include "NokiaLCD.h" + +#include "mbed.h" + +#define NOKIALCD_ROWS 16 +#define NOKIALCD_COLS 16 +#define NOKIALCD_WIDTH 130 +#define NOKIALCD_HEIGHT 130 +#define NOKIALCD_FREQUENCY 20000000 + +NokiaLCD::NokiaLCD(PinName mosi, PinName sclk, PinName cs, PinName rst, LCDType type) + : _spi(mosi, NC, sclk) + , _rst(rst) + , _cs(cs) { + + _type = type; + + _row = 0; + _column = 0; + _foreground = 0x00FFFFFF; + _background = 0x00000000; + + reset(); +} + +void NokiaLCD::reset() { + + // setup the SPI interface and bring display out of reset + _cs = 1; + _rst = 0; + _spi.format(9); + _spi.frequency(NOKIALCD_FREQUENCY); + wait_ms(1); + _rst = 1; + wait_ms(1); + + _cs = 0; + + switch (_type) { + case LCD6100: + command(0xCA); // display control + data(0); + data(32); + data(0); + command(0xBB); + data(1); + command(0xD1); // oscillator on + command(0x94); // sleep out + command(0x20); // power control + data(0x0F); + command(0xA7); // invert display + command(0x81); // Voltage control + data(39); // contrast setting: 0..63 + data(3); // resistance ratio + wait_ms(1); + command(0xBC); + data(0); + data(1); + data(4); + command(0xAF); // turn on the display + break; + + case LCD6610: + command(0xCA); // display control + data(0); + data(31); + data(0); + command(0xBB); + data(1); + command(0xD1); // oscillator on + command(0x94); // sleep out + command(0x20); // power control + data(0x0F); + command(0xA7); // invert display + command(0x81); // Voltage control + data(39); // contrast setting: 0..63 + data(3); // resistance ratio + wait_ms(1); + command(0xBC); + data(0); + data(0); + data(2); + command(0xAF); // turn on the display + break; + + case PCF8833: + command(0x11); // sleep out + command(0x3A); // column mode + data(0x05); + command(0x36); // madctl + data(0x60); // vertical RAM, flip x + command(0x25); // setcon + data(0x30);// contrast 0x30 + wait_ms(2); + command(0x29);//DISPON + command(0x03);//BSTRON + break; + } + + _cs = 1; + + cls(); +} + +void NokiaLCD::command(int value) { + _spi.write(value & 0xFF); +} + +void NokiaLCD::data(int value) { + _spi.write(value | 0x100); +} + +void NokiaLCD::_window(int x, int y, int width, int height) { + int x1 = x + 2; + int y1 = y + 0; + int x2 = x1 + width - 1; + int y2 = y1 + height - 1; + + switch (_type) { + case LCD6100: + case LCD6610: + command(0x15); // column + data(x1); + data(x2); + command(0x75); // row + data(y1); + data(y2); + command(0x5C); // start write to ram + break; + case PCF8833: + command(0x2A); // column + data(x1); + data(x2); + command(0x2B); // row + data(y1); + data(y2); + command(0x2C); // start write to ram + break; + } +} + +void NokiaLCD::_putp(int colour) { + int gr = ((colour >> 20) & 0x0F) //MSB 4bit(red) + | ((colour >> 8 ) & 0xF0); //Middle 4bit (green) + int nb = ((colour >> 4 ) & 0x0F); //LSB 4bit (blue) + data(nb); + data(gr); +} + +const unsigned char FONT8x8[97][8] = { + 0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00, // columns, rows, num_bytes_per_char + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // space 0x20 + 0x30,0x78,0x78,0x30,0x30,0x00,0x30,0x00, // ! + 0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00, // " + 0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00, // # + 0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00, // $ + 0x00,0x63,0x66,0x0C,0x18,0x33,0x63,0x00, // % + 0x1C,0x36,0x1C,0x3B,0x6E,0x66,0x3B,0x00, // & + 0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00, // ' + 0x0C,0x18,0x30,0x30,0x30,0x18,0x0C,0x00, // ( + 0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x00, // ) + 0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00, // * + 0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00, // + + 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30, // , + 0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00, // - + 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00, // . + 0x03,0x06,0x0C,0x18,0x30,0x60,0x40,0x00, // / (forward slash) + 0x3E,0x63,0x63,0x6B,0x63,0x63,0x3E,0x00, // 0 0x30 + 0x18,0x38,0x58,0x18,0x18,0x18,0x7E,0x00, // 1 + 0x3C,0x66,0x06,0x1C,0x30,0x66,0x7E,0x00, // 2 + 0x3C,0x66,0x06,0x1C,0x06,0x66,0x3C,0x00, // 3 + 0x0E,0x1E,0x36,0x66,0x7F,0x06,0x0F,0x00, // 4 + 0x7E,0x60,0x7C,0x06,0x06,0x66,0x3C,0x00, // 5 + 0x1C,0x30,0x60,0x7C,0x66,0x66,0x3C,0x00, // 6 + 0x7E,0x66,0x06,0x0C,0x18,0x18,0x18,0x00, // 7 + 0x3C,0x66,0x66,0x3C,0x66,0x66,0x3C,0x00, // 8 + 0x3C,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00, // 9 + 0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00, // : + 0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x30, // ; + 0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00, // < + 0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00, // = + 0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00, // > + 0x3C,0x66,0x06,0x0C,0x18,0x00,0x18,0x00, // ? + 0x3E,0x63,0x6F,0x69,0x6F,0x60,0x3E,0x00, // @ 0x40 + 0x18,0x3C,0x66,0x66,0x7E,0x66,0x66,0x00, // A + 0x7E,0x33,0x33,0x3E,0x33,0x33,0x7E,0x00, // B + 0x1E,0x33,0x60,0x60,0x60,0x33,0x1E,0x00, // C + 0x7C,0x36,0x33,0x33,0x33,0x36,0x7C,0x00, // D + 0x7F,0x31,0x34,0x3C,0x34,0x31,0x7F,0x00, // E + 0x7F,0x31,0x34,0x3C,0x34,0x30,0x78,0x00, // F + 0x1E,0x33,0x60,0x60,0x67,0x33,0x1F,0x00, // G + 0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x00, // H + 0x3C,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // I + 0x0F,0x06,0x06,0x06,0x66,0x66,0x3C,0x00, // J + 0x73,0x33,0x36,0x3C,0x36,0x33,0x73,0x00, // K + 0x78,0x30,0x30,0x30,0x31,0x33,0x7F,0x00, // L + 0x63,0x77,0x7F,0x7F,0x6B,0x63,0x63,0x00, // M + 0x63,0x73,0x7B,0x6F,0x67,0x63,0x63,0x00, // N + 0x3E,0x63,0x63,0x63,0x63,0x63,0x3E,0x00, // O + 0x7E,0x33,0x33,0x3E,0x30,0x30,0x78,0x00, // P 0x50 + 0x3C,0x66,0x66,0x66,0x6E,0x3C,0x0E,0x00, // Q + 0x7E,0x33,0x33,0x3E,0x36,0x33,0x73,0x00, // R + 0x3C,0x66,0x30,0x18,0x0C,0x66,0x3C,0x00, // S + 0x7E,0x5A,0x18,0x18,0x18,0x18,0x3C,0x00, // T + 0x66,0x66,0x66,0x66,0x66,0x66,0x7E,0x00, // U + 0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00, // V + 0x63,0x63,0x63,0x6B,0x7F,0x77,0x63,0x00, // W + 0x63,0x63,0x36,0x1C,0x1C,0x36,0x63,0x00, // X + 0x66,0x66,0x66,0x3C,0x18,0x18,0x3C,0x00, // Y + 0x7F,0x63,0x46,0x0C,0x19,0x33,0x7F,0x00, // Z + 0x3C,0x30,0x30,0x30,0x30,0x30,0x3C,0x00, // [ + 0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x00, // \ (back slash) + 0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00, // ] + 0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00, // ^ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, // _ + 0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00, // ` 0x60 + 0x00,0x00,0x3C,0x06,0x3E,0x66,0x3B,0x00, // a + 0x70,0x30,0x3E,0x33,0x33,0x33,0x6E,0x00, // b + 0x00,0x00,0x3C,0x66,0x60,0x66,0x3C,0x00, // c + 0x0E,0x06,0x3E,0x66,0x66,0x66,0x3B,0x00, // d + 0x00,0x00,0x3C,0x66,0x7E,0x60,0x3C,0x00, // e + 0x1C,0x36,0x30,0x78,0x30,0x30,0x78,0x00, // f + 0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x7C, // g + 0x70,0x30,0x36,0x3B,0x33,0x33,0x73,0x00, // h + 0x18,0x00,0x38,0x18,0x18,0x18,0x3C,0x00, // i + 0x06,0x00,0x06,0x06,0x06,0x66,0x66,0x3C, // j + 0x70,0x30,0x33,0x36,0x3C,0x36,0x73,0x00, // k + 0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // l + 0x00,0x00,0x66,0x7F,0x7F,0x6B,0x63,0x00, // m + 0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x00, // n + 0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00, // o + 0x00,0x00,0x6E,0x33,0x33,0x3E,0x30,0x78, // p + 0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x0F, // q + 0x00,0x00,0x6E,0x3B,0x33,0x30,0x78,0x00, // r + 0x00,0x00,0x3E,0x60,0x3C,0x06,0x7C,0x00, // s + 0x08,0x18,0x3E,0x18,0x18,0x1A,0x0C,0x00, // t + 0x00,0x00,0x66,0x66,0x66,0x66,0x3B,0x00, // u + 0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x00, // v + 0x00,0x00,0x63,0x6B,0x7F,0x7F,0x36,0x00, // w + 0x00,0x00,0x63,0x36,0x1C,0x36,0x63,0x00, // x + 0x00,0x00,0x66,0x66,0x66,0x3E,0x06,0x7C, // y + 0x00,0x00,0x7E,0x4C,0x18,0x32,0x7E,0x00, // z + 0x0E,0x18,0x18,0x70,0x18,0x18,0x0E,0x00, // { + 0x0C,0x0C,0x0C,0x00,0x0C,0x0C,0x0C,0x00, // | + 0x70,0x18,0x18,0x0E,0x18,0x18,0x70,0x00, // } + 0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00, // ~ + 0x1C,0x36,0x36,0x1C,0x00,0x00,0x00,0x00 +}; // DEL + +void NokiaLCD::locate(int column, int row) { + _column = column; + _row = row; +} + +void NokiaLCD::newline() { + _column = 0; + _row++; + if (_row >= _rows) { + _row = 0; + } +} + +int NokiaLCD::_putc(int value) { + int x = _column * 8; // FIXME: Char sizes + int y = _row * 8; + bitblit(x + 1, y + 1, 8, 8, (char*)&(FONT8x8[value - 0x1F][0])); + + _column++; + + if (_column >= NOKIALCD_COLS) { + _row++; + _column = 0; + } + + if (_row >= NOKIALCD_ROWS) { + _row = 0; + } + + return value; +} + +void NokiaLCD::cls() { + fill(0, 0, NOKIALCD_WIDTH, NOKIALCD_HEIGHT, _background); + _row = 0; + _column = 0; +} + + +void NokiaLCD::window(int x, int y, int width, int height) { + _cs = 0; + _window(x, y, width, height); + _cs = 1; +} + +void NokiaLCD::putp(int colour) { + _cs = 0; + _putp(colour); + _cs = 1; +} + +void NokiaLCD::pixel(int x, int y, int colour) { + _cs = 0; + _window(x, y, 1, 1); + _putp(colour); + _cs = 1; +} + +void NokiaLCD::fill(int x, int y, int width, int height, int colour) { + _cs = 0; + _window(x, y, width, height); + switch (_type) { + case LCD6100: + case PCF8833: + for (int i=0; i<width*height; i++) { + _putp(colour); + } + break; + case LCD6610: + for (int i=0; i<width*height/2; i++) { + int r4 = (colour >> (16 + 4)) & 0xF; + int g4 = (colour >> (8 + 4)) & 0xF; + int b4 = (colour >> (0 + 4)) & 0xF; + int d1 = (r4 << 4) | g4; + int d2 = (b4 << 4) | r4; + int d3 = (g4 << 4) | b4; + data(d1); + data(d2); + data(d3); + } + break; + } + _window(0, 0, NOKIALCD_WIDTH, NOKIALCD_HEIGHT); + _cs = 1; +} + +void NokiaLCD::blit(int x, int y, int width, int height, const int* colour) { + _cs = 0; + _window(x, y, width, height); + + switch (_type) { + case LCD6100: + case PCF8833: + for (int i=0; i<width*height; i++) { + _putp(colour[i]); + } + break; + case LCD6610: + for (int i=0; i<width*height/2; i++) { + int r41 = (colour[i*2] >> (16 + 4)) & 0xF; + int g41 = (colour[i*2] >> (8 + 4)) & 0xF; + int b41 = (colour[i*2] >> (0 + 4)) & 0xF; + + int r42 = (colour[i*2+1] >> (16 + 4)) & 0xF; + int g42 = (colour[i*2+1] >> (8 + 4)) & 0xF; + int b42 = (colour[i*2+1] >> (0 + 4)) & 0xF; + int d1 = (r41 << 4) | g41; + int d2 = (b41 << 4) | r42; + int d3 = (g42 << 4) | b42; + data(d1); + data(d2); + data(d3); + } + break; + } + _window(0, 0, NOKIALCD_WIDTH, NOKIALCD_HEIGHT); + _cs = 1; +} + +void NokiaLCD::bitblit(int x, int y, int width, int height, const char* bitstream) { + _cs = 0; + _window(x, y, width, height); + + switch (_type) { + case LCD6100: + case PCF8833: + for (int i=0; i<height*width; i++) { + int byte = i / 8; + int bit = i % 8; + int colour = ((bitstream[byte] << bit) & 0x80) ? _foreground : _background; + _putp(colour); + } + break; + case LCD6610: + for(int i=0; i<height*width/2; i++) { + int byte1 = (i*2) / 8; + int bit1 = (i*2) % 8; + int colour1 = ((bitstream[byte1] << bit1) & 0x80) ? _foreground : _background; + int byte2 = (i*2+1) / 8; + int bit2 = (i*2+1) % 8; + int colour2 = ((bitstream[byte2] << bit2) & 0x80) ? _foreground : _background; + + int r41 = (colour1 >> (16 + 4)) & 0xF; + int g41 = (colour1 >> (8 + 4)) & 0xF; + int b41 = (colour1 >> (0 + 4)) & 0xF; + + int r42 = (colour2 >> (16 + 4)) & 0xF; + int g42 = (colour2 >> (8 + 4)) & 0xF; + int b42 = (colour2 >> (0 + 4)) & 0xF; + int d1 = (r41 << 4) | g41; + int d2 = (b41 << 4) | r42; + int d3 = (g42 << 4) | b42; + data(d1); + data(d2); + data(d3); + } + break; + } + _window(0, 0, _width, _height); + _cs = 1; +} + +void NokiaLCD::foreground(int c) { + _foreground = c; +} + +void NokiaLCD::background(int c) { + _background = c; +} + +int NokiaLCD::width() { + return NOKIALCD_WIDTH; +} + +int NokiaLCD::height() { + return NOKIALCD_HEIGHT; +} + +int NokiaLCD::columns() { + return NOKIALCD_COLS; +} + +int NokiaLCD::rows() { + return NOKIALCD_ROWS; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/NokiaLCD/NokiaLCD.h Sat Jul 02 22:05:27 2011 +0000 @@ -0,0 +1,151 @@ +/* mbed NokiaLCD Library, for a 130x130 Nokia colour LCD + * Copyright (c) 2007-2010, sford + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MBED_NOKIALCD_H +#define MBED_NOKIALCD_H + +#include "mbed.h" + +/** An interface for the 130x130 Nokia Mobile phone screens + * + * @code + * #include "mbed.h" + * #include "NokiaLCD.h" + * + * NokiaLCD lcd(p5, p7, p8, p9, NokiaLCD::6610); // mosi, sclk, cs, rst, type + * + * int main() { + * lcd.printf("Hello World!"); + * } + * @endcode + */ +class NokiaLCD : public Stream { + +public: + /** LCD panel format */ + enum LCDType { + LCD6100 /**< Nokia 6100, as found on sparkfun board (default) */ + , LCD6610 /**< Nokia 6610, as found on olimex board */ + , PCF8833 + }; + + /** Create and Nokia LCD interface, using a SPI and two DigitalOut interfaces + * + * @param mosi SPI data out + * @param sclk SPI clock + * @param cs Chip Select (DigitalOut) + * @param rst Reset (DigitalOut) + * @param type The LCDType to select driver chip variants + */ + NokiaLCD(PinName mosi, PinName sclk, PinName cs, PinName rst, LCDType type = LCD6100); + +#if DOXYGEN_ONLY + /** Write a character to the LCD + * + * @param c The character to write to the display + */ + int putc(int c); + + /** Write a formated string to the LCD + * + * @param format A printf-style format string, followed by the + * variables to use in formating the string. + */ + int printf(const char* format, ...); +#endif + + /** Locate to a screen column and row + * + * @param column The horizontal position from the left, indexed from 0 + * @param row The vertical position from the top, indexed from 0 + */ + void locate(int column, int row); + + /** Clear the screen and locate to 0,0 */ + void cls(); + + /** Set a pixel on te screen + * + * @param x horizontal position from left + * @param y vertical position from top + * @param colour 24-bit colour in format 0x00RRGGBB + */ + void pixel(int x, int y, int colour); + + /** Fill an area of the screen + * + * @param x horizontal position from left + * @param y vertical position from top + * @param width width in pixels + * @param height height in pixels + * @param colour 24-bit colour in format 0x00RRGGBB + */ + void fill(int x, int y, int width, int height, int colour); + + void blit(int x, int y, int width, int height, const int* colour); + void bitblit(int x, int y, int width, int height, const char* bitstream); + + int width(); + int height(); + int columns(); + int rows(); + + void reset(); + + /** Set the foreground colour + * + * @param c 24-bit colour + */ + void foreground(int c); + + /** Set the background colour + * + * @param c 24-bit colour + */ + void background(int c); + +protected: + virtual void _window(int x, int y, int width, int height); + virtual void _putp(int colour); + + void command(int value); + void data(int value); + + void newline(); + virtual int _putc(int c); + virtual int _getc() { + return 0; + } + void putp(int v); + void window(int x, int y, int width, int height); + + SPI _spi; + DigitalOut _rst; + DigitalOut _cs; + + LCDType _type; + int _row, _column, _rows, _columns, _foreground, _background, _width, _height; +}; + +#endif + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PowerControl/EthernetPowerControl.cpp Sat Jul 02 22:05:27 2011 +0000 @@ -0,0 +1,138 @@ +#include "EthernetPowerControl.h" + +static void write_PHY (unsigned int PhyReg, unsigned short Value) { + /* Write a data 'Value' to PHY register 'PhyReg'. */ + unsigned int tout; + /* Hardware MII Management for LPC176x devices. */ + LPC_EMAC->MADR = DP83848C_DEF_ADR | PhyReg; + LPC_EMAC->MWTD = Value; + + /* Wait utill operation completed */ + for (tout = 0; tout < MII_WR_TOUT; tout++) { + if ((LPC_EMAC->MIND & MIND_BUSY) == 0) { + break; + } + } +} + +static unsigned short read_PHY (unsigned int PhyReg) { + /* Read a PHY register 'PhyReg'. */ + unsigned int tout, val; + + LPC_EMAC->MADR = DP83848C_DEF_ADR | PhyReg; + LPC_EMAC->MCMD = MCMD_READ; + + /* Wait until operation completed */ + for (tout = 0; tout < MII_RD_TOUT; tout++) { + if ((LPC_EMAC->MIND & MIND_BUSY) == 0) { + break; + } + } + LPC_EMAC->MCMD = 0; + val = LPC_EMAC->MRDD; + + return (val); +} + +void EMAC_Init() +{ + unsigned int tout,regv; + /* Power Up the EMAC controller. */ + Peripheral_PowerUp(LPC1768_PCONP_PCENET); + + LPC_PINCON->PINSEL2 = 0x50150105; + LPC_PINCON->PINSEL3 &= ~0x0000000F; + LPC_PINCON->PINSEL3 |= 0x00000005; + + /* Reset all EMAC internal modules. */ + LPC_EMAC->MAC1 = MAC1_RES_TX | MAC1_RES_MCS_TX | MAC1_RES_RX | MAC1_RES_MCS_RX | + MAC1_SIM_RES | MAC1_SOFT_RES; + LPC_EMAC->Command = CR_REG_RES | CR_TX_RES | CR_RX_RES; + + /* A short delay after reset. */ + for (tout = 100; tout; tout--); + + /* Initialize MAC control registers. */ + LPC_EMAC->MAC1 = MAC1_PASS_ALL; + LPC_EMAC->MAC2 = MAC2_CRC_EN | MAC2_PAD_EN; + LPC_EMAC->MAXF = ETH_MAX_FLEN; + LPC_EMAC->CLRT = CLRT_DEF; + LPC_EMAC->IPGR = IPGR_DEF; + + /* Enable Reduced MII interface. */ + LPC_EMAC->Command = CR_RMII | CR_PASS_RUNT_FRM; + + /* Reset Reduced MII Logic. */ + LPC_EMAC->SUPP = SUPP_RES_RMII; + for (tout = 100; tout; tout--); + LPC_EMAC->SUPP = 0; + + /* Put the DP83848C in reset mode */ + write_PHY (PHY_REG_BMCR, 0x8000); + + /* Wait for hardware reset to end. */ + for (tout = 0; tout < 0x100000; tout++) { + regv = read_PHY (PHY_REG_BMCR); + if (!(regv & 0x8000)) { + /* Reset complete */ + break; + } + } +} + + +void PHY_PowerDown() +{ + if (!Peripheral_GetStatus(LPC1768_PCONP_PCENET)) + EMAC_Init(); //init EMAC if it is not already init'd + + unsigned int regv; + regv = read_PHY(PHY_REG_BMCR); + write_PHY(PHY_REG_BMCR, regv | (1 << PHY_REG_BMCR_POWERDOWN)); + regv = read_PHY(PHY_REG_BMCR); + + //shouldn't need the EMAC now. + Peripheral_PowerDown(LPC1768_PCONP_PCENET); + + //and turn off the PHY OSC + LPC_GPIO1->FIODIR |= 0x8000000; + LPC_GPIO1->FIOCLR = 0x8000000; +} + +void PHY_PowerUp() +{ + if (!Peripheral_GetStatus(LPC1768_PCONP_PCENET)) + EMAC_Init(); //init EMAC if it is not already init'd + + LPC_GPIO1->FIODIR |= 0x8000000; + LPC_GPIO1->FIOSET = 0x8000000; + + //wait for osc to be stable + wait_ms(200); + + unsigned int regv; + regv = read_PHY(PHY_REG_BMCR); + write_PHY(PHY_REG_BMCR, regv & ~(1 << PHY_REG_BMCR_POWERDOWN)); + regv = read_PHY(PHY_REG_BMCR); +} + +void PHY_EnergyDetect_Enable() +{ + if (!Peripheral_GetStatus(LPC1768_PCONP_PCENET)) + EMAC_Init(); //init EMAC if it is not already init'd + + unsigned int regv; + regv = read_PHY(PHY_REG_EDCR); + write_PHY(PHY_REG_BMCR, regv | (1 << PHY_REG_EDCR_ENABLE)); + regv = read_PHY(PHY_REG_EDCR); +} + +void PHY_EnergyDetect_Disable() +{ + if (!Peripheral_GetStatus(LPC1768_PCONP_PCENET)) + EMAC_Init(); //init EMAC if it is not already init'd + unsigned int regv; + regv = read_PHY(PHY_REG_EDCR); + write_PHY(PHY_REG_BMCR, regv & ~(1 << PHY_REG_EDCR_ENABLE)); + regv = read_PHY(PHY_REG_EDCR); +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PowerControl/EthernetPowerControl.h Sat Jul 02 22:05:27 2011 +0000 @@ -0,0 +1,299 @@ +/* mbed PowerControl Library + * Copyright (c) 2010 Michael Wei + */ + +#ifndef MBED_POWERCONTROL_ETH_H +#define MBED_POWERCONTROL_ETH_H + +#include "mbed.h" +#include "PowerControl.h" + +#define PHY_REG_BMCR_POWERDOWN 0xB +#define PHY_REG_EDCR_ENABLE 0xF + + +void EMAC_Init(); +static unsigned short read_PHY (unsigned int PhyReg); +static void write_PHY (unsigned int PhyReg, unsigned short Value); + +void PHY_PowerDown(void); +void PHY_PowerUp(void); +void PHY_EnergyDetect_Enable(void); +void PHY_EnergyDetect_Disable(void); + +//From NXP Sample Code .... Probably from KEIL sample code +/* EMAC Memory Buffer configuration for 16K Ethernet RAM. */ +#define NUM_RX_FRAG 4 /* Num.of RX Fragments 4*1536= 6.0kB */ +#define NUM_TX_FRAG 3 /* Num.of TX Fragments 3*1536= 4.6kB */ +#define ETH_FRAG_SIZE 1536 /* Packet Fragment size 1536 Bytes */ + +#define ETH_MAX_FLEN 1536 /* Max. Ethernet Frame Size */ + +/* EMAC variables located in 16K Ethernet SRAM */ +#define RX_DESC_BASE 0x20080000 +#define RX_STAT_BASE (RX_DESC_BASE + NUM_RX_FRAG*8) +#define TX_DESC_BASE (RX_STAT_BASE + NUM_RX_FRAG*8) +#define TX_STAT_BASE (TX_DESC_BASE + NUM_TX_FRAG*8) +#define RX_BUF_BASE (TX_STAT_BASE + NUM_TX_FRAG*4) +#define TX_BUF_BASE (RX_BUF_BASE + NUM_RX_FRAG*ETH_FRAG_SIZE) + +/* RX and TX descriptor and status definitions. */ +#define RX_DESC_PACKET(i) (*(unsigned int *)(RX_DESC_BASE + 8*i)) +#define RX_DESC_CTRL(i) (*(unsigned int *)(RX_DESC_BASE+4 + 8*i)) +#define RX_STAT_INFO(i) (*(unsigned int *)(RX_STAT_BASE + 8*i)) +#define RX_STAT_HASHCRC(i) (*(unsigned int *)(RX_STAT_BASE+4 + 8*i)) +#define TX_DESC_PACKET(i) (*(unsigned int *)(TX_DESC_BASE + 8*i)) +#define TX_DESC_CTRL(i) (*(unsigned int *)(TX_DESC_BASE+4 + 8*i)) +#define TX_STAT_INFO(i) (*(unsigned int *)(TX_STAT_BASE + 4*i)) +#define RX_BUF(i) (RX_BUF_BASE + ETH_FRAG_SIZE*i) +#define TX_BUF(i) (TX_BUF_BASE + ETH_FRAG_SIZE*i) + +/* MAC Configuration Register 1 */ +#define MAC1_REC_EN 0x00000001 /* Receive Enable */ +#define MAC1_PASS_ALL 0x00000002 /* Pass All Receive Frames */ +#define MAC1_RX_FLOWC 0x00000004 /* RX Flow Control */ +#define MAC1_TX_FLOWC 0x00000008 /* TX Flow Control */ +#define MAC1_LOOPB 0x00000010 /* Loop Back Mode */ +#define MAC1_RES_TX 0x00000100 /* Reset TX Logic */ +#define MAC1_RES_MCS_TX 0x00000200 /* Reset MAC TX Control Sublayer */ +#define MAC1_RES_RX 0x00000400 /* Reset RX Logic */ +#define MAC1_RES_MCS_RX 0x00000800 /* Reset MAC RX Control Sublayer */ +#define MAC1_SIM_RES 0x00004000 /* Simulation Reset */ +#define MAC1_SOFT_RES 0x00008000 /* Soft Reset MAC */ + +/* MAC Configuration Register 2 */ +#define MAC2_FULL_DUP 0x00000001 /* Full Duplex Mode */ +#define MAC2_FRM_LEN_CHK 0x00000002 /* Frame Length Checking */ +#define MAC2_HUGE_FRM_EN 0x00000004 /* Huge Frame Enable */ +#define MAC2_DLY_CRC 0x00000008 /* Delayed CRC Mode */ +#define MAC2_CRC_EN 0x00000010 /* Append CRC to every Frame */ +#define MAC2_PAD_EN 0x00000020 /* Pad all Short Frames */ +#define MAC2_VLAN_PAD_EN 0x00000040 /* VLAN Pad Enable */ +#define MAC2_ADET_PAD_EN 0x00000080 /* Auto Detect Pad Enable */ +#define MAC2_PPREAM_ENF 0x00000100 /* Pure Preamble Enforcement */ +#define MAC2_LPREAM_ENF 0x00000200 /* Long Preamble Enforcement */ +#define MAC2_NO_BACKOFF 0x00001000 /* No Backoff Algorithm */ +#define MAC2_BACK_PRESSURE 0x00002000 /* Backoff Presurre / No Backoff */ +#define MAC2_EXCESS_DEF 0x00004000 /* Excess Defer */ + +/* Back-to-Back Inter-Packet-Gap Register */ +#define IPGT_FULL_DUP 0x00000015 /* Recommended value for Full Duplex */ +#define IPGT_HALF_DUP 0x00000012 /* Recommended value for Half Duplex */ + +/* Non Back-to-Back Inter-Packet-Gap Register */ +#define IPGR_DEF 0x00000012 /* Recommended value */ + +/* Collision Window/Retry Register */ +#define CLRT_DEF 0x0000370F /* Default value */ + +/* PHY Support Register */ +#define SUPP_SPEED 0x00000100 /* Reduced MII Logic Current Speed */ +#define SUPP_RES_RMII 0x00000800 /* Reset Reduced MII Logic */ + +/* Test Register */ +#define TEST_SHCUT_PQUANTA 0x00000001 /* Shortcut Pause Quanta */ +#define TEST_TST_PAUSE 0x00000002 /* Test Pause */ +#define TEST_TST_BACKP 0x00000004 /* Test Back Pressure */ + +/* MII Management Configuration Register */ +#define MCFG_SCAN_INC 0x00000001 /* Scan Increment PHY Address */ +#define MCFG_SUPP_PREAM 0x00000002 /* Suppress Preamble */ +#define MCFG_CLK_SEL 0x0000001C /* Clock Select Mask */ +#define MCFG_RES_MII 0x00008000 /* Reset MII Management Hardware */ + +/* MII Management Command Register */ +#define MCMD_READ 0x00000001 /* MII Read */ +#define MCMD_SCAN 0x00000002 /* MII Scan continuously */ + +#define MII_WR_TOUT 0x00050000 /* MII Write timeout count */ +#define MII_RD_TOUT 0x00050000 /* MII Read timeout count */ + +/* MII Management Address Register */ +#define MADR_REG_ADR 0x0000001F /* MII Register Address Mask */ +#define MADR_PHY_ADR 0x00001F00 /* PHY Address Mask */ + +/* MII Management Indicators Register */ +#define MIND_BUSY 0x00000001 /* MII is Busy */ +#define MIND_SCAN 0x00000002 /* MII Scanning in Progress */ +#define MIND_NOT_VAL 0x00000004 /* MII Read Data not valid */ +#define MIND_MII_LINK_FAIL 0x00000008 /* MII Link Failed */ + +/* Command Register */ +#define CR_RX_EN 0x00000001 /* Enable Receive */ +#define CR_TX_EN 0x00000002 /* Enable Transmit */ +#define CR_REG_RES 0x00000008 /* Reset Host Registers */ +#define CR_TX_RES 0x00000010 /* Reset Transmit Datapath */ +#define CR_RX_RES 0x00000020 /* Reset Receive Datapath */ +#define CR_PASS_RUNT_FRM 0x00000040 /* Pass Runt Frames */ +#define CR_PASS_RX_FILT 0x00000080 /* Pass RX Filter */ +#define CR_TX_FLOW_CTRL 0x00000100 /* TX Flow Control */ +#define CR_RMII 0x00000200 /* Reduced MII Interface */ +#define CR_FULL_DUP 0x00000400 /* Full Duplex */ + +/* Status Register */ +#define SR_RX_EN 0x00000001 /* Enable Receive */ +#define SR_TX_EN 0x00000002 /* Enable Transmit */ + +/* Transmit Status Vector 0 Register */ +#define TSV0_CRC_ERR 0x00000001 /* CRC error */ +#define TSV0_LEN_CHKERR 0x00000002 /* Length Check Error */ +#define TSV0_LEN_OUTRNG 0x00000004 /* Length Out of Range */ +#define TSV0_DONE 0x00000008 /* Tramsmission Completed */ +#define TSV0_MCAST 0x00000010 /* Multicast Destination */ +#define TSV0_BCAST 0x00000020 /* Broadcast Destination */ +#define TSV0_PKT_DEFER 0x00000040 /* Packet Deferred */ +#define TSV0_EXC_DEFER 0x00000080 /* Excessive Packet Deferral */ +#define TSV0_EXC_COLL 0x00000100 /* Excessive Collision */ +#define TSV0_LATE_COLL 0x00000200 /* Late Collision Occured */ +#define TSV0_GIANT 0x00000400 /* Giant Frame */ +#define TSV0_UNDERRUN 0x00000800 /* Buffer Underrun */ +#define TSV0_BYTES 0x0FFFF000 /* Total Bytes Transferred */ +#define TSV0_CTRL_FRAME 0x10000000 /* Control Frame */ +#define TSV0_PAUSE 0x20000000 /* Pause Frame */ +#define TSV0_BACK_PRESS 0x40000000 /* Backpressure Method Applied */ +#define TSV0_VLAN 0x80000000 /* VLAN Frame */ + +/* Transmit Status Vector 1 Register */ +#define TSV1_BYTE_CNT 0x0000FFFF /* Transmit Byte Count */ +#define TSV1_COLL_CNT 0x000F0000 /* Transmit Collision Count */ + +/* Receive Status Vector Register */ +#define RSV_BYTE_CNT 0x0000FFFF /* Receive Byte Count */ +#define RSV_PKT_IGNORED 0x00010000 /* Packet Previously Ignored */ +#define RSV_RXDV_SEEN 0x00020000 /* RXDV Event Previously Seen */ +#define RSV_CARR_SEEN 0x00040000 /* Carrier Event Previously Seen */ +#define RSV_REC_CODEV 0x00080000 /* Receive Code Violation */ +#define RSV_CRC_ERR 0x00100000 /* CRC Error */ +#define RSV_LEN_CHKERR 0x00200000 /* Length Check Error */ +#define RSV_LEN_OUTRNG 0x00400000 /* Length Out of Range */ +#define RSV_REC_OK 0x00800000 /* Frame Received OK */ +#define RSV_MCAST 0x01000000 /* Multicast Frame */ +#define RSV_BCAST 0x02000000 /* Broadcast Frame */ +#define RSV_DRIB_NIBB 0x04000000 /* Dribble Nibble */ +#define RSV_CTRL_FRAME 0x08000000 /* Control Frame */ +#define RSV_PAUSE 0x10000000 /* Pause Frame */ +#define RSV_UNSUPP_OPC 0x20000000 /* Unsupported Opcode */ +#define RSV_VLAN 0x40000000 /* VLAN Frame */ + +/* Flow Control Counter Register */ +#define FCC_MIRR_CNT 0x0000FFFF /* Mirror Counter */ +#define FCC_PAUSE_TIM 0xFFFF0000 /* Pause Timer */ + +/* Flow Control Status Register */ +#define FCS_MIRR_CNT 0x0000FFFF /* Mirror Counter Current */ + +/* Receive Filter Control Register */ +#define RFC_UCAST_EN 0x00000001 /* Accept Unicast Frames Enable */ +#define RFC_BCAST_EN 0x00000002 /* Accept Broadcast Frames Enable */ +#define RFC_MCAST_EN 0x00000004 /* Accept Multicast Frames Enable */ +#define RFC_UCAST_HASH_EN 0x00000008 /* Accept Unicast Hash Filter Frames */ +#define RFC_MCAST_HASH_EN 0x00000010 /* Accept Multicast Hash Filter Fram.*/ +#define RFC_PERFECT_EN 0x00000020 /* Accept Perfect Match Enable */ +#define RFC_MAGP_WOL_EN 0x00001000 /* Magic Packet Filter WoL Enable */ +#define RFC_PFILT_WOL_EN 0x00002000 /* Perfect Filter WoL Enable */ + +/* Receive Filter WoL Status/Clear Registers */ +#define WOL_UCAST 0x00000001 /* Unicast Frame caused WoL */ +#define WOL_BCAST 0x00000002 /* Broadcast Frame caused WoL */ +#define WOL_MCAST 0x00000004 /* Multicast Frame caused WoL */ +#define WOL_UCAST_HASH 0x00000008 /* Unicast Hash Filter Frame WoL */ +#define WOL_MCAST_HASH 0x00000010 /* Multicast Hash Filter Frame WoL */ +#define WOL_PERFECT 0x00000020 /* Perfect Filter WoL */ +#define WOL_RX_FILTER 0x00000080 /* RX Filter caused WoL */ +#define WOL_MAG_PACKET 0x00000100 /* Magic Packet Filter caused WoL */ + +/* Interrupt Status/Enable/Clear/Set Registers */ +#define INT_RX_OVERRUN 0x00000001 /* Overrun Error in RX Queue */ +#define INT_RX_ERR 0x00000002 /* Receive Error */ +#define INT_RX_FIN 0x00000004 /* RX Finished Process Descriptors */ +#define INT_RX_DONE 0x00000008 /* Receive Done */ +#define INT_TX_UNDERRUN 0x00000010 /* Transmit Underrun */ +#define INT_TX_ERR 0x00000020 /* Transmit Error */ +#define INT_TX_FIN 0x00000040 /* TX Finished Process Descriptors */ +#define INT_TX_DONE 0x00000080 /* Transmit Done */ +#define INT_SOFT_INT 0x00001000 /* Software Triggered Interrupt */ +#define INT_WAKEUP 0x00002000 /* Wakeup Event Interrupt */ + +/* Power Down Register */ +#define PD_POWER_DOWN 0x80000000 /* Power Down MAC */ + +/* RX Descriptor Control Word */ +#define RCTRL_SIZE 0x000007FF /* Buffer size mask */ +#define RCTRL_INT 0x80000000 /* Generate RxDone Interrupt */ + +/* RX Status Hash CRC Word */ +#define RHASH_SA 0x000001FF /* Hash CRC for Source Address */ +#define RHASH_DA 0x001FF000 /* Hash CRC for Destination Address */ + +/* RX Status Information Word */ +#define RINFO_SIZE 0x000007FF /* Data size in bytes */ +#define RINFO_CTRL_FRAME 0x00040000 /* Control Frame */ +#define RINFO_VLAN 0x00080000 /* VLAN Frame */ +#define RINFO_FAIL_FILT 0x00100000 /* RX Filter Failed */ +#define RINFO_MCAST 0x00200000 /* Multicast Frame */ +#define RINFO_BCAST 0x00400000 /* Broadcast Frame */ +#define RINFO_CRC_ERR 0x00800000 /* CRC Error in Frame */ +#define RINFO_SYM_ERR 0x01000000 /* Symbol Error from PHY */ +#define RINFO_LEN_ERR 0x02000000 /* Length Error */ +#define RINFO_RANGE_ERR 0x04000000 /* Range Error (exceeded max. size) */ +#define RINFO_ALIGN_ERR 0x08000000 /* Alignment Error */ +#define RINFO_OVERRUN 0x10000000 /* Receive overrun */ +#define RINFO_NO_DESCR 0x20000000 /* No new Descriptor available */ +#define RINFO_LAST_FLAG 0x40000000 /* Last Fragment in Frame */ +#define RINFO_ERR 0x80000000 /* Error Occured (OR of all errors) */ + +#define RINFO_ERR_MASK (RINFO_FAIL_FILT | RINFO_CRC_ERR | RINFO_SYM_ERR | \ + RINFO_LEN_ERR | RINFO_ALIGN_ERR | RINFO_OVERRUN) + +/* TX Descriptor Control Word */ +#define TCTRL_SIZE 0x000007FF /* Size of data buffer in bytes */ +#define TCTRL_OVERRIDE 0x04000000 /* Override Default MAC Registers */ +#define TCTRL_HUGE 0x08000000 /* Enable Huge Frame */ +#define TCTRL_PAD 0x10000000 /* Pad short Frames to 64 bytes */ +#define TCTRL_CRC 0x20000000 /* Append a hardware CRC to Frame */ +#define TCTRL_LAST 0x40000000 /* Last Descriptor for TX Frame */ +#define TCTRL_INT 0x80000000 /* Generate TxDone Interrupt */ + +/* TX Status Information Word */ +#define TINFO_COL_CNT 0x01E00000 /* Collision Count */ +#define TINFO_DEFER 0x02000000 /* Packet Deferred (not an error) */ +#define TINFO_EXCESS_DEF 0x04000000 /* Excessive Deferral */ +#define TINFO_EXCESS_COL 0x08000000 /* Excessive Collision */ +#define TINFO_LATE_COL 0x10000000 /* Late Collision Occured */ +#define TINFO_UNDERRUN 0x20000000 /* Transmit Underrun */ +#define TINFO_NO_DESCR 0x40000000 /* No new Descriptor available */ +#define TINFO_ERR 0x80000000 /* Error Occured (OR of all errors) */ + +/* DP83848C PHY Registers */ +#define PHY_REG_BMCR 0x00 /* Basic Mode Control Register */ +#define PHY_REG_BMSR 0x01 /* Basic Mode Status Register */ +#define PHY_REG_IDR1 0x02 /* PHY Identifier 1 */ +#define PHY_REG_IDR2 0x03 /* PHY Identifier 2 */ +#define PHY_REG_ANAR 0x04 /* Auto-Negotiation Advertisement */ +#define PHY_REG_ANLPAR 0x05 /* Auto-Neg. Link Partner Abitily */ +#define PHY_REG_ANER 0x06 /* Auto-Neg. Expansion Register */ +#define PHY_REG_ANNPTR 0x07 /* Auto-Neg. Next Page TX */ + +/* PHY Extended Registers */ +#define PHY_REG_STS 0x10 /* Status Register */ +#define PHY_REG_MICR 0x11 /* MII Interrupt Control Register */ +#define PHY_REG_MISR 0x12 /* MII Interrupt Status Register */ +#define PHY_REG_FCSCR 0x14 /* False Carrier Sense Counter */ +#define PHY_REG_RECR 0x15 /* Receive Error Counter */ +#define PHY_REG_PCSR 0x16 /* PCS Sublayer Config. and Status */ +#define PHY_REG_RBR 0x17 /* RMII and Bypass Register */ +#define PHY_REG_LEDCR 0x18 /* LED Direct Control Register */ +#define PHY_REG_PHYCR 0x19 /* PHY Control Register */ +#define PHY_REG_10BTSCR 0x1A /* 10Base-T Status/Control Register */ +#define PHY_REG_CDCTRL1 0x1B /* CD Test Control and BIST Extens. */ +#define PHY_REG_EDCR 0x1D /* Energy Detect Control Register */ + +#define PHY_FULLD_100M 0x2100 /* Full Duplex 100Mbit */ +#define PHY_HALFD_100M 0x2000 /* Half Duplex 100Mbit */ +#define PHY_FULLD_10M 0x0100 /* Full Duplex 10Mbit */ +#define PHY_HALFD_10M 0x0000 /* Half Duplex 10MBit */ +#define PHY_AUTO_NEG 0x3000 /* Select Auto Negotiation */ + +#define DP83848C_DEF_ADR 0x0100 /* Default PHY device address */ +#define DP83848C_ID 0x20005C90 /* PHY Identifier */ +#endif \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PowerControl/PowerControl.h Sat Jul 02 22:05:27 2011 +0000 @@ -0,0 +1,192 @@ +/* mbed PowerControl Library + * Copyright (c) 2010 Michael Wei + */ + +#ifndef MBED_POWERCONTROL_H +#define MBED_POWERCONTROL_H + +//shouldn't have to include, but fixes weird problems with defines +#include "LPC1768/LPC17xx.h" + +//System Control Register +// bit 0: Reserved +// bit 1: Sleep on Exit +#define LPC1768_SCR_SLEEPONEXIT 0x2 +// bit 2: Deep Sleep +#define LPC1768_SCR_SLEEPDEEP 0x4 +// bit 3: Resereved +// bit 4: Send on Pending +#define LPC1768_SCR_SEVONPEND 0x10 +// bit 5-31: Reserved + +//Power Control Register +// bit 0: Power mode control bit 0 (power-down mode) +#define LPC1768_PCON_PM0 0x1 +// bit 1: Power mode control bit 1 (deep power-down mode) +#define LPC1768_PCON_PM1 0x2 +// bit 2: Brown-out reduced power mode +#define LPC1768_PCON_BODRPM 0x4 +// bit 3: Brown-out global disable +#define LPC1768_PCON_BOGD 0x8 +// bit 4: Brown-out reset disable +#define LPC1768_PCON_BORD 0x10 +// bit 5-7 : Reserved +// bit 8: Sleep Mode Entry Flag +#define LPC1768_PCON_SMFLAG 0x100 +// bit 9: Deep Sleep Entry Flag +#define LPC1768_PCON_DSFLAG 0x200 +// bit 10: Power Down Entry Flag +#define LPC1768_PCON_PDFLAG 0x400 +// bit 11: Deep Power Down Entry Flag +#define LPC1768_PCON_DPDFLAG 0x800 +// bit 12-31: Reserved + +//"Sleep Mode" (WFI). +inline void Sleep(void) +{ + __WFI(); +} + +//"Deep Sleep" Mode +inline void DeepSleep(void) +{ + SCB->SCR |= LPC1768_SCR_SLEEPDEEP; + __WFI(); +} + +//"Power-Down" Mode +inline void PowerDown(void) +{ + SCB->SCR |= LPC1768_SCR_SLEEPDEEP; + LPC_SC->PCON &= ~LPC1768_PCON_PM1; + LPC_SC->PCON |= LPC1768_PCON_PM0; + __WFI(); + //reset back to normal + LPC_SC->PCON &= ~(LPC1768_PCON_PM1 | LPC1768_PCON_PM0); +} + +//"Deep Power-Down" Mode +inline void DeepPowerDown(void) +{ + SCB->SCR |= LPC1768_SCR_SLEEPDEEP; + LPC_SC->PCON |= LPC1768_PCON_PM1 | LPC1768_PCON_PM0; + __WFI(); + //reset back to normal + LPC_SC->PCON &= ~(LPC1768_PCON_PM1 | LPC1768_PCON_PM0); +} + +//shut down BOD during power-down/deep sleep +inline void BrownOut_ReducedPowerMode_Enable(void) +{ + LPC_SC->PCON |= LPC1768_PCON_BODRPM; +} + +//turn on BOD during power-down/deep sleep +inline void BrownOut_ReducedPowerMode_Disable(void) +{ + LPC_SC->PCON &= ~LPC1768_PCON_BODRPM; +} + +//turn off brown out circutry +inline void BrownOut_Global_Disable(void) +{ + LPC_SC->PCON |= LPC1768_PCON_BOGD; +} + +//turn on brown out circutry +inline void BrownOut_Global_Enable(void) +{ + LPC_SC->PCON &= !LPC1768_PCON_BOGD; +} + +//turn off brown out reset circutry +inline void BrownOut_Reset_Disable(void) +{ + LPC_SC->PCON |= LPC1768_PCON_BORD; +} + +//turn on brown outreset circutry +inline void BrownOut_Reset_Enable(void) +{ + LPC_SC->PCON &= ~LPC1768_PCON_BORD; +} +//Peripheral Control Register +// bit 0: Reserved +// bit 1: PCTIM0: Timer/Counter 0 power/clock enable +#define LPC1768_PCONP_PCTIM0 0x2 +// bit 2: PCTIM1: Timer/Counter 1 power/clock enable +#define LPC1768_PCONP_PCTIM1 0x4 +// bit 3: PCUART0: UART 0 power/clock enable +#define LPC1768_PCONP_PCUART0 0x8 +// bit 4: PCUART1: UART 1 power/clock enable +#define LPC1768_PCONP_PCUART1 0x10 +// bit 5: Reserved +// bit 6: PCPWM1: PWM 1 power/clock enable +#define LPC1768_PCONP_PCPWM1 0x40 +// bit 7: PCI2C0: I2C interface 0 power/clock enable +#define LPC1768_PCONP_PCI2C0 0x80 +// bit 8: PCSPI: SPI interface power/clock enable +#define LPC1768_PCONP_PCSPI 0x100 +// bit 9: PCRTC: RTC power/clock enable +#define LPC1768_PCONP_PCRTC 0x200 +// bit 10: PCSSP1: SSP interface 1 power/clock enable +#define LPC1768_PCONP_PCSSP1 0x400 +// bit 11: Reserved +// bit 12: PCADC: A/D converter power/clock enable +#define LPC1768_PCONP_PCADC 0x1000 +// bit 13: PCCAN1: CAN controller 1 power/clock enable +#define LPC1768_PCONP_PCCAN1 0x2000 +// bit 14: PCCAN2: CAN controller 2 power/clock enable +#define LPC1768_PCONP_PCCAN2 0x4000 +// bit 15: PCGPIO: GPIOs power/clock enable +#define LPC1768_PCONP_PCGPIO 0x8000 +// bit 16: PCRIT: Repetitive interrupt timer power/clock enable +#define LPC1768_PCONP_PCRIT 0x10000 +// bit 17: PCMCPWM: Motor control PWM power/clock enable +#define LPC1768_PCONP_PCMCPWM 0x20000 +// bit 18: PCQEI: Quadrature encoder interface power/clock enable +#define LPC1768_PCONP_PCQEI 0x40000 +// bit 19: PCI2C1: I2C interface 1 power/clock enable +#define LPC1768_PCONP_PCI2C1 0x80000 +// bit 20: Reserved +// bit 21: PCSSP0: SSP interface 0 power/clock enable +#define LPC1768_PCONP_PCSSP0 0x200000 +// bit 22: PCTIM2: Timer 2 power/clock enable +#define LPC1768_PCONP_PCTIM2 0x400000 +// bit 23: PCTIM3: Timer 3 power/clock enable +#define LPC1768_PCONP_PCQTIM3 0x800000 +// bit 24: PCUART2: UART 2 power/clock enable +#define LPC1768_PCONP_PCUART2 0x1000000 +// bit 25: PCUART3: UART 3 power/clock enable +#define LPC1768_PCONP_PCUART3 0x2000000 +// bit 26: PCI2C2: I2C interface 2 power/clock enable +#define LPC1768_PCONP_PCI2C2 0x4000000 +// bit 27: PCI2S: I2S interface power/clock enable +#define LPC1768_PCONP_PCI2S 0x8000000 +// bit 28: Reserved +// bit 29: PCGPDMA: GP DMA function power/clock enable +#define LPC1768_PCONP_PCGPDMA 0x20000000 +// bit 30: PCENET: Ethernet block power/clock enable +#define LPC1768_PCONP_PCENET 0x40000000 +// bit 31: PCUSB: USB interface power/clock enable +#define LPC1768_PCONP_PCUSB 0x80000000 + +//Powers Up specified Peripheral(s) +inline unsigned int Peripheral_PowerUp(unsigned int bitMask) +{ + return LPC_SC->PCONP |= bitMask; +} + +//Powers Down specified Peripheral(s) +inline unsigned int Peripheral_PowerDown(unsigned int bitMask) +{ + return LPC_SC->PCONP &= ~bitMask; +} + +//returns if the peripheral is on or off +inline bool Peripheral_GetStatus(unsigned int peripheral) +{ + return (LPC_SC->PCONP & peripheral) ? true : false; +} + +#endif \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SDFileSystem.cpp Sat Jul 02 22:05:27 2011 +0000 @@ -0,0 +1,458 @@ +/* mbed SDFileSystem Library, for providing file access to SD cards + * Copyright (c) 2008-2010, sford + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/* Introduction + * ------------ + * SD and MMC cards support a number of interfaces, but common to them all + * is one based on SPI. This is the one I'm implmenting because it means + * it is much more portable even though not so performant, and we already + * have the mbed SPI Interface! + * + * The main reference I'm using is Chapter 7, "SPI Mode" of: + * http://www.sdcard.org/developers/tech/sdcard/pls/Simplified_Physical_Layer_Spec.pdf + * + * SPI Startup + * ----------- + * The SD card powers up in SD mode. The SPI interface mode is selected by + * asserting CS low and sending the reset command (CMD0). The card will + * respond with a (R1) response. + * + * CMD8 is optionally sent to determine the voltage range supported, and + * indirectly determine whether it is a version 1.x SD/non-SD card or + * version 2.x. I'll just ignore this for now. + * + * ACMD41 is repeatedly issued to initialise the card, until "in idle" + * (bit 0) of the R1 response goes to '0', indicating it is initialised. + * + * You should also indicate whether the host supports High Capicity cards, + * and check whether the card is high capacity - i'll also ignore this + * + * SPI Protocol + * ------------ + * The SD SPI protocol is based on transactions made up of 8-bit words, with + * the host starting every bus transaction by asserting the CS signal low. The + * card always responds to commands, data blocks and errors. + * + * The protocol supports a CRC, but by default it is off (except for the + * first reset CMD0, where the CRC can just be pre-calculated, and CMD8) + * I'll leave the CRC off I think! + * + * Standard capacity cards have variable data block sizes, whereas High + * Capacity cards fix the size of data block to 512 bytes. I'll therefore + * just always use the Standard Capacity cards with a block size of 512 bytes. + * This is set with CMD16. + * + * You can read and write single blocks (CMD17, CMD25) or multiple blocks + * (CMD18, CMD25). For simplicity, I'll just use single block accesses. When + * the card gets a read command, it responds with a response token, and then + * a data token or an error. + * + * SPI Command Format + * ------------------ + * Commands are 6-bytes long, containing the command, 32-bit argument, and CRC. + * + * +---------------+------------+------------+-----------+----------+--------------+ + * | 01 | cmd[5:0] | arg[31:24] | arg[23:16] | arg[15:8] | arg[7:0] | crc[6:0] | 1 | + * +---------------+------------+------------+-----------+----------+--------------+ + * + * As I'm not using CRC, I can fix that byte to what is needed for CMD0 (0x95) + * + * All Application Specific commands shall be preceded with APP_CMD (CMD55). + * + * SPI Response Format + * ------------------- + * The main response format (R1) is a status byte (normally zero). Key flags: + * idle - 1 if the card is in an idle state/initialising + * cmd - 1 if an illegal command code was detected + * + * +-------------------------------------------------+ + * R1 | 0 | arg | addr | seq | crc | cmd | erase | idle | + * +-------------------------------------------------+ + * + * R1b is the same, except it is followed by a busy signal (zeros) until + * the first non-zero byte when it is ready again. + * + * Data Response Token + * ------------------- + * Every data block written to the card is acknowledged by a byte + * response token + * + * +----------------------+ + * | xxx | 0 | status | 1 | + * +----------------------+ + * 010 - OK! + * 101 - CRC Error + * 110 - Write Error + * + * Single Block Read and Write + * --------------------------- + * + * Block transfers have a byte header, followed by the data, followed + * by a 16-bit CRC. In our case, the data will always be 512 bytes. + * + * +------+---------+---------+- - - -+---------+-----------+----------+ + * | 0xFE | data[0] | data[1] | | data[n] | crc[15:8] | crc[7:0] | + * +------+---------+---------+- - - -+---------+-----------+----------+ + */ + +#include "SDFileSystem.h" + +#define SD_COMMAND_TIMEOUT 5000 + +SDFileSystem::SDFileSystem(PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name) : + FATFileSystem(name), _spi(mosi, miso, sclk), _cs(cs) { + _cs = 1; +} + +#define R1_IDLE_STATE (1 << 0) +#define R1_ERASE_RESET (1 << 1) +#define R1_ILLEGAL_COMMAND (1 << 2) +#define R1_COM_CRC_ERROR (1 << 3) +#define R1_ERASE_SEQUENCE_ERROR (1 << 4) +#define R1_ADDRESS_ERROR (1 << 5) +#define R1_PARAMETER_ERROR (1 << 6) + +// Types +// - v1.x Standard Capacity +// - v2.x Standard Capacity +// - v2.x High Capacity +// - Not recognised as an SD Card + +#define SDCARD_FAIL 0 +#define SDCARD_V1 1 +#define SDCARD_V2 2 +#define SDCARD_V2HC 3 + +int SDFileSystem::initialise_card() { + // Set to 100kHz for initialisation, and clock card with cs = 1 + _spi.frequency(100000); + _cs = 1; + for(int i=0; i<16; i++) { + _spi.write(0xFF); + } + + // send CMD0, should return with all zeros except IDLE STATE set (bit 0) + if(_cmd(0, 0) != R1_IDLE_STATE) { + fprintf(stderr, "No disk, or could not put SD card in to SPI idle state\n"); + return SDCARD_FAIL; + } + + // send CMD8 to determine whther it is ver 2.x + int r = _cmd8(); + if(r == R1_IDLE_STATE) { + return initialise_card_v2(); + } else if(r == (R1_IDLE_STATE | R1_ILLEGAL_COMMAND)) { + return initialise_card_v1(); + } else { + fprintf(stderr, "Not in idle state after sending CMD8 (not an SD card?)\n"); + return SDCARD_FAIL; + } +} + +int SDFileSystem::initialise_card_v1() { + for(int i=0; i<SD_COMMAND_TIMEOUT; i++) { + _cmd(55, 0); + if(_cmd(41, 0) == 0) { + return SDCARD_V1; + } + } + + fprintf(stderr, "Timeout waiting for v1.x card\n"); + return SDCARD_FAIL; +} + +int SDFileSystem::initialise_card_v2() { + + for(int i=0; i<SD_COMMAND_TIMEOUT; i++) { + _cmd(55, 0); + if(_cmd(41, 0) == 0) { + _cmd58(); + return SDCARD_V2; + } + } + + fprintf(stderr, "Timeout waiting for v2.x card\n"); + return SDCARD_FAIL; +} + +int SDFileSystem::disk_initialize() { + + int i = initialise_card(); +// printf("init card = %d\n", i); +// printf("OK\n"); + + _sectors = _sd_sectors(); + + // Set block length to 512 (CMD16) + if(_cmd(16, 512) != 0) { + fprintf(stderr, "Set 512-byte block timed out\n"); + return 1; + } + + // _spi.frequency(1000000); // Set to 1MHz for data transfer + _spi.frequency(5000000); // Set to 1MHz for data transfer + return 0; +} + +int SDFileSystem::disk_write(const char *buffer, int block_number) { + // set write address for single block (CMD24) + if(_cmd(24, block_number * 512) != 0) { + return 1; + } + + // send the data block + _write(buffer, 512); + return 0; +} + +int SDFileSystem::disk_read(char *buffer, int block_number) { + // set read address for single block (CMD17) + if(_cmd(17, block_number * 512) != 0) { + return 1; + } + + // receive the data + _read(buffer, 512); + return 0; +} + +int SDFileSystem::disk_status() { return 0; } +int SDFileSystem::disk_sync() { return 0; } +int SDFileSystem::disk_sectors() { return _sectors; } + +// PRIVATE FUNCTIONS + +int SDFileSystem::_cmd(int cmd, int arg) { + _cs = 0; + + // send a command + _spi.write(0x40 | cmd); + _spi.write(arg >> 24); + _spi.write(arg >> 16); + _spi.write(arg >> 8); + _spi.write(arg >> 0); + _spi.write(0x95); + + // wait for the repsonse (response[7] == 0) + for(int i=0; i<SD_COMMAND_TIMEOUT; i++) { + int response = _spi.write(0xFF); + if(!(response & 0x80)) { + _cs = 1; + _spi.write(0xFF); + return response; + } + } + _cs = 1; + _spi.write(0xFF); + return -1; // timeout +} +int SDFileSystem::_cmdx(int cmd, int arg) { + _cs = 0; + + // send a command + _spi.write(0x40 | cmd); + _spi.write(arg >> 24); + _spi.write(arg >> 16); + _spi.write(arg >> 8); + _spi.write(arg >> 0); + _spi.write(0x95); + + // wait for the repsonse (response[7] == 0) + for(int i=0; i<SD_COMMAND_TIMEOUT; i++) { + int response = _spi.write(0xFF); + if(!(response & 0x80)) { + return response; + } + } + _cs = 1; + _spi.write(0xFF); + return -1; // timeout +} + + +int SDFileSystem::_cmd58() { + _cs = 0; + int arg = 0; + + // send a command + _spi.write(0x40 | 58); + _spi.write(arg >> 24); + _spi.write(arg >> 16); + _spi.write(arg >> 8); + _spi.write(arg >> 0); + _spi.write(0x95); + + // wait for the repsonse (response[7] == 0) + for(int i=0; i<SD_COMMAND_TIMEOUT; i++) { + int response = _spi.write(0xFF); + if(!(response & 0x80)) { + int ocr = _spi.write(0xFF) << 24; + ocr |= _spi.write(0xFF) << 16; + ocr |= _spi.write(0xFF) << 8; + ocr |= _spi.write(0xFF) << 0; +// printf("OCR = 0x%08X\n", ocr); + _cs = 1; + _spi.write(0xFF); + return response; + } + } + _cs = 1; + _spi.write(0xFF); + return -1; // timeout +} + +int SDFileSystem::_cmd8() { + _cs = 0; + + // send a command + _spi.write(0x40 | 8); // CMD8 + _spi.write(0x00); // reserved + _spi.write(0x00); // reserved + _spi.write(0x01); // 3.3v + _spi.write(0xAA); // check pattern + _spi.write(0x87); // crc + + // wait for the repsonse (response[7] == 0) + for(int i=0; i<SD_COMMAND_TIMEOUT * 1000; i++) { + char response[5]; + response[0] = _spi.write(0xFF); + if(!(response[0] & 0x80)) { + for(int j=1; j<5; j++) { + response[i] = _spi.write(0xFF); + } + _cs = 1; + _spi.write(0xFF); + return response[0]; + } + } + _cs = 1; + _spi.write(0xFF); + return -1; // timeout +} + +int SDFileSystem::_read(char *buffer, int length) { + _cs = 0; + + // read until start byte (0xFF) + while(_spi.write(0xFF) != 0xFE); + + // read data + for(int i=0; i<length; i++) { + buffer[i] = _spi.write(0xFF); + } + _spi.write(0xFF); // checksum + _spi.write(0xFF); + + _cs = 1; + _spi.write(0xFF); + return 0; +} + +int SDFileSystem::_write(const char *buffer, int length) { + _cs = 0; + + // indicate start of block + _spi.write(0xFE); + + // write the data + for(int i=0; i<length; i++) { + _spi.write(buffer[i]); + } + + // write the checksum + _spi.write(0xFF); + _spi.write(0xFF); + + // check the repsonse token + if((_spi.write(0xFF) & 0x1F) != 0x05) { + _cs = 1; + _spi.write(0xFF); + return 1; + } + + // wait for write to finish + while(_spi.write(0xFF) == 0); + + _cs = 1; + _spi.write(0xFF); + return 0; +} + +static int ext_bits(char *data, int msb, int lsb) { + int bits = 0; + int size = 1 + msb - lsb; + for(int i=0; i<size; i++) { + int position = lsb + i; + int byte = 15 - (position >> 3); + int bit = position & 0x7; + int value = (data[byte] >> bit) & 1; + bits |= value << i; + } + return bits; +} + +int SDFileSystem::_sd_sectors() { + + // CMD9, Response R2 (R1 byte + 16-byte block read) + if(_cmdx(9, 0) != 0) { + fprintf(stderr, "Didn't get a response from the disk\n"); + return 0; + } + + char csd[16]; + if(_read(csd, 16) != 0) { + fprintf(stderr, "Couldn't read csd response from disk\n"); + return 0; + } + + // csd_structure : csd[127:126] + // c_size : csd[73:62] + // c_size_mult : csd[49:47] + // read_bl_len : csd[83:80] - the *maximum* read block length + + int csd_structure = ext_bits(csd, 127, 126); + int c_size = ext_bits(csd, 73, 62); + int c_size_mult = ext_bits(csd, 49, 47); + int read_bl_len = ext_bits(csd, 83, 80); + +// printf("CSD_STRUCT = %d\n", csd_structure); + + if(csd_structure != 0) { + fprintf(stderr, "This disk tastes funny! I only know about type 0 CSD structures\n"); + return 0; + } + + // memory capacity = BLOCKNR * BLOCK_LEN + // where + // BLOCKNR = (C_SIZE+1) * MULT + // MULT = 2^(C_SIZE_MULT+2) (C_SIZE_MULT < 8) + // BLOCK_LEN = 2^READ_BL_LEN, (READ_BL_LEN < 12) + + int block_len = 1 << read_bl_len; + int mult = 1 << (c_size_mult + 2); + int blocknr = (c_size + 1) * mult; + int capacity = blocknr * block_len; + + int blocks = capacity / 512; + + return blocks; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SDFileSystem.h Sat Jul 02 22:05:27 2011 +0000 @@ -0,0 +1,81 @@ +/* mbed SDFileSystem Library, for providing file access to SD cards + * Copyright (c) 2008-2010, sford + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MBED_SDFILESYSTEM_H +#define MBED_SDFILESYSTEM_H + +#include "mbed.h" +#include "FATFileSystem.h" + +/** Access the filesystem on an SD Card using SPI + * + * @code + * #include "mbed.h" + * #include "SDFileSystem.h" + * + * SDFileSystem sd(p5, p6, p7, p12, "sd"); // mosi, miso, sclk, cs + * + * int main() { + * FILE *fp = fopen("/sd/myfile.txt", "w"); + * fprintf(fp, "Hello World!\n"); + * fclose(fp); + * } + */ +class SDFileSystem : public FATFileSystem { +public: + + /** Create the File System for accessing an SD Card using SPI + * + * @param mosi SPI mosi pin connected to SD Card + * @param miso SPI miso pin conencted to SD Card + * @param sclk SPI sclk pin connected to SD Card + * @param cs DigitalOut pin used as SD Card chip select + * @param name The name used to access the virtual filesystem + */ + SDFileSystem(PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name); + virtual int disk_initialize(); + virtual int disk_write(const char *buffer, int block_number); + virtual int disk_read(char *buffer, int block_number); + virtual int disk_status(); + virtual int disk_sync(); + virtual int disk_sectors(); + +protected: + + int _cmd(int cmd, int arg); + int _cmdx(int cmd, int arg); + int _cmd8(); + int _cmd58(); + int initialise_card(); + int initialise_card_v1(); + int initialise_card_v2(); + + int _read(char *buffer, int length); + int _write(const char *buffer, int length); + int _sd_sectors(); + int _sectors; + + SPI _spi; + DigitalOut _cs; +}; + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TextLCD.lib Sat Jul 02 22:05:27 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/simon/code/TextLCD/#44f34c09bd37
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gpsrtc.cpp Sat Jul 02 22:05:27 2011 +0000 @@ -0,0 +1,370 @@ +//========================================================= +// LPC1114 Project +//========================================================= +// File Name : gpsrtc.c +// Function : GPS&RTC Control +//--------------------------------------------------------- +// Rev.01 2010.08.29 Munetomo Maruyama +//--------------------------------------------------------- +// Copyright (C) 2010-2011 Munetomo Maruyama +//========================================================= +// ---- License Information ------------------------------- +// Anyone can FREELY use this code fully or partially +// under conditions shown below. +// 1. You may use this code only for individual purpose, +// and educational purpose. +// Do not use this code for business even if partially. +// 2. You should use this code under the GNU GPL. +// 3. You should remain this header text in your codes +// including Copyright credit and License Information. +// 4. Your codes should inherit this license information. +//========================================================= +// ---- Patent Notice ------------------------------------- +// I have not cared whether this system (hw + sw) causes +// infringement on the patent, copyright, trademark, +// or trade secret rights of others. You have all +// responsibilities for determining if your designs +// and products infringe on the intellectual property +// rights of others, when you use technical information +// included in this system for your business. +//========================================================= +// ---- Disclaimers --------------------------------------- +// The function and reliability of this system are not +// guaranteed. They may cause any damages to loss of +// properties, data, money, profits, life, or business. +// By adopting this system even partially, you assume +// all responsibility for its use. +//========================================================= + +//#ifdef __USE_CMSIS +//#include "LPC11xx.h" +//#endif + +//#include "gpio.h" +#include "gpsrtc.h" +//#include "i2c.h" +//#include "systick.h +#include "type.h" +//#include "uart.h" +//#include "utility.h" +#include "mbed.h" + +Serial device(p9,p10); //tx,rx +I2C i2c(p28,p27); //sda.scl + +//====================== +// Time Zone Difference +//====================== +#define TZD (+9) // Japan + +//==================== +// RTC Device Address +//==================== +#define RTC_DEV_ADDR 0xa2 +#define RTC_WADDR 0xa2 +#define RTC_RADDR 0xa3 + +//======================= +// RTC Register Address +//======================= +#define RTC_CONTROL1 0x00 +#define RTC_CONTROL2 0x01 +#define RTC_SECONDS 0x02 +#define RTC_MINUTES 0x03 +#define RTC_HOURS 0x04 +#define RTC_DAYS 0x05 +#define RTC_WEEKDAYS 0x06 +#define RTC_C_MONTHS 0x07 +#define RTC_YEARS 0x08 +#define RTC_MINUTE_ALARM 0x09 +#define RTC_HOUR_ALARM 0x0a +#define RTC_DAY_ALARM 0x0b +#define RTC_WEEKDAY_ALARM 0x0c +#define RTC_CLKOUT_FREQ 0x0d +#define RTC_TIMER_CONTROL 0x0e +#define RTC_TIMER 0x0f + +//============ +// Globals +//============ +extern volatile unsigned int I2CCount; +//extern volatile uint8_t I2CMasterBuffer[BUFSIZE]; +//extern volatile uint8_t I2CSlaveBuffer[BUFSIZE]; +extern volatile unsigned int I2CMasterState; +extern volatile unsigned int I2CReadLength, I2CWriteLength; +// +extern volatile unsigned int UARTCount; + +//======================== +// Get Number from GPS +//======================== +unsigned char* Get_Number_from_GPS(unsigned char *pStr, + signed int *pInteger, signed int *pIntrnd, signed int *pDecimal, unsigned int *pDeclen) +{ + unsigned char ch; + signed int found_decimal; + signed int pol; + signed int decimal_1st; + + found_decimal = 0; + *pInteger = 0; + *pDecimal = 0; + *pDeclen = 0; + pol = 1; + while ((ch = *pStr++) != ',') + { + if (ch == '.') + { + found_decimal = 1; + } + else if (ch == '-') + { + pol = -1; + } + else + { + if (found_decimal == 0) + { + *pInteger = (*pInteger) * 10 + (ch - '0'); + } + else + { + *pDecimal = (*pDecimal) * 10 + (ch - '0'); + *pDeclen = *pDeclen + 1; + } + } + } + decimal_1st = (*pDeclen > 0)? *pDecimal / power(10, *pDeclen - 1) : 0; + *pIntrnd = (decimal_1st < 5)? *pInteger : *pInteger + 1; + // + *pInteger = *pInteger * pol; + *pIntrnd = *pIntrnd * pol; + *pDecimal = *pDecimal * pol; + return pStr; +} + +//=========================== +// Get_GPGGA Data from GPS +//=========================== +void Get_GPGGA_Data(sGPSRTC *pG) +{ + unsigned char ch; + unsigned char str[256]; + unsigned char *pStr; + unsigned int quit = 0; + signed int integer; + signed int intrnd; + signed int decimal; + unsigned int declen; + device.baud(9600); + + //------------------------- + // Get String after $GPGGA + //------------------------- + while(quit == 0) + { + //-------------------------- + // Retry from 1st String + //-------------------------- + while(quit == 0) + { + //---------------- + // Check "$GPGGA," + //---------------- + if (device.getc() != '$') break; + if (device.getc() != 'G') break; + if (device.getc() != 'P') break; + if (device.getc() != 'G') break; + if (device.getc() != 'G') break; + if (device.getc() != 'A') break; + if (device.getc() != ',') break; + //----------------- + // Get String + //----------------- + pStr = str; + while ((ch = device.getc()) != '\r') // LF + { + *pStr++ = ch; + } + quit = 1; + } + } + pStr = str; + //------------- + // UTC + //------------- + pStr = Get_Number_from_GPS(pStr, &integer, &intrnd, &decimal, &declen); + pG->bGPS_UTC_hour = (unsigned char) (integer / 10000); + pG->bGPS_UTC_min = (unsigned char) ((integer % 10000) / 100); + pG->bGPS_UTC_sec = (unsigned char) (integer % 100); + //--------------- + // Latitude + //--------------- + pStr = Get_Number_from_GPS(pStr, &integer, &intrnd, &decimal, &declen); + pG->bGPS_LAT_deg = (unsigned char) (integer / 100); + pG->bGPS_LAT_min = (unsigned char) (integer % 100); + pG->bGPS_LAT_sec = (unsigned char) ((60 * decimal) / power(10, declen)); + pG->cGPS_LAT = (*pStr != ',')? *pStr++ : ' '; + ch = *pStr++; // ',' + //--------------- + // Longitude + //--------------- + pStr = Get_Number_from_GPS(pStr, &integer, &intrnd, &decimal, &declen); + pG->bGPS_LNG_deg = (unsigned char) (integer / 100); + pG->bGPS_LNG_min = (unsigned char) (integer % 100); + pG->bGPS_LNG_sec = (unsigned char) ((60 * decimal) / power(10, declen)); + pG->cGPS_LNG = (*pStr != ',')? *pStr++ : ' '; + ch = *pStr++; // ',' + //-------------- + // GPS Quality + //-------------- + pG->cGPS_Quality = *pStr++; + ch = *pStr++; // ',' + //----------------- + // Satellite Count + //----------------- + pStr = Get_Number_from_GPS(pStr, &integer, &intrnd, &decimal, &declen); + pG->bGPS_Sat = (unsigned char) integer; + //----------------- + // HDOP + //----------------- + pStr = Get_Number_from_GPS(pStr, &integer, &intrnd, &decimal, &declen); + pG->bGPS_HDOP_I = (unsigned char) integer; + pG->bGPS_HDOP_D = (unsigned char) ((decimal + power(10, declen) / 2) / power(10, declen)); + //------------------------- + // Altitude above Sea Level + //------------------------- + pStr = Get_Number_from_GPS(pStr, &integer, &intrnd, &decimal, &declen); + pG->wGPS_ASL_m = intrnd; + ch = *pStr++; // 'M' + ch = *pStr++; // ',' + //------------------------- + // Geoid Separation + //------------------------- + pStr = Get_Number_from_GPS(pStr, &integer, &intrnd, &decimal, &declen); + pG->wGPS_GEO_m = intrnd; + ch = *pStr++; // 'M' + ch = *pStr++; // ',' +} + +//================== +// Initialize RTC +//================== +void Init_RTC(unsigned int do_adj, unsigned char year, unsigned char month, unsigned char day, + unsigned char week, unsigned char hour, unsigned char minute, unsigned char second) +{ + + wait(1); // wait 1000ms + // + RTC_Write_Reg(RTC_CONTROL1, 0x20); // STOP + RTC_Write_Reg(RTC_CONTROL2, 0x00); + // + RTC_Write_Reg(RTC_HOURS, BCD_INT(hour)); + RTC_Write_Reg(RTC_MINUTES, BCD_INT(minute)); + RTC_Write_Reg(RTC_SECONDS, BCD_INT(second)); + // + RTC_Write_Reg(RTC_YEARS, BCD_INT(year)); + RTC_Write_Reg(RTC_C_MONTHS, BCD_INT(month)); + RTC_Write_Reg(RTC_DAYS, BCD_INT(day)); + RTC_Write_Reg(RTC_WEEKDAYS, BCD_INT(week)); + // + RTC_Write_Reg(RTC_MINUTE_ALARM, 0x00); + RTC_Write_Reg(RTC_HOUR_ALARM, 0x00); + RTC_Write_Reg(RTC_DAY_ALARM, 0x00); + RTC_Write_Reg(RTC_WEEKDAY_ALARM, 0x00); + // + RTC_Write_Reg(RTC_CLKOUT_FREQ, 0x00); + RTC_Write_Reg(RTC_TIMER_CONTROL,0x00); + RTC_Write_Reg(RTC_TIMER, 0x00); + // + RTC_Write_Reg(RTC_CONTROL1, 0x00); // START +} + +//==================== +// Get RTC Data +//==================== +void Get_RTC_Data(sGPSRTC *psGPSRTC) +{ + psGPSRTC->bRTC_year = INT_BCD(RTC_Read_Reg(RTC_YEARS)); + psGPSRTC->bRTC_mon = INT_BCD(RTC_Read_Reg(RTC_C_MONTHS) & 0x1f); + psGPSRTC->bRTC_day = INT_BCD(RTC_Read_Reg(RTC_DAYS) & 0x3f); + psGPSRTC->bRTC_week = RTC_Read_Reg(RTC_WEEKDAYS) & 0x07; + psGPSRTC->bRTC_hour = INT_BCD(RTC_Read_Reg(RTC_HOURS) & 0x3f); + psGPSRTC->bRTC_min = INT_BCD(RTC_Read_Reg(RTC_MINUTES) & 0x7f); + psGPSRTC->bRTC_sec = INT_BCD(RTC_Read_Reg(RTC_SECONDS) & 0x7f); +} + +//=================== +// Get Week String +//=================== +unsigned char *Get_Week_String(unsigned int week) +{ + static const char *WEEK[] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"}; + + return (unsigned char*) WEEK[week]; +} + +//===================== +// RTC Write Register +//===================== +void RTC_Write_Reg(unsigned int addr, unsigned int data) +{ + char cmd[2]; + cmd[0]=addr; + cmd[1]=data; + const int addrw=0xA2; + i2c.write(addrw,cmd,2); +} + +//==================== +// RTC Read Register +//==================== +unsigned int RTC_Read_Reg(unsigned int addr) +{ + char read_buf[2]; + const int addrw=0xa2; + const int addrr=0xa3; + char write_cmd[1]; + write_cmd[0]=char(addr); + i2c.write(addrw,write_cmd,1); + wait(0.01); + i2c.read(addrr,read_buf,1); + // + return read_buf[0]; +} + +//===================== +// BCD from Integer +//===================== +unsigned char BCD_INT(unsigned char num) +{ + return ((num / 10) << 4) + (num % 10); +} + +//======================== +// Calculate x^n +//======================== +signed int power(signed int x, signed int n) +{ + unsigned int i; + signed int y; + + y = 1; + for (i = 0; i < n; i++) + { + y = y * x; + } + return y; +} + +//===================== +// Integer from BCD +//===================== +unsigned char INT_BCD(unsigned char bcd) +{ + return (((bcd >> 4) * 10) + (bcd & 0x0f)); +} + +//========================================================= +// End of Program +//=========================================================
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gpsrtc.h Sat Jul 02 22:05:27 2011 +0000 @@ -0,0 +1,103 @@ +//========================================================= +// LPC1114 Project +//========================================================= +// File Name : gpsrtc.h +// Function : GPS&RTC Control Header +//--------------------------------------------------------- +// Rev.01 2010.08.29 Munetomo Maruyama +//--------------------------------------------------------- +// Copyright (C) 2010-2011 Munetomo Maruyama +//========================================================= +// ---- License Information ------------------------------- +// Anyone can FREELY use this code fully or partially +// under conditions shown below. +// 1. You may use this code only for individual purpose, +// and educational purpose. +// Do not use this code for business even if partially. +// 2. You should use this code under the GNU GPL. +// 3. You should remain this header text in your codes +// including Copyright credit and License Information. +// 4. Your codes should inherit this license information. +//========================================================= +// ---- Patent Notice ------------------------------------- +// I have not cared whether this system (hw + sw) causes +// infringement on the patent, copyright, trademark, +// or trade secret rights of others. You have all +// responsibilities for determining if your designs +// and products infringe on the intellectual property +// rights of others, when you use technical information +// included in this system for your business. +//========================================================= +// ---- Disclaimers --------------------------------------- +// The function and reliability of this system are not +// guaranteed. They may cause any damages to loss of +// properties, data, money, profits, life, or business. +// By adopting this system even partially, you assume +// all responsibility for its use. +//========================================================= + +#ifndef __GPSRTC_H__ +#define __GPSRTC_H__ + +//#include <type.h> + +//============= +// GPSRTC Data +//============= +typedef struct +{ + unsigned char bGPS_UTC_hour; // UTC hour + unsigned char bGPS_UTC_min; // UTC minute + unsigned char bGPS_UTC_sec; // UTC second + unsigned char cGPS_LAT; // Latitude N or S + unsigned char bGPS_LAT_deg; // Latitude degree + unsigned char bGPS_LAT_min; // Latitude minute + unsigned char bGPS_LAT_sec; // Latitude second + unsigned char cGPS_LNG; // Longitude E or W + unsigned char bGPS_LNG_deg; // Longitude degree + unsigned char bGPS_LNG_min; // Longitude minute + unsigned char bGPS_LNG_sec; // Longitude second + unsigned char cGPS_Quality; // GPS Quality (0:Invalid, 1: SPS, 2:D-GPS) + unsigned char bGPS_Sat; // Satellite Count + unsigned char bGPS_HDOP_I; // Horizontal Dilution of Precision, Integer + unsigned char bGPS_HDOP_D; // Horizontal Dilution of Precision, Decimal + signed int wGPS_ASL_m; // Altitude above Sea Level in meter + signed int wGPS_GEO_m; // Geoid Separation in meter + // + unsigned char bRTC_year; // RTC year + unsigned char bRTC_mon; // RTC month + unsigned char bRTC_day; // RTC day + unsigned char bRTC_week; // RTC week + unsigned char bRTC_hour; // RTC hour + unsigned char bRTC_min; // RTC minute + unsigned char bRTC_sec; // RTC second +} sGPSRTC; + +//=================== +// Define Weekdays +//=================== +enum WEEK {SUN = 0, MON, TUE, WED, THU, FRI, SAT}; + +//============= +// Prototypes +//============= +unsigned char* Get_Number_from_GPS(unsigned char *pStr, + signed int *pInteger, signed int *pIntrnd, signed int *pDecimal, unsigned int *pDeclen); +void Get_GPGGA_Data(sGPSRTC *pG); +// +void Init_RTC(unsigned int do_adj, unsigned char year, unsigned char month, unsigned char day, + unsigned char week, unsigned char hour, unsigned char minute, unsigned char second); +void Get_RTC_Data(sGPSRTC *psGPSRTC); +unsigned char *Get_Week_String(unsigned int week); +// +void RTC_Write_Reg(unsigned int addr, unsigned int data); +unsigned int RTC_Read_Reg(unsigned int addr); +unsigned char BCD_INT(unsigned char num); +signed int power(signed int x, signed int n); +unsigned char INT_BCD(unsigned char bcd); + +#endif // __GPSRTC_H__ + +//========================================================= +// End of Program +//========================================================= \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imagedata.h Sat Jul 02 22:05:27 2011 +0000 @@ -0,0 +1,2061 @@ +//--------------- +// Image data +// Date: 2011/06/05 +// Author : Yuji Notsu +// Image size : 0x80 (128) x 0x80(128) +// Color depth : 32bit color /pixel +//--------------- +//Takoruka image from : http://blog.hangame.co.jp/alicecosan/category/0/ +// + +const unsigned int Header1[16386]={ +0x0080,0x0080, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFDF,0xEF7D,0xE73C,0xDEDB,0xDEDB, +0xDEFB,0xDEFB,0xDEFB,0xDEFB,0xDEFB,0xE6FC,0xE71C,0xE73C, +0xF79E,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF79E,0xDEDB, +0xD69A,0xD69A,0xDEBB,0xC5F8,0xA4F4,0x8C11,0x62CC,0x6ACD, +0x732E,0x7B2F,0x7B0F,0x72EE,0x7B0F,0x7B50,0x8390,0x8BF1, +0xAD15,0xC5F8,0xD69A,0xCE79,0xD6BA,0xE73C,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xD6DA,0xBDF7,0xBDD7,0xA4F4,0x83B0, +0x7B4F,0x8370,0x9BD3,0xC4D8,0xFE3F,0xFEFF,0xFF3F,0xFF1F, +0xFEDF,0xFF1F,0xFF1F,0xFF1F,0xFF1F,0xFEFF,0xFEFF,0xFE5F, +0xD51A,0xABF4,0x7ACF,0x6A8D,0x730E,0x8C31,0xB576,0xBDF7, +0xD6DA,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xEF9D,0xB5B6,0x9CD3,0x83B0,0x6AAC,0x7B2F,0xC4B8,0xFE1F, +0xEE1E,0xDDDC,0xCD9A,0xC557,0xBCF5,0xB4B5,0xB454,0xBC94, +0xDD79,0xC4B5,0xBCB5,0xBCD5,0xC538,0xC518,0xCD5B,0xE5DE, +0xFE9F,0xFF1F,0xFF3F,0xFF1F,0xFE7F,0xCCD9,0x7B0F,0x5A4B, +0x732E,0x9CD3,0xBDD7,0xEF7D,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFDF,0xB596, +0x9452,0x6ACD,0x8370,0xE59C,0xEE1E,0xC599,0xBCD5,0xA3D1, +0x936D,0xA3ED,0x82A5,0x61C0,0x5960,0x4920,0x6A22,0x93A4, +0x9BA4,0x69C0,0x61A0,0x5980,0x7AC4,0x9369,0x6A47,0x8B2D, +0xA3D1,0xAC74,0xB4B7,0xD55B,0xFE5F,0xFEFF,0xFEFF,0xFEBF, +0xC4D8,0x72EE,0x628C,0x7BCF,0x9CF3,0xE73C,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xC659,0x9452,0x93D2, +0xAC55,0xEDFD,0xBD37,0x9C11,0x72AA,0x3901,0x2060,0x30A0, +0x6A41,0xAC28,0xA3A6,0x82A4,0x8AA4,0x7A63,0xABEA,0xAC4B, +0x69C0,0x69E0,0x7220,0x7A40,0x8AC1,0xD52A,0xAB20,0x9280, +0x71E0,0x5960,0x6A44,0x93AE,0xA453,0xAC97,0xEDDE,0xFEBF, +0xFEDF,0xFEDF,0xEDDD,0x8B91,0x626C,0x7B8F,0x8C91,0xEF7D, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xAD55,0xA454,0x9392,0xAC55, +0x734E,0x49C9,0x20C4,0x3123,0x6A67,0x82CA,0x934D,0x93AF, +0x9BCF,0xA433,0xAC76,0xA457,0xA457,0x9C36,0x8BB3,0x7B50, +0x8391,0x836F,0x8B50,0x8B4E,0x82ED,0x938C,0x8B29,0x59A0, +0x61C0,0x8AC0,0xC465,0xC466,0x8B02,0x7243,0x8B2B,0x93D1, +0xCD19,0xFEBF,0xFEDF,0xFEDF,0xFE5F,0xA414,0x7AEE,0x6B2D, +0x7C2F,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFEFF,0xFF5F,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0x8C31,0x72EE,0x6A6D,0x8B91,0x628C, +0x628C,0x8390,0xA454,0xBCD7,0xCD3A,0xE5BD,0xFE3F,0xFEBF, +0xFEBF,0xFEBF,0xFE9F,0xFE9F,0xFE9F,0xFEBF,0xFEBF,0xFEDF, +0xFEDF,0xFEDF,0xFE9F,0xFE5F,0xFE3F,0xD57C,0xB498,0x8BF3, +0x8BB1,0x9BD0,0x832A,0x59C1,0x61A0,0x92A0,0x8240,0x8B04, +0x8309,0x6AED,0xBCD9,0xFEDF,0xFE7F,0xFEBF,0xFEBF,0x93D2, +0x626C,0x630B,0xAD95,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFCDF,0xFD1F,0xFFDF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xDEFB,0x528A,0x3947,0xBC97,0x9C13,0xA454,0xE59C, +0xFE7F,0xFEDF,0xFEBF,0xFE9F,0xFE7F,0xFE5F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE1F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE7F,0xFE9F,0xFEBF, +0xFEBF,0xF61F,0xBCD8,0x9BF4,0x7B0E,0x59C4,0x4920,0x9B01, +0xD529,0x7240,0x59C5,0x5AAE,0xEDFF,0xFEDF,0xFE3F,0xFEDF, +0xFE3F,0x8370,0x6ACD,0x73CE,0xEF7D,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFC9F,0xFB1F,0xFF1F, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xBE17, +0x4A69,0x7B4F,0x9BF3,0xC559,0xF5FE,0xFEBF,0xFE9F,0xFE5F, +0xFE3F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE1F, +0xFE3F,0xFE5F,0xFE7F,0xFEBF,0xFE3F,0xC518,0x9BD2,0x59C6, +0x6AA5,0x9B22,0x9AE0,0x7A40,0x6269,0x8BB4,0xFF3F,0xFE3F, +0xFE3F,0xFEDF,0xDD5A,0x8B31,0x52CB,0xBDF7,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFCFF,0xFBBF,0xFC3F, +0xFD9F,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xBE17,0x52AA,0x9C13, +0xA434,0xCD19,0xFEFF,0xFE9F,0xFE3F,0xFE1F,0xFE1F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFE5F,0xFE9F,0xFE7F,0xD57B, +0xB476,0x626A,0x20C0,0xAC06,0xC486,0x7243,0x4209,0xFEDF, +0xFE9F,0xFE1F,0xFE7F,0xFE5F,0xA454,0x49E8,0x9CF3,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFCFF,0xFCDF,0xFE9F, +0xFD1F,0xFBDF,0xFF9F,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x52AA,0x9472,0xB4B6,0xEDBD, +0xFE9F,0xFE7F,0xFE3F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE7F, +0xFE7F,0xDDBC,0xB497,0x5209,0x2900,0xA320,0x8260,0x41A6, +0xDD9E,0xFEDF,0xFE1F,0xFE5F,0xFE9F,0xB4D6,0x41A8,0x8C71, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFD7F,0xFC7F,0xFF9F, +0xFFDF,0xFD7F,0xFBBF,0xFF7F,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xC5F8,0x5ACB,0xB5B6,0xEF5D,0xFFDF,0xFDFF, +0xFE3F,0xFE1F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE7F,0xFE9F,0xDDDB,0xAC57,0x0820,0x8240,0xA300, +0x8B8B,0xBCD9,0xFF1F,0xFE1F,0xFE3F,0xFE9F,0xBCF7,0x41A7, +0x94F2,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFE1F,0xFC1F,0xFEDF, +0xFFFF,0xFF1F,0xFC5F,0xFF7F,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0x8C51,0x8C31,0xCE79,0xFFFF,0xFFFF,0xFFFF,0xFEDF, +0xFDFF,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE7F,0xFE7F,0xDE1C,0x51E9,0x3040, +0xFF71,0x40C0,0xB4B9,0xFF3F,0xFE1F,0xFE3F,0xFE9F,0xBD17, +0x41C8,0x9D33,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFE9F,0xFBBF,0xFE7F, +0xFFFF,0xFF9F,0xFF9F,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0x8410,0xAD75,0xF79E,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFDDF,0xFE3F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE7F,0xF6BF,0x72AF, +0x4A22,0xE4A5,0x40E0,0x93D4,0xFF1F,0xFE1F,0xFE3F,0xFE9F, +0xBCD7,0x4208,0xAD95,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFF3F,0xFBDF,0xFE5F, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x736E, +0xAD75,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFE5F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFE5F,0xFF1F, +0x6A8F,0x3140,0xFFF4,0x7329,0xCD39,0xFE9F,0xFE1F,0xFE3F, +0xFEBF,0xA454,0x4A29,0xD6BA,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFBFF,0xFE1F, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x7BAE,0xA535, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFEDF,0xFDFF,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFE3F, +0xFF1F,0x5A0C,0x38A0,0xCC23,0x3964,0xFE7F,0xFE5F,0xFE3F, +0xFE3F,0xFEDF,0x8BB1,0x62EC,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFF9F,0xFEDF,0xFBBF,0xFDDF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x8C31,0x8C51,0xFFDF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFEFF,0xFDFF,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFF3F,0x20A3,0x9280,0x92A0,0x3167,0xFF7F,0xFE1F, +0xFE3F,0xFE3F,0xFEDF,0x6AAD,0x7BEF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFF7F,0xFBDF,0xFA1F,0xFADF,0xFABF,0xFD9F, +0xFFDF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xCE19,0x7B8F,0xCE79,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFEBF,0xFDFF,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE5F,0xFEDF,0x0000,0xBB40,0x61C1,0x8352,0xFF1F, +0xFE1F,0xFE3F,0xFE5F,0xFE7F,0x49C9,0x8450,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFF5F,0xFDDF,0xFF3F,0xFD7F,0xFB1F,0xFAFF,0xFD3F, +0xFFBF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x736E,0x9492,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFE3F,0xFE1F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE1F,0xFE7F,0xF5FF,0x2060,0xAB20,0x4A29,0xFE3F, +0xFE5F,0xFE3F,0xFE1F,0xFEBF,0xAC96,0x41E8,0xBE17,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFE5F,0xFC7F,0xFD7F,0xFBDF,0xFB5F,0xFADF,0xFD1F, +0xFFBF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0x83D0,0x8C31,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFDDE,0xFE3F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xF67F,0x830F,0x8AA0,0xAC8C,0x5A6D, +0xFF1F,0xFE1F,0xFE3F,0xFE1F,0xFF1F,0x5A2B,0x8450,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFEDF,0xFB7F,0xFABF,0xFB3F,0xFB3F,0xFADF,0xFE9F, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xDEBB,0x83F0,0xC618,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFF1F, +0xFDDF,0xFE3F,0xFE1F,0xFE3F,0xFE3F,0xFE1F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE5F,0xE63C,0x4140,0xD54B,0x30E6, +0xFE5F,0xFE5F,0xFE3F,0xFE3F,0xFE7F,0xD55A,0x524A,0xBE17, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFBF,0xFD1F,0xFADF,0xFB1F,0xFB9F,0xFF1F,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFBF,0xFFBF,0xFFBF,0xFFDF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0x8410,0x7BAE,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFDDF, +0xFE3F,0xFE1F,0xFE1F,0xFE1F,0xFE1F,0xFE3F,0xFE1F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xF61E,0xA3F0,0xBC46,0x5161, +0x8393,0xFEDF,0xFE3F,0xFE3F,0xFE1F,0xFEFF,0x624C,0x9492, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFDF,0xFEBF,0xFF3F,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFD5F,0xFCDF,0xFD3F,0xFD5F,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xBDF7,0x83D0,0xF75E,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFEBF,0xFE1F, +0xFE1F,0xFE1F,0xFEFF,0xFF3F,0xFE3F,0xFE1F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFE7F,0xEDFC,0x6A62,0x8A80, +0x3988,0xFEDF,0xFE3F,0xFE3F,0xFE3F,0xFE7F,0xDD7B,0x5229, +0xC658,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFF5F,0xFF5F,0xFFBF,0xFC3F,0xFE9F, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xA4F4,0x8370,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFEFF,0xFDDF,0xFE3F, +0xFE1F,0xFE9F,0xFFFF,0xFFFF,0xFEDF,0xFDFF,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFE1F,0xFE1F,0xFE1F, +0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xEDDD,0x9BD0,0xCD0A, +0x6227,0xC4D9,0xFE9F,0xFE3F,0xFE3F,0xFE1F,0xFF1F,0x520A, +0xA514,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFCBF,0xFF1F, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xDEFB,0x9452,0xDD3B,0xFF1F,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFDF,0xFEBF,0xFDFF,0xFE3F,0xFE3F, +0xFE1F,0xFE9F,0xFFDF,0xFF7F,0xF5FE,0xFE1F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFE1F,0xFE1F,0xFE1F,0xFE1F, +0xFE1F,0xFE1F,0xFE1F,0xFE1F,0xFE1F,0xFE1F,0xFE1F,0xFE1F, +0xFE1F,0xFE1F,0xFE1F,0xFE1F,0xFE1F,0xFE1F,0xFE1F,0xFE1F, +0xFE1F,0xF5FE,0xF5FE,0xFE3F,0xFE3F,0xFE5F,0xFE5F,0xFE5F, +0xFE5F,0xFE5F,0xFE3F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE1F,0xFE3F,0xFE3F,0xFE5F,0xB475,0x6A40, +0xB48B,0x62AE,0xFEFF,0xFE1F,0xFE3F,0xFE1F,0xFE7F,0xD51A, +0x732E,0xDEFB,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFB5F,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xBDF7,0x8370,0xFEBF,0xFE3F,0xFF3F,0xFFDF,0xFFFF,0xFFFF, +0xFFDF,0xFFBF,0xFF5F,0xFE5F,0xFDFF,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE1F,0xFE7F,0xFE1F,0xDD3A,0xEDBD,0xFE5F,0xFE3F, +0xFE3F,0xFE5F,0xFEBF,0xFEBF,0xFEBF,0xFE9F,0xFE9F,0xFE9F, +0xFE7F,0xFE7F,0xFE5F,0xFE5F,0xFE3F,0xFE5F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE5F,0xFE5F,0xFE5F,0xFE7F,0xFE7F, +0xFEBF,0xE61C,0xDDFB,0xFEFF,0xFEFF,0xFF1F,0xFF1F,0xFEDF, +0xFEBF,0xFE3F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFE1F,0xFE7F,0xCD79,0x4960, +0x8280,0x5A6B,0xFEBF,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFEBF, +0x41A8,0xC638,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFB7F,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xB596,0xAC15,0xFE9F,0xFDFF,0xFDFF,0xFEBF,0xFF1F,0xFF1F, +0xFEFF,0xFE5F,0xFDDF,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xF5BD,0xCC76,0xC4D8,0xFE7F,0xFE1F, +0xFE3F,0xFE3F,0xFE7F,0xFEFF,0xFF5F,0xFF7F,0xFF9F,0xFFBF, +0xFFBF,0xFF9F,0xFF9F,0xFF9F,0xFF9F,0xFF7F,0xFF5F,0xFF5F, +0xFF5F,0xFF5F,0xFF7F,0xFF9F,0xFF9F,0xFFBF,0xFFDF,0xFFDF, +0xFFBF,0xDEBB,0xD65A,0xFF5F,0xFEBF,0xFE3F,0xFE1F,0xFE1F, +0xFE1F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xDD3A,0xFE3F,0xFE5F,0xE5DD,0x7AAA, +0x71C0,0x6228,0xDD7C,0xFE7F,0xFE3F,0xFE3F,0xFE1F,0xFEFF, +0x51EA,0xAD75,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFB5F,0xFFBF, +0xFFDF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xD6BA, +0x83D0,0xF61E,0xFE7F,0xE59C,0xE59C,0xFE1F,0xFDFF,0xFDFF, +0xFDFF,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xD497,0xC435,0x9BD3,0xFEBF,0xFE1E, +0xFE3F,0xFE3F,0xFE1F,0xFDFF,0xFDDF,0xFDDF,0xFE1F,0xFE5F, +0xFE7F,0xFEBF,0xFEFF,0xFF1F,0xFF5F,0xFF5F,0xFF5F,0xFF7F, +0xFF5F,0xFF5F,0xFF5F,0xFF3F,0xFEFE,0xFEDF,0xFEDF,0xFE9F, +0xF5FD,0xCCB9,0xED9D,0xFE1F,0xFDFF,0xFE1F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xF5BD,0xBC97,0xFE5F,0xFE3F,0xFE5F,0x9BD3, +0x5160,0x8B27,0x9C15,0xFEBF,0xFE3F,0xFE3F,0xFE1F,0xFE7F, +0xCCF9,0x7B8F,0xE73C,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFD5F,0xFDBF, +0xFDDF,0xFEFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xC618, +0x6ACD,0xFEDF,0xFE5F,0xDD7B,0xDD5B,0xFE5F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE5F,0xE53A,0xCC55,0xC435,0x6AAD,0xFEDF,0xFE1E, +0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFE1F, +0xFE1F,0xFDFF,0xFDFF,0xFDFF,0xFDFF,0xFDFF,0xFDFF,0xFE1F, +0xFDFF,0xFDFF,0xFDFF,0xFDFF,0xE4FA,0xF5BE,0xFE1F,0xFE3F, +0xDD3A,0xB436,0xFE7F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE7F,0xCC97,0xC4B8,0xFE3F,0xFE1F,0xFE9F,0xB4B7, +0x51E2,0xAC49,0x6ACE,0xFEFF,0xFE1F,0xFE3F,0xFE3F,0xFE3F, +0xFEBF,0x41A8,0xD69A,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFE7F, +0xFDFF,0xFEFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xB5B6, +0x9392,0xFE9F,0xFE5F,0xDD7B,0xD53A,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE1E,0xC456,0xCC77,0x9351,0x6A8A,0xF5FE,0xFE3F, +0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE1E,0xC456,0xFE5F,0xFE3F,0xFE5F, +0xCCD8,0x9351,0xFE5F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE7F,0x9B51,0xCCD8,0xFE3F,0xFE1F,0xFE9F,0xBCF8, +0x6266,0xA3C7,0x626C,0xFEFF,0xFE1F,0xFE3F,0xFE3F,0xFE1F, +0xFF1F,0x3927,0xC618,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE73C,0x8C51, +0xDD5B,0xFE5F,0xFE5F,0xD55A,0xCD19,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE5F,0xDD1A,0xC436,0xC436,0x7AEB,0xAC0D,0xAC35,0xFE7F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xED9C,0xC435,0xFE7F,0xFE3F,0xFE5F, +0xC476,0x728D,0xDD7B,0xFE7F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0x8ACE,0xC4D8,0xFE3F,0xFE1F,0xFE7F,0xD57B, +0x72A9,0x7A40,0x6A6B,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFEBF,0x8B51,0x9CB3,0xF7DE,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xD6BA,0x6B2D, +0xFE9F,0xFE3F,0xFE5F,0xCD39,0xCCD8,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xC456,0xCC76,0x9330,0xC48F,0xD4F0,0x6A8D,0xFEBF, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE5F,0xD4B8,0xD4D8,0xFE7F,0xFE3F,0xFDFE, +0xBC34,0x72AB,0xBCD6,0xFE9F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE5F,0xED7C,0x8AEE,0xCCF9,0xFE3F,0xFE1F,0xFE5F,0xE5BD, +0x8B4D,0x7240,0x6A28,0xDD9C,0xFE7F,0xFE3F,0xFE3F,0xFE3F, +0xFE7F,0xE57C,0x5ACB,0xE75C,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xD69A,0x6B0D, +0xFEDF,0xFE1F,0xFE7F,0xCD19,0xC4B8,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE5F, +0xE57B,0xC435,0xD497,0x49A7,0xFE54,0xE551,0x728A,0xE5BD, +0xFE5F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xC414,0xED9C,0xFE5F,0xFE1F,0xE53B, +0xABB1,0x830A,0xBC94,0xFE5F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE9F,0xD4B8,0x7ACD,0xE57C,0xFE3F,0xFE3F,0xFE5F,0xEDFE, +0x9BD0,0x8303,0x8B0A,0xBCD9,0xFE9F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFEBF,0x3166,0xDEFB,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xCE79,0x62AC, +0xFEDF,0xFE1F,0xFE5F,0xC4F8,0xBC97,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE7F, +0xCC77,0xCC56,0xA392,0x6AA8,0xFE75,0xFDB2,0xABCD,0x93B2, +0xFEDF,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE5F,0xED9C,0xAB92,0xFE3F,0xFE3F,0xFE1E,0xC457, +0x9B4F,0xC46E,0xBC73,0xEDDE,0xFE5F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE5F,0xCC35,0x5A0A,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0x9BD2,0x6A41,0xA3EB,0xA436,0xFE9F,0xFE3F,0xFE3F,0xFE3F, +0xFE1F,0xFF1F,0x3947,0xE71C,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xCE59,0x626C, +0xFEDF,0xFE1F,0xFE5F,0xCCF9,0xB476,0xF5FE,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE1F, +0xC415,0xD497,0x49A9,0xED51,0xFDF3,0xFDF3,0xCCCF,0x628B, +0xFE9F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE7F,0xCC77,0x9B51,0xFE9F,0xFE5F,0xF5BD,0xB3D4, +0x9B8E,0xFDB2,0xBC51,0xB498,0xFE7F,0xFE1F,0xFE1F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE5F, +0xED9C,0xCC35,0x49A8,0xFE5F,0xFE3F,0xFE3F,0xFE3F,0xFE9F, +0xAC55,0x4920,0x7A83,0x8BB4,0xFEBF,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFEDF,0x72AE,0xCE59,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xD69A,0x7AEF, +0xFEDF,0xFE1F,0xFE5F,0xD53A,0xAC35,0xE57C,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFE7F,0xE55A, +0xC415,0xD498,0x20E3,0xFE95,0xFDB3,0xFE15,0xED72,0x8B4C, +0xC4D8,0xFE9F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xF61E,0xB3D3,0x9BB3,0xFEBF,0xFE3F,0xE55B,0xABB2, +0xAC0E,0xFF58,0xBCB1,0xA475,0xFF5F,0xFEDF,0xFEDF,0xFEDF, +0xFEDF,0xFEBF,0xFE7F,0xFE3F,0xFE1F,0xFE1F,0xFE3F,0xFE9F, +0xCC97,0xCC76,0x49A8,0xFE7F,0xFE3F,0xFE3F,0xFE3F,0xFE9F, +0xAC95,0x5980,0x8B03,0x8BD2,0xFEBF,0xFE3F,0xFE3F,0xFE3F, +0xFE1F,0xFE7F,0xC4B9,0x9CD3,0xFFDF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xD69A,0x8B51, +0xFEBF,0xFE3F,0xFE3F,0xF5DD,0xAC35,0xCCD8,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE9F,0xCC77, +0xCC76,0x9B51,0x7AE9,0xFE54,0xFDD3,0xFE98,0xFE14,0xB44E, +0x6ACE,0xFEFF,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE1F, +0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE9F,0xDCD8,0x724C,0xDD3A,0xFE9F,0xFE1E,0xCC77,0x932F, +0x6AA8,0x5A47,0x18A2,0x3146,0x7B2F,0x72CE,0x6AAD,0x6AAD, +0x6AAE,0x93D3,0xD53A,0xFEBF,0xFEFF,0xFEBF,0xFE5F,0xFE5F, +0xC3F4,0xC435,0x5A0A,0xFEBF,0xFE3F,0xFE3F,0xFE3F,0xFE9F, +0xB4B5,0x8306,0x9BC8,0x72EE,0xFEDF,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0x6B6D,0xF79E,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xC5F8,0x9392, +0xFEBF,0xFE1F,0xFE3F,0xFE1F,0xA414,0xBC76,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xC415, +0xD4B8,0x4188,0xED30,0xFDD3,0xFE15,0xFF5B,0xFE97,0xDCEF, +0x8B4D,0xD55B,0xFE7F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xF5FE, +0xEDBC,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE1F,0xD456,0x28E5,0xFEDF,0xFE5F,0xFE1E,0xABB3,0x5A29, +0xA3CC,0xD511,0xAC4D,0x9BB1,0xE5DD,0xEE1D,0xE5FC,0xE5FC, +0xEDFD,0xCD1A,0x93B2,0x5A6C,0x626C,0x8330,0xFEBF,0xFDDD, +0xD476,0x82CE,0x9B92,0xFE9F,0xFE3F,0xFE3F,0xFE3F,0xFE7F, +0xC518,0x82E6,0x7240,0x72EE,0xFEDF,0xFE1F,0xFE3F,0xFE3F, +0xFE1F,0xFE3F,0xFE9F,0x5AAB,0xEF9D,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xBDB7,0x9372, +0xFEBF,0xFE1F,0xFE3F,0xFE5F,0xA414,0xAC15,0xFE1E,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE5F,0xEDBC,0xC414, +0xF53B,0x18C2,0xFF58,0xFE75,0xFF9A,0xFFFE,0xFF9C,0xFE75, +0xAC0D,0x6ACE,0xFEFF,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xF5FE, +0xE53A,0xF5FE,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFEBF, +0xD4B8,0xB3D4,0x3125,0xFEFF,0xFE3F,0xE53B,0xA372,0x832A, +0xFE96,0xFE76,0xF592,0xABF0,0xCD3A,0xFE9F,0xFE5F,0xFE5F, +0xFE5F,0xFE5F,0xF63E,0xEE1D,0xEE3E,0xF5FE,0x8B71,0x51C9, +0xB3D4,0x49A8,0xED9C,0xFE5F,0xFE1F,0xFE3F,0xFE3F,0xFE7F, +0xCD19,0xA42D,0x9BC7,0x726D,0xFE7F,0xFE1F,0xFE1F,0xFE3F, +0xFE3F,0xFE1F,0xFEFF,0x41A8,0xEF7D,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xBDF7,0x9371, +0xFEBF,0xFE1F,0xFE3F,0xFE9F,0xA414,0x9BD3,0xF5FE,0xFE3F, +0xFE3F,0xFE3F,0xFE1F,0xFE1F,0xFE1F,0xFEDF,0xFDBD,0xDCB8, +0x82EE,0x0000,0x7288,0x4185,0x4A28,0x734C,0x8BEE,0xCD32, +0xDCCE,0x936D,0xBCD8,0xFE9F,0xFE3F,0xFE3F,0xFE3F,0xF5FE, +0xD4D8,0xF5FD,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE5F,0xFE1E, +0xCC36,0x6A4B,0x8B6E,0xFEBF,0xFE5F,0xB3D4,0x6A6B,0xF592, +0xFE76,0xFEB8,0xFE35,0xA3CE,0xA435,0xFE9F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE7F,0xFE1E,0xC415, +0xD477,0x49A8,0xFE7F,0xFE3F,0xFE1F,0xFE3F,0xFE1F,0xFE7F, +0xD55B,0xA3CB,0xB446,0x93D0,0xF5FE,0xFE5F,0xFE3F,0xFE3F, +0xFE3F,0xFE1F,0xFEFF,0x51A9,0xEF7D,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xBDD7,0x82F0, +0xFEDF,0xFE3F,0xFE1F,0xFE7F,0xC4F8,0x9371,0xDD3A,0xFE3F, +0xFE3F,0xFE1F,0xFE3F,0xFE7F,0xFF3F,0xBCB7,0x3947,0x49C8, +0x4989,0xC46E,0xFE75,0xFEB7,0xFFFE,0xFFFD,0xFFDD,0xFF5B, +0xFE96,0xA3CB,0x72CE,0xFEBF,0xFE3F,0xFE3F,0xFE3F,0xF61E, +0xCC76,0xEDDD,0xFE5F,0xFE3F,0xFE3F,0xFE1F,0xFEBF,0xCC76, +0xDCB9,0x3985,0xAC52,0xFEBF,0xED5B,0xAB93,0x6268,0xFEB6, +0xFEF9,0xFF3A,0xFE76,0x938C,0x9BF3,0xFEBF,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFE3F,0xFE9F,0xD4B7,0xC436, +0xD497,0x624B,0xFEBF,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE7F, +0xD57B,0x8B08,0x8260,0x72EC,0xE5BD,0xFE5F,0xFE3F,0xFE3F, +0xFE3F,0xFE1F,0xFEDF,0x620C,0xDF1B,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xD67A,0x72AE, +0xFEDF,0xFE3F,0xFE1F,0xFE5F,0xEDDD,0x8330,0xBC97,0xFE5F, +0xFE3F,0xFE1F,0xFE9F,0xC4D8,0x5A2B,0xBCB7,0xE4F9,0xFD5B, +0x3127,0xFDB2,0xFDB3,0xFF19,0xFF9C,0xFF7B,0xFF5B,0xFF7C, +0xFEF9,0xFDF3,0x9B8C,0x8BD3,0xFEFF,0xFE1F,0xFE3F,0xFE1F, +0xC456,0xED7C,0xFE5F,0xFE3F,0xFE1F,0xFE5F,0xF5DD,0xCC56, +0x6A6D,0xBC6D,0x93B2,0xFEFF,0xBBF5,0x4187,0xFDD3,0xFE56, +0xFF9C,0xFF5B,0xFEB7,0xABCC,0xA3D2,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xBBF4,0xDCB8, +0x59EA,0xDD3A,0xFE7F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE5F, +0xE5DC,0x5A4C,0x0020,0x49A7,0xD55A,0xFE7F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFEBF,0xA3D4,0xAD54,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xC638,0x51CA, +0xFEFF,0xFE1F,0xFE1F,0xFE3F,0xFEBF,0x7B0F,0xABF4,0xFE5F, +0xFE3F,0xFE5F,0xDD5B,0xDD3B,0xFEFF,0xFE9F,0xC435,0xDCB9, +0x0862,0xFED6,0xFDB3,0xFF7C,0xFF7B,0xFF5B,0xFF7B,0xFF7B, +0xFF7C,0xFED8,0xCC6D,0x936E,0xE5BD,0xFE5F,0xFE3F,0xFE5F, +0xCC76,0xDD19,0xFE3F,0xFE3F,0xFE3F,0xFE9F,0xC415,0xF53A, +0x0000,0xFF98,0x6A8D,0xFE1F,0x9B31,0x830A,0xFE75,0xFE76, +0xFF9C,0xFF7C,0xFED8,0xDCCF,0xA3B0,0xE57C,0xFE5F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFE9F,0xDCF9,0xC435,0xE4F9, +0x28E4,0xFEBF,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFEBF, +0xB4B5,0x2080,0x3941,0x20E5,0xC539,0xFEBF,0xFE1F,0xFE3F, +0xFE3F,0xFE1F,0xFE7F,0xDD3B,0x5AEB,0xFFDF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xCE59,0x5A4A, +0xFEFF,0xFE1F,0xFE1F,0xFE3F,0xFE9F,0x93B2,0x8B50,0xF5DD, +0xFE5F,0xFE3F,0xFE5F,0xFE5F,0xFE5F,0xF5DD,0xC456,0xABD4, +0x6226,0xFE55,0xFE36,0xFFBC,0xFF5B,0xFF7B,0xFF7B,0xFF7B, +0xFF7C,0xFF5B,0xFEF8,0x9BAA,0x93F1,0xFEBF,0xFE3F,0xFE5F, +0xCC97,0xD497,0xFE1F,0xFE3F,0xFE7F,0xE55B,0xCC76,0x82D0, +0xA3CB,0xFE75,0x6A8F,0xDCD9,0x51C8,0xFE74,0xFDF4,0xFF7B, +0xFF7C,0xFF9C,0xFF19,0xFDD3,0xABCF,0xBC77,0xFE5F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE5F,0xBC15,0xCC56,0xCC56, +0x5A0A,0xFEBF,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE7F,0xD59B, +0x6227,0xAB20,0x51A0,0x10A1,0x7B2E,0xE5BD,0xFE7F,0xFE3F, +0xFE3F,0xFE1F,0xFE5F,0xF5DE,0x4A69,0xF7DE,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xC638,0x41C8, +0xFEFF,0xFE3F,0xFE3F,0xFE3F,0xFE7F,0xCCD8,0x728D,0xD519, +0xFE7F,0xFE3F,0xFE3F,0xFE1F,0xFE5F,0xED9C,0xD497,0x6A2D, +0xB40C,0xFE13,0xFED9,0xFF9C,0xFF5B,0xFF7B,0xFF7B,0xFF7B, +0xFF5B,0xFF7C,0xFF3A,0xFE35,0xA38D,0xB4B7,0xFE9F,0xFE5F, +0xD4B8,0xBC14,0xF61E,0xFE5F,0xFE5F,0xC415,0xECFA,0x1062, +0xFF78,0xDD31,0x72AF,0x8B0F,0xD4CF,0xFE14,0xFEF9,0xFF9C, +0xFF7B,0xFF9C,0xFF1A,0xFE75,0xABEF,0xABD4,0xFE1E,0xFE3F, +0xFE3F,0xFE3F,0xFE1F,0xFE5F,0xDD3A,0xC435,0xE4D8,0x3105, +0xED7B,0xFE7F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE7F,0xB456, +0x4920,0x8A80,0x6AA6,0xFF74,0x9489,0x9391,0xFE5F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFEBF,0x2945,0xF7BE,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xD6BA,0x62CC, +0xF5DD,0xFE5F,0xFE3F,0xFE3F,0xFE5F,0xFDBD,0x59EA,0xAC14, +0xFE5F,0xFE3F,0xFE3F,0xFE3F,0xFE5F,0xE57B,0xE4D8,0x18A5, +0xFE33,0xFDB3,0xFF7B,0xFF7B,0xFF5B,0xFF5B,0xFF5B,0xFF7B, +0xFF7B,0xFF5B,0xFF7C,0xFF5A,0xE551,0xA3B0,0xD57B,0xFEBF, +0xDCD9,0xBBD4,0xED9C,0xFE9F,0xD4F8,0xD497,0x82AF,0xAC0C, +0xFEB6,0xBC2F,0x82F1,0x936C,0xFE54,0xFE76,0xFFBD,0xFF7C, +0xF77B,0xF75B,0xFF9C,0xFEB7,0xABCD,0x9B30,0xF5BD,0xFE5F, +0xFE3F,0xFE3F,0xFE3F,0xFE5F,0xC435,0xC435,0xE4F9,0x1883, +0xFEDF,0xFE3F,0xFE1F,0xFE3F,0xFE3F,0xFE7F,0xD59B,0x51C5, +0xA300,0x69E0,0x7369,0xFF75,0xFF12,0x9C0D,0xBCB8,0xFE7F, +0xFE3F,0xFE3F,0xFE1F,0xFF1F,0x2124,0xF7BE,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE73C,0x83F0, +0xCCD9,0xFE7F,0xFE3F,0xFE3F,0xFE5F,0xED9C,0x8AEF,0x82EF, +0xEDBC,0xFE5F,0xFE1F,0xFE3F,0xFE5F,0xED7C,0xCC56,0x20C4, +0xFEB5,0xFDD4,0xFFBC,0xFF5B,0xFF7B,0xFF7B,0xFF7B,0xFF5B, +0xFF7B,0xFF7B,0xFF5B,0xFF7C,0xFF7A,0xCCF0,0xB433,0xF63F, +0xDD3A,0xBC14,0xE53A,0xF5FE,0xC456,0xD478,0x20C3,0xFEF7, +0xFDF3,0x936F,0x6A6B,0xFED5,0xFE35,0xFFBD,0xFFBD,0xDEB9, +0x18A2,0x4207,0xFFFE,0xFF19,0xAC0C,0x9B2F,0xE53B,0xFE1F, +0xFE3F,0xFE1F,0xFE7F,0xDD3A,0xC435,0xDCB8,0x7A8D,0xAC15, +0xFE9F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE7F,0xBCD7,0x2080, +0xBB60,0x7AA2,0x9C8D,0xFEF3,0xFF13,0x9409,0xB4B4,0xFE7F, +0xFE3F,0xFE3F,0xFE1F,0xFF3F,0x20C4,0xF7BE,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xAD35, +0x8310,0xFEDF,0xFE1F,0xFE3F,0xFE5F,0xE55B,0xDCB8,0x51A9, +0xBC76,0xFE5F,0xFE3F,0xFE3F,0xFE5F,0xF5BC,0xAB93,0x5A07, +0xFE54,0xFE77,0xFFBC,0xFF7B,0xFF7B,0xFF9C,0xFFBC,0xFF7B, +0xFF5B,0xFF7B,0xFF7B,0xFF5B,0xFF7C,0xFF9B,0xD552,0xCCD6, +0xD4F9,0xCC56,0xD4D9,0xCC97,0xE4D9,0x3907,0xE531,0xFDD3, +0xFF3A,0x62AB,0xFDF3,0xFE15,0xFF9C,0xFF7C,0xFFBC,0xAD12, +0x0000,0x2104,0xBDD6,0xFFBC,0xBC4D,0x9B4F,0xD4B9,0xF5FE, +0xFE3F,0xFE3F,0xFE3F,0xC456,0xC456,0xDCB8,0x28E4,0xFEFF, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE5F,0xF61E,0x7ACD,0x61C0, +0x9AA0,0x82E5,0xEE32,0xFEB2,0xFED3,0xC54C,0xB452,0xEDFE, +0xFE5F,0xFE3F,0xFE1F,0xFF1F,0x2925,0xF7BE,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xB5B6, +0x49C9,0xFEDF,0xFE1F,0xFE3F,0xFE5F,0xE57B,0xDCD8,0x6A6C, +0x9351,0xF5FE,0xFE3F,0xFE3F,0xFE5F,0xFDFE,0x8B10,0x82C8, +0xFE34,0xFEF9,0xFF9C,0xFF7C,0xF75B,0x9C70,0xD637,0xFFFD, +0xFF5B,0xFF5B,0xFF7B,0xFF5B,0xFF7B,0xFF7B,0xFF7B,0xDDD4, +0xABF1,0xABB3,0xCC56,0xD4B7,0x9311,0x5A26,0xFE54,0xFEF9, +0xFF5B,0xC4D0,0xFE76,0xFF7C,0xFF7C,0xFF9C,0xEF3B,0x6B0B, +0x0000,0x0000,0x8430,0xFFFD,0xD510,0xA36F,0xBC15,0xF5DD, +0xFE5F,0xFE7F,0xDD19,0xC435,0xD4B8,0x726C,0xB475,0xFE9F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE7F,0xDDDB,0x3144,0x92C0, +0x8240,0x8328,0xFF54,0xFE72,0xFE92,0xFEB1,0x9BEE,0xCD3A, +0xFE7F,0xFE3F,0xFE1F,0xFF1F,0x3967,0xF7BE,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xBE17, +0x5A6B,0xFDFE,0xFE3F,0xFE3F,0xFE5F,0xED9C,0xCC97,0xCC76, +0x51C9,0xCD19,0xFE5F,0xFE1F,0xFE5F,0xFE5F,0x6A4D,0x9B6A, +0xFE13,0xFF5B,0xFF7B,0xFFBC,0xDEB9,0x0000,0x2104,0xFFBC, +0xFF9C,0xFF5B,0xFF7B,0xFF7B,0xFF5B,0xFF7B,0xFF7B,0xFFBC, +0xE656,0x8B6E,0xABB3,0xC416,0x3966,0xFE75,0xFEF9,0xFF7C, +0xFF3A,0xFE97,0xFF7B,0xFF7C,0xFF5B,0xFF9C,0xEF3B,0x62CA, +0x0000,0x0000,0x6B6D,0xFFFE,0xF614,0x9B6E,0xA372,0xF5BC, +0xFE7F,0xF5FE,0xC455,0xD497,0xABB3,0x6A6C,0xFEBF,0xFE3F, +0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE5F,0xD5BA,0x1040,0xAB20, +0x8260,0x8BA9,0xFF34,0xFE72,0xFE92,0xFEB1,0x9BCB,0xCD19, +0xFE7F,0xFE3F,0xFE1F,0xFEFF,0x51EA,0xF7BE,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xDEDB, +0x6B0D,0xB436,0xFE7F,0xFE3F,0xFE5F,0xEDBD,0xCC77,0xDCB8, +0x7A8D,0x830F,0xF5FE,0xFE3F,0xFE3F,0xFE9F,0x51C9,0xB3EC, +0xFE14,0xFF9C,0xFF7B,0xFFBC,0xCDD5,0x0000,0x0861,0x9470, +0xFFFE,0xFF5B,0xFF7B,0xFF7B,0xFF7B,0xFF5B,0xFF7B,0xFF5B, +0xFFDD,0xFF7B,0xB494,0x8B2F,0xE615,0xFF5A,0xFF7C,0xFF7B, +0xFF5B,0xFF7B,0xFF7C,0xFF5B,0xFF5B,0xFF7C,0xFF7B,0x83CE, +0x0000,0x0000,0x6B4C,0xFFFE,0xFEB7,0x9B8E,0x9B31,0xED7B, +0xFE5F,0xD4B7,0xCC56,0xCC56,0x51E9,0xF5DD,0xFE5F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xE59C,0xC518,0x0820,0xB360, +0x8281,0x940B,0xFF14,0xFE72,0xFE92,0xFE91,0x8B49,0xC4F7, +0xFE7F,0xFE3F,0xFE1F,0xFEFF,0x5A0B,0xF7DF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE, +0x8410,0x728D,0xFEBF,0xFE3F,0xFE3F,0xF5DD,0xD497,0xC435, +0xD498,0x4967,0xB455,0xFE3F,0xFE3F,0xFEFF,0x3948,0xD48E, +0xFE55,0xFFBD,0xFF7B,0xFF9C,0xBD74,0x0000,0x0000,0x5ACA, +0xFFFF,0xFF5B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF5B, +0xFF5B,0xFF9C,0xFF9C,0xF6FA,0xFF9C,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF5B,0xFF5B,0xFF7B,0xFF7B,0xFFBD,0xAD13, +0x0000,0x0000,0x6B2B,0xFFFE,0xFF19,0x9BAE,0x9B51,0xE51A, +0xDD1A,0xC456,0xDCB8,0x59EA,0xAC35,0xFE7F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xB456,0x9BF4,0x1880,0xB340, +0x8AC2,0xACAD,0xFF13,0xFE92,0xFEB2,0xF650,0x9388,0xCD38, +0xFE7F,0xFE3F,0xFE3F,0xFEDF,0x622B,0xF7BE,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0x9CF3,0x4988,0xFE9F,0xFE3F,0xFE3F,0xF61E,0xD4D8,0xC435, +0xD4B7,0xA371,0x49A9,0xE59C,0xFE5F,0xFF3F,0x20C5,0xF530, +0xFE97,0xFFBC,0xFF5B,0xFFBC,0xD677,0x0000,0x0000,0x4228, +0xFFFF,0xFF5B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF5B,0xFF5B,0xFF7B,0xFF9B,0xFF7B,0xFF5B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF5B,0xFF7B,0xFF7B,0xFF5B,0xFFBD,0xD678, +0x20E3,0x0000,0x6B2C,0xFFFF,0xFF39,0x9BCE,0xA392,0xD4B8, +0xC455,0xDCD8,0x8AEF,0x622A,0xFE5F,0xFE5F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xF61E,0x8B10,0x93B3,0x20A0,0xB340, +0x8AC2,0xAC8E,0xFEF3,0xFE72,0xFEB3,0xEE0F,0x8B45,0xCD37, +0xFE7F,0xFE3F,0xFE1F,0xFEDF,0x6A6D,0xE73C,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xB5B6,0x49A9,0xE55B,0xFE7F,0xFE3F,0xFE3F,0xDCF9,0xC435, +0xC456,0xE4F9,0x6A6C,0x7ACE,0xFE7F,0xFF5F,0x1063,0xFDF2, +0xFED8,0xFF9C,0xFF5B,0xFFBC,0xE73B,0x0000,0x0000,0x4228, +0xFFFF,0xFF5B,0xFF5B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF5B,0xFF5B,0xFF7B,0xFF5B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF5B,0xFF7B,0xFFBC, +0xAD33,0x1082,0x7BEF,0xFFFF,0xFF7A,0x93AD,0x9B51,0xD477, +0xD477,0xABB4,0x7AC9,0xAC32,0xFE7F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE5F,0xF5DD,0x6A4C,0xAC15,0x18A0,0xB340, +0x8282,0x942C,0xFF33,0xFE71,0xFED3,0xE5AE,0x72A3,0xC516, +0xFE7F,0xFE1F,0xFE3F,0xFEDF,0x82EF,0xCE99,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xDE9B,0x626C,0x9BD3,0xFE9F,0xFE3F,0xFE5F,0xE53A,0xC456, +0xC456,0xCC56,0xDCD8,0x0841,0x9BF4,0xFFDF,0x1084,0xFE33, +0xFF3A,0xFF7C,0xFF5B,0xFF9C,0xEF7B,0x41E7,0x0000,0x41E7, +0xFFDD,0xFF7C,0xFF5B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF5B,0xFF5B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF5B,0xFF9C, +0xF75B,0xBDB5,0xD678,0xFFBD,0xFFBC,0x8BCD,0x9330,0xCC98, +0xC456,0x7A6B,0xED11,0xC411,0xFDFD,0xFE7F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE5F,0xE55B,0x622B,0xC498,0x1040,0xAB40, +0x7A61,0x8BAA,0xFEF3,0xFED3,0xF651,0xD52C,0x6243,0xBCF6, +0xFE7F,0xFE3F,0xFE3F,0xFEBF,0x8B31,0xC638,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xDEDB,0x5A4A,0x8310,0xFE9F,0xFE3F,0xFE5F,0xED9C,0xCC76, +0xC435,0xCC76,0xC456,0x49C6,0x3924,0xF67E,0x2927,0xFE33, +0xFF9C,0xFF7B,0xFF5B,0xFF7B,0xFFBC,0xAD74,0x0000,0x39E7, +0xFFFE,0xFF7B,0xFF5B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF5B, +0xFF7C,0xFFDD,0xFFBC,0xFF5B,0xFFDD,0x83CD,0x8B0F,0xE476, +0xDBF3,0xDB90,0xFC32,0xF3F1,0xFC75,0xFCF7,0xFE5F,0xFE3F, +0xFE1F,0xFE3F,0xFE7F,0xCC77,0x6A6C,0xD4FA,0x0800,0xA301, +0x7262,0x7B28,0xEDCE,0xF651,0xD52D,0xC4AA,0x6265,0xBCF7, +0xFE7F,0xFE3F,0xFE3F,0xFEBF,0x8B51,0xB5D6,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xCE59,0x624B,0x8B30,0xD55A,0xFE7F,0xFE3F,0xF5FE,0xD4B7, +0xC435,0xD497,0x9B52,0x7AC9,0xC4EF,0x5A2B,0x2905,0xFEB6, +0xFFBD,0xFF5B,0xFF7B,0xFF5B,0xFF9C,0xF77C,0x6B2C,0x5AEA, +0xFFFF,0xFF5B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF5B,0xFF5B,0xFF5B,0xFF5B,0xFFDC,0xBCD2,0xC370,0xFC13, +0xFBF2,0xFC13,0xFBF2,0xFBF2,0xFBD1,0xFB90,0xFD39,0xFE5F, +0xFE1F,0xFE5F,0xF5DD,0xBC15,0x728D,0xD4D9,0x0000,0x8AC2, +0x7262,0x7307,0xCCCB,0xC4AB,0xBC6A,0xC4A9,0x7AE8,0xC518, +0xFE7F,0xFE3F,0xFE3F,0xFEBF,0x9372,0x9CF3,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xBE18,0x832F,0x9351,0x8B91,0xFEBF,0xFE3F,0xFE5F,0xDCF9, +0xC435,0xD4B8,0x82AF,0x6A68,0xFE75,0xC4D0,0x28C2,0xFF19, +0xFFBC,0xFF5B,0xFF5B,0xFF7B,0xFF7B,0xFF9C,0xF75B,0xD698, +0xFF9C,0xFF5B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF5B,0xFF7B,0xFF5B,0xFCF5,0xFBB1,0xFBF2, +0xFBF2,0xFC12,0xFBF2,0xFBF2,0xFBF2,0xFB90,0xFCD7,0xFE5F, +0xFE1F,0xFE7F,0xD4B8,0x9B71,0x9B92,0xCC76,0x0000,0x7262, +0x7241,0x6AC7,0xCCCA,0xB449,0xBC6A,0xC489,0x832B,0xCD5A, +0xFE7F,0xFE3F,0xFE3F,0xFEBF,0x9BB3,0x8C71,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xBDF7,0x8350,0xA392,0x7AEE,0xFE3F,0xFE5F,0xFE5F,0xE57B, +0xC456,0xDCD8,0x6A4C,0x7288,0xF5F3,0xFE75,0xCCCE,0xFF7A, +0xFFFD,0xFFDC,0xFF9C,0xFF5B,0xFF5B,0xFF7B,0xFF9C,0xFFBC, +0xFF5B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF5B,0xFF7B,0xFF5B,0xFC94,0xFB50,0xFBD2, +0xFBD2,0xFBD2,0xFBF2,0xFBF1,0xFC13,0xFCD7,0xFE1E,0xFE3F, +0xFE3F,0xFE1E,0xC435,0x622B,0xDCF9,0xC436,0x20C3,0x49A2, +0x4982,0x6266,0xD50B,0xBC4A,0xBC8A,0xA3E7,0x9BCF,0xE5BD, +0xFE5F,0xFE3F,0xFE3F,0xFEBF,0xA3F4,0x8C71,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xC638,0x834F,0xCC77,0x7AAE,0xC4D7,0xFE9F,0xFE3F,0xFDFE, +0xCC97,0xE4D8,0x49AA,0x49E5,0xF5D3,0xFD13,0xFCB3,0xFC94, +0xFCB4,0xFD15,0xFE99,0xFFBC,0xFF5B,0xFF5B,0xFF5B,0xFF5B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF5B,0xFF7B,0xFF9C,0xFEDA,0xFD35,0xFC53, +0xFC32,0xFCB3,0xE46F,0xC455,0xFDFD,0xFE3F,0xFE3F,0xFE3F, +0xFE7F,0xDCF9,0xD477,0x3146,0xED1A,0xC456,0x59E9,0x20E0, +0x2902,0x5205,0xD50C,0xBC6A,0xC4AA,0x8305,0xBC74,0xFE5F, +0xFE3F,0xFE3F,0xFE3F,0xFE9F,0xB456,0x94D2,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xCE79,0x8B70,0xED1A,0x7AAD,0x93B2,0xFE9F,0xFE3F,0xFE5F, +0xDCF9,0xDCD9,0x49C9,0xB2EC,0xFC32,0xFC12,0xFBF2,0xFBD2, +0xFBD2,0xFBD2,0xFBD2,0xFE58,0xFFBC,0xFF5B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF5B,0xFF7B,0xFF7B,0xFF7C,0xFED9, +0xFDD4,0xFDF4,0xABEB,0xD55B,0xFE5F,0xFE3F,0xFE1E,0xFE3F, +0xFE5F,0xC435,0xBC35,0x4167,0xE4F9,0xD4B8,0x8AEF,0x0020, +0x3963,0x49C4,0xA409,0xC48A,0xC48A,0x9388,0xC496,0xFE3F, +0xFE3F,0xFE3F,0xFE1F,0xFE9F,0xBC57,0x9CF3,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF5D,0xDEFB,0xF7BE,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xCE99,0x8B90,0xE4D9,0x9B71,0x82EF,0xE59C,0xFE5F,0xFE5F, +0xED9C,0xCC97,0xE3F2,0xFBF2,0xFBF2,0xFBF2,0xFBF2,0xFBF2, +0xFC12,0xFBD2,0xFB30,0xFEDA,0xFF9C,0xFF5B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF5B,0xFF5B,0xFF5B,0xFF5B,0xFF5B,0xFF5B,0xFF5B, +0xFF5B,0xFF5B,0xFF5B,0xFF5B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF5B,0xFF7B,0xFF9C,0xFEF9, +0xFDD3,0xFE34,0x82E8,0xEDFC,0xFE5F,0xFE1E,0xFE1F,0xFE7F, +0xDD1A,0xCC76,0x624B,0x9330,0xD497,0xD497,0xABB3,0x1081, +0x49C3,0x2902,0x72C6,0xDD2C,0xC4C9,0x936A,0xB415,0xFE1F, +0xFE3F,0xFE3F,0xFE1F,0xFE9F,0xB436,0xA534,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE71C,0x62EC,0xB596,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xA534,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xCE99,0x8BB1,0xDCB8,0xD4B8,0x6A6C,0xA434,0xFEBF,0xFE3F, +0xF63F,0xF475,0xFBF2,0xFC12,0xFBF2,0xFC12,0xFC12,0xFBF2, +0xFB71,0xFB71,0xFEFA,0xFFBC,0xFF7B,0xFF5B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF5B, +0xFF5B,0xFF9C,0xFFDD,0xFFFE,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFE,0xFFFE,0xFFFE,0xFFFF,0xFF5B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF5B,0xFF5B,0xFF9C,0xFE97, +0xFDB3,0xFE14,0x8B2B,0xEDFD,0xFE5F,0xFE1F,0xFE3F,0xFE7F, +0xBBF4,0xED1A,0x0000,0xE51A,0xC456,0xCC56,0xC435,0x51C9, +0x20E0,0x3983,0x3143,0xA3E9,0xA407,0x7ACC,0xCC57,0xF5DD, +0xFE3F,0xFE3F,0xFE3F,0xFE9F,0xABF5,0xAD75,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xAD55,0x7B4F,0xAD35,0xEF7D, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xEF9E,0x8C31,0x0020,0xCE59,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xD6BA,0x93D1,0xD498,0xE4F9,0x8B0F,0x8B50,0xF5FE,0xFE5F, +0xFE5F,0xFC13,0xFBD1,0xFBF2,0xFC12,0xFBD2,0xFBB2,0xFB30, +0xFD76,0xFFDC,0xFF9C,0xFF7B,0xFF5B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF5B,0xFF5B, +0xFFFE,0xEF9C,0xA574,0x5B6B,0x5289,0x5A48,0x7249,0x61A7, +0x79C7,0xA26A,0xAA8B,0x51C6,0xFFFF,0xFF5B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFE56, +0xFDB2,0xFE13,0x832C,0xEDFD,0xFE3F,0xFE1F,0xFE9F,0xE53A, +0xCC56,0x9B51,0x3146,0xE4F9,0xC436,0xC456,0xD498,0x9B51, +0x0000,0x49C4,0x3943,0x2923,0x0840,0x7AAD,0xD497,0xEDBD, +0xF5FE,0xFE1F,0xFE1F,0xFEDF,0x82F0,0xAD75,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x73AE,0x94B2,0x94B2,0xC618, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0x638C,0x7ACE,0x3885,0xD67A,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xD6BA,0x8B90,0xDCB8,0xD4B8,0xD4B8,0x624B,0xB4B6,0xFE9F, +0xFE7F,0xFCF8,0xFC54,0xFBF2,0xFC74,0xFC53,0xFCB1,0xFFDC, +0xFFDC,0xFF7B,0xFF5B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF5B,0xFFFD, +0xB4B2,0x9209,0xCAED,0xFC32,0xFC73,0xFC93,0xFC92,0xFC93, +0xFC93,0xFC93,0xFC73,0x8208,0xFFFE,0xFF7B,0xFF5B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF5B,0xFF7B,0xFF3A,0xFE15, +0xFD92,0xFE34,0x7B0D,0xEDFD,0xFE3F,0xFE3F,0xFE7F,0xBBF4, +0xF53B,0x0820,0xC456,0xCC77,0xC456,0xC456,0xCC76,0xCC56, +0x6209,0x0840,0x49C4,0x3983,0x3123,0x9330,0xCC56,0xE57B, +0xED9C,0xFE1E,0xFE3F,0xFEBF,0x8310,0xA574,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xE71C,0xA434,0xE63C,0x62EC,0xAD75, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF7D, +0x2985,0xBCF7,0xB3B3,0x6ACC,0xF7BE,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE, +0x73AE,0x51A9,0xE519,0xD4B8,0xED5B,0x728D,0xAC15,0xFE7F, +0xFE3F,0xFF5F,0x0882,0xC477,0x0000,0xFE54,0xFDB1,0xFEF9, +0xFF9C,0xFF5B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF5B,0xFFFE, +0x8BEE,0xDC11,0xFC93,0xFC72,0xFC72,0xFC52,0xFC52,0xFC52, +0xFC72,0xFC72,0xFC72,0x69A7,0xFFFE,0xFF7B,0xFF5B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF5B,0xFF9C,0xFED8,0xFDB3, +0xFDB3,0xED50,0x9BD2,0xF61E,0xFE3F,0xFE7F,0xDD19,0xCC76, +0xB3F4,0x1882,0xF53B,0xC435,0xC456,0xCC56,0xC456,0xD497, +0xC435,0x4986,0x18A0,0x0860,0x51C9,0xD497,0xC456,0xD4D9, +0xD4F8,0xF5FE,0xFE3F,0xFEBF,0xA3D4,0x94D2,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0x8C50,0x83B0,0xFF7F,0x9412,0x9CD2, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE75C,0xB5D6,0x0881, +0x8BD2,0xFDDD,0x38E6,0xEF5D,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xAD96, +0x0000,0x8B10,0xDCF9,0xD4B7,0xD497,0xD497,0x624B,0xBD17, +0xFE7F,0xFF5F,0x10A2,0xCC77,0x6A6D,0x5A06,0xFE14,0xFE14, +0xFFBD,0xFF5B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF5B,0xFFFE, +0x8C70,0xDC10,0xFC72,0xFC52,0xFC72,0xFC72,0xFC72,0xFC72, +0xFC52,0xFC72,0xFC72,0x69E8,0xFFFF,0xFF5B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7C,0xFF5B,0xFE56,0xFD92, +0xFE14,0xB3EB,0xCCF8,0xFE3F,0xFE3F,0xFE3F,0xBC14,0xF53A, +0x20C4,0x9B72,0xD497,0xC456,0xCC56,0xC456,0xCC56,0xC436, +0xCC97,0xDCB8,0x82CF,0x9331,0xE4F9,0xCC56,0xCC56,0xCC76, +0xC456,0xF5FE,0xFE3F,0xFE9F,0xB436,0x7BEE,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xDF1B,0x83B0,0xC497,0xFEBF,0xC578,0x8C51, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE75D,0x9C73,0x9432,0xB536, +0xFE1E,0xBBD4,0x7B8F,0xEF9E,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xCE79,0x3986, +0x9330,0x7AEE,0xDCD9,0xCC76,0xC435,0xDCB8,0x726C,0xB456, +0xFE5F,0xFF3F,0x2945,0xBC34,0xDCD9,0x0000,0xFE55,0xFD92, +0xFFBD,0xFF7B,0xFF5B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF5B,0xFFFD, +0x9D33,0xD3CF,0xFC52,0xFC72,0xFC52,0xFC72,0xFC72,0xFC72, +0xFC72,0xFC72,0xF472,0x6248,0xFFFF,0xFF5B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF5B,0xFF9C,0xFF1A,0xFDF4,0xFD92, +0xFE34,0x7AC8,0xE5DB,0xFE5F,0xFE7F,0xD4B8,0xCC77,0xBC14, +0x1882,0xFD7C,0xC436,0xC456,0xCC56,0xCC56,0xCC56,0xC456, +0xCC56,0xC435,0xA392,0xABD3,0xCC77,0xC456,0xCC76,0xCC76, +0xC414,0xEDBD,0xFE3F,0xFE5F,0xE57C,0x5B0B,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0x7BEF,0x626D,0xFEFF,0xFE3F,0xE65C,0x630C, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x8430,0x738E,0xBD37,0xEE5E, +0xF5FD,0x7A2C,0xBD97,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xAD75,0x4107, +0xC435,0x6A6C,0xDCD9,0xC476,0xC456,0xC415,0xFDDD,0x7B10, +0xC518,0xFF7F,0x39A7,0xBBF4,0xF53A,0x4169,0x6246,0xFE14, +0xFEF9,0xFF9C,0xFF5B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF5B,0xFF9C, +0xF77B,0x92CB,0xEBF1,0xFC72,0xFC52,0xFC72,0xFC72,0xFC72, +0xFC72,0xFC72,0xFC52,0x7B2C,0xFFFE,0xFF5B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF5B,0xFF9C,0xFE97,0xFD92,0xFD93, +0xFE34,0x830B,0xE5DC,0xFE7F,0xF5DD,0xC415,0xED3A,0x18A2, +0xB3D3,0xD497,0xC456,0xCC56,0xC456,0xC456,0xCC56,0xC456, +0xCC56,0xC435,0x9B71,0xA3B2,0xCC77,0xC456,0xCC56,0xCC77, +0xC435,0xE55B,0xFE3F,0xFE3F,0xFEBF,0x39E7,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xA514,0x624C,0xF5FE,0xFE5F,0xFE3F,0xF6DE,0x39A7, +0xFFFF,0xFFFF,0xFFFF,0xEF5D,0x6B6D,0x6B0D,0xEDFD,0xFE9F, +0xED5B,0x4948,0xCE59,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xDEFB,0x5229,0xC3F5, +0x8B30,0x9350,0xD4B8,0xCC56,0xC456,0xC435,0xF5FD,0xBCD7, +0xBC77,0xFF1F,0x39C8,0xBBF5,0xCC77,0xE4F9,0x0000,0xFE55, +0xFE14,0xFFBD,0xFF7B,0xFF5B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF5B, +0xFFFF,0x732C,0xDBF0,0xFC72,0xFC52,0xFC72,0xFC72,0xFC72, +0xFC52,0xFC72,0xEBF0,0x94F1,0xFFFD,0xFF5B,0xFF7B,0xFF7B, +0xFF7B,0xFF5B,0xFF5B,0xFF9C,0xFF1A,0xFDF4,0xFD92,0xFDB3, +0xFE33,0x7AED,0xE5DC,0xFE9F,0xCC77,0xD497,0xA372,0x0000, +0xFD7C,0xC456,0xC456,0xC456,0xCC56,0xCC56,0xC456,0xCC56, +0xCC56,0xC436,0x9330,0xA371,0xD477,0xC456,0xC435,0xCC97, +0xC436,0xDCF9,0xFE3F,0xFE3F,0xFF1F,0x2925,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xCE59,0x7B2F,0xCCF9,0xFEBF,0xFE1F,0xFE3F,0xF69E,0x6B2D, +0xFFFF,0xFFFF,0xFFFF,0x6B6D,0x7BEF,0xFF9F,0xFE5F,0xFE3F, +0xED3A,0x38A5,0xD69A,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xD6BA,0x4968,0xD477, +0x624B,0xCC76,0xCC77,0xCC56,0xC436,0xCC77,0xF5DD,0xFF1F, +0x9391,0xE65C,0x49E9,0xBC14,0xCC76,0xF57B,0x0000,0x3124, +0xFE75,0xFED8,0xFF9C,0xFF5B,0xFF5B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF5B, +0xFFBC,0xC657,0xC38E,0xFC52,0xFC52,0xFC52,0xFC52,0xFC52, +0xFC52,0xFC93,0x69A7,0xFFFE,0xFF7B,0xFF5B,0xFF7B,0xFF7B, +0xFF5B,0xFF5B,0xFF7C,0xFF5B,0xFE35,0xFD92,0xFD93,0xFDD4, +0xDCCF,0x9BD2,0xF63E,0xE53A,0xC456,0xED1A,0x0000,0xCC76, +0xCC76,0xC456,0xCC56,0xC456,0xCC77,0xC456,0xC456,0xC456, +0xCC56,0xC455,0x8B0F,0x9B51,0xD497,0xC456,0xC435,0xD4B8, +0xD497,0xD4B7,0xFE1E,0xFE3F,0xFF1F,0x3907,0xFFDE,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xC638, +0x8BD1,0xCD19,0xFEDF,0xFE1F,0xFE3F,0xFE3F,0xEE7D,0x6B4D, +0xFFFF,0xFFFF,0xA534,0x9CB3,0x83B0,0xA3F4,0xFEBF,0xF5FE, +0xE51A,0x40E6,0xCE59,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xD67A,0x61CB,0xABD3, +0x4187,0xE4F9,0xCC56,0xCC56,0xC435,0xDCF9,0xFE1F,0xFE5F, +0xF5DE,0xD51A,0x41A8,0xBC15,0xCC56,0xED1A,0x18A2,0x59EC, +0x6A67,0xFE55,0xFF5A,0xFF7C,0xFF7B,0xFF5B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF5B,0xFFFF,0xA4F2,0xD3D0,0xFC52,0xFC72,0xFC72,0xFC72, +0xFC93,0xD36E,0x73CD,0xFFFF,0xFF5B,0xFF7B,0xFF7B,0xFF7B, +0xFF5B,0xFF7C,0xFF5B,0xFE56,0xFD92,0xFDB3,0xFDB3,0xFE34, +0x8B29,0xD539,0xF5DE,0xC456,0xE4D9,0x5A0A,0x6A6C,0xDCD9, +0xC456,0xCC56,0xC456,0xC456,0xE53A,0xC415,0xCC56,0xC456, +0xCC56,0xC456,0x82EF,0x9330,0xD497,0xC456,0xC456,0xCC56, +0xE53A,0xCC97,0xF5FE,0xFE3F,0xFEBF,0x9372,0xA514,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE73C,0xAD75,0x6AAD, +0xEDBD,0xFEBF,0xFE1F,0xFE1F,0xFE3F,0xFE3F,0xF69E,0x5AAA, +0xFFFF,0xCE99,0x9C52,0xBCD5,0x7B4F,0xC4F8,0xFE9F,0xF5DE, +0xDCF9,0x69EB,0x9CD3,0xFFDF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFDF,0xB576,0x92AF,0x8B30, +0x72AD,0xDCD8,0xC456,0xC456,0xC435,0xED9C,0xFE5F,0xFE1F, +0xFE7F,0xD57A,0x41A8,0xBC15,0xCC76,0xED1A,0x0021,0xFE5F, +0x0021,0x9B6B,0xFE75,0xFF7B,0xFF7C,0xFF7B,0xFF5B,0xFF7B, +0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF5B,0xFF5B,0xFFFF,0xACD2,0xDBF0,0xDBD0,0xE3D0,0xE3F0, +0xD3B0,0x5A89,0xFFFF,0xFF5B,0xFF5B,0xFF7B,0xFF5B,0xFF7B, +0xFF7C,0xFF5B,0xFE36,0xFD92,0xFDB3,0xFDB3,0xFD93,0xFE54, +0x7AEA,0xD57A,0xD4D8,0xDCB8,0x9351,0x3946,0xE4F9,0xC456, +0xCC76,0xC456,0xC435,0xE57B,0xE55B,0xC415,0xCC56,0xC456, +0xCC56,0xC456,0x82EF,0x8B0F,0xD497,0xC456,0xC456,0xC435, +0xED9C,0xD4D8,0xEDBD,0xFE3F,0xFE5F,0xEDBD,0x522A,0xDEDB, +0xD6BA,0xCE79,0xC638,0xBDF7,0x9CD3,0x524A,0x7A8E,0xFEDF, +0xFE5F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xEE5D,0x9492, +0xFFFF,0xBDD7,0x52AA,0xA453,0xEDBD,0xFE7F,0xFE3F,0xF5FE, +0xD4B8,0xAB93,0x526A,0xEF7D,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF7BE,0xAD14,0x92F0,0x622B, +0xC456,0xCC76,0xC456,0xC435,0xD4F9,0xFE1E,0xFE3F,0xFE1F, +0xFE1F,0xFF1F,0x7AEE,0xBC15,0xCC76,0xE4F9,0x20C4,0xDCB8, +0xF55B,0x1063,0x9B8B,0xFE34,0xFF7B,0xFF7C,0xFF7B,0xFF5B, +0xFF5B,0xFF5B,0xFF5B,0xFF5B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF5B,0xFF5B,0xFFFF,0xB5B5,0x8BAE,0xABCE,0xA40F, +0x73EE,0xFFFF,0xFF7B,0xFF5B,0xFF5B,0xFF5B,0xFF7B,0xFF7C, +0xFF3A,0xFE35,0xFD92,0xFDB3,0xFDB3,0xFDB3,0xFDD3,0xFDF2, +0x93B0,0xC477,0xDCD8,0xABD3,0x20C3,0xD4B7,0xCC56,0xC456, +0xCC76,0xC435,0xD4B8,0xFE9F,0xD4B8,0xC435,0xC456,0xC456, +0xCC76,0xC456,0x82EF,0x8B0F,0xD497,0xCC76,0xCC56,0xC435, +0xDD19,0xED9C,0xED9C,0xFE3F,0xFE1F,0xFF7F,0x2905,0x6AAC, +0x5249,0x3166,0x20C4,0x2083,0x5168,0xC456,0xFEFF,0xFE3F, +0xFE3F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xE61C,0xA4F4, +0xFFFF,0x94B2,0x3146,0xDDBB,0xFE7F,0xFE3F,0xFE3F,0xFE1F, +0xCC97,0xDCB8,0x30E5,0xCE59,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFDF,0xBD36,0x722C,0x624B, +0xE4F9,0xCC56,0xC435,0xC476,0xEDBD,0xFE5F,0xFE3F,0xFE1F, +0xFE3F,0xFE7F,0xE53A,0xC456,0xCC76,0xC456,0x6AAD,0xE53A, +0xC415,0xE4FA,0x3127,0x8B2A,0xDD92,0xFF5A,0xFF7B,0xFF7C, +0xFF7C,0xFF5B,0xFF5B,0xFF5B,0xFF7B,0xFF7B,0xFF7B,0xFF7B, +0xFF7B,0xFF7B,0xFF5B,0xFF5B,0xFFDD,0xFFFE,0xFFFE,0xFFFE, +0xFFFE,0xFF5B,0xFF5B,0xFF5B,0xFF5B,0xFF7C,0xFF7C,0xFEF9, +0xFDF4,0xFD72,0xFDB3,0xFDB3,0xFDD3,0xFE34,0xFDF3,0x8B49, +0xABF3,0xDCD8,0xBC15,0x1082,0x9B71,0xD497,0xC456,0xCC76, +0xC435,0xC435,0xFE3F,0xFE5F,0xCC76,0xC435,0xC456,0xCC76, +0xD4B8,0xCC56,0x8B0F,0x8B0F,0xD497,0xD497,0xCC97,0xC435, +0xCC77,0xFE1E,0xF5FE,0xFE3F,0xFE3F,0xFE9F,0xAC35,0xC435, +0xCC36,0xB3D4,0xC415,0xDC97,0xED3A,0xFE1E,0xFE5F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE5F,0xD59A,0xA514, +0xFFDF,0x9472,0x8C91,0xFFDF,0xFDFF,0xFE3F,0xFE3F,0xFE5F, +0xCC97,0xD477,0x9310,0x528A,0xE6FC,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xACF5,0x4127,0xCC97, +0xCC76,0xC435,0xC455,0xE55B,0xFE5F,0xFE3F,0xFE1F,0xFE3F, +0xFE3F,0xFE7F,0xD4B8,0xC435,0xDCB8,0x622B,0xC4D8,0xFE7F, +0xCC97,0xC415,0xE57A,0x5ACC,0x72CB,0xBC6E,0xFED8,0xFF5B, +0xFF5B,0xFF7C,0xFF7B,0xFF7B,0xFF7B,0xFF7B,0xFF5B,0xFF5B, +0xFF5B,0xFF5B,0xFF5B,0xFF5B,0xFF5B,0xFF5B,0xFF5B,0xFF5B, +0xFF5B,0xFF5B,0xFF7B,0xFF7C,0xFF9C,0xFF5B,0xFEB8,0xFDD3, +0xFD72,0xFDB3,0xFDF4,0xFE34,0xFDD3,0xBC8F,0x72A8,0x3124, +0xC456,0xBC15,0x728D,0x2905,0xBC35,0xCC77,0xCC56,0xCC56, +0xBBF4,0xED9C,0xFE9F,0xFE3F,0xC435,0xC456,0xC435,0xD4B7, +0xED7C,0xCC76,0x9330,0x8B0F,0xD477,0xD4F9,0xD4D8,0xC435, +0xC435,0xF5DD,0xFE3F,0xFE3F,0xFE1F,0xFE3F,0xFEFF,0x51E9, +0xFD9C,0xCC76,0xD4B8,0xDCF9,0xF5DD,0xFE5F,0xFE1F,0xFE1F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFE7F,0xC578,0x7BEF, +0xE6FC,0x73AE,0x8410,0xE61C,0xFE3F,0xFE3F,0xFE3F,0xFE7F, +0xD4D8,0xC435,0xDCD9,0x69EB,0x5A8B,0xC5F8,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xBE18,0x8370,0xA372,0xDCB8, +0xC456,0xC435,0xDD19,0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFE3F, +0xFE3F,0xFE3F,0xCC76,0xC435,0xED1A,0x1041,0xFE5F,0xFE7F, +0xFE3F,0xDCD9,0xCD78,0xB515,0x93B2,0x5A49,0x8B0A,0xC4CF, +0xFEB7,0xFF5A,0xFF5A,0xFF5B,0xFF5B,0xFF7B,0xFF7C,0xFF7C, +0xFF7B,0xFF7B,0xFF5B,0xFF5B,0xFF5B,0xFF7B,0xFF7B,0xFF7C, +0xFF7C,0xFF9C,0xFF5B,0xFEF9,0xFEB7,0xFE35,0xFDD3,0xFDF3, +0xFE34,0xFDD3,0xC4AF,0xA3EC,0x7AE9,0x4166,0x51CA,0x7AAE, +0xA392,0x8B10,0x6A6C,0x7ACE,0xD477,0xCC77,0xCC56,0xBC14, +0xD4D8,0xFE7F,0xFE3F,0xFE1E,0xBC14,0xC456,0xC435,0xE55B, +0xF5FD,0xCC56,0x9350,0x8B0F,0xCC77,0xDD19,0xDD1A,0xCC56, +0xBC15,0xE57B,0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFEDF,0x8350, +0xD53A,0xEDBC,0xF5DE,0xFE5F,0xFE5F,0xFE3F,0xFE1F,0xFE1F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFEBF,0xB516,0x632C, +0xCE59,0x5AAB,0x8BB1,0xD53A,0xFE7F,0xFE3F,0xFE1F,0xFE7F, +0xDD3A,0xC456,0xC456,0xE4F9,0x724C,0x7AEE,0x9452,0x9472, +0xCE39,0xFFDF,0xFFFF,0x8430,0x8B70,0xB3B3,0xDCD8,0xCC56, +0xC435,0xCC97,0xF5FE,0xFE5F,0xFE1F,0xFE1F,0xFE1F,0xFE3F, +0xFE5F,0xED9C,0xC456,0xCC76,0xC435,0x4188,0xFEBF,0xFE3F, +0xFE5F,0xFE5F,0xD65A,0x626B,0x9B71,0xC557,0x1883,0x7AAB, +0x8B0A,0x9BCC,0xD511,0xFE77,0xFF19,0xFF3A,0xFF5A,0xFF7B, +0xFF7B,0xFF7B,0xFF7C,0xFF7C,0xFF5B,0xFF5B,0xFF3A,0xFF3A, +0xFF39,0xFEF8,0xFEB6,0xFE55,0xFE14,0xFDF3,0xE531,0xAC0D, +0x832A,0x8B4C,0x93F0,0x628B,0x39A8,0x72CD,0xB414,0x82CE, +0x82CE,0xABB3,0x5A0A,0xCC76,0xCC77,0xCC76,0xC435,0xCC97, +0xFE3F,0xFE3F,0xFE3F,0xEDBD,0xBBF4,0xC435,0xCC97,0xFE5F, +0xEDBC,0xCC56,0x9B51,0x8B0F,0xD476,0xE53A,0xED9C,0xCC76, +0xC415,0xDD1A,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE5F,0xFE7F, +0x4188,0xFF5F,0xFE3F,0xFE3F,0xFE1F,0xFE1F,0xFE1F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFF1F,0xAD35,0x6B4D, +0xBDD7,0x5A4A,0xA433,0xFEBF,0xFE3F,0xFE3F,0xFE3F,0xFE5F, +0xEDBC,0xCC56,0xC436,0xC456,0xE4F9,0xBBF4,0x828E,0x726D, +0x9BB2,0x5AAB,0x736E,0x7AAE,0xCC36,0xD4D8,0xCC76,0xCC56, +0xC435,0xD4D9,0xFE3F,0xFE3F,0xFE1F,0xFDFE,0xFE1F,0xFE1F, +0xFE7F,0xDCF9,0xC456,0xED1A,0x3905,0xC4B7,0xFE7F,0xFE3F, +0xFE1F,0xFE9F,0xEFBE,0x83F0,0xA473,0xC517,0x51A9,0xCC57, +0x726D,0x6A8B,0x834D,0x832C,0x832B,0x832B,0x9BAC,0xBC8F, +0xD531,0xF614,0xFEB7,0xFF19,0xFF18,0xFED7,0xFEB7,0xFE14, +0xDD32,0xCC90,0xB42E,0x9BAC,0x938D,0x832B,0x5A28,0x7B2D, +0x628B,0x41E9,0xD5B9,0xBD16,0x6AEC,0x838F,0x6A8C,0x82AE, +0xC456,0x622B,0xABD3,0xCC76,0xD497,0xC435,0xBC35,0xF61E, +0xFE5F,0xFE3F,0xFE3F,0xE55B,0xBC14,0xC456,0xE57B,0xFE9F, +0xED9C,0xCC56,0x9350,0x8B0F,0xCC76,0xE57B,0xFE1E,0xCC97, +0xC415,0xD4D8,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFEDF, +0x9392,0xBCD7,0xFE9F,0xFE1F,0xFE1F,0xFE1F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFF1F,0xC5D8,0x632C, +0xBDD7,0x39A7,0x93B1,0xFEBF,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xCC77,0xC435,0xC456,0xCC56,0xD4B7,0xE51A,0xFDBC, +0x59EA,0x51A9,0x92F0,0xE4D9,0xD497,0xCC97,0xCC56,0xC456, +0xC435,0xDCF9,0xFE5F,0xFE3F,0xFDFE,0xF5FE,0xFE1F,0xFE3F, +0xFE1F,0xCC97,0xCC76,0xD497,0x1041,0xFE5F,0xFE5F,0xFE3F, +0xFE1F,0xF71E,0xFFFF,0xEF5D,0xE63A,0xAC94,0x59EA,0xE4F9, +0xC415,0xA413,0x8C12,0x734F,0x7B6F,0x836F,0x8B8F,0x6A8A, +0x936E,0x936C,0x830A,0x6267,0x5A26,0x6AA8,0x72A9,0x6227, +0x49A7,0x4166,0x4208,0x62CB,0x524A,0x526B,0x4A09,0x8BB0, +0xD599,0x626B,0x730D,0x9C72,0xAD75,0xBDF7,0xC557,0xCCB7, +0x620A,0x7AAE,0xD497,0xDCB8,0xA392,0xA392,0xE5BC,0xFE5F, +0xFE1F,0xFE3F,0xFE5F,0xDCD9,0xC415,0xD4D8,0xFE5F,0xFE5F, +0xE57B,0xCC56,0x9350,0x82EE,0xD497,0xE59C,0xFE5F,0xD4B8, +0xC415,0xD4B8,0xFE1E,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFEBF,0x7AEF,0xFE9F,0xFE1F,0xFE1F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFE9F,0xD5FA,0x734E,0x9492, +0xDF1C,0x8410,0xBD57,0xFEDF,0xFE1F,0xFE3F,0xFE3F,0xFE3F, +0xFE7F,0xDCF9,0xC435,0xC456,0xC456,0xCC76,0xF55B,0x5A0A, +0x9351,0xCC97,0xDCD9,0xCC76,0xCC97,0xCC97,0xBC15,0xCC76, +0xC435,0xD4D8,0xFE3F,0xFE3F,0xFE1E,0xFE1F,0xFE1F,0xFE5F, +0xE53A,0xC456,0xE4F9,0x4167,0x9BB3,0xFE7F,0xFE3F,0xFE5F, +0xC4D7,0xF6FD,0xDF1B,0xFFFF,0x9C32,0x8BD0,0x8B51,0xF5FD, +0xCC97,0xAC53,0xA493,0xA453,0xACB4,0xD5D9,0x9C53,0x8390, +0x62CC,0x2125,0x3967,0x5A2B,0x726D,0x82CF,0x82CF,0x82CF, +0x82CF,0x8AEF,0x9371,0x830E,0x5A09,0x49E8,0x2925,0x18C3, +0x5A6A,0x41A8,0x18A2,0x5AAB,0xA534,0xCE78,0x94D2,0x5209, +0x4988,0x9330,0x9330,0x9B71,0xBC76,0xDD7B,0xFE7F,0xFE3F, +0xFE1F,0xFE3F,0xFE5F,0xC456,0xC435,0xF5FE,0xFE5F,0xFE3F, +0xE55B,0xCC56,0x9330,0x82CE,0xDCD8,0xEDDD,0xFE7F,0xD4B8, +0xC415,0xCC97,0xFE1E,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE5F,0xD59A,0xAC35,0xFEDF,0xFE1F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFDFF,0xFF7F,0x738E,0x5ACB,0xEF5D, +0xFFFF,0xAD95,0x83B0,0xFEBF,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE5F,0xF61E,0xC456,0xC435,0xC456,0xED3A,0x49A8,0x8AEF, +0xDCB8,0xCC97,0xCC56,0xCC76,0xC455,0x82CE,0xBC35,0xCC76, +0xC456,0xCC76,0xE57C,0xFE5F,0xFE5F,0xFE5F,0xFE9F,0xFE1E, +0xDCD8,0xDCB8,0xCC36,0x5A0A,0xFE7F,0xFE9F,0xFE5F,0xFEDF, +0x5289,0xAC94,0xDF1B,0xBDD7,0x7B2E,0x72ED,0xCD19,0xFE9F, +0xFE9E,0xEF1C,0xDE7B,0x9432,0x7B4E,0x7B4E,0x18C3,0x49C8, +0x830E,0x9350,0xABB2,0xCC56,0xDCB8,0xDCF8,0xE519,0xE53A, +0xE53A,0xED5B,0xE53B,0xD4B8,0xC497,0xBC56,0xABF4,0xA3D3, +0xA3D2,0x9B71,0x72AD,0x72AD,0x7B2E,0x93D1,0x834F,0x7B0F, +0xB435,0xCCD8,0xCD19,0xD55A,0xFE3F,0xFE5F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE5F,0xBC14,0xE53A,0xFE7F,0xFE3F,0xFE1F, +0xDD19,0xCC76,0x8B10,0x7A8D,0xE51A,0xF61E,0xFE3F,0xD4B8, +0xC415,0xCC97,0xFE1E,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE1F,0xFE7F,0xCD19,0xBCB7,0xFEBF,0xFE1F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE1F,0xFE9F,0xCDD9,0x8410,0xD69A,0xFFFF, +0xEF5D,0xA514,0x7B6E,0xB496,0xFE9F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE5F,0xED9C,0xC435,0xED1A,0x49A8,0x82EE,0xDCB8, +0xCC77,0xCC56,0xCC56,0xCC56,0xCC97,0x8B30,0x7ACE,0xE4D9, +0xCC56,0xCC76,0xD4B8,0xED9C,0xFDFE,0xFDDE,0xD4D8,0x9330, +0x726C,0x7AAD,0x3926,0xA414,0xCD19,0xC4F8,0xCCD9,0xFF9F, +0xB5F6,0xDEFB,0xFFFF,0x7B2E,0x732D,0x49C8,0xFEBF,0xFE9F, +0xF73E,0xFFFF,0xFFFF,0x73CF,0x1883,0x5A0A,0x8ACF,0xAB92, +0xCC77,0xED5B,0xF5BC,0xF5DD,0xF5DD,0xF5FE,0xF5FE,0xFE1E, +0xFE1E,0xFE1F,0xFE1F,0xFE3F,0xFE5F,0xFE7F,0xFE5F,0xFE5F, +0xFE3F,0xF5FE,0xEDDD,0xE5BC,0xE5BC,0xE59B,0xEDDD,0xF61E, +0xF61E,0xFE3F,0xFE5F,0xFE7F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xED9C,0xCC97,0xFE5F,0xFE3F,0xFE3F,0xF61E, +0xD4B8,0xD497,0x82CE,0x6A2B,0xED7B,0xFE3F,0xF61E,0xCC97, +0xC415,0xD4B8,0xFE1E,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE5F,0xBCB7,0xAC55,0xFEDF,0xFE1F,0xFE3F, +0xFE3F,0xFE3F,0xFE1F,0xFF1F,0x7BAF,0x630C,0xEF5D,0xFFFF, +0xCE79,0x9411,0x7ACE,0x734F,0xFEFF,0xFE3F,0xFE3F,0xFE1F, +0xFE3F,0xFE3F,0xFE5F,0xFDFE,0x6A4C,0x726C,0xD4B8,0xCC76, +0xCC76,0xCC56,0xC435,0xCC77,0xFE1F,0xE5DC,0x8330,0x9351, +0xABB3,0x9B51,0x9350,0x9B50,0x830F,0x7AEF,0x830F,0x9BD3, +0xABF4,0xBC76,0xAC35,0xBC97,0xB456,0xAC35,0xA3F4,0x8BB1, +0x7C0F,0x842F,0xA554,0x9C31,0x524A,0xA414,0xFE9F,0xAC95, +0xB5D6,0xAD75,0x636D,0x6A6C,0xA351,0xC456,0xED5B,0xFDFE, +0xFE1E,0xFE1F,0xFE3F,0xFE3F,0xFE5F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE5F,0xFE5F,0xFE5F,0xFE5F,0xFE5F,0xFE5F,0xFE5F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xD4D8,0xF5FE,0xFE5F,0xFE3F,0xFE3F,0xF5FD, +0xCC56,0xD497,0x7AAE,0x622B,0xF5BD,0xFE7F,0xF5BD,0xCC77, +0xC415,0xDCF9,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xF61E,0x9BD3,0xC4F8,0xFE9F,0xFE1F, +0xFE3F,0xFE1F,0xFF1F,0xA4B4,0x8430,0x9471,0xBDF7,0xFFFF, +0xF7DE,0xAD55,0x8B90,0xBCF7,0xEDDD,0xFE3F,0xFE3F,0xFE3F, +0xFE1F,0xFE3F,0xFF3F,0xDD5A,0x4988,0xD477,0xCC77,0xC456, +0xCC56,0xC456,0xC415,0xF61E,0xFE5F,0xFE5F,0xEDFD,0xE57B, +0xE57B,0xDD1A,0xDD3A,0xE57C,0xE5BC,0xE5DC,0xEDFD,0xF61E, +0xFE1F,0xFE3F,0xFE5F,0xF61E,0xF61E,0xF61E,0xF5FE,0xE5BC, +0xE5FC,0xE5DC,0xC558,0x72ED,0x1883,0xBCB7,0xEE3D,0x7B8E, +0x9451,0x4187,0xAB92,0xD497,0xFDDE,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE1F, +0xFE1F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xF5DD,0xF5BD,0xFE5F,0xFE3F,0xFE1F,0xFE3F,0xEDDD, +0xC415,0xD498,0x7AAD,0x6A4C,0xFE1E,0xFE9F,0xE53A,0xC435, +0xC415,0xE55B,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE5F,0xDDBB,0x72AE,0xFE5F,0xFE5F, +0xFDFF,0xFEBF,0xCE19,0x738D,0x8431,0xBDD7,0xF7BE,0xFFFF, +0xFFFF,0xFFFF,0x738E,0x738E,0xFFFF,0xFE3F,0xFDFF,0xFE5F, +0xFF1F,0xFE9F,0xA414,0x1883,0xC435,0xD497,0xC456,0xCC56, +0xCC56,0xC415,0xEE1C,0xFEFF,0xFE1F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE5F,0xFE5F,0xFE5F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE5F, +0xFE5F,0xFE5F,0xFE3F,0xEE1D,0xE5FB,0xBC97,0x5A4B,0x5249, +0xABF4,0xD4B8,0xED9C,0xFE5F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE1F, +0xFE3F,0xFE3F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE1E,0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFE3F,0xED7C, +0xBC14,0xD4B7,0x7AAD,0x7ACE,0xFE7F,0xF61E,0xCCB7,0xC415, +0xCC56,0xF5DD,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE7F,0xC4F8,0x5A4B,0xFEDF, +0xFEDF,0xEF3D,0x62EC,0x39E7,0xA534,0xF7BE,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xF7BE,0x738E,0x7C0F,0xFFDF,0xFF9F,0xF63E, +0x5A6C,0x3146,0x622B,0x7A8D,0xCC97,0xCC76,0xC456,0xCC76, +0xCC56,0xC415,0xFFFF,0xFE7F,0xFE1F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE5F,0xFE5F,0xEE3D,0x9BD3, +0x51EA,0xE5BB,0xFEFF,0xFE3F,0xFE3F,0xFE1F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFE3F,0xFE3F,0xDCF9, +0xC435,0xC435,0x7A8D,0xA414,0xFEDF,0xE51A,0xC415,0xD497, +0xABB3,0xDD7B,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE1F, +0xFE3F,0xFE1F,0xFE3F,0xFE3F,0xFE5F,0xE5DC,0x6A6C,0xF65E, +0xE69C,0x4A49,0x4A49,0xBDD7,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xCE59,0x626C,0xAD35,0x6BCD,0x3146, +0xB3F4,0xFD7C,0x59E9,0xC435,0xCC97,0xC456,0xC456,0xCC56, +0xC436,0xCC97,0xFFFF,0xFE3F,0xFE1F,0xFE1F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE9F, +0xCD79,0x520A,0xA454,0xFF1F,0xFE1F,0xFE1F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFE3F,0xFE1F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFE3F,0xF61E,0xCC56, +0xCC76,0xABD3,0x72AE,0xCD3A,0xEDBC,0xC435,0xDCD8,0xA351, +0xA3D3,0xF61E,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE1F, +0xFE1F,0xFE1F,0xFE3F,0xFE3F,0xFE1F,0xFE7F,0xCD59,0x4A48, +0x52AB,0x4A49,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xD65A,0x5A4A,0x0821,0x9310,0xED3A, +0xD4B8,0xDCD8,0x59EA,0xC436,0xCC76,0xCC76,0xCC97,0xC435, +0xC435,0xCCB7,0xFFFF,0xFE3F,0xFE1F,0xF5DE,0xFE1F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE7F,0xF63D,0x72AD,0x8BD1,0xFEFF,0xFE1F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE1F,0xFE1F,0xFE1F,0xFE5F,0xF5BD,0xBBF4, +0xD497,0x9330,0x6A8D,0xDCF9,0xD497,0xE4D8,0x6A2B,0x8B71, +0xF63E,0xFE5F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE1F, +0xFE7F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE7F,0xD51A,0x3145, +0x8450,0xF79E,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0x94F2,0x3946,0xD497,0xE519,0xC455, +0xCC56,0xB415,0x9351,0xCC76,0xC435,0xD4D8,0xED7C,0xC415, +0xC436,0xCC37,0xFFFF,0xFE9F,0xFDFF,0xFDFE,0xFDFE,0xFE3F, +0xFE3F,0xFE3F,0xFDFF,0xFDDF,0xFDDF,0xFE1F,0xFE3F,0xFE1F, +0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE7F,0xEDFD,0x72CE,0xA474,0xFEFF,0xFE1F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFE3F,0xFE3F,0xFE1F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xD4D8,0xC435, +0xD497,0x82CE,0x6A4C,0xFD7C,0x9B51,0x4167,0xC4D7,0xFEDF, +0xFE5F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFE3F,0xFDBF, +0xFF5F,0xFDFF,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xCC98,0x9390, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0x8430,0x4127,0xED1A,0xD4B8,0xC415,0xC435, +0xFE7F,0x9C13,0xA392,0xCC76,0xC415,0xDCF9,0xFEDF,0xBC14, +0xC435,0xC3F5,0xFF9F,0xFFFF,0xFDDF,0xFDFF,0xFE1F,0xFE1F, +0xFE1F,0xFDFF,0xFEBF,0xFFFF,0xFFDF,0xFE7F,0xFDFF,0xFE1F, +0xFE1F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE1F,0xFE9F,0xD57A,0x7AEE,0xC518,0xFE7F,0xFE1F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE5F,0xED7C,0xBBF4,0xD497, +0xB3D4,0x6A6C,0x82EF,0x51A8,0x9350,0xFE7F,0xFE9F,0xFE1F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFE3F,0xFDFF,0xFE7F, +0xFFFF,0xFDBF,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xCC57,0x9BB1, +0xEF9D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0x9D14,0x59CA,0xE4FA,0xD4B7,0xC435,0xCC76,0xF5FE, +0xFEDF,0x9BD2,0x9B92,0xCC76,0xC415,0xDD3A,0xFE7F,0xFE3F, +0xBC15,0xBBD4,0xDCD9,0xFFFF,0xFFFF,0xFF7F,0xFEBF,0xFE1F, +0xFDFF,0xFEDF,0xFFFF,0xFFFF,0xFFFF,0xFF1F,0xFE1F,0xFE5F, +0xFE3F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE1F,0xFF1F,0x730E,0x8370,0xFE9F,0xFDFF, +0xFE1F,0xFE1F,0xFE1F,0xFE3F,0xFE1F,0xFE1F,0xFE1F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE1F, +0xFE3F,0xFE3F,0xFE3F,0xFE7F,0xED9C,0xC3F4,0xCC76,0xB3D3, +0x6A4B,0x59C9,0xB3D3,0xF5BC,0xFE9F,0xFE5F,0xFE1F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFDFF,0xFE1F,0xFFFF, +0xFF7F,0xFDDF,0xFE3F,0xFE3F,0xFE3F,0xFE1E,0xC415,0x9330, +0xA575,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xD6DA,0x838F,0xBC15,0xD4B7,0xC436,0xC435,0xEDBC,0xFE5F, +0xFE7F,0xB497,0x9350,0xCC56,0xC415,0xDD1A,0xFE5F,0xFE5F, +0xFE9F,0xED7B,0xD4B8,0xED7C,0xFEDF,0xFEBF,0xFE1F,0xFE1F, +0xFE5F,0xFF7F,0xFFFF,0xFFFF,0xFFFF,0xFEFF,0xFE1F,0xFF9F, +0xFF9F,0xFE3F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE1F,0xFE5F,0xDDBC,0x8C52,0xCE99,0xFFFF, +0xFFFF,0xFFDF,0xFF3F,0xFE7F,0xFE5F,0xFE3F,0xFE3F,0xFE1F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE5F,0xFE5F,0xFE1E,0xDCF9,0x8ACE,0x8B0F,0x8B0F,0xABB2, +0xDCF8,0xFDBD,0xFE5F,0xFE7F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFDDF,0xFE9F,0xFFFF,0xFFFF, +0xFEFF,0xFDFF,0xFE3F,0xFE3F,0xFE3F,0xF5FE,0xB3B3,0x9BB2, +0xC638,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xAD55,0x61CA,0xE4F9,0xC455,0xC415,0xD4D8,0xFE1E,0xFE3F, +0xFE5F,0xEDBD,0x72AD,0xC435,0xCC56,0xCC97,0xFE7F,0xFE3F, +0xFE3F,0xFE5F,0xFE7F,0xFE3F,0xFDFF,0xFDFF,0xFE1F,0xFE1F, +0xFE3F,0xFF1F,0xFFFF,0xFFFF,0xFF5F,0xFE3F,0xFDFF,0xFE5F, +0xFE3F,0xFE1F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFEFF,0x626C,0x3146,0x734E, +0x526A,0x4A29,0x6B4D,0x9CF3,0xE73C,0xF79D,0xF6DE,0xFE7F, +0xFE3F,0xFE3F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE5F,0xFE3F, +0xEDDD,0xB435,0x49A8,0x6A4B,0xC435,0xDCB8,0xED5B,0xFE1E, +0xFE7F,0xFE7F,0xFE3F,0xFE1F,0xFE1F,0xFE3F,0xFE1F,0xFE3F, +0xFE1F,0xFE1F,0xFE1F,0xFE5F,0xFFBF,0xFFFF,0xFFFF,0xFFDF, +0xFDFF,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xE55A,0xAB92,0x6AAC, +0xE73C,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xAD15,0xAB52,0xCC77,0xC456,0xC435,0xE57B,0xFE5F,0xFE3F, +0xFE3F,0xFEBF,0x49A8,0xC435,0xCC76,0xBBF4,0xFE3F,0xFE3F, +0xFE3F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE1F,0xFE3F,0xFEDF,0xFE9F,0xFE1F,0xFE1F,0xFE3F,0xFE1F, +0xFE1F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFE1F,0xFE3F, +0xFE3F,0xFE1F,0xFE1F,0xFE1F,0xFE1F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xFEBF,0x9392,0x9452,0xAD75, +0xBDB7,0xBD97,0xE6FC,0xDE5B,0x39A7,0x3166,0x8C30,0xE6FC, +0xEEDD,0xFE7F,0xFE5F,0xFE5F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE5F,0xFE3F,0xEDBD,0xB435, +0x28E4,0x82CE,0xE4F9,0xE53A,0xEDBD,0xFE7F,0xFE7F,0xFE3F, +0xFE3F,0xFE3F,0xFE1F,0xFE3F,0xFE3F,0xFE1F,0xFE3F,0xFE1F, +0xFE1F,0xFE5F,0xFF3F,0xFFFF,0xFF9F,0xFF3F,0xFE7F,0xFDDE, +0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xF61E,0xCC56,0xAB93,0x6ACC, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xA473,0xCC36,0xCC56,0xC435,0xCC76,0xEDBD,0xFE5F,0xFE3F, +0xFE3F,0xFE9F,0x5A4B,0xB3F4,0xCC77,0xC415,0xDCF9,0xFE5F, +0xFDFE,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE1F,0xFDFF,0xFDFF,0xFE1F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE1E,0xFE1F,0xFE3F,0xFE5F,0xEDDD, +0xFE9F,0xFE9F,0xFE7F,0xFE5F,0xFE3F,0xFE1F,0xFE1F,0xFE1F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE7F,0xBC97,0xA4B4,0xF7BE, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xA514,0xBD36,0x2863, +0x5A8B,0xACB4,0xD559,0xED9B,0xFDFE,0xF61E,0xF61E,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE5F,0xFE5F,0xE5BC,0xABF3,0x4987,0x7A8D, +0xED3A,0xED5B,0xFDFE,0xFE7F,0xFE5F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE1F,0xFE7F,0xFF7F,0xFF9F,0xFEDF,0xFE3F,0xFE1F, +0xFE1F,0xFE5F,0xFE3F,0xFDFF,0xFDDF,0xFDFF,0xFE1F,0xFE3F, +0xFE1F,0xFE3F,0xFE3F,0xFE5F,0xE53A,0xC415,0xABB3,0x7BEF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xA453,0xCC36,0xCC56,0xC435,0xCC97,0xF5DD,0xFE3F,0xFE3F, +0xFE3F,0xFE9F,0xD4F9,0x4188,0xCC97,0xCC76,0xBBD4,0xF5DD, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE1F,0xF5FE, +0xFE5F,0xF61E,0xC4B7,0xD4D9,0xE5BC,0xF5FD,0xF63E,0xB4B6, +0xB576,0xCEB9,0xDEDB,0xFF7F,0xFF7F,0xFF3F,0xFEBF,0xFE5F, +0xFE1F,0xFE1F,0xFE1F,0xFE3F,0xFE3F,0xFDFE,0xA473,0xD6BA, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xB5B6,0xC577, +0xBC75,0x3186,0x62AB,0x9B50,0xAB92,0xC435,0xDCD8,0xDCF9, +0xE53A,0xED9C,0xF5BD,0xF5FD,0xF5FE,0xF61E,0xF5FE,0xF5FE, +0xF5FD,0xF5FE,0xF5DD,0xCCB8,0x4187,0x4147,0xE4F9,0xED7B, +0xFE3F,0xFE7F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFDFF,0xFEDF,0xFFFF,0xFFFF,0xFFFF,0xFE9F,0xFE1F, +0xFE3F,0xFE1F,0xFE1F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE1F, +0xFE3F,0xFE5F,0xFE3F,0xEDBC,0xC435,0xC415,0x8B2F,0xDF3C, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xBD56,0xB393,0xCC76,0xC435,0xCC97,0xF5DD,0xFE5F,0xFE1F, +0xFE9F,0xE5BC,0xD539,0x18E3,0x9330,0xDCB8,0xC436,0xBC15, +0xED9C,0xF5FD,0xFE1F,0xFE3F,0xFE3F,0xFE5F,0xFE5F,0xFE5F, +0xFE3F,0xFE1F,0xFE1F,0xF5FE,0xF5FE,0xFE3F,0xFE7F,0xD53A, +0xA433,0xB555,0x5269,0xB475,0xB4F5,0xDDF9,0xC4D6,0xDE9B, +0x1062,0x6B2D,0x526A,0xD61A,0xD639,0xCE38,0xDEFB,0xEF5D, +0xFEFF,0xFE3F,0xFE1F,0xFE3F,0xFE3F,0xFE7F,0xA474,0xCE99, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xEFBD,0xFFFF,0xFFFF,0xB5D6,0x524A,0x8B0F,0xB3F4,0xBC14, +0xCC76,0xCC56,0xC456,0xC456,0xCC56,0xCC77,0xCC77,0xCC56, +0xCC56,0xCC76,0x8B0F,0x3926,0x9B50,0xED3A,0xF5DD,0xFE9F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F, +0xFE3F,0xFE1F,0xFE7F,0xFF5F,0xFF9F,0xFF1F,0xFE5F,0xFE1F, +0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE3F,0xFE5F, +0xFE3F,0xF5FD,0xE51A,0xC415,0xCC56,0x92F0,0x9472,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xD659,0x8AF0,0xD497,0xC455,0xCC76,0xEDBC,0xFE5F,0xFE9F, +0xDDDB,0x5A4B,0x6B8D,0x9D13,0x6B4D,0xA392,0xD4B8,0xC456, +0xBBF4,0xCC76,0xDD19,0xE57B,0xEDBC,0xEDDD,0xEDBC,0xED9C, +0xED9C,0xED7B,0xDCF9,0xC476,0xCCD8,0xD59A,0xDE1A,0x93F1, +0x3A07,0xBDF7,0x9D13,0xA4B3,0xE6DC,0xE75C,0xD5B9,0xAD55, +0xAD96,0xFFFF,0x9CD3,0xBD96,0x9411,0x5229,0x624C,0x8C31, +0xDEFB,0xFF7F,0xFE7F,0xFE1F,0xFE3F,0xFE5F,0x9C33,0xCE79, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xD6BA,0x528A,0x49C8,0x7A8D, +0x9B71,0xABB3,0xBBF4,0xCC56,0xD477,0xD497,0xD497,0xD497, +0xD497,0x8B0F,0x622B,0xC456,0xE53B,0xFE3F,0xFE5F,0xFE1F, +0xFE3F,0xFE5F,0xFE5F,0xFE5F,0xFE5F,0xFE5F,0xFE5F,0xFE5F, +0xFE5F,0xFE3F,0xFE1F,0xFE1F,0xFE1F,0xFE1F,0xFE1F,0xFE3F, +0xFE3F,0xFE3F,0xFE5F,0xFE5F,0xFE5F,0xFE3F,0xFE1E,0xEDDD, +0xE55B,0xC456,0xC435,0xD497,0x9B30,0x62EC,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xE73C,0x9C32,0xAB72,0xD497,0xC435,0xE53A,0xFE9F,0xDDBB, +0x524A,0x73AE,0xAD96,0xEF7D,0xFFFF,0x528A,0x8AEF,0xDCF9, +0xD477,0xCC76,0xCC35,0xCC56,0xC415,0xC415,0xC435,0xCC56, +0xB3D3,0x9B31,0x7AAD,0x732D,0xB556,0x8C11,0x7B2E,0x6ACC, +0xC638,0xFFFF,0xE71C,0xCE9A,0xC658,0xC618,0xBDF7,0xFFFF, +0xFFFF,0xFFFF,0xEF9E,0xCE59,0xD6FA,0xD6BA,0x8BF1,0x9452, +0xAD35,0xCE99,0xE6BC,0xFE7F,0xFE1F,0xFE1F,0xA474,0xD6BA, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xCE39,0xACF4,0x83CF, +0x62EC,0x7B4E,0x8B70,0x8B2F,0x8B0F,0x8AEF,0x82CE,0x9350, +0x728D,0x6A4B,0xC456,0xDCD8,0xE57B,0xE55B,0xDD1A,0xDD19, +0xE53A,0xED7C,0xED7C,0xED9C,0xED9C,0xEDBC,0xEDBD,0xF5DD, +0xF5FE,0xF5FE,0xFE1E,0xFE1F,0xFE1F,0xFE1F,0xFE1E,0xFE1E, +0xF61E,0xF5FE,0xF5DD,0xEDBC,0xED7B,0xE53A,0xD4D8,0xC456, +0xC415,0xDCB8,0xB3B4,0x8AAF,0x836F,0xEF7D,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xD679,0x7AEE,0xBBB4,0xD477,0xD497,0xEDDC,0x732E, +0x52CA,0xEF7D,0xFFFF,0xFFFF,0xFFFF,0xD6DA,0x634C,0x8B70, +0xA3F3,0x6A6C,0x9350,0x9BB2,0xE57A,0xE57A,0xE51A,0xC436, +0x6A4C,0x736E,0x9CD3,0x8450,0xBDF7,0xC618,0x9CF3,0xE73C, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xF7BE,0xB596,0xAD74,0xE67C,0xFE9F,0xDD3B,0xB516,0xEF5D, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEF7D, +0xDEFB,0xDF1B,0xBE38,0x9D13,0x6B8D,0x4A89,0x4A29,0x2144, +0x3966,0xCC56,0xDCD8,0xD477,0xCC56,0xCC36,0xCC56,0xCC36, +0xCC36,0xCC36,0xCC56,0xCC56,0xC456,0xC456,0xCC76,0xCC97, +0xD4B7,0xD4B8,0xD4D9,0xD4F9,0xDCF9,0xDCF9,0xD4F9,0xD4D9, +0xD4D8,0xD4B8,0xCC77,0xC436,0xC414,0xC435,0xD477,0xD497, +0xB3D4,0x724D,0x7B4E,0x7BCF,0xEF5D,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xCE59,0x8B90,0x9B31,0xD457,0x9B51,0x4209, +0xA514,0xF7BE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x8470, +0xAD96,0x7C2F,0xA534,0x738E,0xBD77,0xB516,0xA3F3,0x8B90, +0x8C71,0xE75C,0xFFFF,0xF79E,0xE73C,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xD6BA,0xB596,0xFEBF,0xA3D4,0xBD77,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFDF,0xE73C,0xE73C,0x838F, +0x9B11,0xA351,0x9330,0x9BB2,0xA3D2,0xAC14,0x8B0F,0xA372, +0x9B51,0x9B11,0xA331,0xBBD4,0xC3F5,0xCC36,0xCC36,0xCC56, +0xCC76,0xCC56,0xCC56,0xCC56,0xCC56,0xCC56,0xCC56,0xC436, +0xCC56,0xCC56,0xD497,0xD497,0xD497,0xCC56,0x9310,0x8B0F, +0x4187,0x6B8E,0xC679,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xD6DA,0xA4B4,0xA3B2,0x626C,0x8C51, +0xF79E,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xDEFB,0xBE17,0xB596,0xA534,0xC638, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xDEDB,0xDDFB,0xACB5,0xCE79,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xD65A,0x9B71, +0xA3D2,0xB4F5,0x9492,0x8C71,0x8C71,0x8C51,0x9CD3,0xBD97, +0xBD76,0xBD36,0xACD4,0x834F,0xBD16,0xBCD6,0xB454,0x9B71, +0x92CF,0x9B11,0xA331,0xA352,0xAB93,0xABB3,0xB3D3,0xBBD4, +0xB3D4,0xA352,0x92F0,0x7A6D,0x726D,0x5A0A,0x5AAA,0x632C, +0x8C91,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xCE39,0xC618,0xFFDF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xC5F8,0xC5F8,0xF7DE,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xDE7A,0xCDD8, +0xE6FC,0xFFFF,0xF7DE,0xE75C,0xE73C,0xDEDB,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xBE18,0xA575,0xA555,0x9491,0x83F0, +0xB556,0xC597,0xC597,0x9C53,0x7B4F,0x7B0E,0x6AAC,0x628B, +0x72ED,0x9411,0xA4B4,0xA4D4,0xA514,0x9D14,0xCE99,0xDEFB, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE75C,0xEF7D,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xDEDB,0xE71C,0xDEFB,0xDF1B, +0xFFFF,0xFFFF,0xFFFF,0xEF7D,0xD6BA,0xCE79,0xC638,0xBDF7, +0xC658,0xE73C,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, +0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF +};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sat Jul 02 22:05:27 2011 +0000 @@ -0,0 +1,399 @@ +// MARMEX OLED and GPS test program +// Author : Yuji Notsu +// Date : 14-Jun-2011 +// Revision : 0.0 + +/** A sample app of MARMEX_OB OLED screen drawing library + * + * @author Tedd + * @version 0.51 + * @date 08-Apr-2011 + * + * Released under the MIT License: http://mbed.org/license/mit + * + * MARMEX_OB_oled OLED screen drawing library for mbed + * This code has been written based on sample code and advises + * from Ochiai-san (Marutsu-Elec). Thank you! + * + * To build this code, "NokiaLCD" and "mbed" libraries are needed to be imported in a project. + * NokiaLCD library : http://mbed.org/users/simon/libraries/NokiaLCD/ + */ + + +#include "mbed.h" +#include "MARMEX_OB_oled.h" +#include "imagedata.h" +#include "gpsrtc.h" +#include "TextLCD.h" +#include "SDFileSystem.h" +#include "PowerControl/EthernetPowerControl.h" + +// oled1 is for MARMEX_OB_oled board on MAPLE slot 1 +MARMEX_OB_oled oled1( p5, p7, p8, p30, p11 ); // mosi, sclk, cs, rst, power_control + +TextLCD lcd(p25,p24,p12,p13,p14,p23); //rs,e,d0-d3 + +SDFileSystem sd(p5, p6, p7, p20, "sd"); // the pinout on the mbed Cool Components workshop board +Serial pc(USBTX, USBRX); // tx, rx + +InterruptIn sendpcmode(p16); +InterruptIn oledmode(p17); + +//AnalogIn ain(p19); +InterruptIn ain(p18); +DigitalOut led(LED3); + +float sdata; +char pcmodevalue; +char oledmodevalue; +char graphnum=0; +float graph[16]; +int c1,c2,c3,c4,c5,c6; +char c1en,c2en,c3en,c4en,c5en,c6en; +float maxdata; + +void oled_image2(const unsigned int *ptr2); + +void changepcmode() +{ + pcmodevalue=!pcmodevalue; +} + +void changeoledmode() +{ + oledmodevalue=!oledmodevalue; +} + +void count_geiger() +{ + led=1; + if(c1en==1) c1++; + if(c2en==1) c2++; + if(c3en==1) c3++; + if(c4en==1) c4++; + if(c5en==1) c5++; + if(c6en==1) c6++; + led=0; + } + +void setup_pinmode() +{ + //p25 lowlevel = write mode? + sendpcmode.mode(PullUp); + sendpcmode.rise(&changepcmode); +} + +void setup_pinmode2() +{ + oledmode.mode(PullUp); + oledmode.rise(&changeoledmode); + for(int i=0;i<=15;i++) + { + graph[i]=0.0; + } +} + +void setup_pinmode3() +{ + ain.mode(PullNone); + ain.rise(&count_geiger); +} + + +int main() { + + // Initialize RTC + // + // Init_RTC(1, 11, 05, 31, TUE, 00, 55, 00); // with adjustment + //wait(1.0); + // Init_RTC(0, 00, 00, 00, 000, 00, 00, 00); // without adjustment + // + + PHY_PowerDown(); + + pcmodevalue=0x00; + oledmodevalue=0x00; + graphnum=0; + lcd.cls(); + lcd.locate(0,0); + lcd.printf("Startup"); + pc.printf("Startup\n"); + sdata=0.0; + + //Start up window (texe base) + oled1.background( 0x000000 ); + oled1.cls(); + oled1.locate(0,1); + oled1.printf("Takoruka OS"); + oled1.locate(0,2); + oled1.printf("starting."); + wait(1.0); + oled1.printf("."); + wait(1.0); + oled1.printf("."); + wait(1.0); + oled1.printf("."); + wait(1.0); + oled1.locate(0,3); + oled1.printf("done!"); + + c1=0; + c2=0; + c3=0; + c4=0; + c5=0; + c6=0; + //setup_pinmode(); + //setup_pinmode2(); + //setup_pinmode3(); + + //display Imade data of imagedata.h + wait(1.0); + oled1.cls(); + oled1.locate(0,0); + oled_image2(Header1); + + wait(1.0); + oled1.cls(); + + lcd.cls(); + lcd.locate(0,0); + lcd.printf("GPS Data reading"); + pc.printf("GPS data reading\n"); + sGPSRTC sGPSRTC_Data; + sGPSRTC *psGPSRTC_Data; + + int count = 0; + c1en=1; + c2en=0; + c3en=0; + c4en=0; + c5en=0; + c6en=0; + setup_pinmode(); + setup_pinmode2(); + setup_pinmode3(); + + while(1) + { + //Get GPSRTC data and display + Get_GPGGA_Data(&sGPSRTC_Data); + Get_RTC_Data(&sGPSRTC_Data); + psGPSRTC_Data = &sGPSRTC_Data; + //Get sensor value + //sdata = ain.read(); + + //oled1.cls(); + + if(oledmodevalue==0x01) + { + oled1.cls(); + oled1.locate(0,1); + oled1.foreground(0xff00ff); + oled1.printf("RTC"); + oled1.locate(0,2); + oled1.foreground(0x00ffff); + oled1.printf("%02d/%02d/%02d(%s)", + psGPSRTC_Data->bRTC_year, psGPSRTC_Data->bRTC_mon, psGPSRTC_Data->bRTC_day, + Get_Week_String(psGPSRTC_Data->bRTC_week)); + oled1.locate(0,3); + oled1.printf("%02d:%02d:%02d", + psGPSRTC_Data->bRTC_hour, psGPSRTC_Data->bRTC_min, psGPSRTC_Data->bRTC_sec); + oled1.locate(0,4); + oled1.foreground(0xff0000);//Red + oled1.printf("----------"); + oled1.foreground(0x00ffff); //Cyan + oled1.foreground(0xff00ff); + oled1.locate(0,5); + oled1.printf("GPS"); + oled1.foreground(0xffff00); //Yellow + oled1.locate(0,6); + oled1.printf("UTC ="); + oled1.printf("%02d:%02d:%02d", + psGPSRTC_Data->bGPS_UTC_hour, psGPSRTC_Data->bGPS_UTC_min, psGPSRTC_Data->bGPS_UTC_sec); + oled1.locate(0,7); + //oled1.foreground(0x00ffff); //Cyan + oled1.printf("LAT ="); + oled1.printf("%c %02d:%02d:%02d", psGPSRTC_Data->cGPS_LAT, + psGPSRTC_Data->bGPS_LAT_deg, psGPSRTC_Data->bGPS_LAT_min, psGPSRTC_Data->bGPS_LAT_sec); + oled1.foreground(0xffff00); //Yellow + oled1.locate(0,8); + oled1.printf("LNG ="); + oled1.printf("%c%03d:%02d:%02d", psGPSRTC_Data->cGPS_LNG, + psGPSRTC_Data->bGPS_LNG_deg, psGPSRTC_Data->bGPS_LNG_min, psGPSRTC_Data->bGPS_LNG_sec); + oled1.locate(0,9); + oled1.printf("Qual="); + oled1.printf("%c ", psGPSRTC_Data->cGPS_Quality); + oled1.locate(0,10); + oled1.foreground(0x00ffff); //Cyan + oled1.printf("Sat ="); + oled1.printf("%3d ", psGPSRTC_Data->bGPS_Sat); + oled1.locate(0,11); + oled1.printf("HDOP="); + oled1.printf("%1d.%1d ", psGPSRTC_Data-> bGPS_HDOP_I, psGPSRTC_Data->bGPS_HDOP_D); + oled1.locate(0,12); + oled1.printf("ASL ="); + oled1.printf("%4dm", psGPSRTC_Data->wGPS_ASL_m); + oled1.locate(0,13); + oled1.printf("GEO ="); + oled1.printf("%4dm", psGPSRTC_Data->wGPS_GEO_m); + } + else //display sensor value (update 10sec) + { + + switch(count) + { + case 0: + c1en=0; + sdata=c1; + c1=0; + c1en=1; + break; + case 10: + c2en=0; + sdata=c2; + c2=0; + c2en=1; + break; + case 20: + c3en=0; + sdata=c3; + c3=0; + c3en=1; + break; + case 30: + c4en=0; + sdata=c4; + c4=0; + c4en=1; + break; + case 40: + c5en=0; + sdata=c5; + c5=0; + c5en=1; + break; + case 50: + c6en=0; + sdata=c6; + c6=0; + c6en=1; + break; + default: + sdata=sdata; + break; + } + if(sdata>maxdata) maxdata=sdata; + if((count%10)==1) + { + oled1.cls(); + float mSvh = float(sdata)/633.0; + graphnum++; + if(graphnum==16) graphnum=0; + graph[graphnum]=sdata; + + for(int i=0;i<=15;i++) + { + int width = int(graph[i]/10); + if(i!=graphnum) + oled1.fill(i*8,28+(100-width),7,width,0xffff00); + else + oled1.fill(i*8,28+(100-width),7,width,0xff00ff); + } + oled1.locate(0,1); + oled1.foreground(0xff00ff); //Magenta + oled1.printf("Sensor value"); + oled1.locate(0,2); + oled1.foreground(0x00ffff); //Cyan + oled1.printf("%4.1f max:%4.1f",sdata,maxdata); + oled1.locate(0,3); + oled1.printf("%7.4f [uSv/h]",mSvh); + } + } + + count ++; + + if((count%10)==1) + { + FILE *fp=fopen("/sd/datalog.csv","a"); + if(fp==NULL) + { + error("Could not open file for write\n"); + } + fprintf(fp,"UTC ,"); + fprintf(fp,"%02d:%02d:%02d ,", + psGPSRTC_Data->bRTC_hour, psGPSRTC_Data->bRTC_min, psGPSRTC_Data->bRTC_sec); + fprintf(fp,"LAT ,"); + fprintf(fp,"%c,%02d:%02d:%02d ,", psGPSRTC_Data->cGPS_LAT, + psGPSRTC_Data->bGPS_LAT_deg, psGPSRTC_Data->bGPS_LAT_min, psGPSRTC_Data->bGPS_LAT_sec); + fprintf(fp,"LNG ,"); + fprintf(fp,"%c, %03d:%02d:%02d ,", psGPSRTC_Data->cGPS_LNG, + psGPSRTC_Data->bGPS_LNG_deg, psGPSRTC_Data->bGPS_LNG_min, psGPSRTC_Data->bGPS_LNG_sec); + fprintf(fp,"Count,%4.2f \n",sdata); + fclose(fp); + } + //Serial PC communication + if(pcmodevalue==0x00) + { + pc.printf("UTC,"); + pc.printf("%02d:%02d:%02d ,", + psGPSRTC_Data->bRTC_hour, psGPSRTC_Data->bRTC_min, psGPSRTC_Data->bRTC_sec); + pc.printf("LAT,"); + pc.printf("%c,%02d:%02d:%02d ,", psGPSRTC_Data->cGPS_LAT, + psGPSRTC_Data->bGPS_LAT_deg, psGPSRTC_Data->bGPS_LAT_min, psGPSRTC_Data->bGPS_LAT_sec); + pc.printf("LNG,"); + pc.printf("%c, %03d:%02d:%02d ,", psGPSRTC_Data->cGPS_LNG, + psGPSRTC_Data->bGPS_LNG_deg, psGPSRTC_Data->bGPS_LNG_min, psGPSRTC_Data->bGPS_LNG_sec); + } + if(count==60) count=0; + + wait(0.3); + + if((psGPSRTC_Data->bGPS_Sat)<=3) + { + lcd.cls(); + lcd.locate(0,0); + lcd.printf("Can't read GPS"); + } + else + { + lcd.cls(); + lcd.locate(0,0); + lcd.printf("GPS data reading"); + } + + lcd.locate(0,1); + lcd.printf("Count=%4.1f",sdata); + if(pcmodevalue==0x00) + pc.printf("Count=%4.1f\n",sdata); + + } + + +} + +void oled_image2(const unsigned int *ptr2) +{ + short height,width; + int colour; + height = *ptr2; + ptr2++; + width = *ptr2; + ptr2++; + oled1.locate(0,0); + for(int i=1;i<=width;i++) + { + for(int j=1;j<=height;j++) + { + colour = (((*ptr2&0xF800)<<8) | ((*ptr2&0x07E0)<<5) | ((*ptr2&0x001F)<<3)); + oled1.pixel(j,i,colour); + ptr2++; + } + } +} + +/* + * history: + * 0.5 (2011-Apr-07) : initial published version + * 0.51 (2011-Apr-08) : minor modification to make the source more consistent (use " MARMEX_OB_oled::HEIGHT" instead of 128) + */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Sat Jul 02 22:05:27 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/029aa53d7323
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/type.h Sat Jul 02 22:05:27 2011 +0000 @@ -0,0 +1,46 @@ +/***************************************************************************** + * type.h: Type definition Header file for NXP Family + * Microprocessors + * + * Copyright(C) 2006, NXP Semiconductor + * All rights reserved. + * + * History + * 2009.04.01 ver 1.00 Preliminary version, first Release + * +******************************************************************************/ +#ifndef __TYPE_H__ +#define __TYPE_H__ + +// CodeRed - ifdef for GNU added to avoid potential clash with stdint.h +#if defined ( __GNUC__ ) +//#include <stdint.h> +#else + +/* exact-width signed integer types */ +//typedef signed char int8_t; +//typedef signed short int int16_t; +//typedef signed int int32_t; +//typedef signed __int64 int64_t; + + /* exact-width unsigned integer types */ +//typedef unsigned char uint8_t; +//typedef unsigned short int uint16_t; +//typedef unsigned int uint32_t; +//typedef unsigned __int64 uint64_t; + +#endif // __GNUC__ + +#ifndef NULL +#define NULL ((void *)0) +#endif + +#ifndef FALSE +#define FALSE (0) +#endif + +#ifndef TRUE +#define TRUE (1) +#endif + +#endif /* __TYPE_H__ */ \ No newline at end of file