Browse Source

Added additional font and the font converter

pull/3/head
Sebastian 5 years ago
parent
commit
3d03fa4038
  1. 2
      Makefile
  2. 203
      fonts/free_sans.h
  3. 250
      images/logo_bw.h
  4. BIN
      images/logo_bw.png
  5. 9
      main.c
  6. 1
      utils/fontconvert/.gitignore
  7. 12
      utils/fontconvert/Makefile
  8. 278
      utils/fontconvert/fontconvert.c
  9. 24
      utils/fontconvert/gfxfont.h

2
Makefile

@ -6,7 +6,7 @@ VERSION = 0.1
HEADERS = include/spi.h include/st7735.h include/st7735initcmds.h
HEADERS += images/logo_bw.h images/logo.h include/st7735_gfx.h
HEADERS += include/st7735_font.h fonts/tom_thumb.h
HEADERS += include/st7735_font.h fonts/tom_thumb.h fonts/free_sans.h
SRC = main.c spi.c st7735.c st7735_gfx.c st7735_font.c
TARGET = st7735_test
OBJDIR = bin

203
fonts/free_sans.h

@ -0,0 +1,203 @@
#include "st7735_font.h"
const uint8_t FreeSans_Bitmaps[] PROGMEM = {
0xFF, 0xFF, 0xF8, 0xC0, 0xDE, 0xF7, 0x20, 0x09, 0x86, 0x41, 0x91, 0xFF,
0x13, 0x04, 0xC3, 0x20, 0xC8, 0xFF, 0x89, 0x82, 0x61, 0x90, 0x10, 0x1F,
0x14, 0xDA, 0x3D, 0x1E, 0x83, 0x40, 0x78, 0x17, 0x08, 0xF4, 0x7A, 0x35,
0x33, 0xF0, 0x40, 0x20, 0x38, 0x10, 0xEC, 0x20, 0xC6, 0x20, 0xC6, 0x40,
0xC6, 0x40, 0x6C, 0x80, 0x39, 0x00, 0x01, 0x3C, 0x02, 0x77, 0x02, 0x63,
0x04, 0x63, 0x04, 0x77, 0x08, 0x3C, 0x0E, 0x06, 0x60, 0xCC, 0x19, 0x81,
0xE0, 0x18, 0x0F, 0x03, 0x36, 0xC2, 0xD8, 0x73, 0x06, 0x31, 0xE3, 0xC4,
0xFE, 0x13, 0x26, 0x6C, 0xCC, 0xCC, 0xC4, 0x66, 0x23, 0x10, 0x8C, 0x46,
0x63, 0x33, 0x33, 0x32, 0x66, 0x4C, 0x80, 0x25, 0x7E, 0xA5, 0x00, 0x30,
0xC3, 0x3F, 0x30, 0xC3, 0x0C, 0xD6, 0xF0, 0xC0, 0x08, 0x44, 0x21, 0x10,
0x84, 0x42, 0x11, 0x08, 0x00, 0x3C, 0x66, 0x42, 0xC3, 0xC3, 0xC3, 0xC3,
0xC3, 0xC3, 0xC3, 0x42, 0x66, 0x3C, 0x11, 0x3F, 0x33, 0x33, 0x33, 0x33,
0x30, 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x1C, 0x1C, 0x1C, 0x18, 0x18,
0x10, 0x08, 0x07, 0xF8, 0x3C, 0x66, 0xC3, 0xC3, 0x03, 0x06, 0x1C, 0x07,
0x03, 0xC3, 0xC3, 0x66, 0x3C, 0x0C, 0x18, 0x71, 0x62, 0xC9, 0xA3, 0x46,
0xFE, 0x18, 0x30, 0x60, 0xC0, 0x7F, 0x20, 0x10, 0x08, 0x08, 0x07, 0xF3,
0x8C, 0x03, 0x01, 0x80, 0xF0, 0x6C, 0x63, 0xE0, 0x1E, 0x31, 0x98, 0x78,
0x0C, 0x06, 0xF3, 0x8D, 0x83, 0xC1, 0xE0, 0xD0, 0x6C, 0x63, 0xE0, 0xFF,
0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x18, 0x18, 0x10, 0x30, 0x30,
0x3E, 0x31, 0xB0, 0x78, 0x3C, 0x1B, 0x18, 0xF8, 0xC6, 0xC1, 0xE0, 0xF0,
0x6C, 0x63, 0xE0, 0x3C, 0x66, 0xC2, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x03,
0x03, 0xC2, 0x66, 0x3C, 0xC0, 0x00, 0x30, 0xC0, 0x00, 0x00, 0x64, 0xA0,
0x00, 0x81, 0xC7, 0x8E, 0x0C, 0x07, 0x80, 0x70, 0x0E, 0x01, 0x80, 0xFF,
0x80, 0x00, 0x1F, 0xF0, 0x00, 0x70, 0x0E, 0x01, 0xC0, 0x18, 0x38, 0x71,
0xC0, 0x80, 0x00, 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x18, 0x38, 0x18,
0x18, 0x0C, 0x00, 0x00, 0x01, 0x80, 0x03, 0xF0, 0x06, 0x0E, 0x06, 0x01,
0x86, 0x00, 0x66, 0x1D, 0xBB, 0x31, 0xCF, 0x18, 0xC7, 0x98, 0x63, 0xCC,
0x31, 0xE6, 0x11, 0xB3, 0x99, 0xCC, 0xF7, 0x86, 0x00, 0x01, 0x80, 0x00,
0x70, 0x40, 0x0F, 0xE0, 0x06, 0x00, 0xF0, 0x0F, 0x00, 0x90, 0x19, 0x81,
0x98, 0x10, 0x83, 0x0C, 0x3F, 0xC2, 0x04, 0x60, 0x66, 0x06, 0xC0, 0x30,
0xFF, 0x18, 0x33, 0x03, 0x60, 0x6C, 0x0D, 0x83, 0x3F, 0xC6, 0x06, 0xC0,
0x78, 0x0F, 0x01, 0xE0, 0x6F, 0xF8, 0x1F, 0x86, 0x19, 0x81, 0xA0, 0x3C,
0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x68, 0x0D, 0x83, 0x18, 0x61, 0xF0,
0xFF, 0x18, 0x33, 0x03, 0x60, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0,
0x78, 0x0F, 0x03, 0x60, 0xCF, 0xF0, 0xFF, 0xE0, 0x30, 0x18, 0x0C, 0x06,
0x03, 0xFD, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0F, 0xF8, 0xFF, 0xC0, 0xC0,
0xC0, 0xC0, 0xC0, 0xFE, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x0F, 0x83,
0x0E, 0x60, 0x66, 0x03, 0xC0, 0x0C, 0x00, 0xC1, 0xFC, 0x03, 0xC0, 0x36,
0x03, 0x60, 0x73, 0x0F, 0x0F, 0x10, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C,
0x07, 0x80, 0xFF, 0xFE, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x06,
0xFF, 0xFF, 0xFF, 0xC0, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x07,
0x8F, 0x1E, 0x27, 0x80, 0xC0, 0xD8, 0x33, 0x0C, 0x63, 0x0C, 0xC1, 0xB8,
0x3F, 0x07, 0x30, 0xC3, 0x18, 0x63, 0x06, 0x60, 0x6C, 0x0C, 0xC0, 0xC0,
0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xE0,
0x3F, 0x01, 0xFC, 0x1F, 0xE0, 0xFD, 0x05, 0xEC, 0x6F, 0x63, 0x79, 0x13,
0xCD, 0x9E, 0x6C, 0xF1, 0x47, 0x8E, 0x3C, 0x71, 0x80, 0xE0, 0x7C, 0x0F,
0xC1, 0xE8, 0x3D, 0x87, 0x98, 0xF1, 0x1E, 0x33, 0xC3, 0x78, 0x6F, 0x07,
0xE0, 0x7C, 0x0E, 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0, 0x6C, 0x01, 0xE0,
0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x0C, 0x60, 0xC0, 0xF8,
0x00, 0xFF, 0x30, 0x6C, 0x0F, 0x03, 0xC0, 0xF0, 0x6F, 0xF3, 0x00, 0xC0,
0x30, 0x0C, 0x03, 0x00, 0xC0, 0x00, 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0,
0x6C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x6C,
0x60, 0xC0, 0xFB, 0x00, 0x08, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0,
0x6C, 0x0C, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, 0x6C, 0x06, 0xC0,
0x70, 0x3F, 0x18, 0x6C, 0x0F, 0x03, 0xC0, 0x1E, 0x01, 0xF0, 0x0E, 0x00,
0xF0, 0x3C, 0x0D, 0x86, 0x3F, 0x00, 0xFF, 0x86, 0x03, 0x01, 0x80, 0xC0,
0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0xC0, 0x78, 0x0F,
0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01,
0xB0, 0x61, 0xF0, 0xC0, 0x6C, 0x0D, 0x81, 0x10, 0x63, 0x0C, 0x61, 0x04,
0x60, 0xCC, 0x19, 0x01, 0x60, 0x3C, 0x07, 0x00, 0x60, 0xC1, 0x81, 0x30,
0xE1, 0x98, 0x70, 0xCC, 0x28, 0x66, 0x26, 0x21, 0x13, 0x30, 0xC8, 0x98,
0x6C, 0x4C, 0x14, 0x34, 0x0A, 0x1A, 0x07, 0x07, 0x03, 0x03, 0x80, 0x81,
0x80, 0x60, 0x63, 0x0C, 0x30, 0xC1, 0x98, 0x0F, 0x00, 0xE0, 0x06, 0x00,
0xF0, 0x19, 0x01, 0x98, 0x30, 0xC6, 0x0E, 0x60, 0x60, 0xC0, 0x36, 0x06,
0x30, 0xC3, 0x0C, 0x19, 0x81, 0xD8, 0x0F, 0x00, 0x60, 0x06, 0x00, 0x60,
0x06, 0x00, 0x60, 0x06, 0x00, 0xFF, 0xC0, 0x60, 0x30, 0x0C, 0x06, 0x03,
0x01, 0xC0, 0x60, 0x30, 0x18, 0x06, 0x03, 0x00, 0xFF, 0xC0, 0xFB, 0x6D,
0xB6, 0xDB, 0x6D, 0xB6, 0xE0, 0x84, 0x10, 0x84, 0x10, 0x84, 0x10, 0x84,
0x10, 0x80, 0xED, 0xB6, 0xDB, 0x6D, 0xB6, 0xDB, 0xE0, 0x30, 0x60, 0xA2,
0x44, 0xD8, 0xA1, 0x80, 0xFF, 0xC0, 0xC6, 0x30, 0x7E, 0x71, 0xB0, 0xC0,
0x60, 0xF3, 0xDB, 0x0D, 0x86, 0xC7, 0x3D, 0xC0, 0xC0, 0x60, 0x30, 0x1B,
0xCE, 0x36, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x7C, 0x6D, 0xE0, 0x3C,
0x66, 0xC3, 0xC0, 0xC0, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, 0x03, 0x03, 0x03,
0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x3C, 0x66,
0xC3, 0xC3, 0xFF, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, 0x36, 0x6F, 0x66, 0x66,
0x66, 0x66, 0x60, 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67,
0x3B, 0x03, 0x03, 0xC6, 0x7C, 0xC0, 0xC0, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3,
0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF, 0xC0, 0x30, 0x03,
0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xE0, 0xC0, 0x60, 0x30, 0x18, 0x4C,
0x46, 0x63, 0x61, 0xF0, 0xEC, 0x62, 0x31, 0x98, 0x6C, 0x30, 0xFF, 0xFF,
0xFF, 0xC0, 0xDE, 0xF7, 0x1C, 0xF0, 0xC7, 0x86, 0x3C, 0x31, 0xE1, 0x8F,
0x0C, 0x78, 0x63, 0xC3, 0x1E, 0x18, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3, 0xC3,
0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
0xC3, 0x66, 0x3C, 0xDE, 0x71, 0xB0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83,
0xE3, 0x6F, 0x30, 0x18, 0x0C, 0x00, 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3,
0xC3, 0xC3, 0x67, 0x3B, 0x03, 0x03, 0x03, 0xDF, 0x31, 0x8C, 0x63, 0x18,
0xC6, 0x00, 0x3E, 0xE3, 0xC0, 0xC0, 0xE0, 0x3C, 0x07, 0xC3, 0xE3, 0x7E,
0x66, 0xF6, 0x66, 0x66, 0x66, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
0xC3, 0xC3, 0xC7, 0x7B, 0xC1, 0xA0, 0x98, 0xCC, 0x42, 0x21, 0xB0, 0xD0,
0x28, 0x1C, 0x0C, 0x00, 0xC6, 0x1E, 0x38, 0x91, 0xC4, 0xCA, 0x66, 0xD3,
0x16, 0xD0, 0xA6, 0x87, 0x1C, 0x38, 0xC0, 0xC6, 0x00, 0x43, 0x62, 0x36,
0x1C, 0x18, 0x1C, 0x3C, 0x26, 0x62, 0x43, 0xC1, 0x21, 0x98, 0xCC, 0x42,
0x61, 0xB0, 0xD0, 0x38, 0x1C, 0x0C, 0x06, 0x03, 0x01, 0x03, 0x00, 0xFE,
0x0C, 0x30, 0xC1, 0x86, 0x18, 0x20, 0xC1, 0xFC, 0x36, 0x66, 0x66, 0x6E,
0xCE, 0x66, 0x66, 0x66, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC6, 0x66,
0x66, 0x67, 0x37, 0x66, 0x66, 0x66, 0xC0, 0x61, 0x24, 0x38 };
const GFXglyph FreeSans_Glyphs[] PROGMEM = {
{ 0, 0, 0, 5, 0, 1 }, // 0x20 ' '
{ 0, 2, 13, 6, 2, -12 }, // 0x21 '!'
{ 4, 5, 4, 6, 1, -12 }, // 0x22 '"'
{ 7, 10, 12, 10, 0, -11 }, // 0x23 '#'
{ 22, 9, 16, 10, 1, -13 }, // 0x24 '$'
{ 40, 16, 13, 16, 1, -12 }, // 0x25 '%'
{ 66, 11, 13, 12, 1, -12 }, // 0x26 '&'
{ 84, 2, 4, 4, 1, -12 }, // 0x27 '''
{ 85, 4, 17, 6, 1, -12 }, // 0x28 '('
{ 94, 4, 17, 6, 1, -12 }, // 0x29 ')'
{ 103, 5, 5, 7, 1, -12 }, // 0x2A '*'
{ 107, 6, 8, 11, 3, -7 }, // 0x2B '+'
{ 113, 2, 4, 5, 2, 0 }, // 0x2C ','
{ 114, 4, 1, 6, 1, -4 }, // 0x2D '-'
{ 115, 2, 1, 5, 1, 0 }, // 0x2E '.'
{ 116, 5, 13, 5, 0, -12 }, // 0x2F '/'
{ 125, 8, 13, 10, 1, -12 }, // 0x30 '0'
{ 138, 4, 13, 10, 3, -12 }, // 0x31 '1'
{ 145, 9, 13, 10, 1, -12 }, // 0x32 '2'
{ 160, 8, 13, 10, 1, -12 }, // 0x33 '3'
{ 173, 7, 13, 10, 2, -12 }, // 0x34 '4'
{ 185, 9, 13, 10, 1, -12 }, // 0x35 '5'
{ 200, 9, 13, 10, 1, -12 }, // 0x36 '6'
{ 215, 8, 13, 10, 0, -12 }, // 0x37 '7'
{ 228, 9, 13, 10, 1, -12 }, // 0x38 '8'
{ 243, 8, 13, 10, 1, -12 }, // 0x39 '9'
{ 256, 2, 10, 5, 1, -9 }, // 0x3A ':'
{ 259, 3, 12, 5, 1, -8 }, // 0x3B ';'
{ 264, 9, 9, 11, 1, -8 }, // 0x3C '<'
{ 275, 9, 4, 11, 1, -5 }, // 0x3D '='
{ 280, 9, 9, 11, 1, -8 }, // 0x3E '>'
{ 291, 9, 13, 10, 1, -12 }, // 0x3F '?'
{ 306, 17, 16, 18, 1, -12 }, // 0x40 '@'
{ 340, 12, 13, 12, 0, -12 }, // 0x41 'A'
{ 360, 11, 13, 12, 1, -12 }, // 0x42 'B'
{ 378, 11, 13, 13, 1, -12 }, // 0x43 'C'
{ 396, 11, 13, 13, 1, -12 }, // 0x44 'D'
{ 414, 9, 13, 11, 1, -12 }, // 0x45 'E'
{ 429, 8, 13, 11, 1, -12 }, // 0x46 'F'
{ 442, 12, 13, 14, 1, -12 }, // 0x47 'G'
{ 462, 11, 13, 13, 1, -12 }, // 0x48 'H'
{ 480, 2, 13, 5, 2, -12 }, // 0x49 'I'
{ 484, 7, 13, 10, 1, -12 }, // 0x4A 'J'
{ 496, 11, 13, 12, 1, -12 }, // 0x4B 'K'
{ 514, 8, 13, 10, 1, -12 }, // 0x4C 'L'
{ 527, 13, 13, 15, 1, -12 }, // 0x4D 'M'
{ 549, 11, 13, 13, 1, -12 }, // 0x4E 'N'
{ 567, 13, 13, 14, 1, -12 }, // 0x4F 'O'
{ 589, 10, 13, 12, 1, -12 }, // 0x50 'P'
{ 606, 13, 14, 14, 1, -12 }, // 0x51 'Q'
{ 629, 12, 13, 13, 1, -12 }, // 0x52 'R'
{ 649, 10, 13, 12, 1, -12 }, // 0x53 'S'
{ 666, 9, 13, 11, 1, -12 }, // 0x54 'T'
{ 681, 11, 13, 13, 1, -12 }, // 0x55 'U'
{ 699, 11, 13, 12, 0, -12 }, // 0x56 'V'
{ 717, 17, 13, 17, 0, -12 }, // 0x57 'W'
{ 745, 12, 13, 12, 0, -12 }, // 0x58 'X'
{ 765, 12, 13, 12, 0, -12 }, // 0x59 'Y'
{ 785, 10, 13, 11, 1, -12 }, // 0x5A 'Z'
{ 802, 3, 17, 5, 1, -12 }, // 0x5B '['
{ 809, 5, 13, 5, 0, -12 }, // 0x5C '\'
{ 818, 3, 17, 5, 0, -12 }, // 0x5D ']'
{ 825, 7, 7, 8, 1, -12 }, // 0x5E '^'
{ 832, 10, 1, 10, 0, 3 }, // 0x5F '_'
{ 834, 4, 3, 5, 0, -12 }, // 0x60 '`'
{ 836, 9, 10, 10, 1, -9 }, // 0x61 'a'
{ 848, 9, 13, 10, 1, -12 }, // 0x62 'b'
{ 863, 8, 10, 9, 1, -9 }, // 0x63 'c'
{ 873, 8, 13, 10, 1, -12 }, // 0x64 'd'
{ 886, 8, 10, 10, 1, -9 }, // 0x65 'e'
{ 896, 4, 13, 5, 1, -12 }, // 0x66 'f'
{ 903, 8, 14, 10, 1, -9 }, // 0x67 'g'
{ 917, 8, 13, 10, 1, -12 }, // 0x68 'h'
{ 930, 2, 13, 4, 1, -12 }, // 0x69 'i'
{ 934, 4, 17, 4, 0, -12 }, // 0x6A 'j'
{ 943, 9, 13, 9, 1, -12 }, // 0x6B 'k'
{ 958, 2, 13, 4, 1, -12 }, // 0x6C 'l'
{ 962, 13, 10, 15, 1, -9 }, // 0x6D 'm'
{ 979, 8, 10, 10, 1, -9 }, // 0x6E 'n'
{ 989, 8, 10, 10, 1, -9 }, // 0x6F 'o'
{ 999, 9, 13, 10, 1, -9 }, // 0x70 'p'
{ 1014, 8, 13, 10, 1, -9 }, // 0x71 'q'
{ 1027, 5, 10, 6, 1, -9 }, // 0x72 'r'
{ 1034, 8, 10, 9, 1, -9 }, // 0x73 's'
{ 1044, 4, 12, 5, 1, -11 }, // 0x74 't'
{ 1050, 8, 10, 10, 1, -9 }, // 0x75 'u'
{ 1060, 9, 10, 9, 0, -9 }, // 0x76 'v'
{ 1072, 13, 10, 13, 0, -9 }, // 0x77 'w'
{ 1089, 8, 10, 9, 0, -9 }, // 0x78 'x'
{ 1099, 9, 14, 9, 0, -9 }, // 0x79 'y'
{ 1115, 7, 10, 9, 1, -9 }, // 0x7A 'z'
{ 1124, 4, 17, 6, 1, -12 }, // 0x7B '{'
{ 1133, 2, 17, 4, 2, -12 }, // 0x7C '|'
{ 1138, 4, 17, 6, 1, -12 }, // 0x7D '}'
{ 1147, 7, 3, 9, 1, -7 } }; // 0x7E '~'
const GFXfont FreeSans PROGMEM = {
(uint8_t *)FreeSans_Bitmaps,
(GFXglyph *)FreeSans_Glyphs,
0x20, 0x7E, 22 };
// Approx. 1822 bytes

