Version of Robotron arcade game using LPC1768, a Gameduino shield, a serial EEPROM (for high scores), two microswitch joysticks and two buttons plus a box to put it in. 20 levels of mayhem.
Dependencies: 25LCxxx_SPI CommonTypes Gameduino mbed
Revision 2:bb0f631a6068, committed 2013-06-06
- Comitter:
- RichardE
- Date:
- Thu Jun 06 20:11:28 2013 +0000
- Parent:
- 1:dfd5eaaf96a3
- Child:
- 3:a6a0cd726ca0
- Commit message:
- More code brought in from Maple version. Now uses fancy character set and displays Robotric logo. Started re-writing I2C EEPROM code as SPI EEPROM code since now using an SPI EEPROM but not finished yet.
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CharFrame.cpp Thu Jun 06 20:11:28 2013 +0000 @@ -0,0 +1,57 @@ +/* + * SOURCE FILE : CharFrame.cpp + * + * For drawing rectangular frames using characters. + * + */ + +#include "CharFrame.h" +#include "GDConst.h" // a few Gameduino constants +#include "CharCodes.h" // character set codes + +/****************/ +/* DRAW A FRAME */ +/****************/ +// Pass Gameduino to draw on in gd. +// Pass x coordinate of top left in x. +// Pass y coordinate of top left in y. +// Pass width in w. +// Pass height in h. +void CharFrame::Draw( Gameduino *gd, UInt8 x, UInt8 y, UInt8 w, UInt8 h ) { + // Calculate address for top left. + unsigned int rowStart = Gameduino::RAM_PIC + y * SCREEN_CHAR_WIDTH + x; + unsigned int address = rowStart; + UInt8 count; + // Draw top left corner. + gd->wr( address++, TopLeft ); + // Draw top edge. + if( w > 2 ) { + for( count = w - 2; count > 0; --count ) { + gd->wr( address++, Top ); + } + } + // Draw top right corner. + gd->wr( address, TopRight ); + // Draw left and right edges. + rowStart += SCREEN_CHAR_WIDTH; + if( h > 2 ) { + for( count = h - 2; count > 0; --count ) { + gd->wr( rowStart, Left ); + gd->wr( rowStart + w - 1, Right ); + rowStart += SCREEN_CHAR_WIDTH; + } + } + // Draw bottom edge. + address = rowStart; + // Draw bottom left corner. + gd->wr( address++, BottomLeft ); + // Draw bottom edge. + if( w > 2 ) { + for( count = w - 2; count > 0; --count ) { + gd->wr( address++, Bottom ); + } + } + // Draw bottom right corner. + gd->wr( address, BottomRight ); +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CharFrame.h Thu Jun 06 20:11:28 2013 +0000 @@ -0,0 +1,34 @@ +/* + * SOURCE FILE : CharFrame.h + * + * For drawing rectangular frames using characters. + * + */ + +#ifndef CharFrameIncluded + + #define CharFrameIncluded + + #include "Types.h" // various types + #include "Gameduino.h" // Gameduino stuff + + class CharFrame { + + public : + + /****************/ + /* DRAW A FRAME */ + /****************/ + // Pass Gameduino to draw on in gd. + // Pass x coordinate of top left in x. + // Pass y coordinate of top left in y. + // Pass width in w. + // Pass height in h. + static void Draw( Gameduino *gd, UInt8 x, UInt8 y, UInt8 w, UInt8 h ); + + }; + +#endif + +/* END of CharFrame.h */ +
--- a/GameRobotRic.cpp Wed Jun 05 22:05:41 2013 +0000 +++ b/GameRobotRic.cpp Thu Jun 06 20:11:28 2013 +0000 @@ -8,8 +8,9 @@ #include "GameRobotRic.h" // this module's prototypes #include "Types.h" // various integer types etc. #include "LevelCollection.h" // all the levels +#include "sprite.h" // sprite data +#include "RobotRicCharacterSet.h" // character set used in this game #if 0 - #include "RobotRicCharacterSet.h" // character set used in this game #include "GDExtra.h" // extra Gameduino functions #include "GDConst.h" // a few more Gameduino constants #include "ArenaConst.h" // gameplay arena constants @@ -54,9 +55,15 @@ /*****************/ // This NEVER exits. void GameRobotRic::Play( void ) { - // Make a digital output for use with Gameduino. - DigitalOut cs( p8 ); - // Initialise an SPI link for communications with Gameduino. + // Make a digital output for use as the Gameduino chip select pin. Deselect it. + DigitalOut gameduinoCS( p8 ); + gameduinoCS = 1; + // Make a digital output for use as the Gameduino chip select pin. Deselect it. + DigitalOut eepromCS( p14 ); + eepromCS = 1; + // Initialise an SPI link for communications with Gameduino and the serial EEPROM. + // This is different from how the Maple version of RobotRic did it. It used an + // I2C EEPROM. // Use pin 5 for MOSI. // Use pin 6 for MISO. // Use pin 7 for SCK. @@ -68,24 +75,30 @@ // Use SPI mode 0. spi.format( 8, 0 ); // Make a Gameduino and pass SPI link and digital output for chip select. - Gameduino gd( &spi, &cs ); + Gameduino gd( &spi, &gameduinoCS ); // Reset the Gameduino. gd.begin(); - // Lets have a default ASCII character set. - gd.ascii(); - // Display sign on message. - gd.putstr( 3, 10, "RobotRic is up and running!" ); -#if 0 - // Initialise I2C communications (to talk to serial EEPROM). - Wire.begin( EEPROM_SDA, EEPROM_SCL ); - // Initialise serial EEPROM object with EEPROM address of zero. - I2CEEPROM eeprom; - eeprom.Open( &Wire, ADDRESS_OF_EEPROM, EEPROM_WP ); + gd.copy( Gameduino::RAM_SPRIMG, sprite_sprimg, sizeof( sprite_sprimg ) ); + // Copy sprite palette data into Gameduino memory. + gd.copy( Gameduino::RAM_SPRPAL, sprite_sprpal, sizeof( sprite_sprpal ) ); + // Initialise character set pixel data RAM. + gd.copy( Gameduino::RAM_CHR, RobotRicCharacterSet::PixelData, ( LAST_CHAR_IN_CHARACTER_SET + 1 ) << 4 ); + // Initialise character set pixel palette RAM. + gd.copy( Gameduino::RAM_PAL, RobotRicCharacterSet::PaletteData, ( LAST_CHAR_IN_CHARACTER_SET + 1 ) << 3 ); + // Turn off JK collision detection. Every sprite collides with every other. + // Did it this way because I could not resolve some problems with wandering humans. + // Suppose JK collision detection were used. The player sprite is of type J and humans + // are of type K so collisions between them will register allowing humans to be rescued. + // However, I also need some enemies (Crushers for example) to be able to collide with + // humans so they would need to be J type to collide with humans. But then player and + // enemies are both J type and so collisions between players and enemies are not detected. + gd.wr( Gameduino::JK_MODE, 0 ); + // Initialise serial EEPROM object which is on same SPI bus as the Gameduino. + SPIEEPROM eeprom( &spi, &eepromCS ); // Create a high score table that uses the EEPROM. HighScoreTable highScores( &eeprom ); -#endif - // Start on the attract level. - UInt8 levelNumber = LevelCollection::AttractLevel; + // Start on the attract level. + UInt8 levelNumber = LevelCollection::AttractLevel; #if 0 player.Lives = START_LIVES; #endif @@ -144,7 +157,5 @@ // Wait a bit. wait( (float)2 ); } -// Finished with Gameduino. -gd.end(); }
--- a/HighScoreTable.cpp Wed Jun 05 22:05:41 2013 +0000 +++ b/HighScoreTable.cpp Thu Jun 06 20:11:28 2013 +0000 @@ -1,259 +1,259 @@ -/* - * SOURCE FILE : HighScoreTable.cpp - * - * Definition of class HighScoreTable. - * Maintains a table of high scores with a name and a score for each entry in the table. - * - * The table is stored in EEPROM at an address specified when you call the constructor. - * The table is structured as follows. This shows a table with a capacity of 3. - * - * Byte offset Usage - * ----------- ----- - * 0 Index of highest score in data that follows - * 1 Index of second highest score in data that follows - * 2 Index of third highest score in data that follows - * - * 3 First character of player's name - * 4 Second character of player's name - * 5 Third character of player's name - * 6 LSB of score (in BCD) - * 7 Byte 1 of score (in BCD) - * 8 Byte 2 of score (in BCD) - * 9 MSB of score (in BCD) - * 10 Unused - * - * 11 First character of player's name - * 12 Second character of player's name - * 13 Third character of player's name - * 14 LSB of score (in BCD) - * 15 Byte 1 of score (in BCD) - * 16 Byte 2 of score (in BCD) - * 17 MSB of score (in BCD) - * 18 Unused - * - * 19 First character of player's name - * 20 Second character of player's name - * 21 Third character of player's name - * 22 LSB of score (in BCD) - * 23 Byte 1 of score (in BCD) - * 24 Byte 2 of score (in BCD) - * 25 MSB of score (in BCD) - * 26 Unused - * - * So, assuming the capacity of the table is N, the first N bytes form an index which is used to locate - * items in the remaining N*8 bytes that follow. This is done so that inserting a new entry only involves - * overwriting one name/score record and updating the index. You don't have to re-write all the records - * that move down the table to make room for the new one. - * - */ - -#include "HighScoreTable.h" - -/***************/ -/* CONSTRUCTOR */ -/***************/ -// Pass pointer to an I2C EEPROM which contains the high scores. -HighScoreTable::HighScoreTable( I2CEEPROM *e ) : - eeprom( e ) -{ -} - -/**************/ -/* DESTRUCTOR */ -/**************/ -HighScoreTable::~HighScoreTable() { -} - -/****************************************/ -/* VALIDATE EEPROM USED FOR HIGH SCORES */ -/****************************************/ -// Checks EEPROM used for high scores and -// if any of it looks like nonsense it -// rewrites the whole table with defaults. -void HighScoreTable::ValidateEEPROM( void ) { - // Check if contents of EEPROM make sense. - // If not then rewrite EEPROM with defaults. - if( ! EEPROMValid() ) { - WriteEEPROMDefaults(); - } -} - -/**********************************************/ -/* DETERMINE POSITION OF A SCORE IN THE TABLE */ -/**********************************************/ -// Pass score in score. -// Returns position in table (0 is top score). -// If position returned is >= capacity of table then score is not high -// enough to place in table. -UInt8 HighScoreTable::GetPositionInTable( UInt32 score ) const { - // Look through table for a score less than the one passed. - PlayerName name; - UInt32 tableScore = (UInt32)0; - for( UInt8 i = 0; i < capacity; ++i ) { - Get( i, &name, &tableScore ); - if( tableScore < score ) { - // Found a score that is less. - // Return index at which it was found. - return i; - } - } - // No score found that is less than the one passed. - // Return capacity of table to indicate not found. - return capacity; -} - -/*********************************/ -/* ADD ENTRY TO HIGH SCORE TABLE */ -/*********************************/ -// Pass position in table to put entry in pos. -// Pass name of player in name. -// Pass score in score. -void HighScoreTable::Add( UInt8 pos, const PlayerName *name, UInt32 score ) { - // Read the entire index, high scores and names out of EEPROM. - // Going to do manipulations in RAM to minimise the number of - // writes we need to do to EEPROM. Remember every time we write - // a single byte a whole page is written so might as well - // write a whole page in one go. Only drawback is more RAM - // is required. - UInt8 buffer[ memoryUsed ]; - if( eeprom->ReadBytes( eepromAddress, buffer, memoryUsed ) ) { - // Fetch index for lowest score in the table. - UInt8 index = buffer[ capacity - 1 ]; - // Make sure index is within range. - if( index < capacity ) { - // Point to section of buffer that contains name and score for - // lowest score. - UInt8 *address = buffer + capacity + ( index << 3 ); - // Copy characters of name into buffer. - for( UInt8 i = 0; i < PlayerName::Length; ++i ) { - *address++ = name->Name[ i ]; - } - // Copy bytes of score into buffer. - *((UInt32*)address) = score; - address += 4; - // Move all entries in the index below insertion point down one - // to make room for new entry. - for( UInt8 i = capacity - 1; i > pos; --i ) { - buffer[ i ] = buffer[ i - 1 ]; - } - // Insert index of newly written record at insertion point. - buffer[ pos ] = index; - // Write the buffer back to EEPROM. - eeprom->WriteBytes( eepromAddress, buffer, memoryUsed ); - } - } -} - -/****************************/ -/* GET ENTRY FROM THE TABLE */ -/****************************/ -// Pass position to fetch from in pos. -// Player name is returned in object pointed to by name. -// Player score is returned in integer pointed to by score. -void HighScoreTable::Get( UInt8 pos, PlayerName *name, UInt32 *score ) const { - // Write default values to name and score. - for( UInt8 i = 0; i < PlayerName::Length; ++i ) { - name->Name[ i ] = (UInt8)'X'; - } - name->Name[ PlayerName::Length ] = 0; - *score = 0; - // Fetch index from EEPROM. - UInt8 index; - if( ! eeprom->ReadBytes( eepromAddress + pos, &index, 1 ) ) { - return; - } - // Point to appropriate part of data table. - UInt16 address = eepromAddress + capacity + ( index << 3 ); - // Read out characters and store in name. - if( ! eeprom->ReadBytes( address, (UInt8*)name->Name, PlayerName::Length ) ) { - return; - } - name->Name[ PlayerName::Length ] = 0; - address += PlayerName::Length; - // Read out score. - eeprom->ReadBytes( address, (UInt8*)score, 4 ); -} - -/********************************/ -/* DETERMINE IF EEPROM IS VALID */ -/********************************/ -// Returns true if EEPROM is valid. -bool HighScoreTable::EEPROMValid( void ) { - UInt8 b, b2; - // Check all entries in the index are within range and are unique. - for( UInt8 i = 0; i < capacity; ++i ) { - // Read byte from EEPROM. - if( ! eeprom->ReadBytes( eepromAddress + i, &b, 1 ) ) { - return false; - } - // Check index read is less than capacity. - if( b >= capacity ) { - return false; - } - // Check if any of the following bytes in the index have - // the same value. - for( UInt8 j = i + 1; j < capacity; ++j ) { - if( ! eeprom->ReadBytes( eepromAddress + j, &b2, 1 ) ) { - return false; - } - if( b == b2 ) { - return false; - } - } - } - // Check all entries in the data part of the table are valid. - UInt16 address = eepromAddress + capacity; - for( UInt8 i = 0; i < capacity; ++i ) { - // Check name consists only of uppercase letters. - for( UInt8 j = 0; j < PlayerName::Length; ++j ) { - // Read byte from EEPROM. - if( ! eeprom->ReadBytes( address++, &b, 1 ) ) { - return false; - } - if( ( b < PlayerName::MinChar ) || ( b > PlayerName::MaxChar ) ) { - return false; - } - } - // Check score consists only of valid BCD numbers. - for( UInt8 j = 0; j < 4; ++j ) { - // Read byte from EEPROM. - if( ! eeprom->ReadBytes( address++, &b, 1 ) ) { - return false; - } - if( ( ( b & 0x0F ) > 0x09 ) || ( ( b & 0xF0 ) > 0x90 ) ) { - return false; - } - } - // Skip over unused byte. - address++; - } - // EEPROM is valid - return true; -} - -/****************************/ -/* WRITE DEFAULTS TO EEPROM */ -/****************************/ -// This may take a second or two to execute! -void HighScoreTable::WriteEEPROMDefaults( void ) { - UInt8 buffer[ memoryUsed ]; - // Write index with ascending integers. - UInt8 *ptr = buffer; - for( UInt8 i = 0; i < capacity; ++i ) { - *ptr++ = i; - } - // Write data table with zero score entries. - for( UInt8 i = 0; i < capacity; ++i ) { - // Write a name of "AAA". - for( UInt8 j = 0; j < PlayerName::Length; ++j ) { - *ptr++ = (UInt8)'A'; - } - // Write a score of zero. - *((UInt32*)ptr) = 0; - ptr += 4; - // Write zero to unused byte. - *ptr++ = 0; - } - // Write the buffer to EEPROM. - eeprom->WriteBytes( eepromAddress, buffer, memoryUsed ); +/* + * SOURCE FILE : HighScoreTable.cpp + * + * Definition of class HighScoreTable. + * Maintains a table of high scores with a name and a score for each entry in the table. + * + * The table is stored in EEPROM at an address specified when you call the constructor. + * The table is structured as follows. This shows a table with a capacity of 3. + * + * Byte offset Usage + * ----------- ----- + * 0 Index of highest score in data that follows + * 1 Index of second highest score in data that follows + * 2 Index of third highest score in data that follows + * + * 3 First character of player's name + * 4 Second character of player's name + * 5 Third character of player's name + * 6 LSB of score (in BCD) + * 7 Byte 1 of score (in BCD) + * 8 Byte 2 of score (in BCD) + * 9 MSB of score (in BCD) + * 10 Unused + * + * 11 First character of player's name + * 12 Second character of player's name + * 13 Third character of player's name + * 14 LSB of score (in BCD) + * 15 Byte 1 of score (in BCD) + * 16 Byte 2 of score (in BCD) + * 17 MSB of score (in BCD) + * 18 Unused + * + * 19 First character of player's name + * 20 Second character of player's name + * 21 Third character of player's name + * 22 LSB of score (in BCD) + * 23 Byte 1 of score (in BCD) + * 24 Byte 2 of score (in BCD) + * 25 MSB of score (in BCD) + * 26 Unused + * + * So, assuming the capacity of the table is N, the first N bytes form an index which is used to locate + * items in the remaining N*8 bytes that follow. This is done so that inserting a new entry only involves + * overwriting one name/score record and updating the index. You don't have to re-write all the records + * that move down the table to make room for the new one. + * + */ + +#include "HighScoreTable.h" + +/***************/ +/* CONSTRUCTOR */ +/***************/ +// Pass pointer to an SPI EEPROM which contains the high scores. +HighScoreTable::HighScoreTable( SPIEEPROM *e ) : + eeprom( e ) +{ +} + +/**************/ +/* DESTRUCTOR */ +/**************/ +HighScoreTable::~HighScoreTable() { +} + +/****************************************/ +/* VALIDATE EEPROM USED FOR HIGH SCORES */ +/****************************************/ +// Checks EEPROM used for high scores and +// if any of it looks like nonsense it +// rewrites the whole table with defaults. +void HighScoreTable::ValidateEEPROM( void ) { + // Check if contents of EEPROM make sense. + // If not then rewrite EEPROM with defaults. + if( ! EEPROMValid() ) { + WriteEEPROMDefaults(); + } +} + +/**********************************************/ +/* DETERMINE POSITION OF A SCORE IN THE TABLE */ +/**********************************************/ +// Pass score in score. +// Returns position in table (0 is top score). +// If position returned is >= capacity of table then score is not high +// enough to place in table. +UInt8 HighScoreTable::GetPositionInTable( UInt32 score ) const { + // Look through table for a score less than the one passed. + PlayerName name; + UInt32 tableScore = (UInt32)0; + for( UInt8 i = 0; i < capacity; ++i ) { + Get( i, &name, &tableScore ); + if( tableScore < score ) { + // Found a score that is less. + // Return index at which it was found. + return i; + } + } + // No score found that is less than the one passed. + // Return capacity of table to indicate not found. + return capacity; } + +/*********************************/ +/* ADD ENTRY TO HIGH SCORE TABLE */ +/*********************************/ +// Pass position in table to put entry in pos. +// Pass name of player in name. +// Pass score in score. +void HighScoreTable::Add( UInt8 pos, const PlayerName *name, UInt32 score ) { + // Read the entire index, high scores and names out of EEPROM. + // Going to do manipulations in RAM to minimise the number of + // writes we need to do to EEPROM. Remember every time we write + // a single byte a whole page is written so might as well + // write a whole page in one go. Only drawback is more RAM + // is required. + UInt8 buffer[ memoryUsed ]; + if( eeprom->ReadBytes( eepromAddress, buffer, memoryUsed ) ) { + // Fetch index for lowest score in the table. + UInt8 index = buffer[ capacity - 1 ]; + // Make sure index is within range. + if( index < capacity ) { + // Point to section of buffer that contains name and score for + // lowest score. + UInt8 *address = buffer + capacity + ( index << 3 ); + // Copy characters of name into buffer. + for( UInt8 i = 0; i < PlayerName::Length; ++i ) { + *address++ = name->Name[ i ]; + } + // Copy bytes of score into buffer. + *((UInt32*)address) = score; + address += 4; + // Move all entries in the index below insertion point down one + // to make room for new entry. + for( UInt8 i = capacity - 1; i > pos; --i ) { + buffer[ i ] = buffer[ i - 1 ]; + } + // Insert index of newly written record at insertion point. + buffer[ pos ] = index; + // Write the buffer back to EEPROM. + eeprom->WriteBytes( eepromAddress, buffer, memoryUsed ); + } + } +} + +/****************************/ +/* GET ENTRY FROM THE TABLE */ +/****************************/ +// Pass position to fetch from in pos. +// Player name is returned in object pointed to by name. +// Player score is returned in integer pointed to by score. +void HighScoreTable::Get( UInt8 pos, PlayerName *name, UInt32 *score ) const { + // Write default values to name and score. + for( UInt8 i = 0; i < PlayerName::Length; ++i ) { + name->Name[ i ] = (UInt8)'X'; + } + name->Name[ PlayerName::Length ] = 0; + *score = 0; + // Fetch index from EEPROM. + UInt8 index; + if( ! eeprom->ReadBytes( eepromAddress + pos, &index, 1 ) ) { + return; + } + // Point to appropriate part of data table. + UInt16 address = eepromAddress + capacity + ( index << 3 ); + // Read out characters and store in name. + if( ! eeprom->ReadBytes( address, (UInt8*)name->Name, PlayerName::Length ) ) { + return; + } + name->Name[ PlayerName::Length ] = 0; + address += PlayerName::Length; + // Read out score. + eeprom->ReadBytes( address, (UInt8*)score, 4 ); +} + +/********************************/ +/* DETERMINE IF EEPROM IS VALID */ +/********************************/ +// Returns true if EEPROM is valid. +bool HighScoreTable::EEPROMValid( void ) { + UInt8 b, b2; + // Check all entries in the index are within range and are unique. + for( UInt8 i = 0; i < capacity; ++i ) { + // Read byte from EEPROM. + if( ! eeprom->ReadBytes( eepromAddress + i, &b, 1 ) ) { + return false; + } + // Check index read is less than capacity. + if( b >= capacity ) { + return false; + } + // Check if any of the following bytes in the index have + // the same value. + for( UInt8 j = i + 1; j < capacity; ++j ) { + if( ! eeprom->ReadBytes( eepromAddress + j, &b2, 1 ) ) { + return false; + } + if( b == b2 ) { + return false; + } + } + } + // Check all entries in the data part of the table are valid. + UInt16 address = eepromAddress + capacity; + for( UInt8 i = 0; i < capacity; ++i ) { + // Check name consists only of uppercase letters. + for( UInt8 j = 0; j < PlayerName::Length; ++j ) { + // Read byte from EEPROM. + if( ! eeprom->ReadBytes( address++, &b, 1 ) ) { + return false; + } + if( ( b < PlayerName::MinChar ) || ( b > PlayerName::MaxChar ) ) { + return false; + } + } + // Check score consists only of valid BCD numbers. + for( UInt8 j = 0; j < 4; ++j ) { + // Read byte from EEPROM. + if( ! eeprom->ReadBytes( address++, &b, 1 ) ) { + return false; + } + if( ( ( b & 0x0F ) > 0x09 ) || ( ( b & 0xF0 ) > 0x90 ) ) { + return false; + } + } + // Skip over unused byte. + address++; + } + // EEPROM is valid + return true; +} + +/****************************/ +/* WRITE DEFAULTS TO EEPROM */ +/****************************/ +// This may take a second or two to execute! +void HighScoreTable::WriteEEPROMDefaults( void ) { + UInt8 buffer[ memoryUsed ]; + // Write index with ascending integers. + UInt8 *ptr = buffer; + for( UInt8 i = 0; i < capacity; ++i ) { + *ptr++ = i; + } + // Write data table with zero score entries. + for( UInt8 i = 0; i < capacity; ++i ) { + // Write a name of "AAA". + for( UInt8 j = 0; j < PlayerName::Length; ++j ) { + *ptr++ = (UInt8)'A'; + } + // Write a score of zero. + *((UInt32*)ptr) = 0; + ptr += 4; + // Write zero to unused byte. + *ptr++ = 0; + } + // Write the buffer to EEPROM. + eeprom->WriteBytes( eepromAddress, buffer, memoryUsed ); +}
--- a/HighScoreTable.h Wed Jun 05 22:05:41 2013 +0000 +++ b/HighScoreTable.h Thu Jun 06 20:11:28 2013 +0000 @@ -12,7 +12,7 @@ #include "Types.h" #include "PlayerName.h" - #include "I2CEEPROM.h" + #include "SPIEEPROM.h" class HighScoreTable { @@ -21,20 +21,20 @@ /***************/ /* CONSTRUCTOR */ /***************/ - // Pass pointer to an I2C EEPROM which contains the high scores. - HighScoreTable( I2CEEPROM *e ); + // Pass pointer to an SPI EEPROM which contains the high scores. + HighScoreTable( SPIEEPROM *e ); /**************/ /* DESTRUCTOR */ /**************/ virtual ~HighScoreTable(); - /***************************************/ - /* GET EEPROM USED BY HIGH SCORE TABLE */ - /***************************************/ - I2CEEPROM *GetEEPROM( void ) const { - return eeprom; - } + /***************************************/ + /* GET EEPROM USED BY HIGH SCORE TABLE */ + /***************************************/ + SPIEEPROM *GetEEPROM( void ) const { + return eeprom; + } /****************************************/ /* VALIDATE EEPROM USED FOR HIGH SCORES */ @@ -87,16 +87,16 @@ // Change the following to suit. enum { - eepromAddress = 0, // address in EEPROM where high score table starts - capacity = 10, // number of entries in table - // Amount of memory used in EEPROM. - // You need capacity bytes for the index and then - // eight bytes for each high score and name. - memoryUsed = capacity + ( capacity << 3 ), + eepromAddress = 0, // address in EEPROM where high score table starts + capacity = 10, // number of entries in table + // Amount of memory used in EEPROM. + // You need capacity bytes for the index and then + // eight bytes for each high score and name. + memoryUsed = capacity + ( capacity << 3 ), }; - // Pointer to EEPROM that holds high scores. - I2CEEPROM *eeprom; + // Pointer to EEPROM that holds high scores. + SPIEEPROM *eeprom; /****************************/ /* WRITE DEFAULTS TO EEPROM */ @@ -108,4 +108,3 @@ #endif /* END of HighScoreTable.h */ -
--- a/I2CEEPROM.cpp Wed Jun 05 22:05:41 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,191 +0,0 @@ -/* - * SOURCE FILE : I2CEEPROM.cpp - * - * Definition of class I2CEEPROM. - * Rountines for communicating with a serial EEPROM over an I2C link. - * EEPROM in question is a Microchip 24AA512. - * Remember you need pullup resistors on the SCL, SDA and WP lines. - * - */ - -#include "I2CEEPROM.h" - -/***************/ -/* CONSTRUCTOR */ -/***************/ -I2CEEPROM::I2CEEPROM() : - isOpen( false ), - // wire( (TwoWire*)NULL ), - wp( 8 ) -{ -} - -/**************/ -/* DESTRUCTOR */ -/**************/ -I2CEEPROM::~I2CEEPROM() { -} - -/**************************************/ -/* PREPARE TO COMMUNICATE WITH EEPROM */ -/**************************************/ -// Pass pointer to TwoWire object to use for I2C communications -// which should have been initialised and opened before calling this. -// Pass 3 bit address of EEPROM (as set by A0, A1 and A2 pins) in ea. -// Pass pin number to use for write protect in wp. -#if 0 -void I2CEEPROM::Open( TwoWire *wire, UInt8 ea, UInt8 wp ) { - if( ! isOpen ) { - // Save pointer to TwoWire object. - this->wire = wire; - // Calculate slave address. - slaveAddress = (UInt8)( ( ea & 0x7 ) | 0x50 ); - // Save write protect pin number. - this->wp = wp; - // Configure write protect pin as open drain output. - pinMode( wp, OUTPUT_OPEN_DRAIN ); - // Write protect EEPROM. - digitalWrite( wp, HIGH ); - isOpen = true; - } -} -#endif - -/*********************************************/ -/* SHUT DOWN COMMUNICATIONS LINK WITH EEPROM */ -/*********************************************/ -void I2CEEPROM::Close( void ) { - isOpen = false; -} - -// Size of each chunk read or written. -#define CHUNK_SIZE ( WIRE_BUFSIZ - 2 ) - -/************************************/ -/* ATTEMPT TO READ A CHUNK OF BYTES */ -/************************************/ -// Pass address within EEPROM in address. -// Pass pointer to buffer for bytes read in buffer. -// Returns false if a failure occurred whilst reading EEPROM. -// Pass number of bytes to read in count. -// Returns true if successful, false if not. -// The number of bytes read must not exceed CHUNK_SIZE. -bool I2CEEPROM::ReadChunk( UInt16 address, UInt8 *buffer, UInt8 count ) { -#if 0 - // First send address you want to read from. - wire->beginTransmission( slaveAddress ); - // Add high byte of EEPROM address to read from. - wire->send( ( address >> 8 ) & 0xFF ); - // Add low byte of EEPROM address to read from. - wire->send( address & 0xFF ); - // Send the packet and return false on failure. - if( wire->endTransmission() != SUCCESS ) { - return false; - } - // Now read back data. - wire->requestFrom( slaveAddress, count ); - UInt16 readCount = 0; - while( ( wire->available() > 0 ) && ( readCount < count ) ) { - *buffer++ = wire->receive(); - readCount++; - } - return true; -#else - return false; -#endif -} - -/*************************************/ -/* ATTEMPT TO READ A NUMBER OF BYTES */ -/*************************************/ -// Pass address within EEPROM in address. -// Pass pointer to buffer for bytes read in buffer. -// Returns false if a failure occurred whilst reading EEPROM. -// Pass number of bytes to read in count. -// Returns true if successful, false if not. -bool I2CEEPROM::ReadBytes( UInt16 address, UInt8 *buffer, UInt16 count ) { -#if 0 - bool ok = true; - // Keep reading chunks until all bytes read. - while( ( count > 0 ) && ok ) { - if( count > CHUNK_SIZE ) { - ok = ReadChunk( address, buffer, (UInt8)CHUNK_SIZE ); - address += CHUNK_SIZE; - buffer += CHUNK_SIZE; - count -= CHUNK_SIZE; - } - else { - ok = ReadChunk( address, buffer, (UInt8)count ); - count = 0; - } - } - // Return true on success. - return ok; -#else - return false; -#endif -} - -/**************************************/ -/* ATTEMPT TO WRITE A CHUNK TO EEPROM */ -/**************************************/ -// Pass address within EEPROM in address. -// Pass pointer to buffer of bytes to write in buffer. -// Pass number of bytes to write in count. -// Returns true if successful, false if not. -// The number of bytes written must not exceed CHUNK_SIZE. -bool I2CEEPROM::WriteChunk( UInt16 address, const UInt8 *buffer, UInt8 count ) { -#if 0 - // First send address you want to write to. - wire->beginTransmission( slaveAddress ); - // Add high byte of EEPROM address to write to. - wire->send( ( address >> 8 ) & 0xFF ); - // Add low byte of EEPROM address to write to. - wire->send( address & 0xFF ); - // Add buffer bytes. - wire->send( (uint8*)buffer, count ); - // Send the packet. - // Return true if successful. - return ( wire->endTransmission() == SUCCESS ); -#else - return false; -#endif -} - -/**************************************/ -/* ATTEMPT TO WRITE A NUMBER OF BYTES */ -/**************************************/ -// Pass address within EEPROM in address. -// Pass pointer to buffer of bytes to write in buffer. -// Pass number of bytes to write in count. -// Returns true if successful, false if not. -bool I2CEEPROM::WriteBytes( UInt16 address, const UInt8 *buffer, UInt16 count ) { -#if 0 - bool ok = true; - // Write enable EEPROM and wait a bit. - digitalWrite( wp, LOW ); - delay( 1 ); - // Keep writing chunks until all bytes written. - while( ( count > 0 ) && ok ) { - if( count > CHUNK_SIZE ) { - ok = WriteChunk( address, buffer, (UInt8)CHUNK_SIZE ); - address += CHUNK_SIZE; - buffer += CHUNK_SIZE; - count -= CHUNK_SIZE; - } - else { - ok = WriteChunk( address, buffer, (UInt8)count ); - count = 0; - } - // Wait a lot to allow page to be written. - delay( 6 ); - } - // Write protect EEPROM. - digitalWrite( wp, HIGH ); - // Return true on success. - return ok; -#else - return false; -#endif -} -
--- a/I2CEEPROM.h Wed Jun 05 22:05:41 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,113 +0,0 @@ -/* - * SOURCE FILE : I2CEEPROM.h - * - * Definition of class I2CEEPROM. - * Rountines for communicating with a serial EEPROM over an I2C link. - * EEPROM in question is a Microchip 24AA512. - * Remember you need pullup resistors on the SCL, SDA and WP lines. - * - */ - -#ifndef I2CEEPROMDefined - - #define I2CEEPROMDefined - - #include "Types.h" - // #include "CDFWire.h" // tweaked version of Wire library - - class I2CEEPROM { - - public : - - /***************/ - /* CONSTRUCTOR */ - /***************/ - I2CEEPROM(); - - /**************/ - /* DESTRUCTOR */ - /**************/ - virtual ~I2CEEPROM(); - - /**************************************/ - /* PREPARE TO COMMUNICATE WITH EEPROM */ - /**************************************/ - // Pass pointer to TwoWire object to use for I2C communications. - // Pass 3 bit address of EEPROM (as set by A0, A1 and A2 pins) in ea. - // Pass pin number to use for write protect in wp. - // void Open( TwoWire *wire, UInt8 ea, UInt8 wp ); - - /*********************************************/ - /* SHUT DOWN COMMUNICATIONS LINK WITH EEPROM */ - /*********************************************/ - void Close( void ); - - /*****************************************/ - /* DETERMINE IF LINK WITH EEPROM IS OPEN */ - /*****************************************/ - // Returns true if link is open. - bool IsOpen( void ) { - return isOpen; - } - - /*************************************/ - /* ATTEMPT TO READ A NUMBER OF BYTES */ - /*************************************/ - // Pass address within EEPROM in address. - // Pass pointer to buffer for bytes read in buffer. - // Pass number of bytes to read in count. - // Returns true if successful, false if not. - bool ReadBytes( UInt16 address, UInt8 *buffer, UInt16 count ); - - /**************************************/ - /* ATTEMPT TO WRITE A NUMBER OF BYTES */ - /**************************************/ - // Pass address within EEPROM in address. - // Pass pointer to buffer of bytes to write in buffer. - // Pass number of bytes to write in count. - // Returns true if successful, false if not. - bool WriteBytes( UInt16 address, const UInt8 *buffer, UInt16 count ); - -private : - - // Indicates connection with EEPROM is open. - bool isOpen; - - // Pointer to object that does I2C communications. - // TwoWire *wire; - - // Slave address consisting of three bits that identify the - // particular EEPROM on the I2C bus, plus bits 3 to 7 are - // set to 01010 binary (see 24AA512 dtasheet). - UInt8 slaveAddress; - - // Pin number for write protect pin. - UInt8 wp; - - /************************************/ - /* ATTEMPT TO READ A CHUNK OF BYTES */ - /************************************/ - // Pass address within EEPROM in address. - // Pass pointer to buffer for bytes read in buffer. - // Returns false if a failure occurred whilst reading EEPROM. - // Pass number of bytes to read in count. - // Returns true if successful, false if not. - // The number of bytes read must not exceed CHUNK_SIZE. - bool ReadChunk( UInt16 address, UInt8 *buffer, UInt8 count ); - - /**************************************/ - /* ATTEMPT TO WRITE A CHUNK TO EEPROM */ - /**************************************/ - // Pass address within EEPROM in address. - // Pass pointer to buffer of bytes to write in buffer. - // Pass number of bytes to write in count. - // Returns true if successful, false if not. - // The number of bytes written must not exceed WIRE_BUFSIZ - 2. - bool WriteChunk( UInt16 address, const UInt8 *buffer, UInt8 count ); - - }; - -#endif - -/* END of I2CEEPROM.h */ -
--- a/Level.h Wed Jun 05 22:05:41 2013 +0000 +++ b/Level.h Thu Jun 06 20:11:28 2013 +0000 @@ -18,6 +18,7 @@ #include "CharBlocks.h" #include "StringData.h" #include "HighScoreTable.h" + #include "CharFrame.h" #if 0 #include "ArenaConst.h" #include "SpriteImageId.h" @@ -26,7 +27,6 @@ #include "BlueMeanyObject.h" #include "CrusherObject.h" #include "BrainObject.h" - #include "CharFrame.h" #include "SoundManager.h" #include "Sounds.h" #endif
--- a/Level0.cpp Wed Jun 05 22:05:41 2013 +0000 +++ b/Level0.cpp Thu Jun 06 20:11:28 2013 +0000 @@ -68,12 +68,11 @@ GDExtra::HideAllSprites( gd ); // SoundManager::Instance.SilenceAll(); // Draw border around screen. - // CharFrame::Draw( 0, 0, VISIBLE_CHAR_WIDTH, VISIBLE_CHAR_HEIGHT ); + CharFrame::Draw( gd, 0, 0, VISIBLE_CHAR_WIDTH, VISIBLE_CHAR_HEIGHT ); // Draw big block of characters that read "ROBOTRIC". GDExtra::WriteProgCharBlock( gd, 2, 2, CharBlocks::RobotRicText ); // Write message telling user how to start game. GDExtra::WriteProgString( gd, 2, VISIBLE_CHAR_HEIGHT - 3, startText ); - #if 0 // Validate high scores in EEPROM which will re-write the entire // table with default data if it finds nonsense in the EEPROM. // Then check if EEPROM now makes sense. If it does then display @@ -85,6 +84,7 @@ DrawHighScores(); } } + #if 0 // Must have a player with non-NULL controls. PanelControls *controls; if(
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SPIEEPROM.cpp Thu Jun 06 20:11:28 2013 +0000 @@ -0,0 +1,122 @@ +/* + * SOURCE FILE : SPIEEPROM.cpp + * + * Definition of class SPIEEPROM. + * Rountines for communicating with a serial EEPROM over an SPI link. + * EEPROM in question is a Microchip 24AA512. + * Remember you need pullup resistors on the SCL, SDA and WP lines. + * + */ + +#include "SPIEEPROM.h" + +// Instruction set codes for use with EEPROM. +#define READ 0x03 // read data beginning at selected address +#define WRITE 0x02 // write data beginning at selected address +#define WRDI 0x04 // disable write operations +#define WREN 0x06 // enable write operations +#define RDSR 0x05 // read status register +#define WRSR 0x01 // write status register + +/***************/ +/* CONSTRUCTOR */ +/***************/ +// Pass pointer to an SPI object in spiLink. +// Pass pointer to output used as chip select in chipSelect. +SPIEEPROM::SPIEEPROM( SPI *spiLink, DigitalOut *chipSelect ) : + spi( spiLink ), + cs( chipSelect ) +{ +} + +/**************/ +/* DESTRUCTOR */ +/**************/ +SPIEEPROM::~SPIEEPROM() { +} + +/*************************************/ +/* ATTEMPT TO READ A NUMBER OF BYTES */ +/*************************************/ +// Pass address within EEPROM in address. +// Pass pointer to buffer for bytes read in buffer. +// Returns false if a failure occurred whilst reading EEPROM. +// Pass number of bytes to read in count. +// Returns true if successful, false if not. +bool SPIEEPROM::ReadBytes( UInt16 address, UInt8 *buffer, UInt16 count ) { + *cs = 0; // Select the EEPROM. + spi->write( READ ); // Send read instruction. + spi->write( ( address >> 8 ) & 0xFF ); // Send MSB of address. + spi->write( address & 0xFF ); // Send LSB of address. + // Read back the correct number of bytes by writing zero bytes. + // and storing what comes back in the buffer. + while( count > 0 ) { + *buffer++ = (UInt8)( spi->write( 0 ) ); + count--; + } + *cs = 1; // Deselect the EEPROM. + return true; // Always succeeds. +} + +/**************************************/ +/* ATTEMPT TO WRITE A CHUNK TO EEPROM */ +/**************************************/ +// Pass address within EEPROM in address. +// Pass pointer to buffer of bytes to write in buffer. +// Pass number of bytes to write in count. +// Returns true if successful, false if not. +// The number of bytes written must not exceed CHUNK_SIZE. +bool SPIEEPROM::WriteChunk( UInt16 address, const UInt8 *buffer, UInt8 count ) { +#if 0 + // First send address you want to write to. + wire->beginTransmission( slaveAddress ); + // Add high byte of EEPROM address to write to. + wire->send( ( address >> 8 ) & 0xFF ); + // Add low byte of EEPROM address to write to. + wire->send( address & 0xFF ); + // Add buffer bytes. + wire->send( (uint8*)buffer, count ); + // Send the packet. + // Return true if successful. + return ( wire->endTransmission() == SUCCESS ); +#else + return false; +#endif +} + +/**************************************/ +/* ATTEMPT TO WRITE A NUMBER OF BYTES */ +/**************************************/ +// Pass address within EEPROM in address. +// Pass pointer to buffer of bytes to write in buffer. +// Pass number of bytes to write in count. +// Returns true if successful, false if not. +bool SPIEEPROM::WriteBytes( UInt16 address, const UInt8 *buffer, UInt16 count ) { +#if 0 + bool ok = true; + // Write enable EEPROM and wait a bit. + digitalWrite( wp, LOW ); + delay( 1 ); + // Keep writing chunks until all bytes written. + while( ( count > 0 ) && ok ) { + if( count > CHUNK_SIZE ) { + ok = WriteChunk( address, buffer, (UInt8)CHUNK_SIZE ); + address += CHUNK_SIZE; + buffer += CHUNK_SIZE; + count -= CHUNK_SIZE; + } + else { + ok = WriteChunk( address, buffer, (UInt8)count ); + count = 0; + } + // Wait a lot to allow page to be written. + delay( 6 ); + } + // Write protect EEPROM. + digitalWrite( wp, HIGH ); + // Return true on success. + return ok; +#else + return false; +#endif +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SPIEEPROM.h Thu Jun 06 20:11:28 2013 +0000 @@ -0,0 +1,74 @@ +/* + * SOURCE FILE : SPIEEPROM.h + * + * Definition of class SPIEEPROM. + * Rountines for communicating with a serial EEPROM over an SPI link. + * EEPROM in question is a Microchip 25AA256. + * + */ + +#ifndef SPIEEPROMDefined + + #define SPIEEPROMDefined + + #include "Types.h" + #include "mbed.h" // for SPI + + class SPIEEPROM { + + public : + + /***************/ + /* CONSTRUCTOR */ + /***************/ + // Pass pointer to an SPI object in spiLink. + // Pass pointer to output used as chip select in chipSelect. + SPIEEPROM( SPI *spi, DigitalOut *cs ); + + /**************/ + /* DESTRUCTOR */ + /**************/ + virtual ~SPIEEPROM(); + + /*************************************/ + /* ATTEMPT TO READ A NUMBER OF BYTES */ + /*************************************/ + // Pass address within EEPROM in address. + // Pass pointer to buffer for bytes read in buffer. + // Pass number of bytes to read in count. + // Returns true if successful, false if not. + bool ReadBytes( UInt16 address, UInt8 *buffer, UInt16 count ); + + /**************************************/ + /* ATTEMPT TO WRITE A NUMBER OF BYTES */ + /**************************************/ + // Pass address within EEPROM in address. + // Pass pointer to buffer of bytes to write in buffer. + // Pass number of bytes to write in count. + // Returns true if successful, false if not. + bool WriteBytes( UInt16 address, const UInt8 *buffer, UInt16 count ); + +private : + + // Pointer to SPI object used for communication. + SPI *spi; + + // Pointer to digital output used as chip select. + DigitalOut *cs; + + /**************************************/ + /* ATTEMPT TO WRITE A CHUNK TO EEPROM */ + /**************************************/ + // Pass address within EEPROM in address. + // Pass pointer to buffer of bytes to write in buffer. + // Pass number of bytes to write in count. + // Returns true if successful, false if not. + // The number of bytes written must not exceed WIRE_BUFSIZ - 2. + bool WriteChunk( UInt16 address, const UInt8 *buffer, UInt8 count ); + +}; + +#endif + +/* END of SPIEEPROM.h */ +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sprite.h Thu Jun 06 20:11:28 2013 +0000 @@ -0,0 +1,684 @@ +static PROGMEM prog_uchar sprite_sprimg[] = { + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xf8, 0x44, 0x08, 0x07, 0x07, 0x08, 0x44, 0xf8, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xf8, 0x44, 0x07, 0x07, 0x07, 0x07, 0x44, 0xf8, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x08, 0x07, 0x07, 0x08, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x34, 0xf8, 0xf8, 0x34, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, +0xff, 0xff, 0x34, 0x34, 0x44, 0x44, 0x44, 0x34, 0x34, 0x44, 0x44, 0x44, 0x34, 0x34, 0xff, 0xff, +0xff, 0xff, 0xf8, 0xf8, 0xff, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xff, 0xf8, 0xf8, 0xff, 0xff, +0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, +0xff, 0xff, 0xf8, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x07, 0x07, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x07, 0x00, 0x00, 0x07, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x07, 0x00, 0x00, 0x07, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x07, 0x07, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xfa, 0xfa, 0xfa, 0xfa, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xf8, 0xfe, 0xfe, 0xfa, 0xfa, 0xfe, 0xfe, 0xf8, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xf8, 0x64, 0x07, 0x64, 0x64, 0x07, 0x64, 0xf8, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x64, 0xfa, 0xfa, 0x64, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xfa, 0xfe, 0xfe, 0xfa, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xff, +0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xff, 0xfa, 0xfa, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xf8, 0xff, +0xff, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xff, +0xff, 0xf8, 0xf8, 0xff, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xff, 0x64, 0x64, 0xff, +0xff, 0x64, 0x64, 0xff, 0xf8, 0xfa, 0xfe, 0xfe, 0xfe, 0xfe, 0xfa, 0xf8, 0xff, 0x07, 0x07, 0xff, +0xff, 0x07, 0x07, 0xff, 0xff, 0xfe, 0xfe, 0xfa, 0xfa, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0x07, 0x07, 0xff, 0xf8, 0xfa, 0xfe, 0xfe, 0xfe, 0xfe, 0xfa, 0xf8, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x64, 0x64, 0x64, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x07, 0x07, 0x07, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0x07, 0x07, 0x07, 0x07, 0xff, 0xff, 0x64, 0x64, 0x64, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x07, 0x07, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x07, 0x07, 0x07, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xdd, 0xc4, 0xb2, 0xff, 0xce, 0xd2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x99, 0x6a, 0x74, 0x9b, 0x7c, 0x86, 0xa7, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xe2, 0x67, 0x24, 0x49, 0x4e, 0x2c, 0x54, 0x96, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0x6c, 0x1d, 0x16, 0x1e, 0x1a, 0x21, 0x1b, 0x4c, 0x99, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0x6b, 0x1f, 0x12, 0x13, 0x18, 0x1b, 0x16, 0x26, 0x68, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0x6b, 0x12, 0x0b, 0x0c, 0x12, 0x18, 0x19, 0x26, 0x66, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xb6, 0x30, 0x0d, 0x01, 0x09, 0x0a, 0x13, 0x0d, 0x1c, 0x54, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0x90, 0x30, 0x0d, 0x0b, 0x09, 0x00, 0x0b, 0x11, 0x24, 0x5e, 0xa7, 0xff, 0xff, 0xff, +0xff, 0xff, 0x91, 0x30, 0x0a, 0x0c, 0x09, 0x09, 0x0c, 0x0c, 0x2b, 0x5a, 0x86, 0xff, 0xff, 0xff, +0xff, 0xff, 0xb5, 0x8a, 0x0e, 0x0d, 0x0c, 0x0a, 0x14, 0x1c, 0x4b, 0x7e, 0x86, 0xff, 0xff, 0xff, +0xff, 0xff, 0xb4, 0x90, 0x67, 0x12, 0x13, 0x1d, 0x25, 0x49, 0x59, 0x72, 0x86, 0xff, 0xff, 0xff, +0xff, 0xff, 0xb7, 0x6c, 0x5b, 0x2a, 0x1d, 0x21, 0x4d, 0x53, 0x5c, 0x7f, 0xa5, 0xff, 0xff, 0xff, +0xff, 0xff, 0xd6, 0x91, 0x7b, 0x30, 0x1c, 0x24, 0x49, 0x53, 0x76, 0x86, 0xc9, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x6b, 0x4e, 0x48, 0x57, 0x77, 0xc3, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xcb, 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, 0xe3, 0xaa, 0xb0, 0xb0, 0xad, 0xc6, 0xb0, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x99, 0x79, 0x79, 0x81, 0x77, 0x8e, 0xc9, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x6a, 0x61, 0x74, 0x56, 0x65, 0x72, 0xc4, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xa9, 0x68, 0x4c, 0x28, 0x21, 0x49, 0x2b, 0x66, 0xaa, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xa9, 0x4e, 0x16, 0x15, 0x18, 0x21, 0x1d, 0x53, 0x88, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0x9c, 0x23, 0x16, 0x11, 0x14, 0x1a, 0x19, 0x2b, 0x81, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xb3, 0x8a, 0x28, 0x17, 0x0c, 0x11, 0x19, 0x1c, 0x1f, 0x7a, 0xee, 0xff, 0xff, 0xff, +0xff, 0xff, 0xdc, 0x87, 0x1c, 0x19, 0x0b, 0x0a, 0x15, 0x1d, 0x49, 0x61, 0xe5, 0xff, 0xff, 0xff, +0xff, 0xff, 0xd5, 0x30, 0x15, 0x15, 0x0a, 0x0a, 0x14, 0x1a, 0x2a, 0x65, 0xa7, 0xff, 0xff, 0xff, +0xff, 0xff, 0xdb, 0x6b, 0x1f, 0x15, 0x11, 0x0d, 0x21, 0x2b, 0x47, 0x78, 0xa5, 0xff, 0xff, 0xff, +0xff, 0xff, 0xcc, 0x95, 0x4e, 0x25, 0x17, 0x23, 0x4d, 0x57, 0x5a, 0x7f, 0xa3, 0xff, 0xff, 0xff, +0xff, 0xff, 0xdc, 0x9b, 0x7b, 0x47, 0x1d, 0x26, 0x4b, 0x53, 0x65, 0x7f, 0xc3, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xb3, 0x8b, 0x6b, 0x16, 0x29, 0x49, 0x57, 0x7f, 0x93, 0xe5, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x6c, 0x68, 0x54, 0x65, 0x82, 0xc9, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xcd, 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0xdb, 0xaa, 0xa8, 0xd1, 0xc8, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xb3, 0x89, 0x9c, 0x7c, 0x81, 0xaf, 0xd1, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xac, 0x88, 0x89, 0x74, 0x7f, 0x85, 0xd2, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xea, 0x8b, 0x8a, 0x4e, 0x26, 0x5a, 0x74, 0x8d, 0xe5, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xcc, 0x90, 0x2e, 0x21, 0x1a, 0x29, 0x26, 0x65, 0xa7, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xe1, 0x67, 0x20, 0x15, 0x1b, 0x26, 0x21, 0x48, 0x8f, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xbc, 0xab, 0x54, 0x29, 0x14, 0x19, 0x1b, 0x24, 0x2e, 0x94, 0xee, 0xff, 0xff, 0xff, +0xff, 0xff, 0xf2, 0x9c, 0x2e, 0x29, 0x14, 0x0d, 0x1a, 0x21, 0x53, 0x97, 0xd1, 0xff, 0xff, 0xff, +0xff, 0xff, 0xf3, 0x6b, 0x20, 0x1c, 0x0d, 0x0c, 0x1d, 0x26, 0x4c, 0x77, 0xe5, 0xff, 0xff, 0xff, +0xff, 0xff, 0xee, 0x6b, 0x47, 0x23, 0x16, 0x16, 0x2b, 0x4d, 0x50, 0x61, 0xd1, 0xff, 0xff, 0xff, +0xff, 0xff, 0xdf, 0x88, 0x6a, 0x50, 0x1f, 0x2a, 0x57, 0x5a, 0x7f, 0x81, 0xcf, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xcc, 0x87, 0x5b, 0x2f, 0x2c, 0x50, 0x5a, 0x7f, 0x85, 0xcf, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xbc, 0x87, 0x23, 0x2f, 0x4b, 0x5a, 0x82, 0xa5, 0xf5, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x8b, 0x89, 0x7a, 0x84, 0xa4, 0xeb, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xe1, 0xce, 0xb1, 0xe9, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xe3, 0x98, 0xdb, 0x8f, 0x92, 0xd2, 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xe3, 0x9c, 0xa6, 0x84, 0x85, 0xc3, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xd4, 0x91, 0x69, 0x48, 0x77, 0x82, 0xc4, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xe2, 0xb6, 0x8a, 0x4b, 0x2b, 0x5b, 0x52, 0x82, 0xeb, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xf2, 0x8a, 0x47, 0x20, 0x24, 0x50, 0x47, 0x55, 0xad, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xe4, 0xd6, 0x68, 0x52, 0x28, 0x1b, 0x26, 0x49, 0x5e, 0xc6, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xd5, 0x68, 0x54, 0x23, 0x14, 0x21, 0x2c, 0x75, 0xd0, 0xe5, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0x8b, 0x48, 0x20, 0x16, 0x12, 0x26, 0x48, 0x5e, 0x95, 0xf5, 0xff, 0xff, 0xff, +0xff, 0xff, 0xf7, 0x8f, 0x68, 0x47, 0x1e, 0x20, 0x50, 0x61, 0x74, 0x7a, 0xec, 0xff, 0xff, 0xff, +0xff, 0xff, 0xe2, 0x98, 0x87, 0x74, 0x2e, 0x4b, 0x65, 0x72, 0x82, 0x93, 0xee, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xf2, 0x91, 0x7a, 0x5b, 0x4b, 0x57, 0x65, 0x82, 0x97, 0xed, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xe4, 0x90, 0x4e, 0x4f, 0x52, 0x75, 0x92, 0xc9, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0xb1, 0x90, 0xa5, 0xc6, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xf7, 0xdb, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xab, 0xe3, 0xae, 0xa7, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0xb1, 0x97, 0x96, 0xeb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x89, 0x5b, 0x84, 0xa4, 0xe5, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xd4, 0xb8, 0x74, 0x5a, 0x8e, 0x7c, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xc7, 0x7b, 0x2e, 0x2c, 0x74, 0x55, 0x73, 0xdb, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xf0, 0x7d, 0x72, 0x56, 0x26, 0x49, 0x55, 0x82, 0xed, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xf0, 0x7d, 0x78, 0x54, 0x20, 0x2b, 0x53, 0x94, 0xf5, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xbc, 0x68, 0x2b, 0x25, 0x16, 0x49, 0x59, 0x78, 0xc8, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xca, 0x83, 0x5b, 0x2b, 0x2b, 0x5a, 0x81, 0x85, 0x94, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xb2, 0x91, 0x89, 0x55, 0x55, 0x7f, 0x78, 0xa3, 0xc5, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xd4, 0x94, 0x87, 0x59, 0x5a, 0x78, 0x92, 0xc4, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x87, 0x6a, 0x79, 0x84, 0xaf, 0xeb, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe9, 0xb8, 0xcb, 0xe5, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0xf2, 0xce, 0xcd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xdb, 0xaf, 0xb0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xb0, 0x83, 0x9a, 0xc8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0x96, 0x8d, 0xd1, 0x9a, 0xc9, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xe8, 0x9b, 0x6a, 0x4f, 0x8e, 0x7a, 0x89, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x95, 0x7c, 0x7d, 0x2f, 0x59, 0x73, 0x97, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x98, 0x8d, 0x7c, 0x2e, 0x53, 0x61, 0xc6, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xf0, 0x89, 0x4e, 0x50, 0x23, 0x5e, 0x75, 0x8d, 0xed, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xf4, 0xa6, 0x83, 0x52, 0x50, 0x7c, 0x94, 0xa4, 0xb0, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xdf, 0xab, 0xaa, 0x87, 0x6a, 0x86, 0x8d, 0xaf, 0xed, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xf3, 0xca, 0x9b, 0x79, 0x72, 0x84, 0xa6, 0xe6, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xab, 0x90, 0x83, 0xa6, 0xd2, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe8, 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, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xc8, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x9a, 0xca, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0xc5, 0xb0, 0xff, 0xcc, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x90, 0x61, 0xaf, 0x94, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xad, 0x8f, 0xa8, 0x4f, 0x73, 0x85, 0xb1, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xb2, 0xa6, 0xa6, 0x56, 0x76, 0x84, 0xeb, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xad, 0x69, 0x7a, 0x4b, 0x7c, 0x94, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xcc, 0x9a, 0x7d, 0x74, 0x97, 0xa8, 0xc4, 0xe7, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xbb, 0xcf, 0x9b, 0x88, 0xa4, 0x96, 0xc9, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xbb, 0x88, 0x81, 0x97, 0xc6, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0xdc, 0xb8, 0xa8, 0xcf, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xce, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xe7, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x89, 0xd1, 0xc7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xdd, 0xa9, 0xc7, 0x6a, 0x83, 0xa6, 0xe2, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xd5, 0xc8, 0xc7, 0x7d, 0x93, 0xa7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xe8, 0x8c, 0x9a, 0x6a, 0x96, 0xaa, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xf1, 0xcf, 0x98, 0x8d, 0xc7, 0xc7, 0xe5, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xe3, 0xe7, 0xcc, 0x91, 0xc4, 0xaa, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x9b, 0x94, 0xaf, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xdd, 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xac, 0xee, 0xe8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xf1, 0xbb, 0xe7, 0x88, 0x95, 0xc8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xf0, 0xe9, 0xdf, 0x9a, 0xaf, 0xe5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0xcd, 0x90, 0xcb, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xcc, 0xa8, 0xdf, 0xde, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xf3, 0xf7, 0xef, 0xac, 0xcf, 0xc7, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0xa8, 0xcf, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0xf4, 0xab, 0xb0, 0xe9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xf2, 0xca, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xf6, 0xca, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xce, 0xf6, 0xea, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0xe6, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xcb, 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfb, 0xfb, 0xfb, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfd, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xfd, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfd, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xfd, 0xfc, 0xfe, 0xfe, 0xfe, 0xfc, 0xfb, 0xfb, 0xfb, 0xfd, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xfb, 0xfe, 0xf8, 0xf8, 0x00, 0xfe, 0xfb, 0xfb, 0xfb, 0xfd, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfd, 0xfb, 0xfc, 0xfe, 0xfe, 0xfe, 0xfc, 0xfb, 0xfb, 0xfb, 0xfb, 0xfd, 0xff, 0xff, +0xff, 0xff, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfd, 0xff, 0xff, +0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf9, 0xfb, 0xfb, 0xfb, 0xfb, 0xfd, 0xff, 0xff, +0xff, 0xff, 0xff, 0x07, 0x00, 0x07, 0x00, 0x07, 0xf8, 0xfb, 0xfb, 0xfb, 0xfb, 0xfd, 0xff, 0xff, +0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf9, 0xfb, 0xfb, 0xfb, 0xfb, 0xfd, 0xff, 0xff, +0xff, 0xff, 0xff, 0xfd, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfd, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfd, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x31, 0x00, 0x00, 0x31, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x31, 0x0f, 0x31, 0x0f, 0x0f, 0x31, 0x0f, 0x31, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x31, 0x31, 0xfe, 0x31, 0x31, 0xfe, 0x31, 0x31, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x31, 0x0f, 0x31, 0x0f, 0x0f, 0x31, 0x0f, 0x31, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0x70, 0xff, 0xff, 0xff, 0x00, 0x70, 0xfe, 0xfe, 0x70, 0x00, 0xff, 0xff, 0xff, 0x70, 0xff, +0xff, 0x00, 0x70, 0xff, 0xff, 0x31, 0x00, 0x70, 0x70, 0x00, 0x31, 0xff, 0xff, 0x70, 0x00, 0xff, +0x70, 0x00, 0x00, 0x31, 0xff, 0xff, 0x31, 0x00, 0x00, 0x31, 0xff, 0xff, 0x31, 0x00, 0x00, 0x70, +0xff, 0x70, 0x31, 0x00, 0x00, 0x31, 0xff, 0xff, 0xff, 0xff, 0x31, 0x00, 0x00, 0x31, 0x70, 0xff, +0xff, 0xff, 0xff, 0xff, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xff, 0xff, 0xff, 0xff, +0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x31, 0x70, 0x70, 0x31, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, +0x70, 0x00, 0x00, 0x00, 0x31, 0x70, 0xff, 0xff, 0xff, 0xff, 0x70, 0x31, 0x00, 0x00, 0x00, 0xd7, +0xff, 0x00, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 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, 0xa1, 0xa1, 0xa1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2d, 0xa1, 0xa1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2d, 0x6f, 0x2d, 0xa1, 0xa1, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2d, 0x2d, 0xa1, 0xa1, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x46, 0x46, 0x46, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x46, 0x46, 0x46, 0x46, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x46, 0x46, 0x46, 0x46, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x45, 0x46, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x2d, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0xa1, 0xa1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xa1, 0xa1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x6f, 0x10, 0xa1, 0xa1, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x10, 0xa1, 0xa1, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x46, 0x46, 0x46, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x46, 0x46, 0x46, 0x46, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x46, 0x46, 0x46, 0x46, 0x46, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xff, 0x45, 0x45, 0x45, 0xff, 0x10, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xff, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0xa1, 0xa1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xa1, 0xa1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x6f, 0x10, 0xa1, 0xa1, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x10, 0xa1, 0xa1, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0x10, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x10, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x46, 0x46, 0x46, 0x46, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x46, 0x46, 0x46, 0x46, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x45, 0x45, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xf8, 0xff, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x07, 0x08, 0xf8, 0xf8, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x07, 0x07, 0xf8, 0xf8, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xf8, 0xff, 0xff, 0xff, 0x07, 0x07, 0x08, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xf8, 0x34, 0x34, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0x34, 0x44, 0x44, 0x34, 0xf8, 0xf8, 0x34, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x34, 0x34, 0x44, 0x44, 0x44, 0x34, 0x34, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xff, 0xf8, 0xf8, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x07, 0x08, 0xf8, 0xf8, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x07, 0x07, 0xf8, 0xf8, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xf8, 0xff, 0xff, 0xff, 0x07, 0x07, 0x08, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xf8, 0x34, 0x34, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0x34, 0x44, 0x44, 0x34, 0xf8, 0xf8, 0x34, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x34, 0x34, 0x44, 0x44, 0x44, 0x34, 0x34, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xff, 0xf8, 0xf8, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xf8, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x07, 0x08, 0xf8, 0xf8, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x07, 0x07, 0xf8, 0xf8, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x07, 0x08, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, +0xf8, 0xf8, 0xf8, 0x34, 0x44, 0x44, 0x34, 0xf8, 0xf8, 0x34, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, +0xff, 0xf8, 0xf8, 0x34, 0x44, 0x44, 0x44, 0x34, 0x34, 0x44, 0x44, 0x44, 0x34, 0x34, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xff, 0xf8, 0xf8, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x07, 0x08, 0xf8, 0xf8, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x07, 0x07, 0xf8, 0xf8, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x07, 0x08, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, +0xf8, 0xf8, 0xf8, 0x34, 0x44, 0x44, 0x34, 0xf8, 0xf8, 0x34, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, +0xff, 0xf8, 0xf8, 0x34, 0x44, 0x44, 0x44, 0x34, 0x34, 0x44, 0x44, 0x44, 0x34, 0x34, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xff, 0xf8, 0xf8, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xf8, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x07, 0x08, 0xf8, 0xf8, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x07, 0x07, 0xf8, 0xf8, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x07, 0x08, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x34, 0xf8, 0xf8, 0x34, 0x34, 0x44, 0x44, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0x34, 0x44, 0x44, 0x44, 0x34, 0x34, 0x44, 0x44, 0x44, 0x34, 0x34, 0xff, 0xff, +0xff, 0xff, 0xf8, 0x34, 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xff, 0xf8, 0xf8, 0xff, 0xff, +0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, +0xff, 0xf8, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x07, 0x08, 0xf8, 0xf8, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x07, 0x07, 0xf8, 0xf8, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x07, 0x08, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x34, 0xf8, 0xf8, 0x34, 0x34, 0x44, 0x44, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0x34, 0x44, 0x44, 0x44, 0x34, 0x34, 0x44, 0x44, 0x44, 0x34, 0x34, 0xff, 0xff, +0xff, 0xff, 0xf8, 0x34, 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xff, 0xf8, 0xf8, 0xff, 0xff, +0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, +0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xf8, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x07, 0x07, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x07, 0x07, 0x07, 0x07, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xf8, 0x44, 0x08, 0x07, 0x07, 0x08, 0x44, 0xf8, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xf8, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xf8, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xf8, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xf8, 0xff, 0xff, +0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, +0xff, 0xff, 0xf8, 0xf8, 0x44, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x44, 0xf8, 0xf8, 0xff, 0xff, +0xff, 0xff, 0x34, 0x34, 0x44, 0x44, 0x34, 0xf8, 0xf8, 0x34, 0x44, 0x44, 0x34, 0x34, 0xff, 0xff, +0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0x34, 0x34, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x70, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x71, 0x10, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x10, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0x6f, 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x10, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd9, 0xd9, 0xd9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x70, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x71, 0x10, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x10, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xff, 0xda, 0xda, 0xda, 0xff, 0x10, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0xff, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xda, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0xda, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0xda, 0xff, 0xff, 0xff, 0xda, 0xda, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x70, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x71, 0x10, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x10, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0x10, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x10, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0xda, 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0xff, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xda, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0xda, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x07, 0x07, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x07, 0x07, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x07, 0x07, 0x07, 0x07, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xf8, 0xf8, 0xf8, 0x07, 0x07, 0x00, 0x00, 0x07, 0x07, 0xf8, 0xf8, 0xf8, 0xff, 0xff, +0xf8, 0xf8, 0xf8, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0xf8, 0xf8, 0xf8, +0xf8, 0xf8, 0xf8, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0xf8, 0xf8, 0xf8, +0xff, 0xff, 0xf8, 0xf8, 0xf8, 0x07, 0x07, 0x00, 0x00, 0x07, 0x07, 0xf8, 0xf8, 0xf8, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x07, 0x07, 0x07, 0x07, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x07, 0x07, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x07, 0x07, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 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, 0xf8, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, +0xff, 0xf8, 0xf8, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0x32, 0x5d, 0xc2, 0xff, 0xff, 0xff, 0xff, +0xff, 0xf8, 0xf8, 0xc0, 0x80, 0xf8, 0x80, 0x58, 0x58, 0x07, 0x32, 0xf8, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xf8, 0x58, 0x07, 0x32, 0x04, 0x04, 0x03, 0x07, 0x64, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xf8, 0x80, 0x32, 0x07, 0x0a, 0x09, 0x00, 0x18, 0x32, 0xf8, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x5d, 0x03, 0x00, 0x00, 0x00, 0x11, 0x07, 0xa2, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xc0, 0x07, 0x0a, 0x00, 0x00, 0x0c, 0x07, 0x80, 0xf8, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xc0, 0x32, 0x03, 0x0c, 0x03, 0x04, 0x07, 0x07, 0x80, 0xf8, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xc1, 0x27, 0x07, 0x07, 0x58, 0x58, 0x80, 0x32, 0xc1, 0xf8, 0xf8, 0xff, +0xff, 0xff, 0xff, 0xf8, 0xa2, 0x07, 0x32, 0xc1, 0xf8, 0xff, 0xf8, 0xc2, 0xf8, 0xf8, 0xf8, 0xff, +0xff, 0xff, 0xff, 0xff, 0xf8, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +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, 0xbf, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x64, 0x64, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x00, 0x00, 0x64, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf8, 0x00, 0x64, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x64, 0x64, 0x64, 0x64, 0x64, 0xbf, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xff, 0xff, +0xff, 0xff, 0xbf, 0xbf, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0xbf, 0xbf, 0xff, +0xff, 0xff, 0xbf, 0x64, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0x64, 0xbf, 0xff, +0xff, 0xff, 0xbf, 0x64, 0xbf, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0xbf, 0x64, 0xbf, 0xff, +0xff, 0xff, 0xbf, 0x64, 0xbf, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0xbf, 0x64, 0xbf, 0xff, +0xff, 0xff, 0xbf, 0x64, 0xbf, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0xbf, 0x64, 0xbf, 0xff, +0xff, 0xff, 0xbf, 0x64, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0x64, 0xbf, 0xff, +0xff, 0xff, 0xbf, 0xbf, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0xbf, 0xbf, 0xff, +0xff, 0xff, 0xff, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x07, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xbf, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x64, 0x64, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x00, 0x00, 0x64, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf8, 0x00, 0x64, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x64, 0x64, 0x64, 0x64, 0x64, 0xbf, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xff, 0xff, +0xff, 0xff, 0xbf, 0xbf, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0xbf, 0xbf, 0xff, +0xff, 0xff, 0xbf, 0x64, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0x64, 0xbf, 0xff, +0xff, 0xff, 0xbf, 0x64, 0xbf, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0xbf, 0x64, 0xbf, 0xff, +0xff, 0xff, 0xbf, 0x64, 0xbf, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0xbf, 0x64, 0xbf, 0xff, +0xff, 0xff, 0xbf, 0x64, 0xbf, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0xbf, 0x64, 0xbf, 0xff, +0xff, 0xff, 0xbf, 0x64, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0x64, 0xbf, 0xff, +0xff, 0xff, 0xbf, 0xbf, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0xbf, 0xbf, 0xff, +0xff, 0xff, 0xff, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x07, 0x07, 0x07, 0xff, 0xff, 0xff, 0x07, 0x07, 0x07, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0x07, 0x07, 0x07, 0x07, 0xff, 0xff, 0x07, 0x07, 0x07, 0x07, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xbe, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x63, 0x63, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x00, 0x00, 0x63, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf8, 0x00, 0x62, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x64, 0x63, 0x62, 0x62, 0x60, 0xba, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xbf, 0xbf, 0xbf, 0xbe, 0xbe, 0xbd, 0xbd, 0xba, 0xba, 0xb9, 0xb9, 0xff, 0xff, +0xff, 0xff, 0xbf, 0xbf, 0x64, 0x64, 0x63, 0x63, 0x62, 0x60, 0x60, 0x5f, 0x5f, 0xb7, 0xb7, 0xff, +0xff, 0xff, 0xbf, 0x64, 0xbf, 0xbf, 0xbe, 0xbd, 0xbd, 0xba, 0xba, 0xb9, 0xb9, 0x5f, 0xb5, 0xff, +0xff, 0xff, 0xbf, 0x64, 0xbf, 0x38, 0x38, 0x37, 0x37, 0x36, 0x35, 0x35, 0xb7, 0x5f, 0xb5, 0xff, +0xff, 0xff, 0xbf, 0x64, 0xbf, 0x38, 0x38, 0x37, 0x37, 0x36, 0x35, 0x35, 0xb7, 0x5f, 0xb5, 0xff, +0xff, 0xff, 0xbf, 0x64, 0xbf, 0x38, 0x38, 0x37, 0x37, 0x36, 0x35, 0x35, 0xb7, 0x5f, 0xb5, 0xff, +0xff, 0xff, 0xbf, 0x64, 0xbf, 0xbe, 0xbe, 0xbd, 0xbd, 0xba, 0xb9, 0xb9, 0xb7, 0x5f, 0xb5, 0xff, +0xff, 0xff, 0xbf, 0xbf, 0x64, 0x63, 0x63, 0x62, 0x62, 0x60, 0x5f, 0x5f, 0x5f, 0xb5, 0xb5, 0xff, +0xff, 0xff, 0x07, 0xbf, 0xbf, 0xbe, 0xbe, 0xbd, 0xbd, 0xba, 0xb9, 0xb9, 0xb7, 0xb7, 0x05, 0xff, +0xff, 0x07, 0x07, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x06, 0x05, 0x05, +0x07, 0x07, 0x07, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x06, 0x06, 0x06, 0x05, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x42, 0xa0, 0x9d, 0x43, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x42, 0x42, 0x42, 0xd8, 0xd8, 0x42, 0x43, 0x43, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0x41, 0xd7, 0x9f, 0x9d, 0x9f, 0x9d, 0xa0, 0xa0, 0xd8, 0x42, 0xff, 0xff, 0xff, +0xff, 0xff, 0x9f, 0x9e, 0x9e, 0x9e, 0x40, 0x9f, 0x9d, 0x41, 0xa0, 0xa0, 0xa0, 0x9e, 0xff, 0xff, +0xff, 0xff, 0x40, 0x40, 0x9e, 0x40, 0x40, 0xd7, 0xd8, 0x41, 0x41, 0x9f, 0x42, 0x42, 0xff, 0xff, +0xff, 0xff, 0xd7, 0x9d, 0x9d, 0x3f, 0xd7, 0x9d, 0x9e, 0xd7, 0x41, 0x9e, 0x9e, 0xd7, 0xff, 0xff, +0xff, 0xff, 0x3f, 0x9d, 0x3f, 0x3f, 0x3f, 0x9d, 0x9d, 0x40, 0x3f, 0x41, 0x9f, 0x42, 0xff, 0xff, +0xff, 0xff, 0xff, 0x3e, 0x05, 0x34, 0x05, 0x3e, 0x3f, 0x05, 0x34, 0x05, 0x41, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0x3d, 0x3d, 0x3d, 0x3d, 0x3e, 0x3e, 0x3f, 0x3f, 0x40, 0x41, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0x3d, 0x3e, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0x39, 0x3b, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x39, 0x39, 0x39, 0x39, 0x3b, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x39, 0x3b, 0xff, 0x39, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x39, 0x39, 0x39, 0x3b, 0xff, 0x39, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x39, 0x3b, 0xff, 0xff, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x39, 0x39, 0xff, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0xa1, 0xa1, 0xa1, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, +0xff, 0xff, 0x00, 0xff, 0xff, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xa1, 0x10, 0xf8, 0x10, 0x10, 0xf8, 0x10, 0xa1, 0xff, 0x00, 0xff, 0xff, +0xff, 0xff, 0x00, 0xff, 0xa1, 0x10, 0x10, 0x2d, 0x2d, 0x10, 0x10, 0xa1, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x10, 0x10, 0x10, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x46, 0x45, 0x45, 0x45, 0x45, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x00, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x00, 0xff, 0xff, 0xff, +0xff, 0xff, 0x00, 0xff, 0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x70, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xf8, 0x10, 0x10, 0xf8, 0x10, 0xff, 0xff, 0x00, 0xff, 0xff, +0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x10, 0x2d, 0x2d, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x10, 0x10, 0x10, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0xda, 0xda, 0xda, 0xda, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x6f, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x6f, 0xda, 0xda, 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0xda, 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x45, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x45, 0x3a, 0x3a, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x45, 0x3a, 0x00, 0x00, 0x3a, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0x45, 0x3a, 0x00, 0x00, 0x3a, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x45, 0x3a, 0x3a, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x45, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +}; +static PROGMEM prog_uchar sprite_sprpal[] = { + +0xff, 0x7f, 0xf7, 0x7f, 0xeb, 0x7f, 0xe8, 0x7f, 0xe2, 0x7f, 0xe0, 0x7f, 0xe0, 0x7f, 0xe0, 0x7f, +0xe0, 0x63, 0xfa, 0x7f, 0xf8, 0x7f, 0xf6, 0x7f, 0xf5, 0x7f, 0xf3, 0x7f, 0xd4, 0x7f, 0x9c, 0x73, +0x7b, 0x7f, 0xf1, 0x7f, 0xf1, 0x7f, 0xef, 0x7f, 0xef, 0x7f, 0xee, 0x7f, 0xed, 0x7f, 0xee, 0x7f, +0xec, 0x7f, 0xec, 0x7f, 0xeb, 0x7f, 0xea, 0x7f, 0xec, 0x7f, 0xeb, 0x7f, 0xcb, 0x7f, 0xcc, 0x7f, +0xab, 0x7f, 0xa9, 0x7f, 0xc4, 0x7f, 0x8b, 0x7f, 0x89, 0x7f, 0x6a, 0x7f, 0x88, 0x7f, 0x83, 0x7f, +0x6a, 0x7f, 0x48, 0x7f, 0x49, 0x7f, 0x48, 0x7f, 0x28, 0x7f, 0x18, 0x7f, 0x08, 0x7f, 0x08, 0x7f, +0x2b, 0x7b, 0x18, 0x63, 0x22, 0x7f, 0x24, 0x73, 0x00, 0x63, 0xf0, 0x43, 0xf0, 0x43, 0xf0, 0x43, +0xf0, 0x43, 0xeb, 0x3f, 0xff, 0x23, 0xeb, 0x3b, 0xe8, 0x23, 0x5a, 0x07, 0x5a, 0x07, 0x39, 0x03, +0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0xe0, 0x03, 0x18, 0x03, 0x00, 0x03, 0xe8, 0x7e, +0xc7, 0x7e, 0xe6, 0x7e, 0xe4, 0x7e, 0xc7, 0x7e, 0xc7, 0x7a, 0xc4, 0x7e, 0xa7, 0x7a, 0x86, 0x7a, +0x86, 0x7a, 0xa3, 0x7e, 0x66, 0x7e, 0x64, 0x7e, 0x66, 0x7a, 0x66, 0x7a, 0x66, 0x76, 0x65, 0x7e, +0x61, 0x7e, 0x45, 0x7e, 0x24, 0x7e, 0x45, 0x7a, 0x23, 0x7e, 0x20, 0x7e, 0x25, 0x7a, 0x00, 0x7e, +0x00, 0x7e, 0x05, 0x7a, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0x7e, 0x03, 0x7a, 0x04, 0x76, 0x87, 0x72, +0x26, 0x72, 0x05, 0x72, 0x05, 0x6e, 0x47, 0x66, 0x06, 0x66, 0x1f, 0x42, 0x0c, 0x4e, 0x1f, 0x42, +0x10, 0x42, 0x00, 0x42, 0xe4, 0x79, 0xe4, 0x75, 0xe3, 0x71, 0xe4, 0x71, 0xc2, 0x79, 0xc3, 0x71, +0xc3, 0x71, 0xe5, 0x6d, 0xc4, 0x6d, 0xe5, 0x69, 0xc4, 0x69, 0xc5, 0x65, 0xa1, 0x7d, 0xa3, 0x75, + +0x60, 0x7d, 0xa3, 0x69, 0x83, 0x69, 0xa3, 0x65, 0x83, 0x65, 0x63, 0x65, 0x42, 0x61, 0xc5, 0x5d, +0xa5, 0x5d, 0x84, 0x5d, 0xc5, 0x55, 0xa5, 0x51, 0x85, 0x55, 0x63, 0x5d, 0x62, 0x5d, 0x64, 0x59, +0x64, 0x51, 0x64, 0x49, 0x42, 0x5d, 0x42, 0x5d, 0x43, 0x59, 0x43, 0x55, 0x43, 0x55, 0x43, 0x55, +0x43, 0x4d, 0x63, 0x49, 0x43, 0x4d, 0x43, 0x49, 0x43, 0x45, 0x08, 0x7d, 0x08, 0x7d, 0x08, 0x7d, +0x08, 0x7d, 0x03, 0x75, 0x20, 0x7d, 0x22, 0x59, 0x22, 0x55, 0x02, 0x51, 0x22, 0x4d, 0x02, 0x4d, +0x22, 0x49, 0x23, 0x45, 0x02, 0x49, 0x23, 0x41, 0x23, 0x41, 0x03, 0x41, 0x02, 0x49, 0x01, 0x49, +0x02, 0x45, 0x02, 0x41, 0x03, 0x3d, 0x24, 0x3d, 0x24, 0x39, 0x03, 0x39, 0x03, 0x3d, 0x03, 0x39, +0x02, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x39, 0x03, 0x35, 0x02, 0x35, 0x02, 0x35, 0x02, 0x35, +0xa0, 0x7c, 0x20, 0x7c, 0x00, 0x7c, 0xe2, 0x44, 0xe1, 0x44, 0xe2, 0x40, 0xe1, 0x40, 0xe2, 0x3c, +0xc2, 0x3c, 0xc1, 0x3c, 0xe2, 0x38, 0xe2, 0x38, 0xe2, 0x38, 0xe2, 0x38, 0xc2, 0x34, 0xc1, 0x38, +0xc1, 0x38, 0xa1, 0x38, 0xa1, 0x38, 0x26, 0x2d, 0xe3, 0x30, 0xe2, 0x34, 0xe3, 0x2c, 0x08, 0x21, +0x08, 0x21, 0x08, 0x21, 0x08, 0x21, 0xe2, 0x34, 0xc2, 0x30, 0xc2, 0x30, 0xc2, 0x30, 0xc2, 0x30, +0xc2, 0x2c, 0xc1, 0x2c, 0xc2, 0x2c, 0xc2, 0x28, 0xc2, 0x24, 0xa1, 0x34, 0xa1, 0x30, 0xa1, 0x30, +0xa1, 0x2c, 0xa1, 0x2c, 0xa2, 0x28, 0x81, 0x30, 0xa1, 0x2c, 0xa1, 0x28, 0x81, 0x28, 0xa2, 0x28, +0xa2, 0x24, 0xa1, 0x28, 0xa1, 0x24, 0xa2, 0x20, 0x81, 0x28, 0x81, 0x28, 0x81, 0x24, 0x81, 0x24, +0x00, 0x7c, 0x1f, 0x30, 0x00, 0x60, 0x1f, 0x00, 0x18, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, +};