diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..2618ac6 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,30 @@ +cmake_minimum_required(VERSION 2.8) +project(doorlockd) + +option(USE_COLORIZED_LOGS "Colorized logging" ON) + +add_definitions(-std=c++11) + +configure_file ( + "${PROJECT_SOURCE_DIR}/config.h.in" + "${PROJECT_BINARY_DIR}/config.h" +) + +include_directories("${PROJECT_BINARY_DIR}") + +set(SRCS +main.cpp +logger.cpp +door.cpp +epaper.cpp +logic.cpp +util.cpp +epaper/Display_COG_Process.c +epaper/Display_Controller.c +epaper/Display_Hardware_Driver.c +epaper/bsp.c +) + +add_executable(doorlockd ${SRCS}) + +target_link_libraries(doorlockd wiringPi jsoncpp) diff --git a/config.h.in b/config.h.in new file mode 100644 index 0000000..4e8542d --- /dev/null +++ b/config.h.in @@ -0,0 +1,16 @@ +#ifndef CONFIG_H +#define CONFIG_H + +#cmakedefine USE_COLORIZED_LOGS + +#ifdef DEBUG +#define DEFAULT_LOG_LEVEL LogLevel::debug2 +#else +#define DEFAULT_LOG_LEVEL LogLevel::info +#endif + +#define TOKEN_TIMEOUT 15 +#define LOCKPAGE_PREFIX "https://lock.binary.kitchen/" +#define FIFO_LOCATION "/tmp/fifo" + +#endif diff --git a/door.cpp b/door.cpp new file mode 100644 index 0000000..50c705b --- /dev/null +++ b/door.cpp @@ -0,0 +1,42 @@ +#include +#include + +#include "logger.h" +#include "door.h" + +using namespace std; + + +constexpr int LOCKPIN = 10; + +Door::Door() : _l(Logger::get()) +{ + _l(LogLevel::info, "Initializing Raspberry Pi GPIOs"); + wiringPiSetup(); + pinMode(LOCKPIN, OUTPUT); + + lock(); +} + +Door::~Door() +{ + +} + +Door &Door::get() +{ + static Door d; + return d; +} + +void Door::lock() +{ + _l(LogLevel::info, "Door closed"); + digitalWrite(LOCKPIN, HIGH); +} + +void Door::unlock() +{ + _l(LogLevel::info, "Door opened"); + digitalWrite(LOCKPIN, LOW); +} diff --git a/door.h b/door.h new file mode 100644 index 0000000..0a9e36a --- /dev/null +++ b/door.h @@ -0,0 +1,25 @@ +#ifndef DOOR_H +#define DOOR_H + +#include + +#include "logger.h" + +class Door { + +public: + static Door &get(); + + ~Door(); + + void lock(); + void unlock(); + +private: + + Door(); + + const Logger &_l; +}; + +#endif diff --git a/epaper.cpp b/epaper.cpp new file mode 100644 index 0000000..0cb4279 --- /dev/null +++ b/epaper.cpp @@ -0,0 +1,53 @@ +#include +#include +#include + +#include "logger.h" + +extern "C" { +#include "epaper/bsp.h" +#include "epaper/Display_Controller.h" +} + +#include "epaper.h" + +#include "template.h" + +using namespace std; + +Epaper::Epaper() : + _logger(Logger::get()) +{ + memset(_prevImg, 0xFF, ARRAY_SIZE); + bsp_init(); +} + +Epaper::~Epaper() +{ +} + +Epaper &Epaper::get() +{ + static Epaper e; + return e; +} + +void Epaper::draw(const string &uri) +{ + unsigned char buffer[ARRAY_SIZE]; + snprintf((char*)buffer, ARRAY_SIZE, "qrencode -l M -d 100 -s 5 \"%s\" -o /tmp/qr.png", uri.c_str()); + system((char*)buffer); + + FILE* f = popen("composite -geometry +90+0 /tmp/qr.png /tmp/template.png -colorspace gray -depth 1 gray:-", "r"); + int i = fread(buffer, ARRAY_SIZE, 1, f); + if (i != 1) + { + _logger(LogLevel::error, "Image format error"); + pclose(f); + return; + } + pclose(f); + + epd_DisplayImg(EPDType_270, buffer, _prevImg); + memcpy(_prevImg, buffer, ARRAY_SIZE); +} diff --git a/epaper.h b/epaper.h new file mode 100644 index 0000000..c0826f8 --- /dev/null +++ b/epaper.h @@ -0,0 +1,31 @@ +#ifndef EPAPER_H +#define EPAPER_H + +#include +#include + +#include "logger.h" + +class Epaper { +public: + + constexpr static int HEIGHT = 176; // In Pixel + constexpr static int WIDTH = 33; // In Byte + + constexpr static int ARRAY_SIZE = HEIGHT * WIDTH; + + static Epaper &get(); + ~Epaper(); + + void draw(const std::string &uri); + +private: + + Epaper(); + + uint8_t _prevImg[ARRAY_SIZE]; + + const Logger &_logger; +}; + +#endif diff --git a/epaper/Display_COG_Process.c b/epaper/Display_COG_Process.c new file mode 100644 index 0000000..ef8c600 --- /dev/null +++ b/epaper/Display_COG_Process.c @@ -0,0 +1,650 @@ +// Copyright 2013 Pervasive Displays, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +// express or implied. See the License for the specific language +// governing permissions and limitations under the License. + +/****************************************************************************** + * Includes + *****************************************************************************/ +//#include "driver_config.h" +//#include "target_config.h" +//#include "type.h" +//#include "gpio.h" +#include "Display_COG_Process.h" +#include "Display_Hardware_Driver.h" +#include "Display_Controller.h" + + +/****************************************************************************** + * Defines and typedefs + *****************************************************************************/ +#define _GaugeFrameTimeMark 0 + +const COG_Parameters_t COG_Parameters[3]= { + { //for 1.44" + {0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0x00}, + 0x03, + (128/8), + 96, + (((128+96)*2)/8), + (43), + 480 + }, + { //for 2.0" + {0x00,0x00,0x00,0x00,0x01,0xFF,0xE0,0x00}, + 0x03, + (200/8), + 96, + (((200+96)*2)/8)+1, + (53), + 480 + }, + { //for 2.7" + {0x00,0x00,0x00,0x7F,0xFF,0xFE,0x00,0x00}, + 0x00, + (264/8), + 176, + (((264+176)*2)/8)+1, + 105, + 630 + }, +}; + +const uint8_t ScanTable[4] = {0xC0, 0x30, 0x0C, 0x03}; + + +/****************************************************************************** + * Local variables + *****************************************************************************/ +static uint32_t StageTime = 480; +static COG_LineDataPacket_t COG_Line; +static uint16_t EPD_Type_Index = 0; +static uint16_t cnt = 0; +static uint32_t Currentframe; +static uint8_t *DataLineEven; +static uint8_t *DataLineOdd; +static uint8_t *DataLineScan; +static uint8_t *DisplayOrgPtr; + + +/****************************************************************************** + * Local functions + *****************************************************************************/ +static void SetTemperature_Factor(uint8_t EPD_Type_Index) +{ + int16_t Temperature; + + //Get current temperature + Temperature = epd_get_temperature(); + + if (Temperature < -10) + { + StageTime = COG_Parameters[EPD_Type_Index].StageTime * 17; + } + else if (Temperature < -5) + { + StageTime = COG_Parameters[EPD_Type_Index].StageTime * 12; + } + else if (Temperature < 5) + { + StageTime = COG_Parameters[EPD_Type_Index].StageTime * 8; + } + else if (Temperature < 10) + { + StageTime = COG_Parameters[EPD_Type_Index].StageTime * 4; + } + else if (Temperature < 15) + { + StageTime = COG_Parameters[EPD_Type_Index].StageTime * 3; + } + else if (Temperature < 20) + { + StageTime = COG_Parameters[EPD_Type_Index].StageTime * 2; + } + else if (Temperature < 40) + { + StageTime = COG_Parameters[EPD_Type_Index].StageTime * 1; + } + else + { + StageTime = (COG_Parameters[EPD_Type_Index].StageTime * 7)/10; + } +} + +static void Driver_TypeSelect(uint8_t typeIndex) +{ + switch(typeIndex) + { + case EPDType_144: + DataLineEven=&COG_Line.LineDatas.COG_144LineData.Even[0]; + DataLineOdd=&COG_Line.LineDatas.COG_144LineData.Odd[0]; + DataLineScan=&COG_Line.LineDatas.COG_144LineData.Scan[0]; + break; + case EPDType_200: + DataLineEven=&COG_Line.LineDatas.COG_20LineData.Even[0]; + DataLineOdd=&COG_Line.LineDatas.COG_20LineData.Odd[0]; + DataLineScan=&COG_Line.LineDatas.COG_20LineData.Scan[0]; + break; + case EPDType_270: + DataLineEven=&COG_Line.LineDatas.COG_27LineData.Even[0]; + DataLineOdd=&COG_Line.LineDatas.COG_27LineData.Odd[0]; + DataLineScan=&COG_Line.LineDatas.COG_27LineData.Scan[0]; + break; + } +} + +//#pragma GCC optimize ("-O3") +static void Display_Stage_1 (uint8_t *PreviousPicture) +{ + uint16_t i,j,k; // general counters + uint8_t TempByte; // Temporary storage for image data check + uint16_t StartClock; +#ifdef DISPLAY_180_DEGREE + uint8_t *DataLinePrt; + DisplayOrgPtr = (PreviousPicture+(uint32_t)((COG_Parameters[EPD_Type_Index].VERTICAL-1)*COG_Parameters[EPD_Type_Index].HORIZONTAL)); +#else + DisplayOrgPtr = PreviousPicture; +#endif + Currentframe = (uint32_t)COG_Parameters[EPD_Type_Index].FrameTime; +//TestPinTrigger(); + cnt = 0; + StartClock = epd_GetCurrentTimeTick(); + do + { +// TestPin2Trigger(); + PreviousPicture = DisplayOrgPtr; +#ifdef DISPLAY_180_DEGREE + DataLinePrt = PreviousPicture; +#endif + for (i = 0; i < COG_Parameters[EPD_Type_Index].VERTICAL; i++) // for every line + { + // SPI (0x04, ...) + epd_SPI_Send_Byte(0x04, COG_Parameters[EPD_Type_Index].VoltageLevel); + k = COG_Parameters[EPD_Type_Index].HORIZONTAL-1; + for (j = 0; j < COG_Parameters[EPD_Type_Index].HORIZONTAL; j++) // check every bit in the line + { + TempByte = (*PreviousPicture++); +#ifdef DISPLAY_180_DEGREE + DataLineEven[j] = ((TempByte & 0x80) ? BLACK3 : WHITE3) + | ((TempByte & 0x20) ? BLACK2 : WHITE2) + | ((TempByte & 0x08) ? BLACK1 : WHITE1) + | ((TempByte & 0x02) ? BLACK0 : WHITE0); + + DataLineOdd[k--] = ((TempByte & 0x01) ? BLACK3 : WHITE3) + | ((TempByte & 0x04) ? BLACK2 : WHITE2) + | ((TempByte & 0x10) ? BLACK1 : WHITE1) + | ((TempByte & 0x40) ? BLACK0 : WHITE0); + DataLinePrt--; +#else + DataLineOdd[j] = ((TempByte & 0x80) ? BLACK3 : WHITE3) + | ((TempByte & 0x20) ? BLACK2 : WHITE2) + | ((TempByte & 0x08) ? BLACK1 : WHITE1) + | ((TempByte & 0x02) ? BLACK0 : WHITE0); + + DataLineEven[k--] = ((TempByte & 0x01) ? BLACK3 : WHITE3) + | ((TempByte & 0x04) ? BLACK2 : WHITE2) + | ((TempByte & 0x10) ? BLACK1 : WHITE1) + | ((TempByte & 0x40) ? BLACK0 : WHITE0); +#endif + } +#ifdef DISPLAY_180_DEGREE + PreviousPicture = DataLinePrt; +#endif + DataLineScan[(i>>2)] = ScanTable[(i%4)]; + // SPI (0x0a, line data....) + epd_SPI_Send(0x0a, (uint8_t *)&COG_Line.uint8, COG_Parameters[EPD_Type_Index].DataLineSize); + + // SPI (0x02, 0x25) + epd_SPI_Send_Byte(0x02, 0x2F); + + DataLineScan[(i>>2)] = 0; + } +#if(!_GaugeFrameTimeMark) + if(COG_Parameters[EPD_Type_Index].FrameTime>0) + { + while(Currentframe>(epd_GetCurrentTimeTick() - StartClock)); + } +#endif + //TestPin2Trigger(); + Currentframe=(uint32_t)(epd_GetCurrentTimeTick() - StartClock)+COG_Parameters[EPD_Type_Index].FrameTime ; + cnt++; + }while (StageTime>Currentframe); +// TestPin2Trigger(); + while(StageTime>(epd_GetCurrentTimeTick() - StartClock)); +// TestPin2Trigger(); +// TestPinTrigger(); +} + +//#pragma GCC optimize ("-O3") +static void Display_Stage_2 (uint8_t *PreviousPicture) +{ + uint16_t i, j, k; // general counters + uint8_t TempByte; // Temporary storage for image data check + uint16_t StartClock; +#ifdef DISPLAY_180_DEGREE + uint8_t *DataLinePrt; + DisplayOrgPtr = (PreviousPicture+(uint32_t)((COG_Parameters[EPD_Type_Index].VERTICAL-1)*COG_Parameters[EPD_Type_Index].HORIZONTAL)); +#else + DisplayOrgPtr = PreviousPicture; +#endif + +// TestPinTrigger(); + cnt = 0; + Currentframe = (uint32_t)COG_Parameters[EPD_Type_Index].FrameTime; + StartClock = epd_GetCurrentTimeTick(); + do + { +// TestPin2Trigger(); + PreviousPicture = DisplayOrgPtr; +#ifdef DISPLAY_180_DEGREE + DataLinePrt = PreviousPicture; +#endif + for (i = 0; i < COG_Parameters[EPD_Type_Index].VERTICAL; i++) // for every line + { + // SPI (0x04, ...) + epd_SPI_Send_Byte(0x04, COG_Parameters[EPD_Type_Index].VoltageLevel); + k = COG_Parameters[EPD_Type_Index].HORIZONTAL-1; + for (j = 0; j < COG_Parameters[EPD_Type_Index].HORIZONTAL; j++) // make every bit in the line black + { + TempByte =(*PreviousPicture++); +#ifdef DISPLAY_180_DEGREE + DataLineEven[j] = ((TempByte & 0x80) ? WHITE3 : NOTHING) + | ((TempByte & 0x20) ? WHITE2 : NOTHING) + | ((TempByte & 0x08) ? WHITE1 : NOTHING) + | ((TempByte & 0x02) ? WHITE0 : NOTHING); + DataLineOdd[k--] = ((TempByte & 0x01) ? WHITE3 : NOTHING) + | ((TempByte & 0x04) ? WHITE2 : NOTHING) + | ((TempByte & 0x10) ? WHITE1 : NOTHING) + | ((TempByte & 0x40) ? WHITE0 : NOTHING); + DataLinePrt--; +#else + DataLineOdd[j] = ((TempByte & 0x80) ? WHITE3 : NOTHING) + | ((TempByte & 0x20) ? WHITE2 : NOTHING) + | ((TempByte & 0x08) ? WHITE1 : NOTHING) + | ((TempByte & 0x02) ? WHITE0 : NOTHING); + DataLineEven[k--] = ((TempByte & 0x01) ? WHITE3 : NOTHING) + | ((TempByte & 0x04) ? WHITE2 : NOTHING) + | ((TempByte & 0x10) ? WHITE1 : NOTHING) + | ((TempByte & 0x40) ? WHITE0 : NOTHING); +#endif + } + +#ifdef DISPLAY_180_DEGREE + PreviousPicture = DataLinePrt; +#endif + DataLineScan[(i>>2)] = ScanTable[(i%4)]; + // SPI (0x0a, line data....) + epd_SPI_Send(0x0a, (uint8_t *)&COG_Line.uint8, COG_Parameters[EPD_Type_Index].DataLineSize); + + epd_SPI_Send_Byte(0x02, 0x25); + + DataLineScan[(i>>2)] = 0; + } +#if(!_GaugeFrameTimeMark) + if(COG_Parameters[EPD_Type_Index].FrameTime>0) + { + while(Currentframe>(epd_GetCurrentTimeTick() - StartClock)); + } +#endif + //TestPin2Trigger(); + Currentframe=(uint32_t)(epd_GetCurrentTimeTick() - StartClock)+COG_Parameters[EPD_Type_Index].FrameTime ; + cnt++; + }while (StageTime>Currentframe); +// TestPin2Trigger(); + while(StageTime>(epd_GetCurrentTimeTick() - StartClock)); +// TestPin2Trigger(); +// TestPinTrigger(); +} + + +//#pragma GCC optimize ("-O3") +static void Display_Stage_3 (uint8_t *Picture) +{ + uint16_t i, j,k; // general counters + uint8_t TempByte; // Temporary storage for image data check + uint16_t StartClock; +#ifdef DISPLAY_180_DEGREE + uint8_t *DataLinePrt; + DisplayOrgPtr = (Picture+(uint32_t)((COG_Parameters[EPD_Type_Index].VERTICAL-1)*COG_Parameters[EPD_Type_Index].HORIZONTAL)); +#else + DisplayOrgPtr = Picture; +#endif + Currentframe = (uint32_t)COG_Parameters[EPD_Type_Index].FrameTime; + cnt = 0; +// TestPinTrigger(); + StartClock = epd_GetCurrentTimeTick(); + do + { +// TestPin2Trigger(); + Picture = DisplayOrgPtr; +#ifdef DISPLAY_180_DEGREE + DataLinePrt = Picture; +#endif + for (i = 0; i < COG_Parameters[EPD_Type_Index].VERTICAL; i++) // for every line + { + // SPI (0x04, 0x03) + epd_SPI_Send_Byte(0x04, COG_Parameters[EPD_Type_Index].VoltageLevel); + k = COG_Parameters[EPD_Type_Index].HORIZONTAL-1; + for (j = 0; j < COG_Parameters[EPD_Type_Index].HORIZONTAL; j++) // check every bit in the line + { + TempByte = (*Picture++); +#ifdef DISPLAY_180_DEGREE + DataLineEven[j] = ((TempByte & 0x80) ? BLACK3 : NOTHING) + | ((TempByte & 0x20) ? BLACK2 : NOTHING ) + | ((TempByte & 0x08) ? BLACK1 : NOTHING ) + | ((TempByte & 0x02) ? BLACK0 : NOTHING ); + + DataLineOdd[k--] = ((TempByte & 0x01) ? BLACK3 : NOTHING) + | ((TempByte & 0x04) ? BLACK2 : NOTHING ) + | ((TempByte & 0x10) ? BLACK1 : NOTHING ) + | ((TempByte & 0x40) ? BLACK0 : NOTHING ); + DataLinePrt--; +#else + DataLineOdd[j] = ((TempByte & 0x80) ? BLACK3 : NOTHING) + | ((TempByte & 0x20) ? BLACK2 : NOTHING ) + | ((TempByte & 0x08) ? BLACK1 : NOTHING ) + | ((TempByte & 0x02) ? BLACK0 : NOTHING ); + + DataLineEven[k--] = ((TempByte & 0x01) ? BLACK3 : NOTHING) + | ((TempByte & 0x04) ? BLACK2 : NOTHING ) + | ((TempByte & 0x10) ? BLACK1 : NOTHING ) + | ((TempByte & 0x40) ? BLACK0 : NOTHING ); +#endif + } +#ifdef DISPLAY_180_DEGREE + Picture = DataLinePrt; +#endif + DataLineScan[(i>>2)] = ScanTable[(i%4)]; + // SPI (0x0a, line data....) + epd_SPI_Send(0x0a, (uint8_t *)&COG_Line.uint8, COG_Parameters[EPD_Type_Index].DataLineSize); + + epd_SPI_Send_Byte(0x02, 0x2F); + + DataLineScan[(i>>2)] = 0; + } +#if(!_GaugeFrameTimeMark) + if(COG_Parameters[EPD_Type_Index].FrameTime>0) + { + while(Currentframe>(epd_GetCurrentTimeTick() - StartClock)); + } +#endif + //TestPin2Trigger(); + Currentframe=(uint32_t)(epd_GetCurrentTimeTick() - StartClock)+COG_Parameters[EPD_Type_Index].FrameTime ; + cnt++; + }while (StageTime>Currentframe); +// TestPin2Trigger(); + while(StageTime>(epd_GetCurrentTimeTick() - StartClock)); +// TestPin2Trigger(); +// TestPinTrigger(); +} + +//#pragma GCC optimize ("-O3") +static void Display_Stage_4 (uint8_t *Picture) +{ + uint16_t i, j,k; // general counters + uint8_t TempByte; // Temporary storage for image data check + uint16_t StartClock; +#ifdef DISPLAY_180_DEGREE + uint8_t *DataLinePrt; + DisplayOrgPtr = (Picture+(uint32_t)((COG_Parameters[EPD_Type_Index].VERTICAL-1)*COG_Parameters[EPD_Type_Index].HORIZONTAL)); +#else + DisplayOrgPtr = Picture; +#endif + Currentframe = (uint32_t)COG_Parameters[EPD_Type_Index].FrameTime; + cnt = 0; +// TestPinTrigger(); + + StartClock = epd_GetCurrentTimeTick(); + do + { +// TestPin2Trigger(); + Picture = DisplayOrgPtr; +#ifdef DISPLAY_180_DEGREE + DataLinePrt = Picture; +#endif + for (i = 0; i < COG_Parameters[EPD_Type_Index].VERTICAL; i++) // for every line + { + // SPI (0x04, ...) + epd_SPI_Send_Byte(0x04, COG_Parameters[EPD_Type_Index].VoltageLevel); + k = COG_Parameters[EPD_Type_Index].HORIZONTAL-1; + for (j = 0; j < COG_Parameters[EPD_Type_Index].HORIZONTAL; j++) // check every bit in the line + { + TempByte =(*Picture++); +#ifdef DISPLAY_180_DEGREE + DataLineEven[j] = ((TempByte & 0x80) ? WHITE3 : BLACK3 ) + | ((TempByte & 0x20) ? WHITE2 : BLACK2 ) + | ((TempByte & 0x08) ? WHITE1 : BLACK1 ) + | ((TempByte & 0x02) ? WHITE0 : BLACK0 ); + + DataLineOdd[k--] = ((TempByte & 0x01) ? WHITE3 : BLACK3 ) + | ((TempByte & 0x04) ? WHITE2 : BLACK2 ) + | ((TempByte & 0x10) ? WHITE1 : BLACK1 ) + | ((TempByte & 0x40) ? WHITE0 : BLACK0 ); + DataLinePrt--; +#else + DataLineOdd[j] = ((TempByte & 0x80) ? WHITE3 : BLACK3 ) + | ((TempByte & 0x20) ? WHITE2 : BLACK2 ) + | ((TempByte & 0x08) ? WHITE1 : BLACK1 ) + | ((TempByte & 0x02) ? WHITE0 : BLACK0 ); + + DataLineEven[k--] = ((TempByte & 0x01) ? WHITE3 : BLACK3 ) + | ((TempByte & 0x04) ? WHITE2 : BLACK2 ) + | ((TempByte & 0x10) ? WHITE1 : BLACK1 ) + | ((TempByte & 0x40) ? WHITE0 : BLACK0 ); +#endif + } +#ifdef DISPLAY_180_DEGREE + Picture = DataLinePrt; +#endif + DataLineScan[(i>>2)] = ScanTable[(i%4)]; + // SPI (0x0a, line data....) + epd_SPI_Send(0x0a, (uint8_t *)&COG_Line.uint8, COG_Parameters[EPD_Type_Index].DataLineSize); + + epd_SPI_Send_Byte(0x02, 0x2F); + + DataLineScan[(i>>2)] = 0; + } +#if(!_GaugeFrameTimeMark) + if(COG_Parameters[EPD_Type_Index].FrameTime>0) + { + while(Currentframe>(epd_GetCurrentTimeTick() - StartClock)); + } +#endif + //TestPin2Trigger(); + Currentframe=(uint32_t)(epd_GetCurrentTimeTick() - StartClock)+COG_Parameters[EPD_Type_Index].FrameTime ; + cnt++; + }while (StageTime>Currentframe); + +// TestPin2Trigger(); + while(StageTime>(epd_GetCurrentTimeTick() - StartClock)); +// TestPin2Trigger(); +// TestPinTrigger(); +} + +static void Display_Nothing (void) +{ + uint16_t i; // general counters + + for (i = 0; i < COG_Parameters[EPD_Type_Index].HORIZONTAL; i++) // make every bit in the line white + { + DataLineEven[i] = 0x00; + DataLineOdd[i] = 0x00; + } + + for (i = 0; i < COG_Parameters[EPD_Type_Index].VERTICAL; i++) // for every line + { + epd_SPI_Send_Byte(0x04, 0x03); + DataLineScan[(i>>2)] = ScanTable[(i%4)]; + // SPI (0x0a, line data....) + epd_SPI_Send(0x0a, (uint8_t *)&COG_Line.uint8, COG_Parameters[EPD_Type_Index].DataLineSize); + + epd_SPI_Send_Byte(0x02, 0x2F); + } +} + +static void Dummy_line(void) +{ + uint16_t i; + + for (i = 0; i < COG_Parameters[EPD_Type_Index].DataLineSize; i++) + { + COG_Line.uint8[i] = 0x00; + } + + epd_SPI_Send_Byte(0x04, 0x03); + + // SPI (0x0a, line data....) + epd_SPI_Send(0x0a, (uint8_t *)&COG_Line.uint8, COG_Parameters[EPD_Type_Index].DataLineSize); + + epd_SPI_Send_Byte(0x02, 0x2F); +} + + +/****************************************************************************** + * Public functions + *****************************************************************************/ +void epd_HwInit(void) +{ + epd_InitDisplayHardware(); +} + +void epd_PowerOn(void) +{ + epd_discharge_low(); + epd_rst_low(); + epd_cs_low(); + epd_spi_init(); + + epd_pwm_active(5); + + epd_panelon_on(); + + epd_pwm_active(10); + + epd_cs_high(); + + //epd_border_high(); + + epd_rst_high(); + + epd_pwm_active(5); + + epd_rst_low(); + + epd_pwm_active(5); + + epd_rst_high(); + + epd_pwm_active(5); +} + +void epd_InitializeDriver(uint8_t EPDIndex) +{ + uint8_t SendBuffer[2]; + uint16_t k; + + EPD_Type_Index = EPDIndex; + + //Data Line Clear + for (k = 0; k <= __LineDataSize; k ++) + { + COG_Line.uint8[k] = 0x00; + } + Driver_TypeSelect(EPDIndex); + k = 0; + + SetTemperature_Factor(EPDIndex); + + /*while (DRIVERBUSY_Get()) + { + delayT32B0Us(500); + if((k++)>=1000) return;//wait 500 ms + } + */ + + // SPI (0x01, 0x0000, 0x0000, 0x01ff, 0xe000) + epd_SPI_Send(0x01, (uint8_t *)&COG_Parameters[EPDIndex].ChannelSelect, 8); + + epd_SPI_Send_Byte(0x06, 0xff); + epd_SPI_Send_Byte(0x07, 0x9d); + epd_SPI_Send_Byte(0x08, 0x00); + + // SPI (0x09, 0xd000) + SendBuffer[0] = 0xd0; + SendBuffer[1] = 0x00; + epd_SPI_Send(0x09, SendBuffer, 2); + + epd_SPI_Send_Byte(0x04,COG_Parameters[EPDIndex].VoltageLevel); + + epd_SPI_Send_Byte(0x03, 0x01); + epd_SPI_Send_Byte(0x03, 0x00); + + epd_pwm_active(5); + + epd_SPI_Send_Byte(0x05, 0x01); + + epd_pwm_active(30); + + epd_SPI_Send_Byte(0x05, 0x03); + epd_delay_ms(30); + epd_SPI_Send_Byte(0x05, 0x0f); + epd_delay_ms(30); + epd_SPI_Send_Byte(0x02, 0x24); +} + +void epd_Display (uint8_t *pNewImg, uint8_t *pPrevImg) +{ + //COG Process - update display in four steps + Display_Stage_1(pPrevImg); + Display_Stage_2(pPrevImg); + Display_Stage_3(pNewImg); + Display_Stage_4(pNewImg); +} + +void epd_PowerOff (void) +{ + Display_Nothing(); + Dummy_line(); + epd_delay_ms(25); + + //border_low(); + //epd_delay_ms(_30ms); + //border_high(); + + epd_SPI_Send_Byte(0x03, 0x01); + epd_SPI_Send_Byte(0x02, 0x05); + epd_SPI_Send_Byte(0x05, 0x0E); + epd_SPI_Send_Byte(0x05, 0x02); + epd_SPI_Send_Byte(0x04, 0x0C); + epd_delay_ms(120); + epd_SPI_Send_Byte(0x05, 0x00); + epd_SPI_Send_Byte(0x07, 0x0D); + epd_SPI_Send_Byte(0x04, 0x50); + epd_delay_ms(40); + epd_SPI_Send_Byte(0x04, 0xA0); + epd_delay_ms(40); + epd_SPI_Send_Byte(0x04, 0x00); + + epd_rst_low(); + epd_cs_low(); + epd_spi_detach(); + epd_panelon_off(); + + //epd_border_low(); + + epd_discharge_high(); + epd_delay_ms(150); + epd_discharge_low(); +} + + + diff --git a/epaper/Display_COG_Process.h b/epaper/Display_COG_Process.h new file mode 100644 index 0000000..bf4f97f --- /dev/null +++ b/epaper/Display_COG_Process.h @@ -0,0 +1,120 @@ +// Copyright 2013 Pervasive Displays, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +// express or implied. See the License for the specific language +// governing permissions and limitations under the License. + +#ifndef __Display_COG_Process_H_ +#define __Display_COG_Process_H_ + +/****************************************************************************** + * Includes + *****************************************************************************/ + + #include "bsp.h" + +/****************************************************************************** + * Defines and typedefs + *****************************************************************************/ +#define BLACK0 (0x03) +#define BLACK1 (0x0C) +#define BLACK2 (0x30) +#define BLACK3 (0xc0) +#define WHITE0 (0x02) +#define WHITE1 (0x08) +#define WHITE2 (0x20) +#define WHITE3 (0x80) + +#define NOTHING (0x00) +#define SCANON (0xC0) +#define __LineDataSize 111 + +/* +enum +{ + _5ms, + _10ms, + _25ms, + _30ms, + _40ms, + _120ms, + _150ms, + _300ms +}; +*/ + +typedef enum +{ + EPDType_144 = 0, //1.44" display + EPDType_200 = 1, //2.0" display + EPDType_270 = 2 //2.7" display +} EPDType_t; +#define EPD_TYPE_144 0 +#define EPD_TYPE_200 1 +#define EPD_TYPE_270 2 + +typedef struct +{ + uint8_t Even[16]; + uint8_t Scan[24]; + uint8_t Odd [16]; +} COG_144_LineData_t; + +typedef struct +{ + uint8_t Even[25]; + uint8_t Scan[24]; + uint8_t Odd [25]; + uint8_t DummyData; +} COG_20_LineData_t; + +typedef struct +{ + uint8_t Even[33]; + uint8_t Scan[44]; + uint8_t Odd [33]; + uint8_t DummyData; +} COG_27_LineData_t; + +typedef union +{ + union + { + COG_144_LineData_t COG_144LineData; + COG_20_LineData_t COG_20LineData; + COG_27_LineData_t COG_27LineData; + } LineDatas; + uint8_t uint8[__LineDataSize]; +} COG_LineDataPacket_t; + +typedef struct +{ + uint8_t ChannelSelect[8]; + uint8_t VoltageLevel; + uint16_t HORIZONTAL; + uint16_t VERTICAL; + uint8_t DataLineSize; + uint16_t FrameTime; + uint16_t StageTime; +} COG_Parameters_t; + +extern const COG_Parameters_t COG_Parameters[3]; + +/****************************************************************************** + * Prototypes + *****************************************************************************/ +void epd_HwInit(void); +void epd_PowerOn(void); +void epd_InitializeDriver(uint8_t EPDIndex); +void epd_Display(uint8_t *pNewImg, uint8_t *pPrevImg); +void epd_PowerOff(void); + +#endif //__Display_COG_Process_H_ diff --git a/epaper/Display_Controller.c b/epaper/Display_Controller.c new file mode 100644 index 0000000..9aa5be5 --- /dev/null +++ b/epaper/Display_Controller.c @@ -0,0 +1,40 @@ +// Copyright 2013 Pervasive Displays, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +// express or implied. See the License for the specific language +// governing permissions and limitations under the License. + +/****************************************************************************** + * Includes + *****************************************************************************/ +//#include "driver_config.h" +//#include "type.h" +//#include "gpio.h" +#include "Display_Controller.h" + +/****************************************************************************** + * Global Functions + *****************************************************************************/ + +void epd_DisplayImg(EPDType_t EPDType, uint8_t *pNewImg, uint8_t *pPrevImg) +{ + //always initialize display (has been powered off before) + epd_HwInit(); + epd_PowerOn(); + epd_InitializeDriver(EPDType); + + //display new picture, but first remove old one + epd_Display(pNewImg, pPrevImg); + + //power down display - picture still displayed + epd_PowerOff(); +} + diff --git a/epaper/Display_Controller.h b/epaper/Display_Controller.h new file mode 100644 index 0000000..8f304e2 --- /dev/null +++ b/epaper/Display_Controller.h @@ -0,0 +1,34 @@ +// Copyright 2013 Pervasive Displays, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +// express or implied. See the License for the specific language +// governing permissions and limitations under the License. + +#ifndef __Display_Controller_H_ +#define __Display_Controller_H_ + +/****************************************************************************** + * Includes + *****************************************************************************/ +#include "bsp.h" +#include "Display_COG_Process.h" + +/****************************************************************************** + * Defines and typedefs + *****************************************************************************/ +#define DISPLAY_IN_USE EPD_TYPE_270 + +/****************************************************************************** + * Prototypes + *****************************************************************************/ +void epd_DisplayImg(EPDType_t EPDType, uint8_t *pNewImg, uint8_t *pPrevImg); + +#endif //__Display_Controller_H_ diff --git a/epaper/Display_Hardware_Driver.c b/epaper/Display_Hardware_Driver.c new file mode 100644 index 0000000..04ff563 --- /dev/null +++ b/epaper/Display_Hardware_Driver.c @@ -0,0 +1,258 @@ +// Copyright 2013 Pervasive Displays, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +// express or implied. See the License for the specific language +// governing permissions and limitations under the License. + +/****************************************************************************** + * Includes + *****************************************************************************/ +#include "Display_Hardware_Driver.h" + + +/****************************************************************************** + * Public functions + *****************************************************************************/ +void epd_cs_high(void) +{ + // CS_SET_HIGH; + bsp_pinOut(BSP_PIN_6, 1); +} + +void epd_cs_low(void) +{ + // CS_SET_LOW; + bsp_pinOut(BSP_PIN_6, 0); +} + +void epd_rst_high(void) +{ + // RST_SET_HIGH; + bsp_pinOut(BSP_PIN_12, 1); +} + +void epd_rst_low(void) +{ + // RST_SET_LOW; + bsp_pinOut(BSP_PIN_12, 0); +} + +void epd_discharge_high(void) +{ + // DISCHARGE_SET_HIGH; + bsp_pinOut(BSP_PIN_14, 1); +} + +void epd_discharge_low(void) +{ + // DISCHARGE_SET_LOW; + bsp_pinOut(BSP_PIN_14, 0); +} + +void epd_panelon_off(void) +{ + // PANELON_SET_LOW; + bsp_pinOut(BSP_PIN_13, 0); +} + +void epd_panelon_on(void) +{ + // PANELON_SET_HIGH; + bsp_pinOut(BSP_PIN_13, 1); +} + +void epd_border_high(void) +{ + // BORDER_SET_HIGH; +} + +void epd_border_low(void) +{ + // BORDER_SET_LOW; +} + +void epd_delay_ms(uint32_t Time) +{ + bsp_delayMs(Time); +} + +int16_t epd_get_temperature(void) +{ + return bsp_getTemp(); +} + +uint32_t epd_GetCurrentTimeTick(void) +{ + return bsp_getMsTicks(); +} + +//****************************************************************** +//PWM Configuration/Control +//****************************************************************** +#if 0 +volatile uint32_t period = 500; //96Khz PWM frequency + +void epd_pwm_disable(void) +{ + disable_timer16(1); + LPC_IOCON->PIO1_9 &= 0xFC;//Disable PWM,set general IO + PWM_DIR_OUT(); + PWM_SET_LOW(); +} + +void epd_pwm_active(void) +{ + PWM_SET_HIGH(); + /* Initialize the PWM in timer32_1 enabling match0 output */ + init_timer16PWM(1, period, MATCH0,0); + setMatch_timer16PWM (1, 1, period/8); + enable_timer16(1); +} +#endif +void epd_pwm_active(uint16_t delayInMs) +{ + uint16_t numOfIterations; + + numOfIterations = delayInMs * 100; + // PWM_DIR_OUT; + bsp_pinMode(BSP_PIN_11, BSP_PINMODE_OUTPUT); + for(; numOfIterations > 0; numOfIterations--) + { + // PWM_SET_HIGH; + bsp_pinOut(BSP_PIN_11, 1); + bsp_delayUs(5); //100kHz (96kHz ideal) + // PWM_SET_LOW; + bsp_pinOut(BSP_PIN_11, 0); + bsp_delayUs(5); + } +} + + +//****************************************************************** +//SPI Configuration +//****************************************************************** +void epd_spi_detach(void) +{ +#if 0 + LPC_IOCON->PIO0_8 &= 0xFC;; /* SSP I/O config */ + SPIMISO_DIR_OUT(); + SPIMISO_Set(Low); + + LPC_IOCON->PIO0_9 &= 0xFC; /* SSP MOSI */ + SPIMOSI_DIR_OUT(); + SPIMOSI_Set(Low); + + LPC_IOCON->PIO2_11 &= 0xFC; + SPICLK_DIR_OUT(); + SPICLK_Set(Low); +#endif +} +void epd_spi_init (void) +{ + bsp_spiInit(); +//SSP_IOConfig( SSP_PORT ); /* initialize SSP port */ +//SSP_Init( SSP_PORT ); +} + +void epd_SPI_Send (unsigned char Register, unsigned char *Data, unsigned Length) +{ + uint8_t buf[2]; + + epd_cs_low(); + buf[0] = 0x70; + buf[1] = Register; + bsp_writeToDisplay(buf, 2); + epd_cs_high(); + bsp_delayUs(10); + + epd_cs_low(); + buf[0] = 0x72; + bsp_writeToDisplay(buf, 1); + bsp_writeToDisplay(Data, Length); + epd_cs_high(); + bsp_delayUs(10); +} + + + +void epd_SPI_Send_Byte (uint8_t Register, uint8_t Data) +{ + uint8_t buf[2]; + + epd_cs_low(); + buf[0] = 0x70; + buf[1] = Register; + bsp_writeToDisplay(buf, 2); + epd_cs_high(); + bsp_delayUs(10); + + epd_cs_low(); + buf[0] = 0x72; + buf[1] = Data; + bsp_writeToDisplay(buf, 2); + epd_cs_high(); + bsp_delayUs(10); +} + +void epd_InitDisplayHardware(void) +{ + // RST_DIR_OUT; + bsp_pinMode(BSP_PIN_12, BSP_PINMODE_OUTPUT); + // DISCHARGE_DIR_OUT; + bsp_pinMode(BSP_PIN_14, BSP_PINMODE_OUTPUT); + // CS_DIR_OUT; + bsp_pinMode(BSP_PIN_6, BSP_PINMODE_OUTPUT); + // PANELON_DIR_OUT; + bsp_pinMode(BSP_PIN_13, BSP_PINMODE_OUTPUT); + // DRIVERBUSY_DIR_IN; + bsp_pinMode(BSP_PIN_7, BSP_PINMODE_INPUT); + // BORDER_DIR_OUT; + + + epd_panelon_off(); + epd_spi_init(); + epd_cs_low(); + // epd_pwm_low(); + epd_pwm_active(0); //set output low + epd_rst_low(); + epd_discharge_low(); + +// TESTPin_DIR_OUT(); +// TESTPin2_DIR_OUT(); +} + +//************************************************************************ +void TestPinLow(void) +{ +// TESTPin_Set(0); +} +void TestPinHigh(void) +{ +// TESTPin_Set(1); +} +void TestPinTrigger(void) +{ +// if(TESTPin_Get())TestPinLow(); +// else TestPinHigh(); +} +void TestPin2Low(void) +{ +// TESTPin2_Set(0); +} +void TestPin2High(void) +{ +// TESTPin2_Set(1); +} +void TestPin2Trigger(void) +{ +// if(TESTPin2_Get())TestPin2Low(); +// else TestPin2High(); +} diff --git a/epaper/Display_Hardware_Driver.h b/epaper/Display_Hardware_Driver.h new file mode 100644 index 0000000..a84cf35 --- /dev/null +++ b/epaper/Display_Hardware_Driver.h @@ -0,0 +1,102 @@ +// Copyright 2013 Pervasive Displays, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +// express or implied. See the License for the specific language +// governing permissions and limitations under the License. + +#ifndef __DISPLAY_HARDWARE_DRIVER_H_ +#define __DISPLAY_HARDWARE_DRIVER_H_ + +/****************************************************************************** + * Includes + *****************************************************************************/ + +#include "bsp.h" + + +/****************************************************************************** + * Defines and typedefs + *****************************************************************************/ + +//Pin 12 on Serial Expansion Connector +// #define RST_DIR_OUT SEC14_PIN12_SET_OUTP +// #define RST_SET_HIGH SEC14_PIN12_SET_HIGH +// #define RST_SET_LOW SEC14_PIN12_SET_LOW + +//Pin 14 on Serial Expansion Connector +// #define DISCHARGE_DIR_OUT SEC14_PIN14_SET_OUTP +// #define DISCHARGE_SET_HIGH SEC14_PIN14_SET_HIGH +// #define DISCHARGE_SET_LOW SEC14_PIN14_SET_LOW + +//Pin 6 on Serial Expansion Connector +// #define CS_DIR_OUT SEC14_PIN6_SET_OUTP +// #define CS_SET_HIGH SEC14_PIN6_SET_HIGH +// #define CS_SET_LOW SEC14_PIN6_SET_LOW + +//Pin 13 on Serial Expansion Connector +// #define PANELON_DIR_OUT SEC14_PIN13_SET_OUTP +// #define PANELON_SET_HIGH SEC14_PIN13_SET_HIGH +// #define PANELON_SET_LOW SEC14_PIN13_SET_LOW + +//Pin 7 on Serial Expansion Connector +// #define DRIVERBUSY_DIR_IN SEC14_PIN7_SET_INP +// #define DRIVERBUSY_GET SEC14_PIN7_INP + +//Not implemented +// #define BORDER_DIR_OUT +// #define BORDER_SET_HIGH +// #define BORDER_SET_LOW + +//Pin 11 on Serial Expansion Connector +// #define PWM_DIR_OUT SEC14_PIN11_SET_OUTP +// #define PWM_SET_HIGH SEC14_PIN11_SET_HIGH +// #define PWM_SET_LOW SEC14_PIN11_SET_LOW + + +/****************************************************************************** + * Prototypes + *****************************************************************************/ +void epd_cs_high(void); +void epd_cs_low(void); +void epd_rst_high(void); +void epd_rst_low(void); +void epd_discharge_high(void); +void epd_discharge_low(void); +void epd_panelon_off(void); +void epd_panelon_on(void); + +void epd_pwm_active(uint16_t delayInMs); + +void epd_border_high(void); +void epd_border_low(void); + +void epd_TestPinLow(void); +void epd_TestPinHigh(void); +void epd_TestPinTrigger(void); + +void epd_TestPin2Low(void); +void epd_TestPin2High(void); +void epd_TestPin2Trigger(void); + +void epd_delay_ms(uint32_t Time); +int16_t epd_get_temperature(void); +uint32_t epd_GetCurrentTimeTick(void); + +/***************************************************************************/ +void epd_spi_detach(void); +void epd_spi_init (void); +void epd_SPI_Send (unsigned char Register, unsigned char *Data, unsigned Length); +void epd_SPI_Send_Byte (uint8_t Register, uint8_t Data); +void epd_InitDisplayHardware (void); + +/****************************************************************************/ + +#endif //__DISPLAY_HARDWARE_DRIVER_H_ diff --git a/epaper/Image_EAlogo.h b/epaper/Image_EAlogo.h new file mode 100644 index 0000000..8419150 --- /dev/null +++ b/epaper/Image_EAlogo.h @@ -0,0 +1,234 @@ +/***************************************************************************** + * + * Copyright(C) 2012, Embedded Artists AB + * All rights reserved. + * + ****************************************************************************** + * Software that is described herein is for illustrative purposes only + * which provides customers with programming information regarding the + * products. This software is supplied "AS IS" without any warranties. + * Embedded Artists AB assumes no responsibility or liability for the + * use of the software, conveys no license or title under any patent, + * copyright, or mask work right to the product. Embedded Artists AB + * reserves the right to make changes in the software without + * notification. Embedded Artists AB also make no representation or + * warranty that such application will be suitable for the specified + * use without further testing or modification. + *****************************************************************************/ +#ifndef __IMAGE_EALOGO_H_ +#define __IMAGE_EALOGO_H_ + +/****************************************************************************** + * Includes + *****************************************************************************/ +#include "Display_Controller.h" + +//White=>1 +//Black=>0 + +#if(DISPLAY_IN_USE == EPD_TYPE_144) +unsigned char const ImageDataEA[96][16]= +{ + 0 //Does not exist +}; +unsigned char PreloadImage[96][16]; + +#endif + + +#if(DISPLAY_IN_USE == EPD_TYPE_200) +unsigned char const ImageDataEA[96][25] = +{ +0 //Does not exist +}; + +unsigned char PreloadImage[96][32]; + +#endif + +#if(DISPLAY_IN_USE == EPD_TYPE_270) +unsigned char const ImageDataEA[176][33]= +{ + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFC, 0x0F, 0xFF, 0x9F, 0xFF, 0xF3, 0xF3, 0xFF, 0xE7, 0xF1, 0xFF, 0xB3, 0xFF, 0x7F, 0x9F, 0x8F, 0xC1, 0x27, 0xC0, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0xF0, 0x79, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFC, 0x0F, 0xFF, 0x9F, 0xFF, 0xF3, 0xF3, 0xFF, 0xE7, 0xF1, 0xFF, 0x33, 0xFE, 0x7F, 0x9F, 0x07, 0xC1, 0x27, 0xC0, 0xFC, 0x07, 0xFF, 0xFF, 0xFF, 0xF0, 0x39, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFC, 0xFF, 0xFF, 0x9F, 0xFF, 0xF3, 0xF3, 0xFF, 0xE7, 0xF1, 0xFF, 0x3F, 0xFE, 0x7F, 0x9E, 0x67, 0xF9, 0x27, 0xCF, 0xFC, 0xE7, 0xFF, 0xFF, 0xFF, 0xF3, 0x1F, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFC, 0xF8, 0x33, 0x83, 0xC7, 0x93, 0x93, 0x8F, 0x27, 0xE4, 0xE4, 0x13, 0x8C, 0x31, 0x9E, 0x67, 0xFB, 0x27, 0xCF, 0xFC, 0xE4, 0x39, 0x3C, 0x72, 0xF3, 0x99, 0xC7, 0x27, 0x30, 0xCE, 0x7F, 0xFF}, + {0xFF, 0xFC, 0x08, 0x01, 0x81, 0x93, 0x03, 0x03, 0x26, 0x07, 0xE4, 0xE0, 0x13, 0x04, 0x20, 0xFF, 0xE7, 0xF3, 0xFF, 0xC0, 0xFC, 0xE0, 0x18, 0x19, 0x30, 0xF3, 0x99, 0x83, 0x03, 0x20, 0x4E, 0x7F, 0xFF}, + {0xFF, 0xFC, 0x09, 0x99, 0x99, 0x93, 0x33, 0x33, 0x26, 0x67, 0xE4, 0xE7, 0x33, 0x36, 0x66, 0xFF, 0xCF, 0xF3, 0xFF, 0xC0, 0xFC, 0x01, 0x99, 0x99, 0x33, 0xF3, 0x99, 0x9B, 0x33, 0x26, 0x64, 0xFF, 0xFF}, + {0xFF, 0xFC, 0xF9, 0x99, 0x99, 0x83, 0x33, 0x33, 0x06, 0x67, 0xCE, 0x67, 0x33, 0x0E, 0x61, 0xFF, 0x8F, 0xF7, 0xFF, 0xCF, 0x84, 0x0E, 0x19, 0x98, 0x33, 0xF3, 0x99, 0x87, 0x33, 0x38, 0x64, 0xFF, 0xFF}, + {0xFF, 0xFC, 0xF9, 0x99, 0x99, 0x9F, 0x33, 0x33, 0x3E, 0x67, 0xC0, 0x67, 0x33, 0xC6, 0x78, 0xFF, 0x1F, 0xE7, 0xFF, 0xCF, 0x84, 0xF8, 0x19, 0x99, 0xF3, 0xF3, 0x99, 0xE3, 0x33, 0x20, 0x64, 0xFF, 0xFF}, + {0xFF, 0xFC, 0xF9, 0x99, 0x99, 0x93, 0x33, 0x33, 0x26, 0x67, 0xC0, 0x67, 0x33, 0x66, 0x6C, 0xFF, 0x3F, 0xE7, 0xFF, 0xCF, 0xFC, 0xF9, 0x99, 0x99, 0x33, 0xF3, 0x19, 0xB3, 0x33, 0x26, 0x75, 0xFF, 0xFF}, + {0xFF, 0xFC, 0x09, 0x99, 0x81, 0x93, 0x03, 0x03, 0x26, 0x07, 0x9F, 0x27, 0x13, 0x06, 0x20, 0xFE, 0x04, 0xE7, 0xFF, 0xC0, 0xFC, 0xF8, 0x18, 0x19, 0x33, 0xF0, 0x39, 0x83, 0x03, 0x20, 0x71, 0xFF, 0xFF}, + {0xFF, 0xFC, 0x09, 0x99, 0x93, 0xC7, 0x93, 0x93, 0x8F, 0x27, 0x9F, 0x27, 0x93, 0x8F, 0x31, 0xFE, 0x04, 0xE7, 0xFF, 0xC0, 0xFC, 0xFC, 0x99, 0x3C, 0x73, 0xF0, 0x79, 0xC7, 0x27, 0x32, 0x71, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xF3, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xC3, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xC7, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x33, 0xC3, 0x3C, 0x0C, 0x33, 0x00, 0x03, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x33, 0xC3, 0x3C, 0x0C, 0x33, 0x00, 0x03, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0x3F, 0x33, 0x3C, 0xF3, 0x3F, 0x3F, 0xF3, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFE, 0x1F, 0xFF, 0xC0, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0x3F, 0x33, 0x3C, 0xF3, 0x3F, 0x3F, 0xF3, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFE, 0x3F, 0xFC, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x03, 0x33, 0x30, 0x0C, 0x0C, 0x0F, 0x30, 0x33, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFC, 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x03, 0x33, 0x30, 0x0C, 0x0C, 0x0F, 0x30, 0x33, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xF8, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x03, 0x3F, 0x3F, 0xC0, 0x3C, 0xC3, 0x30, 0x33, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xF8, 0x7F, 0xFF, 0xC0, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x03, 0x3F, 0x3F, 0xC0, 0x3C, 0xC3, 0x30, 0x33, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x03, 0x33, 0xF3, 0xF3, 0x00, 0xFF, 0x30, 0x33, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x03, 0x33, 0xF3, 0xF3, 0x00, 0xFF, 0x30, 0x33, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0x3F, 0xFC, 0x0F, 0x30, 0xC3, 0x3F, 0xF3, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0x3F, 0xFC, 0x0F, 0x30, 0xC3, 0x3F, 0xF3, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x03, 0xFF, 0xFF}, + {0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x03, 0xFF, 0xFF}, + {0xFF, 0xFF, 0x83, 0xE0, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0xCF, 0xC3, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0xCF, 0xC3, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x0F, 0xF0, 0x0F, 0xFF, 0xE3, 0xFF, 0xFF, 0xC7, 0xF1, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xFC, 0x3F, 0xCC, 0xF3, 0xCF, 0x0F, 0x33, 0x33, 0xFF, 0xFF}, + {0xFF, 0xFF, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x07, 0x00, 0x0F, 0xF0, 0x0F, 0xFF, 0xE3, 0xFF, 0xFF, 0xC7, 0xF1, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xFC, 0x3F, 0xCC, 0xF3, 0xCF, 0x0F, 0x33, 0x33, 0xFF, 0xFF}, + {0xFF, 0xFE, 0x03, 0xE0, 0xFF, 0x80, 0x10, 0x03, 0x80, 0x07, 0xF0, 0x1F, 0xFF, 0xE3, 0xFF, 0xFF, 0xC7, 0xF1, 0xFF, 0xFC, 0x7F, 0xFF, 0xF3, 0x33, 0xFC, 0xCC, 0xF3, 0x33, 0xCC, 0xC0, 0x0F, 0xFF, 0xFF}, + {0xFF, 0xFE, 0x07, 0xE1, 0xFF, 0xF0, 0x1E, 0x01, 0x80, 0x07, 0xF1, 0xFF, 0x9C, 0xE2, 0x7C, 0x3E, 0x47, 0x91, 0xC3, 0xE4, 0x7F, 0xFF, 0xF3, 0x33, 0xFC, 0xCC, 0xF3, 0x33, 0xCC, 0xC0, 0x0F, 0xFF, 0xFF}, + {0xFF, 0xFC, 0x07, 0xE1, 0xFF, 0xF8, 0x1F, 0x01, 0xC0, 0x07, 0xF1, 0xF8, 0x00, 0x60, 0x38, 0x1C, 0x07, 0x01, 0x81, 0xC0, 0x7F, 0xFF, 0xF3, 0x0C, 0x33, 0xCF, 0x03, 0xC0, 0xFC, 0xCC, 0x0F, 0xFF, 0xFF}, + {0xFF, 0xFC, 0x07, 0xE1, 0xFF, 0xFC, 0x0F, 0x81, 0xC0, 0x03, 0xF0, 0x18, 0x00, 0x60, 0x10, 0x8C, 0x07, 0x01, 0x08, 0xC0, 0x7F, 0xFF, 0xF3, 0x0C, 0x33, 0xCF, 0x03, 0xC0, 0xFC, 0xCC, 0x0F, 0xFF, 0xFF}, + {0xFF, 0xFC, 0x07, 0xE1, 0xFF, 0xFC, 0x0F, 0xC0, 0xE0, 0x03, 0xF0, 0x18, 0xC4, 0x63, 0x11, 0x88, 0x46, 0x21, 0x18, 0x84, 0x7F, 0xFF, 0xFC, 0xFF, 0xF0, 0xFF, 0x00, 0xF3, 0x30, 0xCC, 0x03, 0xFF, 0xFF}, + {0xFF, 0xF8, 0x07, 0xE1, 0xFF, 0xFE, 0x0F, 0xC0, 0xE0, 0x03, 0xF0, 0x18, 0xC4, 0x63, 0x10, 0x08, 0xC6, 0x21, 0x00, 0x8C, 0x7F, 0xFF, 0xFC, 0xFF, 0xF0, 0xFF, 0x00, 0xF3, 0x30, 0xCC, 0x03, 0xFF, 0xFF}, + {0xFF, 0xF8, 0x07, 0xE1, 0xFF, 0xFE, 0x0F, 0xC0, 0xF0, 0x03, 0xF0, 0xF8, 0xC4, 0x63, 0x10, 0x08, 0xC6, 0x31, 0x00, 0x8C, 0x7F, 0xFF, 0xF3, 0xF3, 0x30, 0x33, 0x30, 0xCC, 0x33, 0x0C, 0xF3, 0xFF, 0xFF}, + {0xFF, 0xF8, 0x07, 0xE1, 0xFF, 0xFE, 0x0F, 0xC0, 0xF0, 0x03, 0xF1, 0xF8, 0xC4, 0x63, 0x10, 0xF8, 0xC6, 0x31, 0x1F, 0x8C, 0x7F, 0xFF, 0xF3, 0xF3, 0x30, 0x33, 0x30, 0xCC, 0x33, 0x0C, 0xF3, 0xFF, 0xFF}, + {0xFF, 0xF8, 0x07, 0xE1, 0xFF, 0xFC, 0x00, 0x00, 0xF0, 0x03, 0xF1, 0xF8, 0xC4, 0x63, 0x11, 0xF8, 0xC6, 0x31, 0x1F, 0x8C, 0x7F, 0xFF, 0xF0, 0x3C, 0xFF, 0xFC, 0xC3, 0x00, 0x0F, 0x0C, 0xF3, 0xFF, 0xFF}, + {0xFF, 0xF8, 0x07, 0xE1, 0xFF, 0xF8, 0x00, 0x00, 0xF0, 0x03, 0xF0, 0x38, 0xC4, 0x63, 0x11, 0x88, 0x46, 0x21, 0x18, 0x84, 0x7F, 0xFF, 0xF0, 0x3C, 0xFF, 0xFC, 0xC3, 0x00, 0x0F, 0x0C, 0xF3, 0xFF, 0xFF}, + {0xFF, 0xF0, 0x07, 0xE1, 0xFF, 0xF0, 0x00, 0x00, 0xF8, 0x03, 0xF0, 0x08, 0xC4, 0x60, 0x30, 0x0C, 0x07, 0x01, 0x00, 0xC0, 0x7F, 0xFF, 0xFF, 0x30, 0x3F, 0xF3, 0x00, 0xC3, 0x33, 0xF3, 0xCF, 0xFF, 0xFF}, + {0xFF, 0xF0, 0x07, 0xE1, 0xFF, 0xC0, 0x00, 0x00, 0xF8, 0x03, 0xF0, 0x08, 0xC4, 0x60, 0x38, 0x1C, 0x07, 0x01, 0x81, 0xC0, 0x7F, 0xFF, 0xFF, 0x30, 0x3F, 0xF3, 0x00, 0xC3, 0x33, 0xF3, 0xCF, 0xFF, 0xFF}, + {0xFF, 0xF0, 0x07, 0xE1, 0xFE, 0x00, 0x1F, 0xE0, 0xF8, 0x03, 0xFF, 0xFF, 0xFF, 0xFE, 0x7C, 0x3E, 0x7F, 0x9F, 0xC3, 0xE7, 0xFF, 0xFF, 0xFC, 0xFF, 0xCC, 0xF3, 0x30, 0xF3, 0xC3, 0xCC, 0x0F, 0xFF, 0xFF}, + {0xFF, 0xF0, 0x07, 0xE0, 0x00, 0x00, 0xFF, 0xE0, 0xF8, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xCC, 0xF3, 0x30, 0xF3, 0xC3, 0xCC, 0x0F, 0xFF, 0xFF}, + {0xFF, 0xF0, 0x03, 0xE0, 0x00, 0x03, 0xFF, 0xE0, 0xF8, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x3F, 0x0C, 0x0C, 0x33, 0x30, 0xF3, 0xC3, 0xFF, 0xFF}, + {0xFF, 0xF0, 0x03, 0xE0, 0x00, 0x07, 0xFF, 0xE0, 0xF8, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xE3, 0x8F, 0xFC, 0x7F, 0xFF, 0xFF, 0xF3, 0x00, 0x3F, 0x0C, 0x0C, 0x33, 0x30, 0xF3, 0xC3, 0xFF, 0xFF}, + {0xFF, 0xF0, 0x03, 0xE0, 0x00, 0x0F, 0xFF, 0xE0, 0xF8, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0xC7, 0x1F, 0xFC, 0x7F, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0x30, 0x0F, 0xFF, 0x00, 0x0F, 0xF3, 0xFF, 0xFF}, + {0xFF, 0xF0, 0x03, 0xE0, 0xFC, 0x0F, 0xFF, 0xE0, 0xF8, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0xC7, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0x30, 0x0F, 0xFF, 0x00, 0x0F, 0xF3, 0xFF, 0xFF}, + {0xFF, 0xF0, 0x01, 0xE0, 0xFC, 0x0F, 0xFF, 0xE0, 0xF8, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xE2, 0x03, 0x1C, 0x18, 0x30, 0x7F, 0xFF, 0xFF, 0x0F, 0x33, 0xF3, 0xFF, 0x00, 0xC3, 0xF0, 0x03, 0xFF, 0xFF}, + {0xFF, 0xF0, 0x01, 0xE0, 0xFC, 0x1F, 0xFF, 0xE0, 0xF8, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xE0, 0x03, 0x18, 0x10, 0x20, 0x3F, 0xFF, 0xFF, 0x0F, 0x33, 0xF3, 0xFF, 0x00, 0xC3, 0xF0, 0x03, 0xFF, 0xFF}, + {0xFF, 0xF0, 0x01, 0xE0, 0xFC, 0x0F, 0xFF, 0xE0, 0xF8, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0xE0, 0x87, 0x11, 0x98, 0x66, 0x3F, 0xFF, 0xF0, 0x3C, 0xF3, 0x33, 0xC0, 0xC3, 0xC0, 0xFC, 0x03, 0xFF, 0xFF}, + {0xFF, 0xF8, 0x00, 0xE0, 0x7C, 0x0F, 0xFF, 0xE0, 0xF8, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x88, 0xE3, 0x8E, 0x31, 0xB8, 0xC7, 0x7F, 0xFF, 0xF0, 0x3C, 0xF3, 0x33, 0xC0, 0xC3, 0xC0, 0xFC, 0x03, 0xFF, 0xFF}, + {0xFF, 0xF8, 0x00, 0xE0, 0x3E, 0x07, 0xFF, 0xE0, 0xF8, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x88, 0xC7, 0x8E, 0x30, 0x78, 0xC1, 0xFF, 0xFF, 0xFF, 0x30, 0x30, 0xC3, 0xF3, 0x33, 0x03, 0xC0, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xF8, 0x00, 0x70, 0x1E, 0x03, 0xFF, 0xE0, 0xF8, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x08, 0xC7, 0x8E, 0x30, 0x38, 0xE0, 0x7F, 0xFF, 0xFF, 0x30, 0x30, 0xC3, 0xF3, 0x33, 0x03, 0xC0, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xF8, 0x00, 0x30, 0x03, 0x00, 0x7F, 0xE0, 0xF8, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xC7, 0x8E, 0x3C, 0x10, 0xF0, 0x7F, 0xFF, 0xF0, 0x30, 0xCC, 0xCF, 0xF3, 0xC3, 0x33, 0xC0, 0x3F, 0xFF, 0xFF}, + {0xFF, 0xFC, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xC7, 0x8E, 0x3E, 0x11, 0xFC, 0x7F, 0xFF, 0xF0, 0x30, 0xCC, 0xCF, 0xF3, 0xC3, 0x33, 0xC0, 0x3F, 0xFF, 0xFF}, + {0xFF, 0xFC, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFE, 0x38, 0xC7, 0x0C, 0x63, 0x31, 0x8C, 0x7F, 0xFF, 0xF3, 0x33, 0x3C, 0xF3, 0x0C, 0x3C, 0x3F, 0xC0, 0xCF, 0xFF, 0xFF}, + {0xFF, 0xFE, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFE, 0x38, 0x8F, 0x04, 0x60, 0x30, 0x80, 0x7F, 0xFF, 0xF3, 0x33, 0x3C, 0xF3, 0x0C, 0x3C, 0x3F, 0xC0, 0xCF, 0xFF, 0xFF}, + {0xFF, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x01, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x38, 0x8F, 0x8C, 0x60, 0x70, 0xC0, 0xFF, 0xFF, 0xF3, 0xFF, 0xCF, 0x0C, 0xC3, 0xF3, 0xCF, 0xC3, 0x3F, 0xFF, 0xFF}, + {0xFF, 0xFF, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0xCF, 0x0C, 0xC3, 0xF3, 0xCF, 0xC3, 0x3F, 0xFF, 0xFF}, + {0xFF, 0xFF, 0x80, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xC0, 0x0C, 0xCF, 0xCC, 0x33, 0xF0, 0x00, 0xF3, 0xFF, 0xFF}, + {0xFF, 0xFF, 0x80, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xC0, 0x0C, 0xCF, 0xCC, 0x33, 0xF0, 0x00, 0xF3, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xC0, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xC0, 0x33, 0x00, 0x33, 0xF0, 0x03, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xE0, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xC0, 0x33, 0x00, 0x33, 0xF0, 0x03, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x3C, 0x30, 0xC0, 0xFF, 0x03, 0x33, 0x0F, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x3C, 0x30, 0xC0, 0xFF, 0x03, 0x33, 0x0F, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0x30, 0x33, 0xCC, 0x0C, 0x03, 0xF0, 0x0F, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x7F, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0x30, 0x33, 0xCC, 0x0C, 0x03, 0xF0, 0x0F, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x07, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x03, 0x3C, 0x00, 0xFF, 0xFC, 0x30, 0x03, 0xCF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x03, 0x3C, 0x00, 0xFF, 0xFC, 0x30, 0x03, 0xCF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x03, 0x3F, 0xCF, 0x03, 0xC0, 0xF3, 0xC3, 0x0F, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x03, 0x3F, 0xCF, 0x03, 0xC0, 0xF3, 0xC3, 0x0F, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x03, 0x3C, 0xCC, 0xCC, 0x30, 0xF3, 0xF3, 0xC3, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x03, 0x3C, 0xCC, 0xCC, 0x30, 0xF3, 0xF3, 0xC3, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0x3C, 0xFC, 0xC0, 0xCF, 0x3C, 0x3C, 0x3F, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0x3C, 0xFC, 0xC0, 0xCF, 0x3C, 0x3C, 0x3F, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x3F, 0xC3, 0x03, 0x3C, 0x00, 0xFF, 0xCF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x3F, 0xC3, 0x03, 0x3C, 0x00, 0xFF, 0xCF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} +}; + +unsigned char PreloadImage[176][33]; + +#endif + +#endif //__IMAGE_EALOGO_H_ diff --git a/epaper/Image_PDlogo.h b/epaper/Image_PDlogo.h new file mode 100644 index 0000000..be03a5c --- /dev/null +++ b/epaper/Image_PDlogo.h @@ -0,0 +1,425 @@ +// Copyright 2013 Pervasive Displays, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +// express or implied. See the License for the specific language +// governing permissions and limitations under the License. + +#ifndef __IMAGE_PDLOGO_H_ +#define __IMAGE_PDLOGO_H_ + +/****************************************************************************** + * Includes + *****************************************************************************/ +#include "Display_Controller.h" + +//White=>1 +//Black=>0 + +#if(DISPLAY_IN_USE == EPD_TYPE_144) + +unsigned char const ImageDataPD[96][16]= +{ + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xE0, 0xC1, 0x81, 0x9F, 0x77, 0xC1, 0x93, 0xE4, 0x1C, 0x07, 0x38, 0x60, 0xCF, 0xF3, 0x3E, 0xC7}, + {0xE6, 0x4F, 0x98, 0x8E, 0x67, 0x99, 0x9B, 0xEC, 0xFC, 0xF3, 0x33, 0xE6, 0x4F, 0xF3, 0x9C, 0xBB}, + {0xE7, 0x4F, 0x9C, 0x8E, 0x63, 0x9F, 0x99, 0xCC, 0xFC, 0xF9, 0x37, 0xE7, 0x4F, 0xF1, 0x9D, 0xBF}, + {0xE7, 0x4F, 0x9C, 0xCE, 0xC3, 0x8F, 0x99, 0xCC, 0xFC, 0xF9, 0x33, 0xE7, 0x4F, 0xED, 0xC9, 0x9F}, + {0xE6, 0x41, 0x99, 0xC4, 0xD1, 0xC7, 0x9C, 0xDC, 0x1C, 0xFD, 0x38, 0xE4, 0x4F, 0xEC, 0xE3, 0xC7}, + {0xE0, 0xCF, 0x83, 0xE5, 0x99, 0xE3, 0x9C, 0xDC, 0xFC, 0xFD, 0x3C, 0x61, 0xCF, 0xC0, 0xF7, 0xF3}, + {0xE7, 0xCF, 0x81, 0xE1, 0x81, 0xF3, 0x9C, 0x9C, 0xFC, 0xF9, 0x3F, 0x27, 0xCF, 0xDC, 0xF7, 0xFB}, + {0xE7, 0xCF, 0x99, 0xE1, 0x3C, 0xF9, 0x9E, 0x3C, 0xFC, 0xF9, 0x3F, 0x27, 0xCF, 0x9E, 0x77, 0xFB}, + {0xE7, 0xCF, 0x98, 0xF3, 0x3C, 0x99, 0x9E, 0x3C, 0xFC, 0xF3, 0x37, 0x67, 0xCF, 0xBE, 0x77, 0xBB}, + {0xE7, 0xC1, 0x9C, 0xF3, 0x7E, 0xC3, 0x9F, 0x7C, 0x1C, 0x07, 0x30, 0xE7, 0xC0, 0xBF, 0x37, 0xC7}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xC0, 0x7F, 0x9F, 0xFF, 0xCF, 0xFF, 0xFC, 0xFE, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xC0, 0x7F, 0x9F, 0xFF, 0xCF, 0xFF, 0xFC, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xCF, 0xFF, 0x9F, 0xFF, 0xCF, 0xFF, 0xFC, 0xFE, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xCF, 0xFF, 0x9F, 0xC1, 0xC8, 0xFC, 0x3C, 0xFE, 0x7E, 0x78, 0x79, 0x18, 0xFC, 0x3F, 0xFF}, + {0xFF, 0xCF, 0xFF, 0x9F, 0x80, 0xC0, 0x78, 0x1C, 0xFE, 0x7E, 0x70, 0x38, 0x00, 0x78, 0x1F, 0xFF}, + {0xFF, 0xC0, 0xFF, 0x9F, 0xBC, 0xC6, 0x31, 0x8C, 0xFE, 0x7E, 0x63, 0x18, 0xC6, 0x71, 0x8F, 0xFF}, + {0xFF, 0xC0, 0xE1, 0x9F, 0xFC, 0xCF, 0x33, 0xCC, 0xFE, 0x7E, 0x67, 0x99, 0xCE, 0x73, 0xCF, 0xFF}, + {0xFF, 0xCF, 0xE1, 0x9F, 0xC0, 0xCF, 0x30, 0x0C, 0xFE, 0x7E, 0x60, 0x19, 0xCE, 0x73, 0xCF, 0xFF}, + {0xFF, 0xCF, 0xFF, 0x9F, 0x9C, 0xCF, 0x33, 0xFC, 0xFE, 0x7E, 0x67, 0xF9, 0xCE, 0x73, 0xCF, 0xFF}, + {0xFF, 0xCF, 0xFF, 0x9F, 0x9C, 0xC6, 0x31, 0xEC, 0xFE, 0x7C, 0xE3, 0xD9, 0xCE, 0x71, 0x8F, 0xFF}, + {0xFF, 0xC0, 0x7F, 0x80, 0x80, 0xC0, 0x78, 0x0C, 0xFE, 0x00, 0xF0, 0x19, 0xCE, 0x78, 0x1F, 0xFF}, + {0xFF, 0xC0, 0x7F, 0x80, 0xC4, 0xC8, 0xFC, 0x1C, 0xFE, 0x03, 0xF8, 0x39, 0xCE, 0x7C, 0x3F, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} +}; +unsigned char PreloadImage[96][16]; + +#endif + + + +#if(DISPLAY_IN_USE == EPD_TYPE_200) + +unsigned char const ImageDataPD[96][25] = +{ + // 5 10 15 20 25 + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFE, 0x03, 0xE0, 0x1C, 0x0E, 0x0F, 0xE3, 0xBF, 0xE0, 0xF1, 0x07, 0xF1, 0x00, 0xF0, 0x07, 0xFF, 0xE1, 0xF0, 0x1E, 0x3F, 0xFE, 0xF1, 0xF9, 0xC3, 0xFF}, + {0xFE, 0x00, 0xE0, 0x1C, 0x03, 0x0F, 0xC7, 0x3F, 0x80, 0x71, 0x87, 0xE3, 0x00, 0xF0, 0x00, 0xF1, 0xC0, 0x73, 0x0E, 0x3F, 0xFC, 0xF1, 0xF9, 0x80, 0xFF}, + {0xFE, 0x38, 0x63, 0xFC, 0x61, 0x07, 0xC7, 0x1F, 0x0E, 0x31, 0x83, 0xE3, 0x1F, 0xF1, 0xF0, 0x71, 0x8E, 0x73, 0xC6, 0x3F, 0xFC, 0x78, 0xF3, 0x1C, 0xFF}, + {0xFE, 0x3C, 0x63, 0xFC, 0x71, 0x87, 0xCE, 0x1F, 0x1E, 0x31, 0xC3, 0xE7, 0x1F, 0xF1, 0xFC, 0x71, 0x9F, 0x73, 0xE6, 0x3F, 0xF8, 0x78, 0xF3, 0x3E, 0xFF}, + {0xFE, 0x3C, 0x63, 0xFC, 0x71, 0x87, 0x8E, 0x0F, 0x1F, 0xF1, 0xC3, 0xC7, 0x1F, 0xF1, 0xFC, 0x31, 0x9F, 0xF3, 0xE6, 0x3F, 0xF8, 0x3C, 0x67, 0x3F, 0xFF}, + {0xFE, 0x3C, 0x63, 0xFC, 0x71, 0xC3, 0x9C, 0xCF, 0x0F, 0xF1, 0xE1, 0xCF, 0x1F, 0xF1, 0xFE, 0x31, 0x8F, 0xF3, 0xE6, 0x3F, 0xF3, 0x3E, 0x67, 0x1F, 0xFF}, + {0xFE, 0x38, 0x63, 0xFC, 0x61, 0xC3, 0x9C, 0xC7, 0x87, 0xF1, 0xE1, 0xCF, 0x1F, 0xF1, 0xFE, 0x31, 0x83, 0xF3, 0xC6, 0x3F, 0xF3, 0x3E, 0x0F, 0x07, 0xFF}, + {0xFE, 0x00, 0x60, 0x1C, 0x03, 0xE1, 0x3D, 0xE7, 0xC3, 0xF1, 0xF0, 0x9F, 0x00, 0xF1, 0xFE, 0x31, 0xC0, 0xF3, 0x0E, 0x3F, 0xF7, 0x9F, 0x0F, 0x81, 0xFF}, + {0xFE, 0x00, 0xE0, 0x1C, 0x0F, 0xE1, 0x39, 0xE3, 0xE0, 0xF1, 0xF0, 0x9F, 0x00, 0xF1, 0xFE, 0x31, 0xE0, 0x70, 0x1E, 0x3F, 0xE0, 0x1F, 0x9F, 0xC0, 0xFF}, + {0xFE, 0x3F, 0xE3, 0xFC, 0x07, 0xE0, 0x38, 0x03, 0xF0, 0x71, 0xF0, 0x1F, 0x1F, 0xF1, 0xFE, 0x31, 0xF8, 0x33, 0xFE, 0x3F, 0xE0, 0x0F, 0x9F, 0xF0, 0x7F}, + {0xFE, 0x3F, 0xE3, 0xFC, 0x03, 0xF0, 0x70, 0x03, 0xFC, 0x31, 0xF8, 0x3F, 0x1F, 0xF1, 0xFE, 0x31, 0xFE, 0x33, 0xFE, 0x3F, 0xCF, 0x8F, 0x9F, 0xFC, 0x7F}, + {0xFE, 0x3F, 0xE3, 0xFC, 0x43, 0xF0, 0x71, 0xE1, 0x3E, 0x31, 0xF8, 0x3F, 0x1F, 0xF1, 0xFC, 0x31, 0xFE, 0x33, 0xFE, 0x3F, 0xCF, 0x8F, 0x9F, 0xFC, 0x7F}, + {0xFE, 0x3F, 0xE3, 0xFC, 0x61, 0xF8, 0xF3, 0xE1, 0x1E, 0x31, 0xFC, 0x7F, 0x1F, 0xF1, 0xF8, 0x71, 0xBE, 0x33, 0xFE, 0x3F, 0xDF, 0xC7, 0x9F, 0x7C, 0x7F}, + {0xFE, 0x3F, 0xE3, 0xFC, 0x70, 0xF8, 0xE3, 0xE0, 0x06, 0x31, 0xFC, 0x7F, 0x1F, 0xF1, 0xF0, 0xF1, 0x1C, 0x73, 0xFE, 0x3F, 0x9F, 0xC7, 0x9E, 0x38, 0xFF}, + {0xFE, 0x3F, 0xE0, 0x1C, 0x78, 0x7D, 0xE3, 0xF0, 0x80, 0x71, 0xFE, 0x7F, 0x00, 0xF0, 0x01, 0xF1, 0x00, 0x73, 0xFE, 0x01, 0x9F, 0xE3, 0x9E, 0x00, 0xFF}, + {0xFE, 0x3F, 0xE0, 0x1C, 0x7C, 0x7D, 0xE3, 0xF0, 0xE0, 0xF1, 0xFF, 0xFF, 0x00, 0xF0, 0x0F, 0xF1, 0x81, 0xF3, 0xFE, 0x01, 0xBF, 0xE3, 0x9F, 0x03, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x1F, 0xFC, 0x7F, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xC7, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x1F, 0xFC, 0x7F, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xC7, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x1F, 0xFC, 0x7F, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xC7, 0xFE, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFC, 0x7F, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xC7, 0xFE, 0x3E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFC, 0x7F, 0xE0, 0x7C, 0x61, 0xFE, 0x0F, 0xC7, 0xFE, 0x3F, 0x8F, 0xE0, 0xFC, 0x61, 0xE1, 0xFE, 0x07, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFC, 0x7F, 0x80, 0x3C, 0x00, 0x78, 0x07, 0xC7, 0xFE, 0x3F, 0x87, 0x80, 0x7C, 0x00, 0x80, 0xF8, 0x03, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x3F, 0xFC, 0x7F, 0x80, 0x1C, 0x00, 0x70, 0x03, 0xC7, 0xFE, 0x3F, 0xC7, 0x00, 0x3C, 0x00, 0x00, 0x70, 0x01, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x3F, 0xFC, 0x7F, 0x9F, 0x1C, 0x3C, 0x31, 0xE1, 0xC7, 0xFE, 0x3F, 0xC7, 0x1E, 0x1C, 0x38, 0x38, 0x71, 0xF0, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x3F, 0xFC, 0x7F, 0xFF, 0x1C, 0x7E, 0x23, 0xF1, 0xC7, 0xFE, 0x3F, 0xC6, 0x3F, 0x1C, 0x7C, 0x7C, 0x63, 0xF8, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x8F, 0xF8, 0x0C, 0x7F, 0xE0, 0x1C, 0x7E, 0x23, 0xF1, 0xC7, 0xFE, 0x3F, 0xC6, 0x3F, 0x1C, 0x7C, 0x7C, 0x63, 0xF8, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x8F, 0xF8, 0x0C, 0x7F, 0x80, 0x1C, 0x7E, 0x20, 0x01, 0xC7, 0xFE, 0x3F, 0xC6, 0x00, 0x1C, 0x7C, 0x7C, 0x63, 0xF8, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x8F, 0xF8, 0x0C, 0x7F, 0x07, 0x1C, 0x7E, 0x20, 0x01, 0xC7, 0xFE, 0x3F, 0x86, 0x00, 0x1C, 0x7C, 0x7C, 0x63, 0xF8, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFC, 0x7F, 0x1F, 0x1C, 0x7E, 0x23, 0xFF, 0xC7, 0xFE, 0x3F, 0x8E, 0x3F, 0xFC, 0x7C, 0x7C, 0x63, 0xF8, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFC, 0x7F, 0x1E, 0x1C, 0x3C, 0x21, 0xF3, 0xC7, 0xFE, 0x3E, 0x0E, 0x1F, 0x3C, 0x7C, 0x7C, 0x61, 0xF1, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x1F, 0xFC, 0x01, 0x00, 0x1C, 0x00, 0x70, 0x03, 0xC7, 0xFE, 0x00, 0x1F, 0x00, 0x3C, 0x7C, 0x7C, 0x70, 0x01, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x1F, 0xFC, 0x01, 0x80, 0x1C, 0x00, 0xF8, 0x03, 0xC7, 0xFE, 0x00, 0x3F, 0x80, 0x3C, 0x7C, 0x7C, 0x78, 0x03, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x1F, 0xFC, 0x01, 0xC1, 0x1C, 0x41, 0xFC, 0x0F, 0xC7, 0xFE, 0x00, 0xFF, 0xC0, 0xFC, 0x7C, 0x7C, 0x7C, 0x0F, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} +}; + +unsigned char PreloadImage[96][32]; + +#endif + +#if(DISPLAY_IN_USE == EPD_TYPE_270) +unsigned char const ImageDataPD[176][33]= +{ + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xF8, 0x03, 0xF0, 0x03, 0xC0, 0x0F, 0x83, 0xFF, 0x9F, 0x3F, 0xFC, 0x07, 0xE3, 0x83, 0xFF, 0x9C, 0x00, 0xFE, 0x00, 0x1F, 0xFF, 0xFC, 0x07, 0xC0, 0x1F, 0x8F, 0xFF, 0xFC, 0xFC, 0x7F, 0xF7, 0xC0, 0xFF}, + {0xF8, 0x00, 0xF0, 0x03, 0xC0, 0x03, 0x83, 0xFF, 0x1E, 0x1F, 0xF8, 0x03, 0xE3, 0x81, 0xFF, 0x1C, 0x00, 0xFE, 0x00, 0x07, 0xF1, 0xF8, 0x03, 0xC0, 0x07, 0x8F, 0xFF, 0xFC, 0xFC, 0x7F, 0xE3, 0x80, 0x7F}, + {0xF8, 0x60, 0x70, 0x03, 0xC1, 0x81, 0x81, 0xFF, 0x3E, 0x1F, 0xF0, 0xE3, 0xE3, 0xC1, 0xFF, 0x1C, 0x00, 0xFE, 0x3F, 0xC1, 0xF1, 0xF1, 0xE3, 0xC7, 0xC3, 0x8F, 0xFF, 0xF8, 0x7E, 0x3F, 0xC7, 0x1E, 0x3F}, + {0xF8, 0x70, 0x70, 0xFF, 0xC3, 0xC1, 0xC1, 0xFE, 0x3C, 0x1F, 0xF1, 0xF3, 0xE3, 0xC1, 0xFE, 0x3C, 0x3F, 0xFE, 0x3F, 0xF0, 0xF1, 0xE3, 0xFF, 0xC7, 0xE3, 0x8F, 0xFF, 0xF8, 0x7E, 0x3F, 0xCE, 0x3F, 0x3F}, + {0xF8, 0x78, 0x70, 0xFF, 0xC3, 0xE1, 0xC1, 0xFE, 0x7C, 0x0F, 0xE1, 0xFF, 0xE3, 0xC0, 0xFE, 0x3C, 0x3F, 0xFE, 0x3F, 0xF8, 0xF1, 0xE3, 0xFF, 0xC7, 0xF1, 0x8F, 0xFF, 0xF0, 0x7F, 0x1F, 0x8E, 0x3F, 0xFF}, + {0xF8, 0x78, 0x70, 0xFF, 0xC3, 0xE1, 0xE0, 0xFC, 0x7C, 0x0F, 0xE1, 0xFF, 0xE3, 0xE0, 0xFE, 0x7C, 0x3F, 0xFE, 0x3F, 0xF8, 0x71, 0xE3, 0xFF, 0xC7, 0xF1, 0x8F, 0xFF, 0xF2, 0x3F, 0x0F, 0x9E, 0x3F, 0xFF}, + {0xF8, 0x78, 0x70, 0xFF, 0xC3, 0xE1, 0xE0, 0xFC, 0x78, 0x0F, 0xE0, 0xFF, 0xE3, 0xE0, 0xFC, 0x7C, 0x3F, 0xFE, 0x3F, 0xFC, 0x71, 0xE3, 0xFF, 0xC7, 0xF1, 0x8F, 0xFF, 0xF2, 0x3F, 0x8F, 0x3E, 0x3F, 0xFF}, + {0xF8, 0x78, 0x70, 0xFF, 0xC3, 0xE1, 0xE0, 0xFC, 0xF9, 0x07, 0xE0, 0x7F, 0xE3, 0xF0, 0x7C, 0xFC, 0x3F, 0xFE, 0x3F, 0xFC, 0x71, 0xE1, 0xFF, 0xC7, 0xE3, 0x8F, 0xFF, 0xE7, 0x1F, 0x87, 0x3E, 0x1F, 0xFF}, + {0xF8, 0x70, 0x70, 0xFF, 0xC3, 0xC1, 0xF0, 0x78, 0xF1, 0x87, 0xE0, 0x1F, 0xE3, 0xF0, 0x7C, 0xFC, 0x3F, 0xFE, 0x3F, 0xFC, 0x71, 0xF0, 0x7F, 0xC7, 0xE3, 0x8F, 0xFF, 0xE7, 0x1F, 0xC6, 0x7F, 0x07, 0xFF}, + {0xF8, 0x60, 0xF0, 0x01, 0xC1, 0x83, 0xF0, 0x79, 0xF3, 0x83, 0xF0, 0x07, 0xE3, 0xF0, 0x78, 0xFC, 0x00, 0xFE, 0x3F, 0xFC, 0x71, 0xF8, 0x1F, 0xC7, 0xC7, 0x8F, 0xFF, 0xCF, 0x9F, 0xE2, 0x7F, 0x81, 0xFF}, + {0xF8, 0x01, 0xF0, 0x01, 0xC0, 0x0F, 0xF8, 0x79, 0xF3, 0x83, 0xF8, 0x03, 0xE3, 0xF8, 0x39, 0xFC, 0x00, 0xFE, 0x3F, 0xFC, 0x71, 0xFC, 0x07, 0xC0, 0x0F, 0x8F, 0xFF, 0xCF, 0x8F, 0xE0, 0xFF, 0xC0, 0x7F}, + {0xF8, 0x07, 0xF0, 0xFF, 0xC0, 0x1F, 0xF8, 0x31, 0xE3, 0xC3, 0xFC, 0x01, 0xE3, 0xF8, 0x31, 0xFC, 0x3F, 0xFE, 0x3F, 0xFC, 0x71, 0xFF, 0x03, 0xC0, 0x7F, 0x8F, 0xFF, 0xC0, 0x0F, 0xF1, 0xFF, 0xF0, 0x3F}, + {0xF8, 0x7F, 0xF0, 0xFF, 0xC0, 0x0F, 0xF8, 0x33, 0xE7, 0xC1, 0xFF, 0x01, 0xE3, 0xFC, 0x33, 0xFC, 0x3F, 0xFE, 0x3F, 0xFC, 0x71, 0xFF, 0xC3, 0xC7, 0xFF, 0x8F, 0xFF, 0x80, 0x07, 0xF1, 0xFF, 0xFC, 0x1F}, + {0xF8, 0x7F, 0xF0, 0xFF, 0xC3, 0x07, 0xFC, 0x23, 0xC0, 0x01, 0xFF, 0xC1, 0xE3, 0xFC, 0x13, 0xFC, 0x3F, 0xFE, 0x3F, 0xFC, 0x71, 0xFF, 0xE1, 0xC7, 0xFF, 0x8F, 0xFF, 0x9F, 0xC7, 0xF1, 0xFF, 0xFE, 0x1F}, + {0xF8, 0x7F, 0xF0, 0xFF, 0xC3, 0x07, 0xFC, 0x07, 0xC0, 0x00, 0xFF, 0xE1, 0xE3, 0xFC, 0x03, 0xFC, 0x3F, 0xFE, 0x3F, 0xF8, 0x71, 0xFF, 0xF1, 0xC7, 0xFF, 0x8F, 0xFF, 0x3F, 0xC7, 0xF1, 0xFF, 0xFF, 0x1F}, + {0xF8, 0x7F, 0xF0, 0xFF, 0xC3, 0x83, 0xFC, 0x07, 0xCF, 0xE0, 0xFF, 0xF1, 0xE3, 0xFE, 0x07, 0xFC, 0x3F, 0xFE, 0x3F, 0xF8, 0xF1, 0xFF, 0xF1, 0xC7, 0xFF, 0x8F, 0xFF, 0x3F, 0xE3, 0xF1, 0xFF, 0xFF, 0x1F}, + {0xF8, 0x7F, 0xF0, 0xFF, 0xC3, 0x81, 0xFE, 0x07, 0x8F, 0xE0, 0xFF, 0xF1, 0xE3, 0xFE, 0x07, 0xFC, 0x3F, 0xFE, 0x3F, 0xF0, 0xF1, 0xFF, 0xF3, 0xC7, 0xFF, 0x8F, 0xFE, 0x7F, 0xE3, 0xF1, 0xFF, 0xFF, 0x1F}, + {0xF8, 0x7F, 0xF0, 0xFF, 0xC3, 0xC1, 0xFE, 0x0F, 0x9F, 0xF0, 0x67, 0xE1, 0xE3, 0xFF, 0x0F, 0xFC, 0x3F, 0xFE, 0x3F, 0xE1, 0xF1, 0xFF, 0xF3, 0xC7, 0xFF, 0x8F, 0xFE, 0x7F, 0xF1, 0xF1, 0xFE, 0x7F, 0x1F}, + {0xF8, 0x7F, 0xF0, 0x03, 0xC3, 0xC0, 0xFF, 0x0F, 0x1F, 0xF0, 0x63, 0xC3, 0xE3, 0xFF, 0x0F, 0xFC, 0x00, 0xFE, 0x3F, 0xC3, 0xF1, 0xE7, 0xE7, 0xC7, 0xFF, 0x8F, 0xFC, 0x7F, 0xF1, 0xF1, 0xFE, 0x1E, 0x3F}, + {0xF8, 0x7F, 0xF0, 0x03, 0xC3, 0xE0, 0x7F, 0x0F, 0x1F, 0xF8, 0x60, 0x07, 0xE3, 0xFF, 0x0F, 0xFC, 0x00, 0xFE, 0x00, 0x0F, 0xF1, 0xE0, 0x0F, 0xC7, 0xFF, 0x80, 0x0C, 0xFF, 0xF0, 0xF1, 0xFE, 0x00, 0x7F}, + {0xF8, 0x7F, 0xF0, 0x03, 0xC3, 0xF0, 0x7F, 0x9F, 0x3F, 0xF8, 0x70, 0x1F, 0xE3, 0xFF, 0x9F, 0xFC, 0x00, 0xFE, 0x00, 0x3F, 0xF1, 0xF0, 0x1F, 0xCF, 0xFF, 0x80, 0x0C, 0xFF, 0xF8, 0xF9, 0xFF, 0x00, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0x07, 0xC0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0x07, 0xF0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xFC, 0x1F, 0xFE, 0x00, 0xFE, 0x0C, 0x1F, 0xFE, 0x03, 0xFC, 0x1F, 0xFF, 0x07, 0xF8, 0x3F, 0xC0, 0x7F, 0x87, 0x03, 0xE0, 0xFF, 0xE0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xFC, 0x1F, 0xF8, 0x00, 0x7E, 0x08, 0x07, 0xF8, 0x01, 0xFC, 0x1F, 0xFF, 0x07, 0xF8, 0x1F, 0x00, 0x3F, 0x86, 0x01, 0x80, 0x7F, 0x80, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xFC, 0x1F, 0xF8, 0x00, 0x3E, 0x00, 0x03, 0xF0, 0x00, 0xFC, 0x1F, 0xFF, 0x07, 0xFC, 0x1E, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x3F, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x07, 0xFF, 0xFC, 0x1F, 0xF8, 0x00, 0x1E, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x1F, 0xFF, 0x07, 0xFC, 0x1C, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x1E, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x07, 0xFF, 0xFC, 0x1F, 0xF8, 0xF8, 0x1E, 0x03, 0x83, 0xE0, 0xF0, 0x3C, 0x1F, 0xFF, 0x07, 0xFC, 0x1C, 0x1E, 0x07, 0x80, 0xE0, 0x18, 0x1E, 0x07, 0x03, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x07, 0xFF, 0xFC, 0x1F, 0xFF, 0xFC, 0x1E, 0x0F, 0x81, 0xC1, 0xF8, 0x3C, 0x1F, 0xFF, 0x07, 0xFC, 0x18, 0x3F, 0x07, 0x81, 0xF0, 0x3C, 0x1C, 0x0F, 0x81, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x07, 0x80, 0x3C, 0x1F, 0xFF, 0xFC, 0x1E, 0x0F, 0xC1, 0xC1, 0xF8, 0x3C, 0x1F, 0xFF, 0x07, 0xFC, 0x18, 0x3F, 0x07, 0x83, 0xF0, 0x7C, 0x1C, 0x1F, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0x80, 0x3C, 0x1F, 0xFF, 0x00, 0x1E, 0x0F, 0xC1, 0xC0, 0x00, 0x3C, 0x1F, 0xFF, 0x07, 0xFC, 0x18, 0x00, 0x07, 0x83, 0xF0, 0x7C, 0x1C, 0x1F, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0x80, 0x3C, 0x1F, 0xFC, 0x00, 0x1E, 0x0F, 0xC1, 0xC0, 0x00, 0x3C, 0x1F, 0xFF, 0x07, 0xFC, 0x18, 0x00, 0x07, 0x83, 0xF0, 0x7C, 0x1C, 0x1F, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0x80, 0x3C, 0x1F, 0xF8, 0x00, 0x1E, 0x0F, 0xC1, 0xC0, 0x00, 0x3C, 0x1F, 0xFF, 0x07, 0xF8, 0x18, 0x00, 0x07, 0x83, 0xF0, 0x7C, 0x1C, 0x1F, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xFC, 0x1F, 0xF0, 0x3C, 0x1E, 0x0F, 0xC1, 0xC1, 0xFF, 0xFC, 0x1F, 0xFF, 0x07, 0xF8, 0x38, 0x3F, 0xFF, 0x83, 0xF0, 0x7C, 0x1C, 0x1F, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xFC, 0x1F, 0xF0, 0x7C, 0x1E, 0x0F, 0x81, 0xC1, 0xFF, 0xFC, 0x1F, 0xFF, 0x07, 0xF0, 0x38, 0x3F, 0xFF, 0x83, 0xF0, 0x7C, 0x1C, 0x0F, 0x81, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xFC, 0x1F, 0xF0, 0x78, 0x1E, 0x03, 0x83, 0xE0, 0xFE, 0x7C, 0x1F, 0xFF, 0x07, 0xC0, 0x7C, 0x1F, 0xCF, 0x83, 0xF0, 0x7C, 0x1E, 0x07, 0x03, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFC, 0x00, 0x10, 0x00, 0x1E, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x1F, 0xFF, 0x00, 0x00, 0x7C, 0x00, 0x0F, 0x83, 0xF0, 0x7C, 0x1E, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFC, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x07, 0xF0, 0x00, 0x7C, 0x1F, 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x0F, 0x83, 0xF0, 0x7C, 0x1F, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFC, 0x00, 0x18, 0x02, 0x1E, 0x10, 0x0F, 0xF8, 0x00, 0x7C, 0x1F, 0xFF, 0x00, 0x03, 0xFF, 0x00, 0x0F, 0x83, 0xF0, 0x7C, 0x1F, 0x80, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFC, 0x00, 0x1E, 0x06, 0x1E, 0x1C, 0x1F, 0xFE, 0x01, 0xFC, 0x1F, 0xFF, 0x00, 0x1F, 0xFF, 0xC0, 0x3F, 0x83, 0xF0, 0x7C, 0x1F, 0xE0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} +}; + +unsigned char PreloadImage[176][33]; + +#endif + +#endif //__IMAGE_PDLOGO_H_ diff --git a/epaper/bsp.c b/epaper/bsp.c new file mode 100644 index 0000000..ca01073 --- /dev/null +++ b/epaper/bsp.c @@ -0,0 +1,243 @@ +/***************************************************************************** + * + * Copyright(C) 2012, Embedded Artists AB + * All rights reserved. + * + ****************************************************************************** + * Software that is described herein is for illustrative purposes only + * which provides customers with programming information regarding the + * products. This software is supplied "AS IS" without any warranties. + * Embedded Artists AB assumes no responsibility or liability for the + * use of the software, conveys no license or title under any patent, + * copyright, or mask work right to the product. Embedded Artists AB + * reserves the right to make changes in the software without + * notification. Embedded Artists AB also make no representation or + * warranty that such application will be suitable for the specified + * use without further testing or modification. + *****************************************************************************/ + +/****************************************************************************** + * Includes + *****************************************************************************/ +#include "bsp.h" +#include +#include +#include + +#include + +/****************************************************************************** + * Typedefs and defines + *****************************************************************************/ + +#define LM75A_I2C_ADDR 0x49 //(0x49 << 1) +#define LM75A_CMD_TEMP 0x00 +#define DISPLAY_BUF_SZ (256) + +/****************************************************************************** + * Local variables + *****************************************************************************/ + +// I2C device handle +static int gI2cFd = -1; + +// mapping between Serial Expansion connector and Raspberry Pi +// GPIOs. Raspberry Pi GPIO numbering according to wiringPi +static int pinMap[BSP_PIN_SZ*2] = +{ + // [SEC] | [PI GPIO#] + BSP_PIN_6, 6, // CS + BSP_PIN_7, 0, // Busy + BSP_PIN_8, -1, // Not Used + BSP_PIN_11, 1, // PWM + BSP_PIN_12, 5, // RST + BSP_PIN_13, 3, // PWR_Ctrl + BSP_PIN_14, 4, // DISCHARGE +}; + +// buffer used when writing to display via SPI +static uint8_t displayBuf[DISPLAY_BUF_SZ]; + +/****************************************************************************** + * Local functions + *****************************************************************************/ + +static int32_t lm75a_readTemp(void) +{ + uint8_t temp[2]; + int16_t t = 0; + + wiringPiI2CWrite(gI2cFd, LM75A_CMD_TEMP); + temp[0] = wiringPiI2CRead(gI2cFd); + temp[1] = wiringPiI2CRead(gI2cFd); + + + // 11 MSB bits used. Celcius is calculated as Temp data * 1/8 + t = ((temp[0] << 8) | (temp[1])); + + return ((t * 100) >> 8); +} + + +/****************************************************************************** + * Public functions + *****************************************************************************/ + + +/****************************************************************************** + * + * Description: + * BSP initialize function. Must be called before any other BSP related + * functions. + * + *****************************************************************************/ +int bsp_init(void) +{ + + if (wiringPiSetup() < 0) { + printf("bsp_init: failed to initialize wiringPi\n"); + return -1; + } + + if ((gI2cFd = wiringPiI2CSetup(LM75A_I2C_ADDR)) < 0) { + printf("bsp_init: failed to initialize I2C\n"); + return -1; + } + + if (wiringPiSPISetup(0, 1000000) < 0) { + printf("bsp_init: failed to initialize SPI\n"); + return -1; + } + + return 0; +} + +/****************************************************************************** + * + * Description: + * Get number of milliseconds + * + *****************************************************************************/ +uint32_t bsp_getMsTicks(void) +{ + return millis(); +} + +/****************************************************************************** + * + * Description: + * Initialize SPI + * + *****************************************************************************/ +void bsp_spiInit(void) +{ + // initialized in bsp_init +} + +/****************************************************************************** + * + * Description: + * Write data to the display + * + *****************************************************************************/ +void bsp_writeToDisplay(uint8_t* data, uint16_t len) +{ + if (len > DISPLAY_BUF_SZ) { + printf("bsp_writeToDisplay: ERROR len=%d > %d\n", len, DISPLAY_BUF_SZ); + return; + } + + memcpy(displayBuf, data, len); + wiringPiSPIDataRW(0, displayBuf, len); + +} + +/****************************************************************************** + * + * Description: + * Delay specified number of milliseconds + * + * Params: + * [in] ms - number of milliseconds to delay + * + *****************************************************************************/ +void bsp_delayMs(uint32_t ms) +{ + delay(ms); +} + +/****************************************************************************** + * + * Description: + * Delay specified number of microseconds + * + * Params: + * [in] us - number of microseconds to delay + * + *****************************************************************************/ +void bsp_delayUs(uint32_t us) +{ + delayMicroseconds(us); +} + +/****************************************************************************** + * + * Description: + * Read temperature + * + * Params: + * [out] temperature - (int16_t) temperature in Celsius + * + *****************************************************************************/ +int16_t bsp_getTemp(void) +{ + lm75a_readTemp(); + bsp_delayMs(5); + return (int16_t)(lm75a_readTemp()/100); +} + +/****************************************************************************** + * + * Description: + * Set the PIN mode of a specific pin + * + *****************************************************************************/ +void bsp_pinMode(bsp_pin_t pin, bps_pinMode_t mode) +{ + int m = INPUT; + int p = 0; + + if (pin >= BSP_PIN_SZ) return; + + if (mode == BSP_PINMODE_OUTPUT) { + m = OUTPUT; + } + + p = pinMap[pin*2+1]; + + pinMode(p, m); +} + +/****************************************************************************** + * + * Description: + * Set PIN to high (1) of low (0) value + * + *****************************************************************************/ +void bsp_pinOut(bsp_pin_t pin, int value) +{ + int p = 0; + int v = LOW; + + if (pin >= BSP_PIN_SZ) return; + + if (value != 0) { + v = HIGH; + } + + p = pinMap[pin*2+1]; + + digitalWrite(p, v); +} + + diff --git a/epaper/bsp.h b/epaper/bsp.h new file mode 100644 index 0000000..c0fbb8a --- /dev/null +++ b/epaper/bsp.h @@ -0,0 +1,61 @@ +/***************************************************************************** + * + * Copyright(C) 2012, Embedded Artists AB + * All rights reserved. + * + ****************************************************************************** + * Software that is described herein is for illustrative purposes only + * which provides customers with programming information regarding the + * products. This software is supplied "AS IS" without any warranties. + * Embedded Artists AB assumes no responsibility or liability for the + * use of the software, conveys no license or title under any patent, + * copyright, or mask work right to the product. Embedded Artists AB + * reserves the right to make changes in the software without + * notification. Embedded Artists AB also make no representation or + * warranty that such application will be suitable for the specified + * use without further testing or modification. + *****************************************************************************/ +#ifndef __BSP_H__ +#define __BSP_H__ + +/****************************************************************************** + * Defines and typedefs + *****************************************************************************/ + +#include +#include +#include + +// pin numbering is for the Serial Expansion Connector +typedef enum +{ + BSP_PIN_6 = 0, + BSP_PIN_7, + BSP_PIN_8, + BSP_PIN_11, + BSP_PIN_12, + BSP_PIN_13, + BSP_PIN_14, + BSP_PIN_SZ // must be last +} bsp_pin_t; + +typedef enum +{ + BSP_PINMODE_INPUT = 0, + BSP_PINMODE_OUTPUT +} bps_pinMode_t; + +/****************************************************************************** + * Prototypes + *****************************************************************************/ +int bsp_init(void); +void bsp_spiInit(void); +void bsp_writeToDisplay(uint8_t* data, uint16_t len); +uint32_t bsp_getMsTicks(void); +void bsp_delayMs(uint32_t ms); +void bsp_delayUs(uint32_t us); +int16_t bsp_getTemp(void); +void bsp_pinMode(bsp_pin_t pin, bps_pinMode_t mode); +void bsp_pinOut(bsp_pin_t pin, int value); + +#endif //__BSP_H__ diff --git a/logger.cpp b/logger.cpp new file mode 100644 index 0000000..0f2735c --- /dev/null +++ b/logger.cpp @@ -0,0 +1,192 @@ +// (c) 2015 Ralf Ramsauer - Logger class from the sdfs project + +#include +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#endif + +#include "config.h" +#include "logger.h" + +using std::map; +using std::string; +using std::mutex; +using std::lock_guard; +using std::move; + +using std::cerr; +using std::endl; + +#ifdef USE_COLORIZED_LOGS +#ifdef _WIN32 // If Windows, Use Windows Terminal coloring +const static map colorAttribute = { + {LogLevel::error, FOREGROUND_RED }, + {LogLevel::warning, FOREGROUND_RED | FOREGROUND_GREEN }, + {LogLevel::notice, FOREGROUND_BLUE }, + {LogLevel::info, FOREGROUND_GREEN }, + {LogLevel::debug, FOREGROUND_BLUE | FOREGROUND_RED }, + {LogLevel::debug2, FOREGROUND_BLUE | FOREGROUND_RED }, +}; +#else // Use ANSI Escape sequences +const static map prefix_ansicolor = { + {LogLevel::error, "\x1b[1m\x1b[31m" }, + {LogLevel::warning, "\x1b[1m\x1b[33m" }, + {LogLevel::notice, "\x1b[1m\x1b[34m" }, + {LogLevel::info, "\x1b[1m\x1b[32m" }, + {LogLevel::debug, "\x1b[1m\x1b[35m" }, + {LogLevel::debug2, "\x1b[1m\x1b[36m" }, +}; + +const static string suffix_ansireset = "\x1b[0m"; +#endif +#endif + +const static map logLevel = { + {LogLevel::error, "ERROR " }, + {LogLevel::warning, "WARNING" }, + {LogLevel::notice, "NOTICE " }, + {LogLevel::info, "INFO " }, + {LogLevel::debug, "DEBUG " }, + {LogLevel::debug2, "DEBUG2 " }, +}; + +Logger::Logger(const LogLevel level) : + _level(level), + _ostreamMutex() +{ +} + +Logger::~Logger() +{ +} + +Logger &Logger::get() +{ + static Logger l(DEFAULT_LOG_LEVEL); + return l; +} + +void Logger::operator ()(const std::string &message, const LogLevel level) const +{ + if(level > _level) + { + return; + } + + std::ostringstream prefix; + + auto t = std::time(nullptr); + auto tm = *std::localtime(&t); + +#if defined(USE_COLORIZED_LOGS) && !defined(_WIN32) + prefix << prefix_ansicolor.at(level); +#endif + + // GCC does not support put_time :-( + /*stringstream ss; + ss << std::put_time(&tm, "%d-%m-%Y %H-%M-%S"); + prefix = "[" + ss.str() + "] ";*/ + + const size_t BUFFER_SIZE = 80; + char timeBuffer[BUFFER_SIZE]; + std::strftime(timeBuffer, BUFFER_SIZE, "%Y-%m-%d %H:%M:%S", &tm); + prefix << "[" << timeBuffer << "] -- " << logLevel.at(level) << " :: "; + + // Critical section + { + lock_guard lock(_ostreamMutex); + +#if defined(USE_COLORIZED_LOGS) && !defined(_WIN32) + cerr << prefix.str() << message << suffix_ansireset << endl; + cerr.flush(); +#elif defined(USE_COLORIZED_LOGS) && defined(_WIN32) + + // taken from GTEST + const HANDLE stdout_handle = GetStdHandle(STD_ERROR_HANDLE); + + // Gets the current text color. + CONSOLE_SCREEN_BUFFER_INFO buffer_info; + GetConsoleScreenBufferInfo(stdout_handle, &buffer_info); + const WORD old_color_attrs = buffer_info.wAttributes; + + // We need to flush the stream buffers into the console before each + // SetConsoleTextAttribute call lest it affect the text that is already + // printed but has not yet reached the console. + cerr.flush(); + SetConsoleTextAttribute(stdout_handle, + colorAttribute.at(level) | FOREGROUND_INTENSITY); + + cerr << prefix.str() << message << endl; + cerr.flush(); + + // Restores the text color. + SetConsoleTextAttribute(stdout_handle, old_color_attrs); + +#else + cerr << prefix.str() << message << endl; + cerr.flush(); +#endif + } +} + +void Logger::operator ()(const std::ostringstream &message, const LogLevel level) const +{ + (*this)(message.str(), level); +} + +void Logger::operator ()(const LogLevel level, const char* format, ...) const +{ + if(level > _level) + { + return; + } + + va_list argp; + char* message = nullptr; + + // determine buffer length + va_start(argp, format); + int size = vsnprintf(nullptr, 0, format, argp) + 1; + va_end(argp); + + if (size >= 0) + { + message = (char*)malloc(size); + if (message == nullptr) + { + (*this)("[LOGGER] CRITICAL: MEMORY ALLOCATION ERROR", + LogLevel::error); + } + + va_start(argp,format); + vsnprintf(message, size, format, argp); + va_end(argp); + + (*this)(string(message), level); + + free(message); + } else { + (*this)("[LOGGER] CRITICAL: VSNPRINTF ERROR", + LogLevel::error); + } +} + +void Logger::level(const LogLevel level) +{ + _level = level; +} + +LogLevel Logger::level() const +{ + return _level; +} + +void foo(void) { +} diff --git a/logger.h b/logger.h new file mode 100644 index 0000000..fe560fa --- /dev/null +++ b/logger.h @@ -0,0 +1,60 @@ +#ifndef LOGGER_H +#define LOGGER_H + +#include +#include +#include +#include + +/** + * @brief The LogLevel enum + */ +enum class LogLevel : unsigned char +{ + off, /// disable logging + error, /// error conditions + warning, /// warning conditions + notice, /// normal but significant conditions + info, /// informational messages + debug, /// debug-level messages + debug2 /// more debug-level messages +}; + +/** + * @brief The Logger class + * + * The logger class is a thread-safe class which is used for formatting and forwarding + * log messages. + */ +class Logger final { + +public: + static Logger &get(); + + /// Log a string + void operator() (const std::string &message, const LogLevel level = LogLevel::debug) const; + + /// Log a ostringstream + void operator() (const std::ostringstream &message, const LogLevel level = LogLevel::debug) const; + + /// Log a format string + void operator() (const LogLevel level, const char* format, ...) const; + + /// Set minimum required log level to generate output + void level(const LogLevel level); + /// Get minimum required log level to generate output + LogLevel level() const; + +private: + + /** + * @brief Constructor + * @param level Minimum required log level to generate output + */ + Logger(const LogLevel level); + ~Logger(); + + LogLevel _level; + mutable std::mutex _ostreamMutex; +}; +#endif diff --git a/logic.cpp b/logic.cpp new file mode 100644 index 0000000..64ec4d3 --- /dev/null +++ b/logic.cpp @@ -0,0 +1,236 @@ +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "util.h" +#include "logic.h" + +using namespace std; + +const string Logic::_lockPagePrefix = LOCKPAGE_PREFIX; +const string Logic::_fifoLocation = FIFO_LOCATION; + +Logic &Logic::get() +{ + static Logic l; + return l; +} + +Logic::Logic() : + _logger(Logger::get()), + _door(Door::get()), + _epaper(Epaper::get()) +{ + srand(time(NULL)); + + _logger(LogLevel::debug, "Creating Fifo file"); + if (access(_fifoLocation.c_str(), F_OK) == 0) + { + _logger(LogLevel::warning, "Fifo file aready existing, trying to delete"); + if (unlink(_fifoLocation.c_str()) != 0) + { + throw("Unable to delete Fifo file"); + } + } + if (mkfifo(_fifoLocation.c_str(), 0660) != 0) + { + throw("Unable to create Fifo"); + } + + _fifoHandle = open(_fifoLocation.c_str(), O_RDWR | O_NONBLOCK); + if (_fifoHandle == -1) + { + throw("Unable to open Fifo"); + } + + _createNewToken(false); +} + +Logic::~Logic() +{ + if (_fifoHandle != -1) + { + close(_fifoHandle); + } + + _logger(LogLevel::debug, "Removing Fifo file"); + if (unlink(_fifoLocation.c_str()) != 0) + { + throw("Unable to delete Fifo file"); + } +} + +void Logic::_parseRequest(const string &str) +{ + _logger("Parsing request..."); + Json::Reader reader; + Json::Value root; + + bool suc = reader.parse(str, root, false); + if (!suc) + { + _logger(LogLevel::error, "Request ist not valid JSON!"); + return; + } + + string action, user, password, host, token; + bool authenticated; + try { + action = getJsonOrFail(root, "action"); + host = getJsonOrFail(root, "host"); + authenticated = getJsonOrFail(root, "authenticated"); + string user, password; + if (authenticated == true) + { + user = getJsonOrFail(root, "user"); + password = getJsonOrFail(root, "password"); + token = getJsonOrFail(root, "token"); + } + } + catch (...) + { + _logger(LogLevel::warning, "Error parsing JSON"); + return; + } + + printf("Action: %s\nAuthenticated: %d\nHost: %s\n",action.c_str(), authenticated, host.c_str()); + printf("User: %s\nPassword: %s\nToken: %s\n",user.c_str(), password.c_str(), token.c_str()); + + if (authenticated == true) + { + if (_checkToken(token) == false) + { + _logger(LogLevel::error, "User provided invalid token"); + return; + } + + if (_checkLDAP(user, password) == false) + { + _logger(LogLevel::error, "invalid LDAP credentials"); + return; + } + } + + if (action == "lock") + { + _lock(); + } else if (action == "unlock") { + _unlock(); + } else { + _logger(LogLevel::error, "Unknown Action: %s", action.c_str()); + } +} + +void Logic::_lock() +{ + if (_state == LOCKED) + { + _logger(LogLevel::warning, "Unable to lock: already locked"); + return; + } + _door.lock(); + _state = LOCKED; + _createNewToken(false); +} + +void Logic::_unlock() +{ + if (_state == UNLOCKED) + { + _logger(LogLevel::warning, "Unable to unlock: already unlocked"); + return; + } + _door.unlock(); + _state = UNLOCKED; + _createNewToken(false); +} + +void Logic::run() +{ + struct timeval tv; + fd_set set; + + for (;;) + { + FD_ZERO(&set); + FD_SET(_fifoHandle, &set); + tv.tv_sec = _tokenTimeout; + tv.tv_usec = 0; + + int i = select(_fifoHandle+1, &set, nullptr, nullptr, &tv); + if (i == 0) + { + _createNewToken(true); + continue; + } else if (i == -1) { + throw "Fifo select() failed"; + } + + if (!FD_ISSET(_fifoHandle, &set)) + { + _logger(LogLevel::warning, "select(): Not my fd"); + continue; + } + + string payload; + for (;;) + { + constexpr int BUFSIZE = 2; + char tmp[BUFSIZE]; + i = read(_fifoHandle, tmp, BUFSIZE); + if (i > 0) { + payload += string(tmp, i); + } else { + if (errno == EWOULDBLOCK) + { + break; + } + throw "read() fifo failed"; + } + } + _parseRequest(payload); + } +} + +bool Logic::_checkToken(const string &strToken) +{ + try { + uint64_t token = toUint64(strToken); + if (token == _curToken || (_prevValid == true && token == _prevToken)) + { + _logger(LogLevel::info, "Token check successful"); + return true; + } + } + catch (const char* const &ex) + { + _logger(LogLevel::error, "Check Token failed for token \"%s\" (expected %s): %s", strToken.c_str(), toHexString(_curToken).c_str(), ex); + } + return false; +} + +bool Logic::_checkLDAP(const string &user, const string &password) +{ + return true; +} + +void Logic::_createNewToken(const bool stillValid) +{ + _prevToken = _curToken; + _prevValid = stillValid; + + _curToken = (((uint64_t)rand())<<32) | ((uint64_t)rand()); + + _epaper.draw(_lockPagePrefix + toHexString(_curToken)); + + ostringstream message; + message << "New Token generated: " << toHexString(_curToken) << " old Token: " << toHexString(_prevToken) << " is " << (_prevValid?"still":"not") << " valid"; + _logger(message, LogLevel::info); +} diff --git a/logic.h b/logic.h new file mode 100644 index 0000000..d519c95 --- /dev/null +++ b/logic.h @@ -0,0 +1,56 @@ +#ifndef LOGIC_H +#define LOGIC_H + +#include +#include +#include + +#include "config.h" +#include "epaper.h" +#include "door.h" +#include "logger.h" + +class Logic +{ +public: + + static Logic &get(); + ~Logic(); + + void run(); + +private: + + Logic(); + void _parseRequest(const std::string &str); + + void _lock(); + void _unlock(); + + bool _checkToken(const std::string &token); + bool _checkLDAP(const std::string &user, const std::string &password); + + void _createNewToken(const bool stillValid); + + const Logger &_logger; + Door &_door; + Epaper &_epaper; + + using Token = uint64_t; + + Token _curToken; + bool _prevValid = { false }; + Token _prevToken; + + + const static std::string _lockPagePrefix; + const static std::string _fifoLocation; + + int _fifoHandle = {-1}; + + static constexpr int _tokenTimeout = TOKEN_TIMEOUT; + + enum {LOCKED, UNLOCKED} _state = { LOCKED }; +}; + +#endif diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..942c7b9 --- /dev/null +++ b/main.cpp @@ -0,0 +1,31 @@ +#include +#include +#include + +#include + +#include "logic.h" + +using namespace std; + +const static Logger &l = Logger::get(); + +int main(void) +{ + l(LogLevel::notice, "Starting doorlockd"); + + + try { + Logic &logic = Logic::get(); + logic.run(); + } + catch (const char* const &ex) { + ostringstream str; + str << "FATAL ERROR: " << ex; + l(str, LogLevel::error); + } + + Door::get().lock(); + l(LogLevel::notice, "Doorlockd stopped"); + return 0; +} diff --git a/template.h b/template.h new file mode 100644 index 0000000..bf453b2 --- /dev/null +++ b/template.h @@ -0,0 +1,486 @@ +static char template_lock[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xE0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, + 0xFF, 0xFF, 0x3F, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x3F, + 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, + 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFE, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, + 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xF0, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, + 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xF0, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0xFC, + 0xF1, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x7C, 0xC0, 0x7F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x7C, 0xC0, 0x7F, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xF0, 0x3F, 0x3C, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x3C, + 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x3C, 0x80, 0x7F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x1C, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xF0, 0x3F, 0x1C, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x1C, + 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x3C, 0x80, 0x7F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x3C, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xF0, 0x3F, 0x3C, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x7C, + 0xC0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x7C, 0xC0, 0x3F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xE0, 0x3F, 0xFC, 0xE1, 0x3F, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, + 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0xE0, 0xFF, 0xFF, + 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x3E, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, + 0x00, 0xE0, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xD0, 0xF8, 0x01, 0xC0, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0xF8, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xC7, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x1F, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xBC, 0xFF, 0xFC, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xF0, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0xFC, 0xE3, 0x07, 0x00, 0x00, 0x00, 0x20, 0x00, 0xFC, 0x3F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF3, 0x9F, + 0x1F, 0x00, 0x00, 0x00, 0x38, 0x80, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC7, 0x7F, 0x1C, 0x00, 0x00, + 0x00, 0x78, 0xE0, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFE, 0xF3, 0x00, 0x00, 0x00, 0x78, 0xF8, + 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xF8, 0xF8, 0xFF, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x1F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xC7, + 0xFF, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xF8, 0x03, 0x00, 0xC0, 0xFF, 0x3F, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF0, 0xFB, 0x0F, 0x00, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3F, 0x7E, 0x00, 0xFC, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xF8, 0x01, + 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xC0, 0xEF, 0xFF, 0xFF, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFE, 0xFF, 0x8F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, + 0xFF, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x7F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFE, 0xFF, 0xF3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x7F, + 0x80, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x7C, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xE1, 0xFF, 0x03, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, + 0xC6, 0xFF, 0x00, 0x00, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE4, 0x3F, 0x00, + 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xBC, 0x07, 0x00, 0x00, 0x00, 0xF8, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x8F, 0x01, 0x00, 0x00, 0x00, 0xC0, 0x3F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x3E, 0x0C, 0x8C, 0xFF, 0xF1, + 0x0F, 0xF8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x70, 0x80, 0x7F, 0x0C, 0x86, 0xFF, 0xF1, 0x1F, 0xFC, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x78, + 0xC0, 0x41, 0x0C, 0x87, 0x01, 0x30, 0x38, 0x0E, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x78, 0xC0, 0x00, 0x8C, + 0x81, 0x01, 0x30, 0x30, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x18, 0x78, 0xE0, 0x00, 0xCC, 0x81, 0x01, 0x30, + 0x30, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x6C, 0x60, 0x00, 0x6C, 0x80, 0x01, 0x30, 0x30, 0x0E, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x1F, 0xDC, + 0x60, 0x00, 0x7C, 0x80, 0xFF, 0x30, 0x18, 0x7C, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x1F, 0xCC, 0x60, 0x00, 0xFC, + 0x80, 0xFF, 0xF0, 0x1F, 0xF8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x18, 0xCC, 0x60, 0x00, 0xDC, 0x81, 0x01, 0xF0, + 0x0F, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0xFE, 0x61, 0x00, 0x8C, 0x81, 0x01, 0x30, 0x1C, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0xFE, + 0x61, 0x00, 0x8C, 0x83, 0x01, 0x30, 0x18, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x86, 0xC1, 0x00, 0x0C, + 0x87, 0x01, 0x30, 0x38, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x18, 0x86, 0xC1, 0x61, 0x0C, 0x86, 0x01, 0x30, + 0x30, 0x82, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x83, 0x83, 0x7F, 0x0C, 0x8C, 0xFF, 0x31, 0x60, 0xFE, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x03, + 0x03, 0x3E, 0x0C, 0x9C, 0xFF, 0x31, 0xE0, 0xFC, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xC0, 0x03, 0x07, 0x63, 0x00, 0x0E, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x0F, 0x07, + 0x63, 0x00, 0x1C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x0C, 0x0F, 0x63, 0x00, 0x1C, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x30, 0x1C, 0x0F, 0x63, 0x00, 0x18, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x1B, 0x63, 0x00, 0x30, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x1B, + 0x63, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x13, 0x63, 0x00, 0xE0, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x18, 0x33, 0x63, 0x00, 0xC0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x33, 0x63, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x63, + 0x63, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x63, 0x63, 0x00, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x0C, 0xC3, 0x63, 0x00, 0xC0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x0E, 0xC3, 0x63, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x83, + 0xE3, 0x7F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x83, 0xE3, 0x7F, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; diff --git a/util.cpp b/util.cpp new file mode 100644 index 0000000..822955b --- /dev/null +++ b/util.cpp @@ -0,0 +1,112 @@ +#include "util.h" + +using namespace std; + +template <> +int getJson(const Json::Value &root, const string &key) +{ + auto val = root.get(key, Json::Value()); + if (val.isInt()) + return val.asInt(); + throw "Json Type error"; +} + +template <> +string getJson(const Json::Value &root, const string &key) +{ + auto val = root.get(key, Json::Value()); + if (val.isString()) + return val.asString(); + throw "Json Type error"; +} + +template <> +size_t getJson(const Json::Value &root, const string &key) +{ + auto val = root.get(key, Json::Value()); + if (val.isInt()) + return val.asUInt64(); + throw "Json Type error"; +} + +template <> +bool getJson(const Json::Value &root, const string &key) +{ + auto val = root.get(key, Json::Value()); + if (val.isBool()) + return val.asBool(); + throw "Json Type error"; +} + +template <> +Json::Value getJson(const Json::Value &root, const string &key) +{ + auto val = root.get(key, Json::Value()); + return val; +} + +static char nibble2hex(unsigned char input) +{ + input &= 0xf; + + if(input <= 9) + { + return input + '0'; + } + + return input - 0xA + 'A'; +} + +string toHexString(const uint64_t c) +{ + string retval; + + retval = nibble2hex((c>>60) & 0xF); + retval += nibble2hex((c>>56) & 0xF); + retval += nibble2hex((c>>52) & 0xF); + retval += nibble2hex((c>>48) & 0xF); + retval += nibble2hex((c>>44) & 0xF); + retval += nibble2hex((c>>40) & 0xF); + retval += nibble2hex((c>>36) & 0xF); + retval += nibble2hex((c>>32) & 0xF); + retval += nibble2hex((c>>28) & 0xF); + retval += nibble2hex((c>>24) & 0xF); + retval += nibble2hex((c>>20) & 0xF); + retval += nibble2hex((c>>16) & 0xF); + retval += nibble2hex((c>>12) & 0xF); + retval += nibble2hex((c>> 8) & 0xF); + retval += nibble2hex((c>> 4) & 0xF); + retval += nibble2hex((c ) & 0xF); + + return retval; +} + +unsigned char hex2uchar(const char input) +{ + if(input >= '0' && input <= '9') { + return input - '0'; + } else if(input >= 'A' && input <= 'F') { + return input - 'A' + 10; + } else if(input >= 'a' && input <= 'f') { + return input - 'a' + 10; + } + throw("Malformed hexadecimal input"); +} + +uint64_t toUint64(const string &s) +{ + if (s.length() != (64/4)) + { + throw("Hex string has invalid length"); + } + + uint64_t retval = 0; + + for (int i = 0 ; i < (64/4) ; i++) + { + retval <<= 4; + retval |= hex2uchar(s.at(i))&0xf; + } + + return retval; +} diff --git a/util.h b/util.h new file mode 100644 index 0000000..d9a8026 --- /dev/null +++ b/util.h @@ -0,0 +1,25 @@ +#ifndef UTIL_H +#define UTIL_H + +#include +#include + +template +T getJson(const Json::Value &root, const std::string &key); + +template +T getJsonOrFail(const Json::Value &root, const std::string &key) +{ + const auto members = root.getMemberNames(); + if (std::find(members.begin(), members.end(), key) == members.end()) + { + throw "Json key not existing"; + } + + return getJson(root, key); +} + +std::string toHexString(uint64_t c); +uint64_t toUint64(const std::string &s); + +#endif