250
images/logo_bw.h

@ -3,134 +3,126 @@
#ifndef _LOGO_BW_H_
#define _LOGO_BW_H_
static const uint8_t PROGMEM logo_bw[] = {
0xa0, 0x80,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x3f, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x1f, 0xfe, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x1f, 0xfe, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0xf, 0xfc, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7, 0xfc, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xc7, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xe3, 0xff, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xe3, 0xff, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0xfb, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf9, 0xf9, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0xff, 0xf8, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0x7f, 0xf8, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0x3b, 0xf8, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0x33, 0xf8, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xff, 0x3, 0xf8, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xff, 0x3, 0xf8, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xff, 0x87, 0xf9, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0xff, 0xc7, 0xf1, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0xe7, 0xc7, 0xf0, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xe7, 0xc7, 0xf0, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xe3, 0xc7, 0xf0, 0xf7, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xc1, 0xf, 0xf0, 0xf7, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xc1, 0xf, 0xf0, 0xf7, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xc1, 0xf, 0xf0, 0xf3, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0x83, 0xf, 0xfc, 0xe3, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0x83, 0xf, 0xfe, 0x83, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0x87, 0x1f, 0xff, 0x81, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xff, 0x7, 0x1f, 0xff, 0x1, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xff, 0xf, 0x9f, 0xf7, 0x81, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x7f, 0xcf, 0x9f, 0xf1, 0x80, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7f, 0xde, 0xfe, 0xf0, 0xc0, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7f, 0x1e, 0xfe, 0xf0, 0xc0, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xff, 0x3c, 0x7c, 0x70, 0xc0, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xff, 0x7f, 0xfc, 0x70, 0xe0, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xf3, 0x7f, 0xfc, 0x7e, 0xe0, 0xf3, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xe1, 0xff, 0x38, 0x7e, 0xf2, 0xf3, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x81, 0xff, 0x38, 0x3e, 0xf3, 0xfb, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0x39, 0x3f, 0xfb, 0xf9, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0x0, 0xfc, 0x31, 0x3f, 0x39, 0xdc, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x7f, 0x0, 0xf8, 0x33, 0x1e, 0x3c, 0x86, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x3f, 0x0, 0xe0, 0x3, 0xf, 0x1c, 0xc0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x3f, 0x0, 0xc0, 0x83, 0xf, 0xc, 0xe0, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x1f, 0x0, 0x80, 0x80, 0xf, 0x0, 0xf0, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xf, 0x0, 0x0, 0x81, 0xf, 0x8, 0xf8, 0xfd, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xf, 0x0, 0x80, 0xc7, 0x1f, 0x1e, 0x7c, 0xfc, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7, 0x0, 0xc0, 0xff, 0xff, 0x3f, 0x3e, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x7, 0x0, 0xc0, 0xff, 0xff, 0x3f, 0x8f, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x3, 0x0, 0xc0, 0xff, 0xff, 0x1f, 0xe7, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0x3, 0x0, 0x80, 0xff, 0xff, 0x1f, 0xf8, 0xf1, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0x1, 0x0, 0x0, 0xff, 0xff, 0xf, 0x1c, 0xe0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x1, 0x0, 0x80, 0xff, 0xff, 0xf, 0x0, 0xf8, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x80, 0xff, 0xf9, 0x1f, 0x0, 0xff, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x80, 0x7f, 0x0, 0x0, 0x80, 0x7f, 0xe0, 0x1f, 0xf8, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xc0, 0x7f, 0x0, 0x0, 0xf8, 0x3f, 0xc0, 0xff, 0xfd, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xc0, 0x3f, 0x0, 0x0, 0xfc, 0x3f, 0xc0, 0xff, 0x1, 0x80, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xe0, 0x3f, 0x0, 0x0, 0xfc, 0x3f, 0xc0, 0xff, 0x1, 0xfc, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xf0, 0x1f, 0x0, 0x0, 0xfc, 0x3f, 0xc0, 0xff, 0x1, 0xe0, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xf0, 0x1f, 0x0, 0x0, 0xf8, 0x3f, 0xc0, 0xff, 0x1, 0x0, 0xfe, 0x3, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xf8, 0xf, 0x0, 0x0, 0xc0, 0x7f, 0xe0, 0x1f, 0xfc, 0xff, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xf8, 0x7, 0x0, 0x0, 0x80, 0xff, 0xf0, 0x1f, 0xc0, 0xff, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xfc, 0x7, 0x0, 0x0, 0x80, 0xff, 0xf0, 0x1f, 0x0, 0xf8, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xfc, 0x3, 0x0, 0x0, 0x0, 0x7f, 0xf0, 0xf, 0x0, 0x7c, 0xfc, 0xf, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xfe, 0x3, 0x0, 0x0, 0x80, 0x7f, 0xe0, 0x1f, 0x70, 0xfc, 0xf0, 0x1f, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xff, 0x1, 0x1e, 0x0, 0xc0, 0x7f, 0xe0, 0x1f, 0xff, 0x40, 0xe0, 0x1f, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x3f, 0x0, 0xc0, 0x3f, 0xe0, 0x3f, 0xfc, 0x1f, 0xc0, 0x3f, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x80, 0xff, 0x80, 0x7f, 0x0, 0xc0, 0x3f, 0xc0, 0x3f, 0xc0, 0xff, 0xc7, 0x3f, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x80, 0x7f, 0x80, 0x7f, 0x0, 0x80, 0x3, 0x0, 0x9e, 0x7, 0xfc, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xc0, 0x7f, 0x80, 0x7f, 0x0, 0x18, 0x1, 0x0, 0x88, 0x7, 0xfc, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xc0, 0x3f, 0x80, 0x7f, 0x0, 0x3e, 0x0, 0x0, 0x60, 0x3c, 0xfc, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xe0, 0x1f, 0x80, 0x7f, 0x0, 0x3f, 0x0, 0x0, 0xc0, 0xf0, 0xf8, 0xe7, 0xff, 0x1, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xe0, 0x1f, 0x0, 0x3f, 0x80, 0x3f, 0x0, 0x0, 0x80, 0xc3, 0xc3, 0x3, 0xfe, 0x1, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xf0, 0xf, 0xe0, 0xe1, 0xff, 0xf, 0x0, 0x0, 0x0, 0x7, 0x1f, 0x0, 0xfc, 0x3, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xf8, 0xf, 0xf0, 0xff, 0xff, 0x7, 0x0, 0x0, 0x0, 0x1c, 0x7c, 0x0, 0xfc, 0x7, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xf8, 0x7, 0xf8, 0xff, 0xff, 0x3, 0x0, 0x7e, 0x0, 0x38, 0xf0, 0x1, 0xf8, 0x7, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xfc, 0x7, 0xfc, 0xff, 0xff, 0x1, 0xf0, 0x7f, 0x0, 0xf0, 0xc0, 0x7, 0xf8, 0xf, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xfc, 0x3, 0xfe, 0xff, 0xff, 0x0, 0xff, 0x7f, 0x0, 0xe0, 0xe1, 0x1f, 0xf0, 0xf, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xfe, 0x1, 0xff, 0xff, 0x3, 0x80, 0xff, 0x7f, 0x0, 0xc0, 0xf7, 0x7f, 0xe0, 0x1f, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xff, 0x81, 0xff, 0xff, 0x7, 0xe0, 0xff, 0x3f, 0x0, 0x0, 0xff, 0xf7, 0xe1, 0x3f, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xff, 0xc0, 0x9f, 0xff, 0xf, 0xf8, 0xff, 0x0, 0x0, 0x0, 0xfe, 0xc7, 0xc7, 0x3f, 0x0, 0x0, 0x0,
0x0, 0x0, 0x80, 0xff, 0xc0, 0xf, 0xff, 0x1f, 0xfc, 0x7, 0x0, 0x0, 0x0, 0x7c, 0x0, 0xff, 0x7f, 0x0, 0x0, 0x0,
0x0, 0x0, 0x80, 0x7f, 0xc0, 0x7, 0xfe, 0x3f, 0xff, 0x3, 0x0, 0x0, 0x0, 0xf8, 0x1, 0xfc, 0x7f, 0x0, 0x0, 0x0,
0x0, 0x0, 0xc0, 0x7f, 0xc0, 0x3, 0xfc, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x7, 0xf0, 0xff, 0x0, 0x0, 0x0,
0x0, 0x0, 0xe0, 0x3f, 0xc0, 0x3, 0xfc, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xf, 0xc0, 0xff, 0x1, 0x0, 0x0,
0x0, 0x0, 0xe0, 0x3f, 0xc0, 0x3, 0xf8, 0xff, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x80, 0x3f, 0x1c, 0xff, 0x1, 0x0, 0x0,
0x0, 0x0, 0xf0, 0x1f, 0xc0, 0x3, 0xf0, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x1c, 0xfe, 0x3, 0x0, 0x0,
0x0, 0x0, 0xf0, 0xf, 0xc0, 0x3, 0xe0, 0xff, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0x1, 0xfc, 0x3, 0x0, 0x0,
0x0, 0x0, 0xf8, 0xf, 0xc0, 0x3, 0xc0, 0xff, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7, 0xfc, 0x7, 0x0, 0x0,
0x0, 0x0, 0xf8, 0x7, 0xc0, 0x3, 0x80, 0xff, 0xff, 0x3f, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xf, 0xf8, 0x7, 0x0, 0x0,
0x0, 0x0, 0xfc, 0x7, 0xc0, 0x3, 0x0, 0xfe, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x3f, 0xf8, 0xf, 0x0, 0x0,
0x0, 0x0, 0xfe, 0x3, 0x0, 0x0, 0x0, 0xf0, 0xff, 0xff, 0x1, 0x0, 0x0, 0x0, 0xc0, 0x7f, 0xf0, 0x1f, 0x0, 0x0,
0x0, 0x0, 0xfe, 0x1, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, 0xff, 0xe1, 0x1f, 0x0, 0x0,
0x0, 0x0, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0xf, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xe7, 0x3f, 0x0, 0x0,
0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xcf, 0x3f, 0x0, 0x0,
0x0, 0x80, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x3f, 0x0, 0x0, 0x0, 0x0, 0xf8, 0xff, 0x7f, 0x0, 0x0,
0x0, 0x80, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xff, 0x7f, 0x0, 0x0,
0x0, 0xc0, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0xff, 0x0, 0x0,
0x0, 0xe0, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0xff, 0x1, 0x0,
0x0, 0xe0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x1, 0x0,
0x0, 0xf0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xff, 0x3, 0x0,
0x0, 0xf0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xff, 0x3, 0x0,
0x0, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7, 0x0,
0x0, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7, 0x0,
0x0, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0x0,
0x0, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0x0,
0x0, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0x0,
0x0, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7, 0x0,
0x0, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x8a, 0x78,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xcf, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x3f, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x7f, 0xf8, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xe1, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0x3, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7, 0xfc, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x1f, 0xff, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x3f, 0xfe, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0xf8, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0xfb, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xe7, 0xe7, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0xff, 0x8f, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xff, 0x1f, 0xfe, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0x3b, 0xf8, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xcf, 0xe0, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0x3f, 0x80, 0xff, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xff, 0x0, 0xfe, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xff, 0x87, 0xf9, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xff, 0x1f, 0xc7, 0xff, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x7f, 0x7e, 0xc, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf9, 0x31, 0xfc, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xe3, 0xc7, 0xf0, 0xf7, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7, 0x3f, 0xc0, 0xdf, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x1f, 0xfc, 0x0, 0x7f, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x7f, 0xf0, 0x3, 0xfc, 0xfc, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0x83, 0xf, 0xfc, 0xe3, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xf, 0x3e, 0xf8, 0xf, 0xfe, 0x1, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x7f, 0xf8, 0xf1, 0x1f, 0xf8, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0xff, 0xc1, 0xc7, 0x7f, 0xc0, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xff, 0xf, 0x9f, 0xf7, 0x81, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0x3d, 0x7f, 0xc6, 0x3, 0xfe, 0xf, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0xe7, 0xed, 0xf, 0xf, 0xfc, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0x9f, 0x87, 0x3f, 0x3c, 0xf0, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xff, 0x3c, 0x7c, 0x70, 0xc0, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xff, 0xff, 0xf1, 0xc3, 0x81, 0xff, 0x3f, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x3f, 0xff, 0xc7, 0xef, 0x7, 0x3e, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x80, 0x7f, 0xf8, 0x3f, 0x8e, 0x9f, 0xfc, 0xfc, 0x7, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x81, 0xff, 0x38, 0x3e, 0xf3, 0xfb, 0x3f, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x3, 0xfc, 0xe7, 0xfc, 0xec, 0xe7, 0xff, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0xf, 0xc0, 0x1f, 0xf3, 0x93, 0xc3, 0xfd, 0x7, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xf0, 0x1f, 0x0, 0xfe, 0x8c, 0x7, 0x8f, 0xe1, 0x1f, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xc0, 0x3f, 0x0, 0xe0, 0x3, 0xf, 0x1c, 0xc0, 0xff, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0x0, 0x0, 0xf, 0x3e, 0x30, 0x80, 0xff, 0x7, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0x1, 0x0, 0x8, 0xf8, 0x0, 0x0, 0xff, 0x1f, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xfc, 0x3, 0x0, 0x40, 0xe0, 0x3, 0x2, 0x7e, 0xff, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xf0, 0xf, 0x0, 0x80, 0xc7, 0x1f, 0x1e, 0x7c, 0xfc, 0x3, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xe0, 0x1f, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf8, 0xfc, 0x1f, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xc0, 0x7f, 0x0, 0x0, 0xfc, 0xff, 0xff, 0xf3, 0xf8, 0xff, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0xf0, 0xff, 0xff, 0xc7, 0xf9, 0xff, 0x3, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xfe, 0x3, 0x0, 0x80, 0xff, 0xff, 0x1f, 0xf8, 0xf1, 0x1f, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xf8, 0x7, 0x0, 0x0, 0xfc, 0xff, 0x3f, 0x70, 0x80, 0x7f, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xf0, 0x1f, 0x0, 0x0, 0xf8, 0xff, 0xff, 0x0, 0x80, 0xff, 0x3, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xc0, 0x3f, 0x0, 0x0, 0xe0, 0x7f, 0xfe, 0x7, 0xc0, 0xff, 0xf, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x80, 0x7f, 0x0, 0x0, 0x80, 0x7f, 0xe0, 0x1f, 0xf8, 0xff, 0x7f, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xff, 0x1, 0x0, 0xe0, 0xff, 0x0, 0xff, 0xf7, 0xff, 0xff, 0x3, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xfc, 0x3, 0x0, 0xc0, 0xff, 0x3, 0xfc, 0x1f, 0x0, 0xf8, 0xf, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xf8, 0xf, 0x0, 0x0, 0xff, 0xf, 0xf0, 0x7f, 0x0, 0xff, 0x7f, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xf0, 0x1f, 0x0, 0x0, 0xfc, 0x3f, 0xc0, 0xff, 0x1, 0xe0, 0xff, 0x3, 0x0, 0x0,
0x0, 0x0, 0x0, 0xc0, 0x7f, 0x0, 0x0, 0xe0, 0xff, 0x0, 0xff, 0x7, 0x0, 0xf8, 0xf, 0x0, 0x0,
0x0, 0x0, 0x0, 0x80, 0xff, 0x0, 0x0, 0x0, 0xfc, 0x7, 0xfe, 0xc1, 0xff, 0xff, 0x7f, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xfe, 0x1, 0x0, 0x0, 0xe0, 0x3f, 0xfc, 0x7, 0xf0, 0xff, 0xff, 0x1, 0x0, 0x0,
0x0, 0x0, 0x0, 0xfc, 0x7, 0x0, 0x0, 0x80, 0xff, 0xf0, 0x1f, 0x0, 0xf8, 0xff, 0xf, 0x0, 0x0,
0x0, 0x0, 0x0, 0xf0, 0xf, 0x0, 0x0, 0x0, 0xfc, 0xc1, 0x3f, 0x0, 0xf0, 0xf1, 0x3f, 0x0, 0x0,
0x0, 0x0, 0x0, 0xe0, 0x3f, 0x0, 0x0, 0x0, 0xf8, 0x7, 0xfe, 0x1, 0xc7, 0xf, 0xff, 0x1, 0x0, 0x0,
0x0, 0x0, 0xc0, 0x7f, 0x80, 0x7, 0x0, 0xf0, 0x1f, 0xf8, 0xc7, 0x3f, 0x10, 0xf8, 0x7, 0x0, 0x0,
0x0, 0x0, 0x0, 0xff, 0x0, 0x3f, 0x0, 0xc0, 0x3f, 0xe0, 0x3f, 0xfc, 0x1f, 0xc0, 0x3f, 0x0, 0x0,
0x0, 0x0, 0x0, 0xfe, 0x3, 0xfe, 0x1, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x1f, 0xff, 0x0, 0x0,
0x0, 0x0, 0x0, 0xf8, 0x7, 0xf8, 0x7, 0x0, 0x38, 0x0, 0xe0, 0x79, 0xc0, 0xff, 0xff, 0x7, 0x0, 0x0,
0x0, 0x0, 0xf0, 0x1f, 0xe0, 0x1f, 0x0, 0x46, 0x0, 0x0, 0xe2, 0x1, 0xff, 0xff, 0x3f, 0x0, 0x0,
0x0, 0x0, 0xc0, 0x3f, 0x80, 0x7f, 0x0, 0x3e, 0x0, 0x0, 0x60, 0x3c, 0xfc, 0xff, 0xff, 0x0, 0x0,
0x0, 0x0, 0x80, 0x7f, 0x0, 0xfe, 0x1, 0xfc, 0x0, 0x0, 0x0, 0xc3, 0xe3, 0x9f, 0xff, 0x7, 0x0,
0x0, 0x0, 0x0, 0xfe, 0x1, 0xf0, 0x3, 0xf8, 0x3, 0x0, 0x0, 0x38, 0x3c, 0x3c, 0xe0, 0x1f, 0x0, 0x0,
0x0, 0x0, 0xfc, 0x3, 0x78, 0xf8, 0xff, 0x3, 0x0, 0x0, 0xc0, 0xc1, 0x7, 0x0, 0xff, 0x0, 0x0,
0x0, 0x0, 0xf8, 0xf, 0xf0, 0xff, 0xff, 0x7, 0x0, 0x0, 0x0, 0x1c, 0x7c, 0x0, 0xfc, 0x7, 0x0,
0x0, 0x0, 0xe0, 0x1f, 0xe0, 0xff, 0xff, 0xf, 0x0, 0xf8, 0x1, 0xe0, 0xc0, 0x7, 0xe0, 0x1f, 0x0,
0x0, 0x0, 0xc0, 0x7f, 0xc0, 0xff, 0xff, 0x1f, 0x0, 0xff, 0x7, 0x0, 0xf, 0x7c, 0x80, 0xff, 0x0, 0x0,
0x0, 0x0, 0xff, 0x80, 0xff, 0xff, 0x3f, 0xc0, 0xff, 0x1f, 0x0, 0x78, 0xf8, 0x7, 0xfc, 0x3, 0x0,
0x0, 0x0, 0xfe, 0x1, 0xff, 0xff, 0x3, 0x80, 0xff, 0x7f, 0x0, 0xc0, 0xf7, 0x7f, 0xe0, 0x1f, 0x0,
0x0, 0x0, 0xfc, 0x7, 0xfe, 0xff, 0x1f, 0x80, 0xff, 0xff, 0x0, 0x0, 0xfc, 0xdf, 0x87, 0xff, 0x0,
0x0, 0x0, 0xf0, 0xf, 0xfc, 0xf9, 0xff, 0x80, 0xff, 0xf, 0x0, 0x0, 0xe0, 0x7f, 0x7c, 0xfc, 0x3, 0x0,
0x0, 0xe0, 0x3f, 0xf0, 0xc3, 0xff, 0x7, 0xff, 0x1, 0x0, 0x0, 0x0, 0x1f, 0xc0, 0xff, 0x1f, 0x0,
0x0, 0x80, 0x7f, 0xc0, 0x7, 0xfe, 0x3f, 0xff, 0x3, 0x0, 0x0, 0x0, 0xf8, 0x1, 0xfc, 0x7f, 0x0,
0x0, 0x0, 0xff, 0x1, 0xf, 0xf0, 0xff, 0xff, 0x3, 0x0, 0x0, 0x0, 0xc0, 0x1f, 0xc0, 0xff, 0x3,
0x0, 0x0, 0xfe, 0x3, 0x3c, 0xc0, 0xff, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x0, 0xfc, 0x1f, 0x0,
0x0, 0xf8, 0xf, 0xf0, 0x0, 0xfe, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xf, 0xc7, 0x7f, 0x0,
0x0, 0xf0, 0x1f, 0xc0, 0x3, 0xf0, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x1c, 0xfe, 0x3,
0x0, 0xc0, 0x3f, 0x0, 0xf, 0x80, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7, 0xf0, 0xf,
0x0, 0x80, 0xff, 0x0, 0x3c, 0x0, 0xfc, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x80, 0x7f, 0xc0, 0x7f, 0x0,
0x0, 0xfe, 0x1, 0xf0, 0x0, 0xe0, 0xff, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x3, 0xfe, 0x1,
0x0, 0xfc, 0x7, 0xc0, 0x3, 0x0, 0xfe, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x3f, 0xf8, 0xf,
0x0, 0xf8, 0xf, 0x0, 0x0, 0x0, 0xc0, 0xff, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, 0xff, 0xc1, 0x7f,
0x0, 0xe0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0x3f, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x1f, 0xfe, 0x1,
0xc0, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0x3, 0x0, 0x0, 0x0, 0x80, 0xff, 0xf9, 0xf,
0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xcf, 0x3f,
0x0, 0xfe, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xff, 0xff,
0x1, 0xf8, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x7, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x7,
0xf0, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xf, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xff, 0x3f,
0xe0, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0xff,
0x81, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xff,
0x7, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xff, 0x3f,
0xfc, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff,
0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f,
};
#endif

BIN
images/logo_bw.png

Before

Width: 160  |  Height: 128  |  Size: 8.8 KiB

After

Width: 138  |  Height: 120  |  Size: 8.5 KiB

9
main.c

@ -9,7 +9,8 @@
//#include "logo.h"
#include "logo_bw.h"
#include "tom_thumb.h"
//#include "tom_thumb.h"
#include "free_sans.h"
int main(void) {
spi_init();
@ -18,7 +19,7 @@ int main(void) {
st7735_set_orientation(ST7735_LANDSCAPE);
st7735_fill_rect(0, 0, 160, 128, ST7735_COLOR_BLACK);
st7735_draw_mono_bitmap(0, 0, &logo_bw, ST7735_COLOR_WHITE, ST7735_COLOR_BLACK);
st7735_draw_mono_bitmap(16, 4, &logo_bw, ST7735_COLOR_WHITE, ST7735_COLOR_BLACK);
//st7735_draw_bitmap(10, 10, &logo);
@ -47,10 +48,10 @@ int main(void) {
w += 20;
}
_delay_ms(1000);
_delay_ms(5000);
st7735_fill_rect(0, 0, 160, 128, ST7735_COLOR_BLACK);
st7735_draw_text(10, 30, "This is\nJust a Test", &TomThumb, 3, ST7735_COLOR_CYAN);
st7735_draw_text(5, 30, "This is\njust a Test xyz\nST7735\nLongHairedHacker", &FreeSans, 1, ST7735_COLOR_CYAN);
st7735_draw_fast_hline(10, 30, 100, ST7735_COLOR_RED);
while(1);

1
utils/fontconvert/.gitignore

@ -0,0 +1 @@
fontconvert

12
utils/fontconvert/Makefile

@ -0,0 +1,12 @@
all: fontconvert
CC = gcc
CFLAGS = -Wall -I/usr/local/include/freetype2 -I/usr/include/freetype2 -I/usr/include
LIBS = -lfreetype
fontconvert: fontconvert.c
$(CC) $(CFLAGS) $< $(LIBS) -o $@
strip $@
clean:
rm -f fontconvert

278
utils/fontconvert/fontconvert.c

@ -0,0 +1,278 @@
/*
TrueType to Adafruit_GFX font converter. Derived from Peter Jakobs'
Adafruit_ftGFX fork & makefont tool, and Paul Kourany's Adafruit_mfGFX.
NOT AN ARDUINO SKETCH. This is a command-line tool for preprocessing
fonts to be used with the Adafruit_GFX Arduino library.
For UNIX-like systems. Outputs to stdout; redirect to header file, e.g.:
./fontconvert ~/Library/Fonts/FreeSans.ttf 18 > FreeSans18pt7b.h
REQUIRES FREETYPE LIBRARY. www.freetype.org
Currently this only extracts the printable 7-bit ASCII chars of a font.
Will eventually extend with some int'l chars a la ftGFX, not there yet.
Keep 7-bit fonts around as an option in that case, more compact.
See notes at end for glyph nomenclature & other tidbits.
*/
#include <stdio.h>
#include <ctype.h>
#include <stdint.h>
#include <ft2build.h>
#include FT_GLYPH_H
#include "gfxfont.h" // Adafruit_GFX font structures
#define DPI 141 // Approximate res. of Adafruit 2.8" TFT
// Accumulate bits for output, with periodic hexadecimal byte write
void enbit(uint8_t value) {
static uint8_t row = 0, sum = 0, bit = 0x80, firstCall = 1;
if(value) sum |= bit; // Set bit if needed
if(!(bit >>= 1)) { // Advance to next bit, end of byte reached?
if(!firstCall) { // Format output table nicely
if(++row >= 12) { // Last entry on line?
printf(",\n "); // Newline format output
row = 0; // Reset row counter
} else { // Not end of line
printf(", "); // Simple comma delim
}
}
printf("0x%02X", sum); // Write byte value
sum = 0; // Clear for next byte
bit = 0x80; // Reset bit counter
firstCall = 0; // Formatting flag
}
}
int main(int argc, char *argv[]) {
int i, j, err, size, first=' ', last='~',
bitmapOffset = 0, x, y, byte;
char *fontName, c, *ptr;
FT_Library library;
FT_Face face;
FT_Glyph glyph;
FT_Bitmap *bitmap;
FT_BitmapGlyphRec *g;
GFXglyph *table;
uint8_t bit;
// Parse command line. Valid syntaxes are:
// fontconvert [filename] [size]
// fontconvert [filename] [size] [last char]
// fontconvert [filename] [size] [first char] [last char]
// Unless overridden, default first and last chars are
// ' ' (space) and '~', respectively
if(argc < 3) {
fprintf(stderr, "Usage: %s fontfile size [first] [last]\n",
argv[0]);
return 1;
}
size = atoi(argv[2]);
if(argc == 4) {
last = atoi(argv[3]);
} else if(argc == 5) {
first = atoi(argv[3]);
last = atoi(argv[4]);
}
if(last < first) {
i = first;
first = last;
last = i;
}
ptr = strrchr(argv[1], '/'); // Find last slash in filename
if(ptr) ptr++; // First character of filename (path stripped)
else ptr = argv[1]; // No path; font in local dir.
// Allocate space for font name and glyph table
if((!(fontName = malloc(strlen(ptr) + 20))) ||
(!(table = (GFXglyph *)malloc((last - first + 1) *
sizeof(GFXglyph))))) {
fprintf(stderr, "Malloc error\n");
return 1;
}
// Derive font table names from filename. Period (filename
// extension) is truncated and replaced with the font size & bits.
strcpy(fontName, ptr);
ptr = strrchr(fontName, '.'); // Find last period (file ext)
if(!ptr) ptr = &fontName[strlen(fontName)]; // If none, append
// Insert font size and 7/8 bit. fontName was alloc'd w/extra
// space to allow this, we're not sprintfing into Forbidden Zone.
sprintf(ptr, "%dpt%db", size, (last > 127) ? 8 : 7);
// Space and punctuation chars in name replaced w/ underscores.
for(i=0; (c=fontName[i]); i++) {
if(isspace(c) || ispunct(c)) fontName[i] = '_';
}
// Init FreeType lib, load font
if((err = FT_Init_FreeType(&library))) {
fprintf(stderr, "FreeType init error: %d", err);
return err;
}
if((err = FT_New_Face(library, argv[1], 0, &face))) {
fprintf(stderr, "Font load error: %d", err);
FT_Done_FreeType(library);
return err;
}
// << 6 because '26dot6' fixed-point format
FT_Set_Char_Size(face, size << 6, 0, DPI, 0);
// Currently all symbols from 'first' to 'last' are processed.
// Fonts may contain WAY more glyphs than that, but this code
// will need to handle encoding stuff to deal with extracting
// the right symbols, and that's not done yet.
// fprintf(stderr, "%ld glyphs\n", face->num_glyphs);
printf("const uint8_t %sBitmaps[] PROGMEM = {\n ", fontName);
// Process glyphs and output huge bitmap data array
for(i=first, j=0; i<=last; i++, j++) {
// MONO renderer provides clean image with perfect crop
// (no wasted pixels) via bitmap struct.
if((err = FT_Load_Char(face, i, FT_LOAD_TARGET_MONO))) {
fprintf(stderr, "Error %d loading char '%c'\n",
err, i);
continue;
}
if((err = FT_Render_Glyph(face->glyph,
FT_RENDER_MODE_MONO))) {
fprintf(stderr, "Error %d rendering char '%c'\n",
err, i);
continue;
}
if((err = FT_Get_Glyph(face->glyph, &glyph))) {
fprintf(stderr, "Error %d getting glyph '%c'\n",
err, i);
continue;
}
bitmap = &face->glyph->bitmap;
g = (FT_BitmapGlyphRec *)glyph;
// Minimal font and per-glyph information is stored to
// reduce flash space requirements. Glyph bitmaps are
// fully bit-packed; no per-scanline pad, though end of
// each character may be padded to next byte boundary
// when needed. 16-bit offset means 64K max for bitmaps,
// code currently doesn't check for overflow. (Doesn't
// check that size & offsets are within bounds either for
// that matter...please convert fonts responsibly.)
table[j].bitmapOffset = bitmapOffset;
table[j].width = bitmap->width;
table[j].height = bitmap->rows;
table[j].xAdvance = face->glyph->advance.x >> 6;
table[j].xOffset = g->left;
table[j].yOffset = 1 - g->top;
for(y=0; y < bitmap->rows; y++) {
for(x=0;x < bitmap->width; x++) {
byte = x / 8;
bit = 0x80 >> (x & 7);
enbit(bitmap->buffer[
y * bitmap->pitch + byte] & bit);
}
}
// Pad end of char bitmap to next byte boundary if needed
int n = (bitmap->width * bitmap->rows) & 7;
if(n) { // Pixel count not an even multiple of 8?
n = 8 - n; // # bits to next multiple
while(n--) enbit(0);
}
bitmapOffset += (bitmap->width * bitmap->rows + 7) / 8;
FT_Done_Glyph(glyph);
}
printf(" };\n\n"); // End bitmap array
// Output glyph attributes table (one per character)
printf("const GFXglyph %sGlyphs[] PROGMEM = {\n", fontName);
for(i=first, j=0; i<=last; i++, j++) {
printf(" { %5d, %3d, %3d, %3d, %4d, %4d }",
table[j].bitmapOffset,
table[j].width,
table[j].height,
table[j].xAdvance,
table[j].xOffset,
table[j].yOffset);
if(i < last) {
printf(", // 0x%02X", i);
if((i >= ' ') && (i <= '~')) {
printf(" '%c'", i);
}
putchar('\n');
}
}
printf(" }; // 0x%02X", last);
if((last >= ' ') && (last <= '~')) printf(" '%c'", last);
printf("\n\n");
// Output font structure
printf("const GFXfont %s PROGMEM = {\n", fontName);
printf(" (uint8_t *)%sBitmaps,\n", fontName);
printf(" (GFXglyph *)%sGlyphs,\n", fontName);
printf(" 0x%02X, 0x%02X, %ld };\n\n",
first, last, face->size->metrics.height >> 6);
printf("// Approx. %d bytes\n",
bitmapOffset + (last - first + 1) * 7 + 7);
// Size estimate is based on AVR struct and pointer sizes;
// actual size may vary.
FT_Done_FreeType(library);
return 0;
}
/* -------------------------------------------------------------------------
Character metrics are slightly different from classic GFX & ftGFX.
In classic GFX: cursor position is the upper-left pixel of each 5x7
character; lower extent of most glyphs (except those w/descenders)
is +6 pixels in Y direction.
W/new GFX fonts: cursor position is on baseline, where baseline is
'inclusive' (containing the bottom-most row of pixels in most symbols,
except those with descenders; ftGFX is one pixel lower).
Cursor Y will be moved automatically when switching between classic
and new fonts. If you switch fonts, any print() calls will continue
along the same baseline.
...........#####.. -- yOffset
..........######..
..........######..
.........#######..
........#########.
* = Cursor pos. ........#########.
.......##########.
......#####..####.
......#####..####.
*.#.. .....#####...####.
.#.#. ....##############
#...# ...###############
#...# ...###############
##### ..#####......#####
#...# .#####.......#####
====== #...# ====== #*###.........#### ======= Baseline
|| xOffset
glyph->xOffset and yOffset are pixel offsets, in GFX coordinate space
(+Y is down), from the cursor position to the top-left pixel of the
glyph bitmap. i.e. yOffset is typically negative, xOffset is typically
zero but a few glyphs will have other values (even negative xOffsets
sometimes, totally normal). glyph->xAdvance is the distance to move
the cursor on the X axis after drawing the corresponding symbol.
There's also some changes with regard to 'background' color and new GFX
fonts (classic fonts unchanged). See Adafruit_GFX.cpp for explanation.
*/

24
utils/fontconvert/gfxfont.h

@ -0,0 +1,24 @@
// Font structures for newer Adafruit_GFX (1.1 and later).
// Example fonts are included in 'Fonts' directory.
// To use a font in your Arduino sketch, #include the corresponding .h
// file and pass address of GFXfont struct to setFont(). Pass NULL to
// revert to 'classic' fixed-space bitmap font.
#ifndef _GFXFONT_H_
#define _GFXFONT_H_
typedef struct { // Data stored PER GLYPH
uint16_t bitmapOffset; // Pointer into GFXfont->bitmap
uint8_t width, height; // Bitmap dimensions in pixels
uint8_t xAdvance; // Distance to advance cursor (x axis)
int8_t xOffset, yOffset; // Dist from cursor pos to UL corner
} GFXglyph;
typedef struct { // Data stored for FONT AS A WHOLE:
uint8_t *bitmap; // Glyph bitmaps, concatenated
GFXglyph *glyph; // Glyph array
uint8_t first, last; // ASCII extents
uint8_t yAdvance; // Newline distance (y axis)
} GFXfont;
#endif // _GFXFONT_H_
Loading…
Cancel
Save